--- /dev/null
+Guillaume Pellerin <yomguy@altern.org>
+Olivier Guilyardi <olivier@samalyse.com>
--- /dev/null
+Copyright (c) 2006, 2008 Parisson, SARL (parisson.com).
+Copyright (c) 2006, 2008 Samalyse, SARL (samalyse.com).
+All rights reserved.
+
+Guillaume Pellerin <yomguy@parisson.com>
+Olivier Guilyardi <olivier@samalyse.com>
+
+This software is a computer program whose purpose is to backup,
+transcode and tag any audio content with metadata over a web frontend.
+
+This software is governed by the CeCILL license under French law and
+abiding by the rules of distribution of free software. You can use,
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info".
+
+
+CeCILL FREE SOFTWARE LICENSE AGREEMENT
+
+ Notice
+
+This Agreement is a Free Software license agreement that is the result
+of discussions between its authors in order to ensure compliance with
+the two main principles guiding its drafting:
+
+ * firstly, compliance with the principles governing the distribution
+ of Free Software: access to source code, broad rights granted to
+ users,
+ * secondly, the election of a governing law, French law, with which
+ it is conformant, both as regards the law of torts and
+ intellectual property law, and the protection that it offers to
+ both authors and holders of the economic rights over software.
+
+The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
+license are:
+
+Commissariat à l'Energie Atomique - CEA, a public scientific, technical
+and industrial research establishment, having its principal place of
+business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.
+
+Centre National de la Recherche Scientifique - CNRS, a public scientific
+and technological establishment, having its principal place of business
+at 3 rue Michel-Ange, 75794 Paris cedex 16, France.
+
+Institut National de Recherche en Informatique et en Automatique -
+INRIA, a public scientific and technological establishment, having its
+principal place of business at Domaine de Voluceau, Rocquencourt, BP
+105, 78153 Le Chesnay cedex, France.
+
+
+ Preamble
+
+The purpose of this Free Software license agreement is to grant users
+the right to modify and redistribute the software governed by this
+license within the framework of an open source distribution model.
+
+The exercising of these rights is conditional upon certain obligations
+for users so as to preserve this status for all subsequent redistributions.
+
+In consideration of access to the source code and the rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty and the software's author, the holder of the
+economic rights, and the successive licensors only have limited liability.
+
+In this respect, the risks associated with loading, using, modifying
+and/or developing or reproducing the software by the user are brought to
+the user's attention, given its Free Software status, which may make it
+complicated to use, with the result that its use is reserved for
+developers and experienced professionals having in-depth computer
+knowledge. Users are therefore encouraged to load and test the
+suitability of the software as regards their requirements in conditions
+enabling the security of their systems and/or data to be ensured and,
+more generally, to use and operate it in the same conditions of
+security. This Agreement may be freely reproduced and published,
+provided it is not altered, and that no provisions are either added or
+removed herefrom.
+
+This Agreement may apply to any or all software for which the holder of
+the economic rights decides to submit the use thereof to its provisions.
+
+
+ Article 1 - DEFINITIONS
+
+For the purpose of this Agreement, when the following expressions
+commence with a capital letter, they shall have the following meaning:
+
+Agreement: means this license agreement, and its possible subsequent
+versions and annexes.
+
+Software: means the software in its Object Code and/or Source Code form
+and, where applicable, its documentation, "as is" when the Licensee
+accepts the Agreement.
+
+Initial Software: means the Software in its Source Code and possibly its
+Object Code form and, where applicable, its documentation, "as is" when
+it is first distributed under the terms and conditions of the Agreement.
+
+Modified Software: means the Software modified by at least one
+Contribution.
+
+Source Code: means all the Software's instructions and program lines to
+which access is required so as to modify the Software.
+
+Object Code: means the binary files originating from the compilation of
+the Source Code.
+
+Holder: means the holder(s) of the economic rights over the Initial
+Software.
+
+Licensee: means the Software user(s) having accepted the Agreement.
+
+Contributor: means a Licensee having made at least one Contribution.
+
+Licensor: means the Holder, or any other individual or legal entity, who
+distributes the Software under the Agreement.
+
+Contribution: means any or all modifications, corrections, translations,
+adaptations and/or new functions integrated into the Software by any or
+all Contributors, as well as any or all Internal Modules.
+
+Module: means a set of sources files including their documentation that
+enables supplementary functions or services in addition to those offered
+by the Software.
+
+External Module: means any or all Modules, not derived from the
+Software, so that this Module and the Software run in separate address
+spaces, with one calling the other when they are run.
+
+Internal Module: means any or all Module, connected to the Software so
+that they both execute in the same address space.
+
+GNU GPL: means the GNU General Public License version 2 or any
+subsequent version, as published by the Free Software Foundation Inc.
+
+Parties: mean both the Licensee and the Licensor.
+
+These expressions may be used both in singular and plural form.
+
+
+ Article 2 - PURPOSE
+
+The purpose of the Agreement is the grant by the Licensor to the
+Licensee of a non-exclusive, transferable and worldwide license for the
+Software as set forth in Article 5 hereinafter for the whole term of the
+protection granted by the rights over said Software.
+
+
+ Article 3 - ACCEPTANCE
+
+3.1 The Licensee shall be deemed as having accepted the terms and
+conditions of this Agreement upon the occurrence of the first of the
+following events:
+
+ * (i) loading the Software by any or all means, notably, by
+ downloading from a remote server, or by loading from a physical
+ medium;
+ * (ii) the first time the Licensee exercises any of the rights
+ granted hereunder.
+
+3.2 One copy of the Agreement, containing a notice relating to the
+characteristics of the Software, to the limited warranty, and to the
+fact that its use is restricted to experienced users has been provided
+to the Licensee prior to its acceptance as set forth in Article 3.1
+hereinabove, and the Licensee hereby acknowledges that it has read and
+understood it.
+
+
+ Article 4 - EFFECTIVE DATE AND TERM
+
+
+ 4.1 EFFECTIVE DATE
+
+The Agreement shall become effective on the date when it is accepted by
+the Licensee as set forth in Article 3.1.
+
+
+ 4.2 TERM
+
+The Agreement shall remain in force for the entire legal term of
+protection of the economic rights over the Software.
+
+
+ Article 5 - SCOPE OF RIGHTS GRANTED
+
+The Licensor hereby grants to the Licensee, who accepts, the following
+rights over the Software for any or all use, and for the term of the
+Agreement, on the basis of the terms and conditions set forth hereinafter.
+
+Besides, if the Licensor owns or comes to own one or more patents
+protecting all or part of the functions of the Software or of its
+components, the Licensor undertakes not to enforce the rights granted by
+these patents against successive Licensees using, exploiting or
+modifying the Software. If these patents are transferred, the Licensor
+undertakes to have the transferees subscribe to the obligations set
+forth in this paragraph.
+
+
+ 5.1 RIGHT OF USE
+
+The Licensee is authorized to use the Software, without any limitation
+as to its fields of application, with it being hereinafter specified
+that this comprises:
+
+ 1. permanent or temporary reproduction of all or part of the Software
+ by any or all means and in any or all form.
+
+ 2. loading, displaying, running, or storing the Software on any or
+ all medium.
+
+ 3. entitlement to observe, study or test its operation so as to
+ determine the ideas and principles behind any or all constituent
+ elements of said Software. This shall apply when the Licensee
+ carries out any or all loading, displaying, running, transmission
+ or storage operation as regards the Software, that it is entitled
+ to carry out hereunder.
+
+
+ 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS
+
+The right to make Contributions includes the right to translate, adapt,
+arrange, or make any or all modifications to the Software, and the right
+to reproduce the resulting software.
+
+The Licensee is authorized to make any or all Contributions to the
+Software provided that it includes an explicit notice that it is the
+author of said Contribution and indicates the date of the creation thereof.
+
+
+ 5.3 RIGHT OF DISTRIBUTION
+
+In particular, the right of distribution includes the right to publish,
+transmit and communicate the Software to the general public on any or
+all medium, and by any or all means, and the right to market, either in
+consideration of a fee, or free of charge, one or more copies of the
+Software by any means.
+
+The Licensee is further authorized to distribute copies of the modified
+or unmodified Software to third parties according to the terms and
+conditions set forth hereinafter.
+
+
+ 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION
+
+The Licensee is authorized to distribute true copies of the Software in
+Source Code or Object Code form, provided that said distribution
+complies with all the provisions of the Agreement and is accompanied by:
+
+ 1. a copy of the Agreement,
+
+ 2. a notice relating to the limitation of both the Licensor's
+ warranty and liability as set forth in Articles 8 and 9,
+
+and that, in the event that only the Object Code of the Software is
+redistributed, the Licensee allows future Licensees unhindered access to
+the full Source Code of the Software by indicating how to access it, it
+being understood that the additional cost of acquiring the Source Code
+shall not exceed the cost of transferring the data.
+
+
+ 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE
+
+When the Licensee makes a Contribution to the Software, the terms and
+conditions for the distribution of the resulting Modified Software
+become subject to all the provisions of this Agreement.
+
+The Licensee is authorized to distribute the Modified Software, in
+source code or object code form, provided that said distribution
+complies with all the provisions of the Agreement and is accompanied by:
+
+ 1. a copy of the Agreement,
+
+ 2. a notice relating to the limitation of both the Licensor's
+ warranty and liability as set forth in Articles 8 and 9,
+
+and that, in the event that only the object code of the Modified
+Software is redistributed, the Licensee allows future Licensees
+unhindered access to the full source code of the Modified Software by
+indicating how to access it, it being understood that the additional
+cost of acquiring the source code shall not exceed the cost of
+transferring the data.
+
+
+ 5.3.3 DISTRIBUTION OF EXTERNAL MODULES
+
+When the Licensee has developed an External Module, the terms and
+conditions of this Agreement do not apply to said External Module, that
+may be distributed under a separate license agreement.
+
+
+ 5.3.4 COMPATIBILITY WITH THE GNU GPL
+
+The Licensee can include a code that is subject to the provisions of one
+of the versions of the GNU GPL in the Modified or unmodified Software,
+and distribute that entire code under the terms of the same version of
+the GNU GPL.
+
+The Licensee can include the Modified or unmodified Software in a code
+that is subject to the provisions of one of the versions of the GNU GPL,
+and distribute that entire code under the terms of the same version of
+the GNU GPL.
+
+
+ Article 6 - INTELLECTUAL PROPERTY
+
+
+ 6.1 OVER THE INITIAL SOFTWARE
+
+The Holder owns the economic rights over the Initial Software. Any or
+all use of the Initial Software is subject to compliance with the terms
+and conditions under which the Holder has elected to distribute its work
+and no one shall be entitled to modify the terms and conditions for the
+distribution of said Initial Software.
+
+The Holder undertakes that the Initial Software will remain ruled at
+least by this Agreement, for the duration set forth in Article 4.2.
+
+
+ 6.2 OVER THE CONTRIBUTIONS
+
+The Licensee who develops a Contribution is the owner of the
+intellectual property rights over this Contribution as defined by
+applicable law.
+
+
+ 6.3 OVER THE EXTERNAL MODULES
+
+The Licensee who develops an External Module is the owner of the
+intellectual property rights over this External Module as defined by
+applicable law and is free to choose the type of agreement that shall
+govern its distribution.
+
+
+ 6.4 JOINT PROVISIONS
+
+The Licensee expressly undertakes:
+
+ 1. not to remove, or modify, in any manner, the intellectual property
+ notices attached to the Software;
+
+ 2. to reproduce said notices, in an identical manner, in the copies
+ of the Software modified or not.
+
+The Licensee undertakes not to directly or indirectly infringe the
+intellectual property rights of the Holder and/or Contributors on the
+Software and to take, where applicable, vis-à-vis its staff, any and all
+measures required to ensure respect of said intellectual property rights
+of the Holder and/or Contributors.
+
+
+ Article 7 - RELATED SERVICES
+
+7.1 Under no circumstances shall the Agreement oblige the Licensor to
+provide technical assistance or maintenance services for the Software.
+
+However, the Licensor is entitled to offer this type of services. The
+terms and conditions of such technical assistance, and/or such
+maintenance, shall be set forth in a separate instrument. Only the
+Licensor offering said maintenance and/or technical assistance services
+shall incur liability therefor.
+
+7.2 Similarly, any Licensor is entitled to offer to its licensees, under
+its sole responsibility, a warranty, that shall only be binding upon
+itself, for the redistribution of the Software and/or the Modified
+Software, under terms and conditions that it is free to decide. Said
+warranty, and the financial terms and conditions of its application,
+shall be subject of a separate instrument executed between the Licensor
+and the Licensee.
+
+
+ Article 8 - LIABILITY
+
+8.1 Subject to the provisions of Article 8.2, the Licensee shall be
+entitled to claim compensation for any direct loss it may have suffered
+from the Software as a result of a fault on the part of the relevant
+Licensor, subject to providing evidence thereof.
+
+8.2 The Licensor's liability is limited to the commitments made under
+this Agreement and shall not be incurred as a result of in particular:
+(i) loss due the Licensee's total or partial failure to fulfill its
+obligations, (ii) direct or consequential loss that is suffered by the
+Licensee due to the use or performance of the Software, and (iii) more
+generally, any consequential loss. In particular the Parties expressly
+agree that any or all pecuniary or business loss (i.e. loss of data,
+loss of profits, operating loss, loss of customers or orders,
+opportunity cost, any disturbance to business activities) or any or all
+legal proceedings instituted against the Licensee by a third party,
+shall constitute consequential loss and shall not provide entitlement to
+any or all compensation from the Licensor.
+
+
+ Article 9 - WARRANTY
+
+9.1 The Licensee acknowledges that the scientific and technical
+state-of-the-art when the Software was distributed did not enable all
+possible uses to be tested and verified, nor for the presence of
+possible defects to be detected. In this respect, the Licensee's
+attention has been drawn to the risks associated with loading, using,
+modifying and/or developing and reproducing the Software which are
+reserved for experienced users.
+
+The Licensee shall be responsible for verifying, by any or all means,
+the suitability of the product for its requirements, its good working
+order, and for ensuring that it shall not cause damage to either persons
+or properties.
+
+9.2 The Licensor hereby represents, in good faith, that it is entitled
+to grant all the rights over the Software (including in particular the
+rights set forth in Article 5).
+
+9.3 The Licensee acknowledges that the Software is supplied "as is" by
+the Licensor without any other express or tacit warranty, other than
+that provided for in Article 9.2 and, in particular, without any warranty
+as to its commercial value, its secured, safe, innovative or relevant
+nature.
+
+Specifically, the Licensor does not warrant that the Software is free
+from any error, that it will operate without interruption, that it will
+be compatible with the Licensee's own equipment and software
+configuration, nor that it will meet the Licensee's requirements.
+
+9.4 The Licensor does not either expressly or tacitly warrant that the
+Software does not infringe any third party intellectual property right
+relating to a patent, software or any other property right. Therefore,
+the Licensor disclaims any and all liability towards the Licensee
+arising out of any or all proceedings for infringement that may be
+instituted in respect of the use, modification and redistribution of the
+Software. Nevertheless, should such proceedings be instituted against
+the Licensee, the Licensor shall provide it with technical and legal
+assistance for its defense. Such technical and legal assistance shall be
+decided on a case-by-case basis between the relevant Licensor and the
+Licensee pursuant to a memorandum of understanding. The Licensor
+disclaims any and all liability as regards the Licensee's use of the
+name of the Software. No warranty is given as regards the existence of
+prior rights over the name of the Software or as regards the existence
+of a trademark.
+
+
+ Article 10 - TERMINATION
+
+10.1 In the event of a breach by the Licensee of its obligations
+hereunder, the Licensor may automatically terminate this Agreement
+thirty (30) days after notice has been sent to the Licensee and has
+remained ineffective.
+
+10.2 A Licensee whose Agreement is terminated shall no longer be
+authorized to use, modify or distribute the Software. However, any
+licenses that it may have granted prior to termination of the Agreement
+shall remain valid subject to their having been granted in compliance
+with the terms and conditions hereof.
+
+
+ Article 11 - MISCELLANEOUS
+
+
+ 11.1 EXCUSABLE EVENTS
+
+Neither Party shall be liable for any or all delay, or failure to
+perform the Agreement, that may be attributable to an event of force
+majeure, an act of God or an outside cause, such as defective
+functioning or interruptions of the electricity or telecommunications
+networks, network paralysis following a virus attack, intervention by
+government authorities, natural disasters, water damage, earthquakes,
+fire, explosions, strikes and labor unrest, war, etc.
+
+11.2 Any failure by either Party, on one or more occasions, to invoke
+one or more of the provisions hereof, shall under no circumstances be
+interpreted as being a waiver by the interested Party of its right to
+invoke said provision(s) subsequently.
+
+11.3 The Agreement cancels and replaces any or all previous agreements,
+whether written or oral, between the Parties and having the same
+purpose, and constitutes the entirety of the agreement between said
+Parties concerning said purpose. No supplement or modification to the
+terms and conditions hereof shall be effective as between the Parties
+unless it is made in writing and signed by their duly authorized
+representatives.
+
+11.4 In the event that one or more of the provisions hereof were to
+conflict with a current or future applicable act or legislative text,
+said act or legislative text shall prevail, and the Parties shall make
+the necessary amendments so as to comply with said act or legislative
+text. All other provisions shall remain effective. Similarly, invalidity
+of a provision of the Agreement, for any reason whatsoever, shall not
+cause the Agreement as a whole to be invalid.
+
+
+ 11.5 LANGUAGE
+
+The Agreement is drafted in both French and English and both versions
+are deemed authentic.
+
+
+ Article 12 - NEW VERSIONS OF THE AGREEMENT
+
+12.1 Any person is authorized to duplicate and distribute copies of this
+Agreement.
+
+12.2 So as to ensure coherence, the wording of this Agreement is
+protected and may only be modified by the authors of the License, who
+reserve the right to periodically publish updates or new versions of the
+Agreement, each with a separate number. These subsequent versions may
+address new issues encountered by Free Software.
+
+12.3 Any Software distributed under a given version of the Agreement may
+only be subsequently distributed under the same version of the Agreement
+or a subsequent version, subject to the provisions of Article 5.3.4.
+
+
+ Article 13 - GOVERNING LAW AND JURISDICTION
+
+13.1 The Agreement is governed by French law. The Parties agree to
+endeavor to seek an amicable solution to any disagreements or disputes
+that may arise during the performance of the Agreement.
+
+13.2 Failing an amicable solution within two (2) months as from their
+occurrence, and unless emergency proceedings are necessary, the
+disagreements or disputes shall be referred to the Paris Courts having
+jurisdiction, by the more diligent Party.
+
+
+Version 2.0 dated 2006-09-05.
--- /dev/null
+==================
+Telemeta - INSTALL
+==================
+
+Requirements
+============
+
+Telemeta is designed to run on Linux and other UNIX based architectures.
+The following third party applications or libraries are required:
+
+:dependencies: python python-xml python-mutagen python-django \
+ python-imaging python-mysqldb mysql-server python-numpy python-scipy \
+ python-ctypes python-setuptools python-support python-docutils
+
+Here, package names are taken from the Debian OS and could be different on other platforms.
+
+
+Install
+=======
+
+-----------------------
+1. Install the software
+-----------------------
+
+1.1 Install Telemeta
+--------------------
+
+* On Debian (Testing recommended) or Ubuntu Hoary
+
+ Install all dependencies like this::
+
+ sudo aptitude install python python-xml python-mutagen python-django \
+ python-imaging python-mysqldb mysql-server python-numpy python-scipy \
+ python-ctypes python-setuptools python-support python-docutils
+
+ Just add these lines to your /etc/apt/sources-list::
+
+ deb http://debian.parisson.org/ binary/
+ deb-src http://debian.parisson.org/ source/
+ deb http://www.debian-multimedia.org etch main
+
+ Then::
+
+ $ sudo apt-get update
+ $ sudo apt-get install telemeta
+
+ This method provides the installation of all needed packages
+ thanks to the Debian dependency system.
+ Go to 1.2.
+
+* On other linux platforms
+
+ Install all dependencies.
+
+ Download the latest release of telemeta at
+ http://telemeta.org
+
+ Uncompress the archive like::
+
+ $ tar xzvf telemeta_0.3.2.tar.gz
+
+ Go to the main folder of telemeta and run this command
+ in a shell as root::
+
+ $ sudo python setup.py install
+
+
+1.2. Install TimeSide
+---------------------
+
+In order to get all the Web Audio Components from TimeSide,
+you have to download and install it from source.
+
+So, checkout the last archives at :
+http://code.google.com/p/timeside/downloads/list
+
+Install it like in the following example::
+
+$ tar xzf timeside-0.2.tar.gz
+$ cd timeside-0.2
+
+Read the README and INSTALL file, install dependencies and then::
+
+$ sudo python setup.py install
+
+
+1.3. Install the Django framework version 1.0
+---------------------------------------------
+
+* On Debian (Lenny recommended) or Ubuntu Hoary::
+
+ $ sudo apt-get install python-django
+
+* On other linux platforms, download and install it from:
+
+ http://www.djangoproject.com/download/
+
+
+--------------------------
+2. Create a Django project
+--------------------------
+
+If you haven't already done it, start a new django project::
+
+ $ cd ~/my_projects
+ $ django-admin startproject mysite
+
+
+-----------------------------------------
+3. Create the media and cache directories
+-----------------------------------------
+
+We need 2 directories for media and caching::
+
+ $ cd mysite
+ $ mkdir media cache
+
+You might want to place these somewhere else...
+
+
+----------------------------------
+4. Configure the telemeta project
+----------------------------------
+
+Edit the file settings.py in a text editor.
+Modifiy the following variables:
+
+ :ADMINS: telemeta requires that you indicate an administrator here
+ :DATABASE_*: your database settings (don't forget to create the database if needed)
+ :MEDIA_ROOT: absolute path to the media directory you just created
+ :INSTALLED_APPS: add 'telemeta'
+ :TEMPLATE_CONTEXT_PROCESSORS: include 'django.core.context_processors.request' and
+ 'django.core.context_processors.auth' in this tuple
+
+Add the following variables:
+
+ :TELEMETA_ORGANIZATION: name of the organization which hosts this installation
+ :TELEMETA_SUBJECTS: tuple of subject keywords (used for Dublin Core), such
+ as "Ethnology", etc...
+ :TELEMETA_CACHE_DIR: absolute path to the cache directory that you just created
+ :TELEMETA_GMAP_KEY: your Google Map API key
+ :TELEMETA_DOWNLOAD_ENABLED: True to enable audio data download
+
+Just paste the lines below::
+
+ LOGIN_URL = '/login'
+ LOGIN_REDIRECT_URL = '/'
+ TELEMETA_EXPORT_CACHE_DIR = TELEMETA_CACHE_DIR + "/export"
+ TELEMETA_DATA_CACHE_DIR = TELEMETA_CACHE_DIR + "/data"
+ CACHE_BACKEND = "file://" + TELEMETA_CACHE_DIR + "/data"
+
+
+--------------------------
+5. Initialize the database
+--------------------------
+
+This synchronizes the DB with the model::
+
+ $ python manage.py syncdb
+
+
+----------------------
+6. Configure your urls
+----------------------
+
+ The simplest case is to have telemeta running at public root. To do so, add this url in urls.py::
+
+ (r'^', include('telemeta.urls')),
+
+
+--------------------
+7. Start the project
+--------------------
+
+We are ready to start the telemeta server::
+
+ $ python manage.py runserver
+
+By default, the server starts on the port 8000. You can override this with, for example::
+
+ $ python manage.py runserver 9000
+
+
+------------------------------------
+8. Go the web page with your browser
+------------------------------------
+
+ http://localhost:8000
+
+ or
+
+ http://localhost:9000
+
+
+See README and http://telemeta.org for more informations.
+
+
+-------------------
+9. Configure Apache
+-------------------
+
+If you want to use Telemeta through a web server, it is highly recommended to use Apache 2
+with the mod_wsgi module as explained in the following page :
+
+http://docs.djangoproject.com/en/1.1/howto/deployment/modwsgi/#howto-deployment-modwsgi
+
+This will prevent Apache to put some audio data in the cache memory as it is usually the case with mod_python.
+
+=================
+Telemeta - README
+=================
+
+Telemeta: web frontend to backup, analyse, transcode and stream any audio content and metadata
+
+
+Introduction
+============
+
+Telemeta is a web audio archiving program which introduces useful and secure methods to
+backup, index, transcode, analyse and publish any digitalized audio file with its metadata.
+It is dedicated to professionnals who wants to easily backup and publish documented sounds
+from collections of vinyls, magnetic tapes or audio CDs over a strong database,
+in accordance with open standards.
+
+Here are the main features of Telemeta:
+
+ * Secure archiving, editing and publishing of audio files over internet.
+ * User friendly web frontend including workflows and high level search methods
+ * Smart dynamical and skinnable audio player (thanks to Timeside and soundmanager2)
+ * "On the fly" analyzing, transcoding and metadata embedding based on an easy plugin architecture
+ * Multi-format support : FLAC, OGG, MP3, WAV and more
+ * GEO Navigator for audio geolocalization
+ * DublinCore compatibility
+ * OAI-PMH data provider
+ * XML serialized backup
+ * Strong SQL backend
+
+The Telemeta data model is based on 'collections' and 'items'. A collection is described
+by its metadata and includes original audio items (sounds) and its own metadata. This
+existing model has been designed to fit the one of the French Centre of Etnomusicology (CREM)
+but could be easily adapted/overrided to sue other data structures.
+
+
+Installation and usage
+======================
+
+See INSTALL and http://telemeta.org for more informations.
+
+
+Development
+===========
+
+To participate to the development of telemeta, you will need a login/password couple.
+You're welcome to email us to join and commit your great ideas ;)
+
+To get the lastest development version, you need subversion and run::
+
+ $ svn co http://svn.parisson.org/svn/telemeta/trunk telemeta
+
+
+Licence
+=======
+CeCILL v2 (see COPYING)
+
+
+Bugs and feedback
+=================
+
+You are welcome to freely use this application in accordance to its licence.
+If you find some bugs, PLEASE leave a ticket on this page:
+
+http://telemeta.org/newticket
+
+You can also leave a ticket to request some new interesting features for the next versions.
+And even if Telemeta suits you, please give us some feedback !
+
+
+Related projects
+================
+
+TimeSide : Web Audio Components
+http://code.google.com/p/timeside/
+
+
+Contact
+=======
+
+:Homepage: http://telemeta.org
+
+:Emails: Guillaume Pellerin <yomguy@parisson.com>,
+ Olivier Guilyardi <olivier@samalyse.com>
+
+Sponsors
+========
+
+The Telemeta project is developed by Parisson and Samalyse. It is sponsored by :
+
+ * CNRS : Centre National de la Recherche Scientifique (the french Natianal Research and Scientific Center)
+ http://cnrs.fr
+ * CREM : Centre de Recherche en Ethnomusicology (the french Ethnomusicology Research Center)
+ http://www.crem-cnrs.fr
+ * LAM : Equipe Lutherie, Acoustique et Musique de l'Université Pierre et Marie Curie de Paris
+ (Instrument design, Acoustic and Music team of the Pierre & Marie Curie University)
+ http://www.lam.jussieu.fr/
+ * MuCEM : Musée des Civilisations de l'Europe et de la Méditerranée
+ http://www.musee-europemediterranee.org
+ * MMSH : Maison Méditerranéenne des Sciences de l'Homme
+ http://www.mmsh.univ-aix.fr/
+ * The Antropponet Project
--- /dev/null
+==================================
+Telemeta 1.0 - Refactoring Warning
+==================================
+
+In the perspective of Telemeta 1.0, most parts of the code are currently
+being refactored.
+
+In this context, you should expect the SVN trunk to be **very unstable**.
+
+You may not be able to use it at all until we're done actually... So please
+be patient.
+
+This warning will be removed once things get better, and that we get closer
+to the beta stage.
+
--- /dev/null
+telemeta for Debian
+---------------
+
+Soon !
+
+ -- Guillaume Pellerin <yomguy@altern.org>, Thu, 17 Aug 2006 22:42:14 +0200
--- /dev/null
+telemeta (0.4-1) unstable; urgency=low
+
+ * New upstream release
+ * See http://telemeta.org/log/ for the entire changelog
+
+ -- Guillaume Pellerin <yomguy@altern.org> Tue, 17 Mar 2009 01:46:51 +0100
+
+telemeta (0.3.3-1) unstable; urgency=low
+
+ * Add django 1.0 compatibility (no backward compatibility in most cases)
+ * Modify dependencies and manuals
+
+ -- Guillaume Pellerin <yomguy@altern.org> Tue, 30 Sep 2008 02:45:36 +0200
+
+telemeta (0.3.2-4) unstable; urgency=low
+
+ * Change license from BSD to CeCILL
+
+ -- Guillaume Pellerin <yomguy@altern.org> Fri, 19 Sep 2008 15:38:48 +0200
+
+telemeta (0.3.2-3) unstable; urgency=low
+
+ * Fix max_digits
+
+ -- Guillaume Pellerin <yomguy@altern.org> Mon, 15 Sep 2008 13:46:11 +0200
+
+telemeta (0.3.2-2) unstable; urgency=low
+
+ * Add analyzers
+
+ -- Guillaume Pellerin <yomguy@altern.org> Mon, 15 Sep 2008 11:40:06 +0200
+
+telemeta (0.3.2-1) unstable; urgency=low
+
+ * Add analysis plugin component and views
+ * Add wav2png.py objects and views
+ * Add audiolab python library
+ * Modify dependencies
+
+ -- Guillaume Pellerin <yomguy@altern.org> Thu, 28 Aug 2008 01:13:14 +0200
+
+telemeta (0.3.1-1beta) unstable; urgency=low
+
+ * Clear some install features
+ * Change waveform color
+ * Change menu order
+ * Change link order at home
+ * Fix spectrogram
+ * Fix tuple bug for version
+ * Modify setup method (distutils)
+ * 2nd layout v0.4 item/view + item/edit
+ * Item instruments prototype display
+ * Hide empty fields on collection and item detail display
+ * Layout breaks under 1024x768 : fixbug
+ * image search, css pagination
+ * search results: display collection tab by default if there's no item
+ * fix search combining country/continent and ethnic group
+ * layout v0.4 item/view + item/edit
+ * advanced search form/results + fix wrong revert
+ * advanced seach css formulaire
+ * fix urls
+ * affichage mediafile, overflow pour spectrogram
+ * hide 4D internal field compil_face_plage
+ * do not print duplicate countries and ethnic groups on collection detail
+ * item/collection dublincore + fixbug css
+ * write item and not items with a single result
+ * enable searching items by publish date and collections by ethnic group
+ * fix advanced search by title; fix empty search
+ * affichage item v1 + bug largeur liste definition list
+ * (re) fix build_query_string filter
+ * collection dublin core
+ * collections avec tous les champs
+ * fix build_query_string filter
+ * item quick search now also searches the creator (auteur) field
+ * improved search; search results are now paginated, displaying either
+ * items or collections, with a tab view
+ * affichage collections + modifs css
+ * sort related items by id on collection detail
+ * advanced search: add missing templates
+ * model modularization ; add is_published() method for collections
+ * model modularization
+ * add advanced search
+ * models: code cleanup and new docstrings
+ * Rewrite README and INSTALL
+ * Show a table for 'normal' data view
+ * Logo Telemeta FINAL v2
+
+ -- Guillaume Pellerin <yomguy@altern.org> Thu, 28 Aug 2008 01:11:19 +0200
+
+telemeta (0.3.0-1) unstable; urgency=low
+
+ * Changed README and INSTALL
+ * fix spectrograms names
+ * accept underscore in viz id
+ * setting version to 'SVN' on trunk
+ * fix items and collections fields display ordering + make item title
+ * optional for django admin
+ * use css overflow instead of iframe for visualization scrolling
+ * Added metadata to OGG stream
+ * Tuned max sample lengths to reasonable values
+ * Tuned max sample lengths to reasonable values
+ * Changed time_limit to 300 (5mn) for Octave
+ * Added main tags to streamed mp3. Closes: #9
+ * Made Octave quiet
+ * Downsampling data for waveform2
+ * Add an iframe to scroll on visualizers
+ * Cleaned OctaveCoreVisualizer to avoid wrong subprocess calls
+ * Fix the maximum displayed length to 10s max for Octave visualizers
+ * Added octave2.9 dependency
+ * Added Waveform2 and Spectrogram2 visualization components
+ * Clean up
+ * Removed old/
+ * fix #28: use item id from export filename. WARNING: require crem data r3
+ * make htdocs variable dynamic and add draft for 0.3 INSTALL
+ * Fixed ExportProcessError
+ * Remove sox piping for FLAC
+ * simplify !TelemetaError
+ * Create ExportProcessError class in export.api
+ * cast double literals (breaks on Debian Sarge)
+ * remove extra space in M3U playlist (failed with Amarok)
+ * Fixed #26 partially for downloading but not for flash playing
+ * remove unused logger instance and duplicated telemeta version
+ * variable, use telemeta url variable + new telemeta_url template tag
+ * soften footer logo
+ * decrease homepage links size
+ * tracify menu bar, add footer, homepage links and fix items list in
+ * collection detail
+ * add version in __init__.py and telemeta_version template tag
+ * optimize and rename BackupBuilder to CollectionSerializer
+ * add method to retrieve items that do not belong to any collection
+ * display id on item detail
+ * rename !FloatField to !DecimalField for django svn !r5302
+ * Cleaned mp3 exporter
+ * Fixed syntax problem
+ * Restore Jeroen Wijering's Flash MP3 Player
+ * add backup core and command line tool
+ * consolidate MediaCore.to_dom() and fix encoding
+ * Adds main id3 tags during MP3 streaming
+ * Moved audio generator to ExporterCore.core_process
+ * add variable for static files root
+ * use named urls for static files
+ * add to_dom() to models
+ * renaming views to web
+ * renaming web.py to base.py
+ * add geographic navigator, coverage dc mapping to collection + other fixes
+ * added collection playlists in m3u and xspf formats
+ * embedded flash mp3 player in both collection and item displays.
+ * Remark: there are two players available, you can switch them in the templates
+ * media objects IDs are now validated at model level
+ * experimenting new logo by Julia
+ * trying some new layout + cleaned css
+ * renamed "dictionaries" to "enumerations"
+ * new PublishingStatus enumerations model (you simply need to syncdb)
+ * Telemeta logos v1
+ * convert DC elements values to strings
+ * fix doblock and spacing
+ * add default empty elements attribute for code clarity
+ * fix css issue between visualization and submenu
+ * add dublin core modelization and new to_dublincore() model methods
+ * improved dublin core mapping
+ * add dublin core HTML-based views of collections and items
+ * fixed URL handling with non aplhanumeric record IDs
+ * fix #21: the web view now properly handle export streams
+ * turn the model list() method into the tolist template filter
+ * new submenu template block + css fixes
+ * Tried new stream function in web.py, but....
+ * Partially fixes #19 by changing MediaCollection.copied_from properties.
+ * Made all exporters generators. Closes: #8 . Input audio raw data is
+ * now passed into sox while encoding (no decoding needed anymore...)
+ * Clean some stings
+ * Made Mp3Exporter a generator. The exported file is still written in the cache.
+ * misc template fixes
+ * fix items urls
+ * add LEM item fields + other fixes
+ * add paging and simplify layout
+ * bundle snack python bindings
+ * svn:ignore .pyc and .swp files
+ * add templatetags
+ * use named urls, add paging to collection, and others
+ * add LEM collection fields
+ * change visualization layout and waveform color
+ * add visualization to web item detail view
+ * add visualization components (waveform, spectrogram)
+ * ticket #10: mark IExporter.process() options argument as optional
+ * Replaced all tabs by spaces in export. Closes: #18
+ * typo
+ * added license headers + cleanup
+ * Temporary fixed mp3 date in urls.py
+ * created htdocs dir, images subdir and moved the css dir
+ * renamed the core css stylesheet
+ * updated css, new stylesheet for the admin
+ * Fixed indent pb
+ * Fixed ogg verbose
+ * Made options optional. Closes: #10
+ * Added Mp3Exporter with (very) partial mapping of DublinCore fields.
+ * fixed quick search form css/layout on Firefox
+ * No metadata in caching path (just ext/item_id.ext). No verbose by default
+ * web interface: added quick search and fixed export download
+ * Added Samalyse to COPYING
+ * coupled the web interface with the export layer
+ * improved collections and items browsing
+ * minor CSS improvements
+ * now using Django typical models instead of "dynamic" ones
+ * made simple models based on Dublin Core elements
+ * Fixed Default call and verbose
+ * Move default.py to old/
+ * Fixed export verbose mode in option dict (see export_test)
+ * Added Trac Components links. Added options dict to exporter arguments
+ * Add pre and post process in CoreExporter. Main calls to OggExporter
+
+ -- Guillaume Pellerin <yomguy@altern.org> Wed, 28 May 2007 22:28:42 +0200
+
+telemeta (0.2.5-2) unstable; urgency=low
+
+ * Fixed --help page
+
+ -- Guillaume Pellerin <yomguy@altern.org> Wed, 10 Jan 2007 12:01:13 +0100
+
+telemeta (0.2.5-1) unstable; urgency=low
+
+ * Fixed --create and --backup option behaviors, thanks to Olivier Guilyardi
+ * Created the Collection class and interface
+ * Fixed error messages
+ * Made the collection XML file saved in collection dir AND user default dir
+
+ -- Guillaume Pellerin <yomguy@altern.org> Mon, 8 Jan 2007 02:50:04 +0100
+
+telemeta (0.2.4-3) unstable; urgency=low
+
+ * Fixed README and INSTALL pages
+
+ -- Guillaume Pellerin <yomguy@altern.org> Thu, 4 Jan 2007 18:56:05 +0100
+
+telemeta (0.2.4-2) unstable; urgency=low
+
+ * Fixed --help menu and man page
+
+ -- Guillaume Pellerin <yomguy@altern.org> Wed, 3 Jan 2007 22:18:05 +0100
+
+telemeta (0.2.4-1) unstable; urgency=low
+
+ * Rewrited the whole main structure
+ * Defined a class and xml for consts
+ * Fixed --erase-media option
+ * Fixed --recover option
+ * Added --create option: creates a database repository and default database xml
+ * Added --backup option: backups a media to the database
+ * Added --album option: proccesses an entire directory (one shot album)
+ * Added --from-xml: takes tags and opts in original xml source
+ * Added --all-default: chooses default argument for all question
+ * Added --par2 : forces par2 file creation
+ * Added --rsync : synchronizes database to a remote server (ssh+rsync)
+ * Added --clean-strings : cleans input strings
+
+ -- Guillaume Pellerin <pellerin@parisson.com> Wed, 3 Jan 2007 18:55:52 +0100
+
+telemeta (0.2.3-3) unstable; urgency=low
+
+ * Fixed --force mode bug
+
+ -- Guillaume Pellerin <pellerin@parisson.com> Wed, 22 Nov 2006 12:33:52 +0100
+
+telemeta (0.2.3-2) unstable; urgency=low
+
+ * fixed non audio file detection with 'file' command
+
+ -- Guillaume Pellerin <pellerin@parisson.com> Wed, 15 Nov 2006 15:30:10 +0100
+
+telemeta (0.2.3-1) unstable; urgency=low
+
+ * Added python-xml parser dependency :
+ xml tag files are now exported to user default directory and in dir_in.
+ * Added par2 dependency : creates secure recovery key file with the "par2" method
+ * Added python-mutagen dependency : new tagging functions
+ * Cleaned : audio functions
+ * Fixed : help page
+ * Debianized
+
+ -- Guillaume Pellerin <pellerin@parisson.com> Tue, 01 Nov 2006 00:25:46 +0100
+
+telemeta (0.2.2) unstable; urgency=low
+
+ * Defined : the tag and option lists
+ * Created : main audio functions
+ * Created : main tags functions
+
+ -- Guillaume Pellerin <pellerin@parisson.com> Tue, 14 Jul 2006 00:00:01 +0100
+
+telemeta (0.1) unstable; urgency=low
+
+ * Initial release
+ * Created : First flac, ogg, mp3 exporting, tagging with basic functions
+
+ -- Guillaume Pellerin <pellerin@parisson.com> Tue, 01 May 2006 23:45:42 +0200
--- /dev/null
+Source: telemeta
+Section: sound
+Priority: optional
+Maintainer: Guillaume Pellerin <yomguy@altern.org>
+Uploaders: Paul Brossier <piem@debian.org>
+Build-Depends: debhelper (>= 5.0.0), docbook-to-man, cdbs (>= 0.4.42), python-setuptools (>= 0.6b3), python-support (>= 0.3), python-all-dev (>= 2.3.5-11)
+Standards-Version: 3.8.0
+
+Package: telemeta
+Architecture: any
+Depends: ${python:Depends}, python-xml, python-mutagen, python-django (>= 1.0-1), python-imaging (>= 1.1.6), sox (>= 14.2.0-1), vorbis-tools, flac, normalize-audio, python-mysqldb, mysql-server, octave2.9, python-tk, libgd2-xpm, libsndfile1 (>= 1.0.17), python-numpy, python-ctypes (>= 1.0.1), python-scikits-audiolab (>= 0.7)
+Recommends: lame, vamp-examples
+Homepage: http://telemeta.org
+Suggests: ecasound, festival, par2
+Description: web frontend to backup, analyse, transcode and stream any audio content with its metadata
+Telemeta is a web audio archiving program which introduces useful and secure methods to
+backup, index, transcode, analyse and publish any digitalized audio file with its metadata.
+It is dedicated to professionnals who wants to easily backup and publish documented sounds
+from collections of vinyls, magnetic tapes or audio CDs over a strong database, in accordance
+with open standards.
+
+Here are the main features of Telemeta:
+ * Secure archiving, editing and publishing of audio files over internet.
+ * "On the fly" transcoding and metadata encapsulating (FLAC, OGG, MP3, WAV, etc..)
+ * User friendly web frontend including workflows and high level search methods
+ * Smart dynamical and skinnable audio player (thanks to Timeside and soundmanager2)
+ * "On the fly" complex audio analyzers based on an easy plugin architecture
+ * Strong SQL backend
+ * XML metadata backup
+ * Auto audio-marking with synthetized voices reading metadata (optional)
+ * Anti-corruption data security management with par2 recovery keys
+ * Data synchronizing over remote servers (rsync + ssh methods)
+
+The Telemeta data model is based on 'collections' and 'items'. A collection is described
+by its metadata and includes original audio items (sounds) and its own metadata. This
+existing model has been designed to fit the one of the French Centre of Etnomusicology (CREM)
+but could be easily adapted/overrided to sue other data structures.
+
--- /dev/null
+This package was debianized by Guillaume Pellerin <yomguy@altern.org> on
+Thu, 17 Aug 2006 22:42:14 +0200.
+
+It was downloaded from http://svn.parisson.org/telemeta/
+
+Upstream Authors: Guillaume Pellerin <pellerin@parisson.com>
+ Olivier Guilyardi <olivier@samalyse.com>
+
+Copyright:
+
+ Copyright (C) 2006-2008 Parisson SARL
+ Copyright (C) 2006-2008 Samalyse SARL
+
+License:
+
+ This software is governed by the CeCILL license under French law and
+ abiding by the rules of distribution of free software. You can use,
+ modify and/ or redistribute the software under the terms of the CeCILL
+ license as circulated by CEA, CNRS and INRIA at the following URL
+ "http://www.cecill.info".
+
+ As a counterpart to the access to the source code and rights to copy,
+ modify and redistribute granted by the license, users are provided only
+ with a limited warranty and the software's author, the holder of the
+ economic rights, and the successive licensors have only limited
+ liability.
+
+ In this respect, the user's attention is drawn to the risks associated
+ with loading, using, modifying and/or developing or reproducing the
+ software by the user in light of its specific status of free software,
+ that may mean that it is complicated to manipulate, and that also
+ therefore means that it is reserved for developers and experienced
+ professionals having in-depth computer knowledge. Users are therefore
+ encouraged to load and test the software's suitability as regards their
+ requirements in conditions enabling the security of their systems and/or
+ data to be ensured and, more generally, to use and operate it in the
+ same conditions as regards security.
+
+ The fact that you are presently reading this means that you have had
+ knowledge of the CeCILL license and that you accept its terms.
+
+The Debian packaging is (C) 2008, Guillaume Pellerin <yomguy@parisson.com> and
+is licensed under the CeCILL License, see "http://www.cecill.info".
+
+
--- /dev/null
+2
\ No newline at end of file
--- /dev/null
+#!/usr/bin/make -f
+
+DEB_PYTHON_SYSTEM := pysupport
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/python-distutils.mk
+
+DEB_PYTHON_SETUP_CMD := setup.py
+DEB_COMPRESS_EXCLUDE := .pyc
+DEB_STRIP_EXCLUDE := .pyc
+
--- /dev/null
+.TH "telemeta" "1"
+.SH "NAME"
+telemeta \(em backups, transcodes, tags and marks any audio content with metadata
+.SH "SYNOPSIS"
+.PP
+\fBtelemeta\fR [\fB\fIOPTIONS\fR\fP] [\fICOLLECTION\fR] [\fB\fIOPTIONS\fR\fP] [\fB\fIMEDIA\fR\fP]
+.SH "DESCRIPTION"
+.PP
+\fBtelemeta\fR is an audio tool which creates audio transcoded collections fast from fresh mastered files. It can be useful to backup digitalized audio media from vinyls, old tapes or whatever and include them in a database.
+.PP
+Telemeta first creates a simple file structure where the original sounds will be backuped. The files can be transcoded to WAV, FLAC, MP3 and OGG including the corresponding tags.
+.PP
+Here are some cool functions:
+.IP "\fB\fP" 10
+\- XML generation for metadata tags of backuped WAV
+.IP "" 10
+\- Audio marking from a given file or from tags thanks to the Festival speech systhesis tool
+.IP "" 10
+\- File corruption security with par2 recovery files
+.IP "" 10
+\- Collection synchronizing to remote servers (ssh+rsync)
+.IP "" 10
+\- Modify metadata from XML or interactive shell
+.SH "OPTIONS"
+.PP
+These programs follow the usual GNU command line syntax,
+with long options starting with two dashes (`\-'). A summary of
+options is included below. For a complete description, see the
+\fBInfo\fP files.
+.IP "\fB\-\-create\fP " 10
+creates a collection repository
+.IP "\fB\-\-backup\fP " 10
+backups and transcodes wave files to a collection
+.IP "\fB\-\-album\fP " 10
+proccesses an entire directory (one shot album)
+.IP "\fB\-\-backup\fP " 10
+backups a media to the collection
+.IP "\fB\-\-from-xml\fP " 10
+takes tags and opts in original xml source
+.IP "\fB\-\-force\fP " 10
+forces file conversion (no audio test)
+.IP "\fB\-\-par2\fP " 10
+forces par2 security file creation
+.IP "\fB\-\-all-default\fP " 10
+chooses default argument for all question
+.IP "\fB\-\-recover\fP " 10
+check an repair the backuped media with the previously created "par2" security files
+.IP "\fB\-\-rsync\fP " 10
+synchronizes collection to a remote server (ssh+rsync)
+.IP "\fB\-\-erase\fP " 10
+erases a collection (flac, ogg, mp3 only !)
+.IP "\fB\-\-help\fP " 10
+Show summary of options.
+.IP "\fB\-\-version\fP " 10
+Show version of program.
+.SH "EXAMPLES"
+.PP
+\fBtelemeta \-\-create my_collection\fR
+.PP
+\fBtelemeta \-\-backup my_collection file.wav\fR
+.PP
+\fBtelemeta \-\-backup my_collection \-\-album /path/to/directory/\fR
+.PP
+\fBtelemeta \-\-backup my_collection \-\-album \-\-par2 \-\-rsync /path/to/directory/\fR
+.PP
+\fBtelemeta \-\-backup my_collection \-\-album \-\-par2 \-\-rsync \-\-force /path/to/directory/\fR
+.SH "DOWNLOAD"
+.PP
+Telemeta is written in python. So it doesn't require any compilation step.
+.PP
+On Debian or Ubuntu just add these lines to your /etc/apt/sources-list:
+.PP
+\fBdeb http://yomix.org/debian/ binary/\fR
+.PP
+\fBdeb-src http://yomix.org/debian/ source/\fR
+.PP
+Then,
+.PP
+\fBsudo apt-get update\fR
+.PP
+\fBsudo apt-get install telemeta\fR
+.PP
+On other linux platforms, \fIdownload (link to URL http://yomix.org/telemeta/download/) \fR the lastest .tar.gz archive, uncompress it, go into the created directory and just type this with your favorite shell :
+.PP
+\fBpython install.py\fR
+.PP
+See README and INSTALL file for more informations.
+.PP
+You can also get the lastest version of Telemeta with subversion (just type 'enter' for the password:
+.PP
+svn co http://svn.yomix.org/svn/telemeta/trunk telemeta \-\-username=anonymous
+.SH "DEPENDS"
+.PP
+python (>= 2.3.5-7), python-xml, python-central (>= 0.5), python-mutagen, sox, vorbis-tools, flac, lame, normalize-audio, ecasound, festival, par2
+.SH "SEE ALSO"
+.PP
+The program is documented fully by Guillaume Pellerin. More info at \fI\fIhttp://svn.yomix.org/telemeta/ (link to URL http://svn.yomix.org/telemeta/) \fR\fP.
+.SH "AUTHOR"
+.PP
+This manual page was written by Guillaume Pellerin <yomguy@altern.org> for
+the \fBDebian\fP system (but may be used by others). Permission is
+granted to copy, distribute and/or modify this document under
+the terms of the GNU General Public License, Version 2 any
+later version published by the Free Software Foundation.
+
+.PP
+On Debian systems, the complete text of the GNU General Public
+License can be found in /usr/share/common-licenses/GPL.
+
+.\" created by instant / docbook-to-man, Fri 26 Jan 2007, 00:26
--- /dev/null
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+
+<!-- Process this file with docbook-to-man to generate an nroff manual
+ page: `docbook-to-man manpage.sgml > manpage.1'. You may view
+ the manual page with: `docbook-to-man manpage.sgml | nroff -man |
+ less'. A typical entry in a Makefile or Makefile.am is:
+
+manpage.1: manpage.sgml
+ docbook-to-man $< > $@
+
+
+ The docbook-to-man binary is found in the docbook-to-man package.
+ Please remember that if you create the nroff version in one of the
+ debian/rules file targets (such as build), you will need to include
+ docbook-to-man in your Build-Depends control field.
+
+ -->
+
+ <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+ <!ENTITY dhfirstname "<firstname>Guillaume</firstname>">
+ <!ENTITY dhsurname "<surname>Pellerin</surname>">
+ <!-- Please adjust the date whenever revising the manpage. -->
+ <!ENTITY dhdate "<date>August 17, 2006</date>">
+ <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+ allowed: see man(7), man(1). -->
+ <!ENTITY dhsection "<manvolnum>1</manvolnum>">
+ <!ENTITY dhemail "<email>yomguy@altern.org</email>">
+ <!ENTITY dhusername "Guillaume Pellerin">
+ <!ENTITY dhucpackage "<refentrytitle>telemeta</refentrytitle>">
+ <!ENTITY dhpackage "telemeta">
+
+ <!ENTITY debian "<productname>Debian</productname>">
+ <!ENTITY gnu "<acronym>GNU</acronym>">
+ <!ENTITY gpl "&gnu; <acronym>GPL</acronym>">
+]>
+
+<refentry>
+ <refentryinfo>
+ <address>
+ &dhemail;
+ </address>
+ <author>
+ &dhfirstname;
+ &dhsurname;
+ </author>
+ <copyright>
+ <year>2006-2007</year>
+ <holder>&dhusername;</holder>
+ </copyright>
+ &dhdate;
+ </refentryinfo>
+ <refmeta>
+ &dhucpackage;
+
+ &dhsection;
+ </refmeta>
+ <refnamediv>
+ <refname>&dhpackage;</refname>
+
+ <refpurpose>backups, transcodes, tags and marks any audio content with metadata</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <arg><option><replaceable>OPTIONS</replaceable></option></arg>
+ <arg><replaceable>COLLECTION</replaceable></arg>
+ <arg><option><replaceable>OPTIONS</replaceable></option></arg>
+ <arg><option><replaceable>MEDIA</replaceable></option></arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+ <refsect1>
+ <title>DESCRIPTION</title>
+
+ <para><command>&dhpackage;</command> is an audio tool which creates audio transcoded collections fast from fresh mastered files. It can be useful to backup digitalized audio media from vinyls, old tapes or whatever and include them in a database.</para>
+ <para>Telemeta first creates a simple file structure where the original sounds will be backuped. The files can be transcoded to WAV, FLAC, MP3 and OGG including the corresponding tags.</para>
+ <para>Here are some cool functions:</para>
+ <variablelist>
+ <varlistentry>
+ <term><option></option></term>
+ <listitem>
+ <para>- XML generation for metadata tags of backuped WAV</para>
+ <para>- Audio marking from a given file or from tags thanks to the Festival speech systhesis tool</para>
+ <para>- File corruption security with par2 recovery files</para>
+ <para>- Collection synchronizing to remote servers (ssh+rsync)</para>
+ <para>- Modify metadata from XML or interactive shell</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1>
+ <title>OPTIONS</title>
+
+ <para>These programs follow the usual &gnu; command line syntax,
+ with long options starting with two dashes (`-'). A summary of
+ options is included below. For a complete description, see the
+ <application>Info</application> files.</para>
+
+ <variablelist>
+ <varlistentry>
+ <term><option>--create</option>
+ </term>
+ <listitem>
+ <para>creates a collection repository</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--backup</option>
+ </term>
+ <listitem>
+ <para>backups and transcodes wave files to a collection</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--album</option>
+ </term>
+ <listitem>
+ <para>proccesses an entire directory (one shot album)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--backup</option>
+ </term>
+ <listitem>
+ <para>backups a media to the collection</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--from-xml</option>
+ </term>
+ <listitem>
+ <para>takes tags and opts in original xml source</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--force</option>
+ </term>
+ <listitem>
+ <para>forces file conversion (no audio test)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--par2</option>
+ </term>
+ <listitem>
+ <para>forces par2 security file creation</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--all-default</option>
+ </term>
+ <listitem>
+ <para>chooses default argument for all question</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--recover</option>
+ </term>
+ <listitem>
+ <para>check an repair the backuped media with the previously created "par2" security files</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--rsync</option>
+ </term>
+ <listitem>
+ <para>synchronizes collection to a remote server (ssh+rsync)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--erase</option>
+ </term>
+ <listitem>
+ <para>erases a collection (flac, ogg, mp3 only !)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--help</option>
+ </term>
+ <listitem>
+ <para>Show summary of options.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>--version</option>
+ </term>
+ <listitem>
+ <para>Show version of program.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>EXAMPLES</title>
+ <para><command>telemeta --create my_collection</command></para>
+ <para><command>telemeta --backup my_collection file.wav</command></para>
+ <para><command>telemeta --backup my_collection --album /path/to/directory/</command></para>
+ <para><command>telemeta --backup my_collection --album --par2 --rsync /path/to/directory/</command></para>
+ <para><command>telemeta --backup my_collection --album --par2 --rsync --force /path/to/directory/</command></para>
+ </refsect1>
+
+ <refsect1>
+ <title>DOWNLOAD</title>
+ <para>Telemeta is written in python. So it doesn't require any compilation step.</para>
+ <para>On Debian or Ubuntu just add these lines to your /etc/apt/sources-list:</para>
+
+ <para><command>deb http://debian.parisson.org/ binary/</command></para>
+ <para><command>deb-src http://debian.parisson.org/ source/</command></para>
+
+ <para>Then,</para>
+
+ <para><command>sudo apt-get update</command></para>
+ <para><command>sudo apt-get install telemeta</command></para>
+
+ <para>On other linux platforms, <ulink url="http://debian.parisson.org/">download</ulink> the lastest tar.gz archive, uncompress it, go into the created directory and just type this with your favorite shell :</para>
+
+ <para><command>python install.py</command></para>
+
+ <para>See README and INSTALL file for more informations.</para>
+ <para>You can also get the lastest version of Telemeta with subversion (just type 'enter' for the password:</para>
+ <para>svn co http://svn.parisson.org/svn/telemeta/trunk telemeta --username=anonymous</para>
+
+ </refsect1>
+
+ <refsect1>
+ <title>DEPENDS</title>
+
+ <para>python (>= 2.3.5-7), python-xml, python-central (>= 0.5), python-mutagen, sox, vorbis-tools, flac, lame, normalize-audio, ecasound, festival, par2</para>
+ </refsect1>
+
+ <refsect1>
+ <title>SEE ALSO</title>
+
+ <para>The program is documented fully by Guillaume Pellerin. More info at <citetitle><ulink url="http://svn.parisson.org/telemeta/">http://svn.parisson.org/telemeta/</ulink></citetitle>.</para>
+ </refsect1>
+
+ <refsect1>
+ <title>AUTHOR</title>
+
+ <para>This manual page was written by &dhusername; <&dhemail;> for
+ the &debian; system (but may be used by others). Permission is
+ granted to copy, distribute and/or modify this document under
+ the terms of the &gnu; General Public License, Version 2 any
+ later version published by the Free Software Foundation.
+ </para>
+ <para>
+ On Debian systems, the complete text of the GNU General Public
+ License can be found in /usr/share/common-licenses/GPL.
+ </para>
+
+ </refsect1>
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
+
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 11.0, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->
+<svg:svg
+ xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"
+ xmlns:xap="http://ns.adobe.com/xap/1.0/"
+ xmlns:x="adobe:ns:meta/"
+ xmlns:ns0="http://ns.adobe.com/SaveForWeb/1.0/"
+ xmlns:ns="http://ns.adobe.com/Variables/1.0/"
+ xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ i:viewOrigin="282.0176 351.5405"
+ i:rulerOrigin="-240 -200"
+ i:pageBounds="240 400 560 200"
+ width="231.896"
+ height="102.419"
+ viewBox="0 0 231.896 102.419"
+ overflow="visible"
+ enable-background="new 0 0 231.896 102.419"
+ xml:space="preserve"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45.1"
+ sodipodi:docname="logo_telemeta.svg"
+ sodipodi:docbase="/home/momo/dev/telemeta/telemeta/design"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"><svg:defs
+ id="defs50" /><sodipodi:namedview
+ inkscape:window-height="995"
+ inkscape:window-width="1392"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:zoom="1.5394832"
+ inkscape:cx="115.948"
+ inkscape:cy="51.209499"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:current-layer="svg2" />
+ <svg:metadata
+ id="metadata4">
+ <ns:variableSets>
+ <ns:variableSet
+ varSetName="binding1"
+ locked="none">
+ <ns:variables />
+ <ns:sampleDataSets />
+ </ns:variableSet>
+ </ns:variableSets>
+ <ns0:sfw>
+ <ns0:slices />
+ <ns0:sliceSourceBounds
+ y="249.121"
+ x="282.018"
+ height="102.419"
+ width="231.896"
+ bottomLeftOrigin="true" />
+ </ns0:sfw>
+<xpacket /><x:xmpmeta
+ x:xmptk="XMP toolkit 3.0-29, framework 1.6">
+
+<svg:metadata
+ id="metadata52"><rdf:RDF>
+
+ <rdf:Description
+ rdf:about="">
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ <xap:CreateDate>2007-06-11T17:47:57Z</xap:CreateDate>
+ <xap:ModifyDate>2007-06-11T19:05:18Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li
+ rdf:parseType="Resource">
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>116</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
+AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
+DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
+Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAdAEAAwER
+AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
+AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
+UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
+1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
+qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
+obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
+0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYqwjzR+Yf1W5b
+TdFjF1e14NNTmqt/Kij7bfh88yceC9zyQSkqeUfPmu/vtUujBG+/Cdz0PhEnwr8jTLPFhHkikSn5
+R3CAOuqhZQdqQkU/2XOv4ZH8z5JpExaZ+YugfvLa4XVrRftW7MztxHgHow9uLfRgMscvJd2T+XfM
+9lrcLhFaC8h2ubOTZ0PT2qK98pnjMU2nGVq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
+FXYq7FXYq7FXYq7FXYq7FWLeedYvYYbfRtMqdT1MlF4mhSPozV7V6V7Cpy7DEczyCCo2em+XPIui
+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</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+<cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></svg:metadata></x:xmpmeta>
+ <xpacket />
+ </svg:metadata>
+ <svg:switch
+ id="switch6">
+ <svg:foreignObject
+ requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ id="foreignObject8">
+ <i:pgfRef
+ xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </svg:foreignObject>
+ <svg:g
+ i:extraneous="self"
+ id="g10">
+ <svg:g
+ id="logo_telemeta"
+ i:layer="yes"
+ i:dimmedPercent="3"
+ i:rgbTrio="#4F008000FFFF">
+ <svg:g
+ id="g13">
+ <svg:path
+ i:knockout="Off"
+ fill="#9291B7"
+ d="M57.119,9.701L57.119,9.701c0.001-0.003,0-0.003-0.005-0.006 C51.827,2.083,42.232-1.563,33.222,0.631C24.209,2.825,17.36,10.47,16.16,19.669c0,0-0.003,0-0.005,0.007l0,0 c-0.002,0.013-0.004,0.029-0.006,0.044l1.372,0.228c1.434-7.288,8.103-13.583,16.59-15.653 c8.484-2.063,17.295,0.46,21.919,6.271l1.118-0.827C57.142,9.73,57.13,9.716,57.119,9.701z"
+ id="path15" />
+ <svg:path
+ i:knockout="Off"
+ fill="#6E6E99"
+ d="M23.844,23.327c1.042-5.32,5.921-9.913,12.119-11.417 c6.201-1.514,12.635,0.323,16.017,4.567l1.116-0.832c-0.01-0.016-0.019-0.027-0.029-0.041l0,0v-0.001 C49.108,9.919,41.943,7.204,35.22,8.839c-6.727,1.638-11.837,7.339-12.741,14.206c0,0.002-0.003,0.008-0.005,0.009h0.005 c-0.003,0.017-0.009,0.033-0.011,0.048L23.844,23.327z"
+ id="path17" />
+ <svg:path
+ i:knockout="Off"
+ fill="#4A477A"
+ d="M51.48,22.287c-3.218-4.63-8.828-6.754-14.31-5.42 c-5.42,1.32-9.525,5.912-10.221,11.439l1.372,0.217c0.81-4.162,4.631-7.758,9.513-8.943c4.868-1.188,9.917,0.244,12.56,3.576 l1.121-0.832c-0.014-0.011-0.021-0.024-0.034-0.034h0.002C51.483,22.285,51.481,22.285,51.48,22.287z"
+ id="path19" />
+ <svg:g
+ id="g21">
+ <svg:path
+ i:knockout="Off"
+ fill="#9291B7"
+ d="M0.437,61.69L0.437,61.69c-0.003,0.005-0.003,0.005-0.003,0.016 c-2.277,14.258,4.563,28.717,17.059,35.98c12.494,7.272,28.444,6.074,39.726-2.968c0,0,0.001,0.002,0.01-0.005l0,0 c0.019-0.01,0.038-0.027,0.06-0.043l-1.297-1.733c-9.48,6.639-23.767,6.508-35.54-0.333 C8.687,85.764,1.513,73.418,2.596,61.897l-2.148-0.276C0.441,61.636,0.438,61.666,0.437,61.69z"
+ id="path23" />
+ <svg:path
+ i:knockout="Off"
+ fill="#4A477A"
+ d="M52.531,82.311c-6.915,4.855-17.354,4.746-25.942-0.256 c-8.601-4.997-13.845-14.007-13.063-22.422l-2.152-0.279c-0.006,0.031-0.006,0.053-0.008,0.079l0,0l-0.001,0.002 c-1.689,10.662,3.425,21.45,12.743,26.873c9.325,5.423,21.225,4.532,29.65-2.204c0.007-0.007,0.012-0.009,0.017-0.007 l-0.005-0.005c0.025-0.016,0.05-0.027,0.065-0.043L52.531,82.311z"
+ id="path25" />
+ <svg:path
+ i:knockout="Off"
+ d="M20.357,53.638c-1.381,8.681,2.628,17.121,10.226,21.541c7.513,4.371,17.084,3.652,23.834-1.809 l-1.308-1.732c-5.402,3.808-13.576,3.719-20.342-0.222c-6.754-3.921-10.881-10.984-10.253-17.575l-2.154-0.278 c0.004,0.026-0.003,0.047-0.003,0.072l-0.002,0.002C20.355,53.637,20.354,53.642,20.357,53.638z"
+ id="path27" />
+ </svg:g>
+ <svg:path
+ i:knockout="Off"
+ d="M49.258,59.804c-0.215,0.356-0.556,0.591-0.933,0.681c-0.375,0.093-0.786,0.043-1.141-0.173 l-5.254-3.183l-5.256-3.183c-0.356-0.216-0.591-0.558-0.685-0.932c-0.091-0.378-0.04-0.788,0.175-1.144l3.184-5.255 l3.185-5.254c0.216-0.356,0.557-0.59,0.934-0.682c0.375-0.094,0.786-0.043,1.141,0.17l5.255,3.185l5.254,3.186 c0.355,0.214,0.591,0.557,0.682,0.931c0.094,0.376,0.044,0.786-0.172,1.142l-3.185,5.256L49.258,59.804z"
+ id="path29" />
+ <svg:path
+ i:knockout="Off"
+ fill="#4A477A"
+ d="M40.835,39.122c0.427-0.706,1.104-1.2,1.907-1.4 c0.802-0.193,1.631-0.066,2.335,0.357c0,0,4.465,2.707,8.011,4.857l1.662-2.744c0.501-0.831,0.236-1.921-0.596-2.425 l-12.28-7.441c-0.828-0.504-1.918-0.235-2.422,0.593l-7.443,12.285c-0.501,0.83-0.231,1.919,0.596,2.423l3.137,1.9 L40.835,39.122z"
+ id="path31" />
+ <svg:path
+ i:knockout="Off"
+ d="M82.463,54.618c-1.339,0-2.109-0.156-2.424-0.49c-0.313-0.328-0.459-1.102-0.459-2.435V43.87v-0.169 h0.169h3.648v-5.643h-3.648H79.58v-0.169v-7.744h-6.93v7.744v0.169h-0.169h-1.393v5.643h1.485h0.169v0.169v8.698 c0,3.006,0.481,5.089,1.43,6.188c0.938,1.09,2.705,1.642,5.253,1.642h3.188l1.601-5.78H82.463z"
+ id="path33" />
+ <svg:path
+ i:knockout="Off"
+ d="M208.41,54.618c-1.337,0-2.109-0.156-2.421-0.491c-0.313-0.334-0.458-1.107-0.458-2.437v-7.817 v-0.169h0.167h3.648v-5.646h-3.648h-0.167v-0.169v-7.744h-6.933v7.744v0.169h-0.167h-1.4v5.646h1.495h0.17v0.169v8.695 c0,3.006,0.479,5.089,1.426,6.188c0.942,1.09,2.708,1.642,5.248,1.642h3.188l1.603-5.78H208.41z"
+ id="path35" />
+ <svg:path
+ i:knockout="Off"
+ d="M102.853,54.618c-1.798,0-3.357-0.142-4.634-0.42l-0.421-0.092l0.372-0.219 c2.944-1.726,5.065-3.39,6.305-4.947c1.22-1.54,1.839-3.307,1.839-5.251c0-2.17-0.723-3.756-2.146-4.712 c-1.462-0.974-3.839-1.468-7.063-1.468c-3.866,0-6.669,0.7-8.33,2.08c-1.651,1.365-2.489,3.673-2.489,6.859 c0,4.259,1.336,7.684,3.971,10.18c2.635,2.503,6.239,3.771,10.714,3.771h2.492l1.571-5.78H102.853z M93.583,49.868 l-0.042-0.213c-0.186-0.934-0.28-1.812-0.28-2.609c0-2.37,1.279-3.572,3.802-3.572c1.516,0,2.284,0.475,2.284,1.41 c0,1.492-1.821,3.092-5.567,4.889L93.583,49.868z"
+ id="path37" />
+ <svg:path
+ i:knockout="Off"
+ d="M135.716,54.618c-1.803,0-3.362-0.142-4.635-0.42l-0.421-0.092l0.372-0.219 c2.936-1.72,5.057-3.386,6.303-4.947c1.223-1.537,1.843-3.303,1.843-5.251c0-2.167-0.725-3.752-2.153-4.712 c-1.456-0.974-3.83-1.468-7.057-1.468c-3.867,0-6.671,0.7-8.332,2.08c-1.656,1.369-2.493,3.676-2.493,6.859 c0,4.259,1.337,7.685,3.976,10.18c2.637,2.503,6.239,3.771,10.709,3.771h2.492l1.575-5.78H135.716z M126.438,49.868 l-0.04-0.215c-0.187-0.966-0.28-1.844-0.28-2.608c0-2.37,1.28-3.572,3.808-3.572c1.513,0,2.281,0.475,2.281,1.41 c0,1.495-1.823,3.094-5.571,4.889L126.438,49.868z"
+ id="path39" />
+ <svg:rect
+ x="109.454"
+ y="30.146"
+ i:knockout="Off"
+ width="6.879"
+ height="30.252"
+ id="rect41" />
+ <svg:path
+ i:knockout="Off"
+ d="M164.265,44.397c0.436,0.452,0.647,1.295,0.647,2.578v13.423h6.885V47.526 c0-3.927-0.589-6.533-1.751-7.748c-1.151-1.218-3.632-1.836-7.367-1.836h-20.48v22.456h6.882V43.89v-0.168h0.169h4.138h0.168 v0.168v16.508h6.888V43.89v-0.168h0.169h1.099C162.997,43.721,163.835,43.943,164.265,44.397z"
+ id="path43" />
+ <svg:path
+ i:knockout="Off"
+ d="M190.965,54.618c-1.793,0-3.353-0.141-4.632-0.418l-0.422-0.091l0.372-0.22 c2.934-1.725,5.055-3.391,6.304-4.949c1.227-1.553,1.851-3.319,1.851-5.251c0-2.167-0.729-3.753-2.164-4.712 c-1.453-0.974-3.828-1.468-7.057-1.468c-3.863,0-6.666,0.699-8.331,2.076c-1.651,1.373-2.489,3.681-2.489,6.861 c0,4.261,1.338,7.687,3.973,10.181c2.639,2.503,6.243,3.771,10.713,3.771h2.493l1.562-5.78H190.965z M181.688,49.862 l-0.04-0.215c-0.184-0.973-0.276-1.848-0.276-2.602c0-2.372,1.281-3.575,3.804-3.575c1.515,0,2.281,0.476,2.281,1.413 c0,1.5-1.822,3.098-5.568,4.884L181.688,49.862z"
+ id="path45" />
+ <svg:path
+ i:knockout="Off"
+ d="M211.859,46.628c0,4.199,1.383,7.576,4.106,10.039c2.731,2.477,6.447,3.731,11.044,3.731h4.886 v-22.34h-9.395c-3.714,0-6.45,0.685-8.134,2.034C212.703,41.429,211.859,43.627,211.859,46.628z M219.792,44.569 c0.63-0.485,1.738-0.732,3.299-0.732h1.755h0.167v0.168v10.443v0.204l-0.201-0.038c-1.776-0.341-3.235-1.213-4.33-2.592 c-1.095-1.368-1.652-3.027-1.652-4.929C218.829,45.91,219.153,45.061,219.792,44.569z"
+ id="path47" />
+ </svg:g>
+ </svg:g>
+ </svg:g>
+ </svg:switch>
+ <i:pgf
+ id="adobe_illustrator_pgf">
+
+ eJzsveuOJMlxJvq/gHqHOj8IDLGHtXG/EIsDZGREShSGFEFKCx1Ii0Frpjjqsz3ds32Rlvv0x67u
+5peIjLwMSUmVPj1VGZXhGeHhbmZu9tlnP/u/fvv7Xxy++/DPL7+on4unx4ef/ez48eXN5w8ff/lE
+h59+9e7dl0+fP+Khr37386eyfC7wU4dfDd/IJ//7y8dPbz+8/yX9jf96wvO/+pvn6fnn8GP6OR77
+u7ef373A0Xcfvv/wzeeXdy8/vHx+8/zm7c/dl0In85vP8Jnuv5blf62Kon8af1m0T7/9NX5k+vDl
+/Xdv338/ffjfv3yqhuqpasantmye6rbCv//129+9fIo/9FyUfYeffC6rsoSP189jWZdwTvncNkWL
+J84fvv3yw8v7z7/9+OHbl0+fjh/effj46ZdPxz++ef/06zffw1/ePP2/L+/effi3p+ndm2//J5xz
++FX7zentuxe4zx/efH7q6a4Pv6q/oZP//hOcBR3g73S8/+ZXP8Ch3798/gzXBn3TIP3uryb7lXD0
+ueuqHn40XYc/6q7pn746vvnDP8HlPn3/7sM/v3lHo/Vf4I9t243wY6hhBODHOMAn3768iz82dkPn
+f1T1WMEDefPl/Uv8waHoB/jRj11J/RXwwa/fvnvzKf5gMeLnurLFS+zhGXz165eP8YfgmeDVVU2N
+vZV4zle//vA/30Sfo/bVbz68TTqQC8Z/BQ7KV3/78c3775Orbuhi2qas8GLwS7/67cvnt59fnn58
++fivL++//ZfklLEr6Ab6gQaubuunr3734RN8LvhYX7UtfnlV0w8auN99+PL23bv0ItqSThixwxKv
+5StYE5+z9/qPv3v5ER/nR5gP/+PnMmv+7uWHH9/BzKdZ2xRwQ0/VOML/ze/6UZh19LFyeO4LeEgl
+Pjr4OZTVc4u/tMP4DGunkhP87H7517cv//bLp998eP8iU/jw8fPv3/4fmKp1VTzBOXL4d1/evXz8
++/dvP8NM7ejYyBP71x++e3kHX+1PP717Q/OZWun/L5/4uzcfv3/5DOvyw7svn0lGDO5bfvPlh6/f
+/PEFl1opX/K3P768/7sP/50u8xcV3EvfdtBfWcEaHvvmqeqo97Jsm6dmkG8r+Zj0il1gB9p1j6P/
+Wxjsv/349vu3739ZdhV0XQ6yLv/q49vv/LLsh+KpLvQH3chzWwX/6zv/P7lqGIPPn1/ey6pe3n93
+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
++CPueycCifceb37JN5X+iL5Wu1VpU5pHOnXso/3SOjY9wh9r8Nf6pX10Hctk7EM+i5Cu7FjY0oER
+SpuVH4OlMUm++r1Gdw3Q7jkyRau9IXsl940JYmq90k5VIt71c79ND/PWPL/fb/E+2Bu8i8MIXhtw
+zuu/OP/9+X9I//0vfvt3/+lX//RPv/7db63h3//6f/zmt9b0797+7D//w+/+6Z9//ec/+zf+FxZK
+oUgJdPOf3UiZLpd4pHYJazcP3Xbbvzz//p9n67+87W9/9fZf/9v29nc/Q/sv/locO75d4tk+YW1f
+xzb7rBrt2ae28dnfqh//UT8Hd2/RgidDngnLurOqlP1TYJu09fGn7+T3w7Z3uJeBjqNdnkSLlEsW
+OKQYoe5GDKYHRIHAJb434fy88Tj1QLg3kAKinZ//pQnYc8MQ0h12V1lGj35nwp3e6HeW687dat2k
+bwqgeGo87+CdeXx8ty5awgm/kx/a2/jOYI1F/fRGPn5Ky+vO8zE6bPZ9bCz2+D6MaMeINjZeX9/R
+6V31qK/G0BuvO1PrjdeHziW4853HMMx02J3WpfNa/d71jb/lN7bem6HfqT859DvbnWlsbJoJJNUa
+CZSNQEOjzcQpIgai76Lasc1TrjkL4+O1T/lFoLz1ibymJ/s7p8Zsj4/vhOfqfudhjSPD5TDz78rk
+fxi2vSR1MJofVjEryLDnnjv9dx+iWOAfikz3to1LJo6NgNBsKqSeriWT++ooI/28s3Xked05zt6B
++T23Xvw7LhkRII+PJ+viSP7zQh+aZs8nv46zZyM8eWjiHV9HcVwy2Zi0jEsmb3ldHanz/DEuGTXm
+4c7UemMcl0ywd9Zxyfg7eScQnyVda9WXjPcmjktmv6+jbHemsdFkHzxU45LhbE+98Zk4CbWNSyYY
+0acpv3PyUTpzDCuu9YlM45Jxdk7jQmj31VGe7ww3hsth5t+Vyccl8+N3mXhYCuGgCBdZGZIazzEy
+b70SrQCgcZ52TmoMjZvdaY/7nQ13nix4xM0bd2vcx8asd4ITalkb43xnTnl9fNfmjBxG1+PR7mxj
+Y7DOn8vuevwU2crcth3nv73vaDvXLJC8/hkNso7fPuyNbW4UNbeRHDaePH3bHj/V2mHkp5zflMt8
+uPOc51aogeBk770suwUhDW0NSIFi8u7s9fSyXz5N92jq+PHytvc3nqTOF/MkYx4qvk7/ZswzNG52
+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
+WLoYqU+gHhUFpAgoTab2gBH6A9FMmJusU/8x8wNhR8W/DtUdtlm8NGT8W3RvjCHVN8Rx2PMq7I0V
+ttEaRx+weOVkJNf8EyWl9j3eOAQnRzDmG+Y5BkiHUOq/DJL3EaH/HKH9L0D/ffPjv6xv2B9Xp/y1
+bO1dm/4FZetvfhuO+lY4/+X1Xv89/SaVld+S/p+/+3/V8Nvf/cO/+m/G1x+92f71v/n36//4d3/+
+h3/7n/+f//v/+p/+/r/8l3/8z3+G9d/+4//5H//81f7f/i9//vPff/7jP/ym5t9g/639dzL4v5H/
+8Xf/Vafb/m/6LX95pP/+9d/+08v2X39rv/0Pv/1v/3v67R/+1et/9z/rlOz0ekepdq2H1HU/tp9f
+bN3Kkz8f/zQw+b/8M57nf7RZeDzY338Zdhpc0f8+/Awpl0mRw58BNEbhf0ph+Wc0yE/9UB9KtobH
+s8YXSWbJ1GupYgGh8ZP2ZKwwLTVCIThTwlG6zVCyN5kc7cuIHPYP/sVq8BRlqFqeZzm1jdU/GPFL
+uVaeIuEv9xTPjBtRh22aHFiT7Xv0GUrH0x5FRLH3NDgydKxFe9wohmt4Pw0lo6u7oK18voxgcYDM
+G1TN5Rl6hhHYHZ1hqw9KYWq2dUb4ZebPRxHGbcEUqQCtf5TX7zbm2bxe+1KVj02B52z4ADVOV0pS
+e+t4mN0Wf6ztnWyWTCA2eIYfj8cbM29OtZOpd+YFI/9kL9LTgdYm9xzGPev7ly3WcW6JVM46S+6X
+P3cmSjosls2/SJUltfuTtFxIg1VtcTNaCKvG0bieX+4Tn8Rzbmuiz5WN2jnAau238BHOPFWyLfn7
+T9oheynv2VyewPKM6yTRv3s4a0ClM7IpRZBMD0Nfb1PlHsKQOhH9DFCsgYAsJGRF5bfWP0cWarO8
+++v1IKOnkvIuD7+FM9Zgt2ZVarN0gK4jbCDRkps4SI7OrthHq9grWrL+yUfLVk1gbd+MdXBlFP65
+t+n98ResC1UaMruJA9srLgzuROpi+iXH6I8N/a41vS3FhujH2Sv/xMIofrhOlZD3p3u55Fhfmuf9
+6Xa7ZnXb53rsX4c5+8K7xMpqkmjTufNta8VSv2Ym5Vv1/e12SJOLAVRQTa+RBqPse3M2xd4h1d9M
+AdoOyYTF2/xSGA9CrNgXDrGh6qw/aYaEhCwo5M53M/yGvTkyvu8vdyZWPBr12KSEL5CVT7dP213d
+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
+5e8WNPKqxXf2xpwet7xlZsfqz+ZfSQPWdvSNd86dMjDHBBENmjpn7rShRovocfNby7ZsXfne3DMz
+jwVDbl2wZG36rpXv3tqD6/bCD9LgNZ8/NZ5G+eTh18+9dWJpznHu6L4T77j3FnN6dcc+8fkaKOq2
+HM3dG3bXWz+lvbhi0c18CB00/9uNpl1PXkE6aTJ02i2zJ/RzsmVU6XL1vMceuE6Uk963vQWS4Lf3
+5uSeEuKRD3+y2m4XPzAkfdeqjx8ZQx0UD5k8e8Zlf849OXaZ9NcX//7A5Timfp8ZL+LWvOqD28/M
+ea7KKdNfX2ZGbNXiO3piqj/hpaXcXNiJaDuvkgyZeMPUi7rkOpj0nPX8ux8sfGjKwL/06T/hjldo
+Bqz5eN6fc99VZfjzS43EX/P5wwPp53PfXclpW3554+az6NHWwyZOv2ZQrnGi+UX3v73kx28Wv/LY
+ffc+8sJ7363Gqq//6rHS/Hf9/Sfzrk0/LpjWBhp79XNLRDJv/OHl60j6Nuo+asp14/vnWsI6T/v7
+lyvXrV259KtPP/nyh5UscDYvfXVS65wni2e/LS3AefC38afDOfvjldKx675++kpqSstzLr/uusvP
+yZka+nD13q+w8DevX7t2fSqHfv/k0bH2+bd5h3OnPb/E2ls2r/jkuZuvuOnpj5aZH63+5MFhpE6p
+wdfecN2lvXJOml2mvrAkf4+HQ9+iB8bQ/D2pdcfufcZcN08vZvuJzau++eCN95esTOv32/u30/pu
+1GPs9bOvG1WSnRrQrAJbfDlsR+8+OqX0z2ed/ZeLrpo2+64nFiz+fnUWUn3rht9X/L7eSlvxzi28
+vvtrwTet7NRss/RoFVBd8LP+108WPDrvjjvmPfrsK28u/vLH3zYUfi79LH/7JlrfbUfOvHPu1MFh
+brPeX1awWdCNvy/98uPFiz/6fMmPv65al6e45X90u3B9H3fOxDvuv3Ny/+zFQZcphUeLP5vXrV61
+avXaDZsqh0evxwvFT9sxtz3y2N3X9Gpsv+qkofPerbBZO/7R55V+UGrpDX997m/3XJ61x3WY9NzX
+a7dfRmU/67977mq9Trpe+/ArC1+Yd2kb+1XHD7zz7V82b7+Myn62rlh8f3+9vB9auHjxgnvHZJwj
+Tr3iyc9Wb7+Iyn82/vTu/Vff+rf3vv7+y9fnXZyZhiUzFvyQp/jt0mfDL5++8/5Xv/6+6oe37hpk
+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
+
+
+ eDMZOlML9rmfn2bdOf7rLnnS3k3jAktEAhe7cNzKeCzVJc9m3ixw9sPbVI8e81ErYCTZcwQnf9fN
+7vM4gHbF3ewsYbsVdLNPyrQ/6mafgbRVdrP7VnBYI0M3u4/1sMbfdbM7Krr+rpvdx3KJw++72X3/
+zSlmWk03u0tx0l90s/vGzX6uTdCr6mb3WQ3MKiPHLdPN7lv2Zr/FutnnIG1V3eykHnr5Di7Wbvap
+LO7fdLNP16r/STc7c2PM77rZnVWqf9bNPrNKdXXd7L6FTlFcupvdS3uuuJudmQR+180+EUz5q272
+6cr7P+lmXwWlMXSzO8N2f9bN7qS0P+tm9/3H3t7wi2529yKLlXez+8ghpwJrnnbZbnaMdU7dFr/6
+bnb2IvJfdbPbCZq9R27hbnYjOuhlCa2qm90wOcRVYc6jR861/2b13eweUY5Vd7OvkNKmE+Mupygu
+2CO3YDf7RJTjr7rZfZMnjv1NN7vP+wDaVXaz+8YtWNvMR8gt0c3u+83pPOzd7EQKzLsl/PcWiM+8
+7p2hpeYX3ezu0cGVd7PPobTpbvZFW8+dRxq5XnWxum52H95c7lahvdpudh+9Sfb3pWGzu9mnhM3f
+dLOT6oc5MYsVdLNbwoZfY726dYludt+Sp1ot2M0+K5iywm52NNXHDe1/0s1ONLXTsvmzbnafdfnJ
+AjcrL9zNzpJYWUE3u5sb9Qfd7JQEPNucV9XN7rO1Y7NGupfoZp9jC6yqm30xh33pbvbp6OCfdLOT
+4iSzof3vutmxXsDl4MtVd7PjasYN7X/Xze6eWFl5N7stscIciVyim53WDnrVO62sm92SAumo+nfd
+7PMK/FfUze5b6Py0pbvZfR7np83uZp9G1Yxudmxb9+HN5X/VuW61raMU+LPOdes5grS/6ly3noNh
+/q5zfc5qVtW5bj0Hw/xd57rVATyuHfyLznWrbd3WrrD6znVrdj7HtdUr7lxnbPz/bef6ZOP/H3Wu
+z2/8X0nnutVAjh7Bn3WuW23rY33zF53rhobotDGF93ed65bFaLpRf9K57ll5v9rO9UnL5o8616ci
+UH/Tub7CCwRnda4v07e2ROf67CteV9a5brWtL1NBzNy5bi14Kp62ys51tyLyP+hcdy8iX3nnupUT
+n9fj8avOdVc3amWd6yb6XHs8/qBz3UKHmVv7k8716c7iP+lcZ6xP+23nuqMs4e86113asf+ic31m
+JeTqOtfnJotX07luta3PK+39Vee6J9JW27luta0zFSov27nuVaK44s51S/2brSR/0rlu4do3cfbD
+SjvXrTonTOH9Wee692pW2rluta1PUdoqO9dnWDar7Fx3VWur71yftTcr7Fy32tZXvDdeF57/Zm8W
+uPB8llP46851a8PdPIKVda5bG04y7H/VuT63rXQ1netOb+3POtfZzn7gXovS3Uxs2gIMxtLtOWlb
+zQUMY5ZddFvetx2nag+L35F67C0F2kerai9mPf7DsgBcTT9Y4SfTdclPwgMJdL2XavwcgkrVfiaP
+/l6ot3QaaQv2lnohjflcjvlImz7WeJETxxyL83T1F5oTTUg+MpU6zb9p3lNuzagd9ETVgm2tThd3
+YlpLHETnlSujl9ezdqAyeAS41qmiIFyr0yNw8ei9/YDDQKbv5QccT7jzTAQ9syE3O9UP56UI2JqQ
+l4pTeh94DhOccp1/E6eE9226VBB7lvLNjVMee8Yp59Tceu/I9kLMM8+NOl7uhM2Zjf8uJWe/uzl9
+rCGxMWYFpzu8TdXUO3Ho87izeAYOZ9SKe+LQ27LB1vp5xWfMOCTDYGv9PHfDQJ+LznSpTR20Z3Xh
+iRv6N0tTBVvktltwJYElSg8Lq78OsbDiSxxAYEyx+HI92VaJ+a+RNvcmRMZYJ/Z1r+om2QKpMv99
+rTqZk0t1uUnQi6JqblTKWRXoo91EXhVg2Fr/y0tkrZCqo+1OPKwMMx6xqO+TJQvLPSK34uFVaPLE
+mmW2KlYep1fnle2xqvxY2ZvdnLFONpV/snhNuTfS9oMrQZp/3Lf2y9LtE4YiNR/bpag4rd+Uk9sz
+hSduYZAlUTWRdpqTJprnAmBfPUvJod3kYO0O+Z5RAoHtui4c7CrTGPs4G4/MbUbGamb1OrOp4dk6
+2E4C2IkdmwzNLH+cBfbVm2xsTxYvdStx45HlFAoDafO7xJl0sSel+6xrq7GrfhVnWtCWeicvz+Sb
+eecGBMMrpLRFFbKbNrb5N+SVz8yUtkDB+uUXkdAeoUeMCjF1mM/XfDYSuPzyPMZp8Zw4TnHHkp/z
+rU7bK716TMgrZ54EZCuymPFK13bZnaS879WEc+UeTFk+qQqKk0HfjVczr9c5x0KCnjF/lx4PEAWs
+h+UwtcvuJEsupygu1cZ23ZvdLuskgbld4jtL+leTcWhCI6tpl8XGcDPC+mt9gy3189tlmSktPlVz
+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
+k4qr
+
+ </i:pgf>
+ <svg:image
+ xlink:href="txt2.png"
+ sodipodi:absref="/home/momo/dev/telemeta/telemeta/design/txt2.png"
+ width="146.14291"
+ height="58.645603"
+ id="image2416"
+ x="68.852638"
+ y="22.857874" /><svg:rect
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0"
+ id="rect2419"
+ width="93.862663"
+ height="152.97342"
+ x="213.23874"
+ y="-21.766815" /><svg:rect
+ style="fill:#ffffff;stroke:#000000;stroke-opacity:0"
+ id="rect3390"
+ width="10.393098"
+ height="4.2221961"
+ x="199.09279"
+ y="25.769901" /></svg:svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 11.0, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [\r
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">\r
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">\r
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">\r
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">\r
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">\r
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">\r
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">\r
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">\r
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">\r
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">\r
+]>\r
+<svg \r
+ xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" i:viewOrigin="293.0176 351.5405" i:rulerOrigin="-240 -200" i:pageBounds="240 400 560 200"\r
+ xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+ width="202.688" height="102.419" viewBox="0 0 202.688 102.419" overflow="visible" enable-background="new 0 0 202.688 102.419"\r
+ xml:space="preserve">\r
+ <metadata>\r
+ <variableSets xmlns="&ns_vars;">\r
+ <variableSet varSetName="binding1" locked="none">\r
+ <variables></variables>\r
+ <v:sampleDataSets xmlns="&ns_custom;" xmlns:v="&ns_vars;"></v:sampleDataSets>\r
+ </variableSet>\r
+ </variableSets>\r
+ <sfw xmlns="&ns_sfw;">\r
+ <slices></slices>\r
+ <sliceSourceBounds y="249.121" x="293.018" height="102.419" width="202.688" bottomLeftOrigin="true"></sliceSourceBounds>\r
+ </sfw>\r
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?><x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 3.0-29, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+
+ <rdf:Description rdf:about='uuid:8b49ffa0-da94-4d53-89b0-78dc8a74f18d'
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about='uuid:8b49ffa0-da94-4d53-89b0-78dc8a74f18d'
+ xmlns:tiff='http://ns.adobe.com/tiff/1.0/'>
+ </rdf:Description>
+
+ <rdf:Description rdf:about='uuid:8b49ffa0-da94-4d53-89b0-78dc8a74f18d'
+ xmlns:xap='http://ns.adobe.com/xap/1.0/'
+ xmlns:xapGImg='http://ns.adobe.com/xap/1.0/g/img/'>
+ <xap:CreateDate>2007-06-11T17:47:57Z</xap:CreateDate>
+ <xap:ModifyDate>2007-06-14T14:12:42Z</xap:ModifyDate>
+ <xap:CreatorTool>Illustrator</xap:CreatorTool>
+ <xap:MetadataDate>2007-06-11T21:03:39+02:00</xap:MetadataDate>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType='Resource'>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>132</xapGImg:height>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAhAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYqhNU1Ww0uze7
vZRFCnc9WPZVHcnJRiSaCvN9T/MHzFrFybTQ4HgjbZRGvqTsPEkAhfo6eOZccEY7yY2oR/l95z1M
+rfSrGzbk3UzO/8Awvqfjh8eA5LSJj/K3zHAfUt7+BJR0KtKh+8LkfzET0WkVFffmL5co19CdSsE
+21fVIHc8x+8X5sKYKxz5bFO7MvL/mTTNdtfWs3pIlBNA+zoT4juPAjMeeMxO6bTXIK7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqtlljhieWVgkUal3c9AqipJxAV
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
7FX/2Q==</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+
+ <rdf:Description rdf:about='uuid:8b49ffa0-da94-4d53-89b0-78dc8a74f18d'
+ xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/'>
+ <xapMM:DocumentID>uuid:e19d97bc-233e-4709-a6fb-32a30768a317</xapMM:DocumentID>
+ </rdf:Description>
+
+ <rdf:Description rdf:about='uuid:8b49ffa0-da94-4d53-89b0-78dc8a74f18d'
+ xmlns:dc='http://purl.org/dc/elements/1.1/'>
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xmpmeta>
+ <?xpacket end='w'?>\r
+ </metadata>\r
+ <switch>\r
+ <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">\r
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf">\r
+ </i:pgfRef>\r
+ </foreignObject>\r
+ <g i:extraneous="self">\r
+ <g id="logo_telemeta" i:layer="yes" i:dimmedPercent="3" i:rgbTrio="#4F008000FFFF">\r
+ <path i:knockout="Off" fill="#9291B7" d="M57.119,9.701L57.119,9.701c0.001-0.003,0-0.003-0.005-0.006\r
+ C51.827,2.083,42.232-1.563,33.222,0.631C24.209,2.825,17.36,10.47,16.16,19.669c0,0-0.003,0-0.005,0.007l0,0\r
+ c-0.002,0.013-0.004,0.029-0.006,0.044l1.372,0.228c1.434-7.288,8.103-13.583,16.59-15.653\r
+ c8.484-2.063,17.295,0.46,21.919,6.271l1.118-0.827C57.142,9.73,57.13,9.716,57.119,9.701z"/>\r
+ <path i:knockout="Off" fill="#6E6E99" d="M23.844,23.327c1.042-5.32,5.921-9.913,12.119-11.417\r
+ c6.201-1.514,12.635,0.323,16.017,4.567l1.116-0.832c-0.01-0.016-0.019-0.027-0.029-0.041l0,0v-0.001\r
+ C49.108,9.919,41.943,7.204,35.22,8.839c-6.727,1.638-11.837,7.339-12.741,14.206c0,0.002-0.003,0.008-0.005,0.009h0.005\r
+ c-0.003,0.017-0.009,0.033-0.011,0.048L23.844,23.327z"/>\r
+ <path i:knockout="Off" fill="#4A477A" d="M51.48,22.287c-3.218-4.63-8.828-6.754-14.31-5.42\r
+ c-5.42,1.32-9.525,5.912-10.221,11.439l1.372,0.217c0.81-4.162,4.631-7.758,9.513-8.943c4.868-1.188,9.917,0.244,12.56,3.576\r
+ l1.121-0.832c-0.014-0.011-0.021-0.024-0.034-0.034h0.002C51.483,22.285,51.481,22.285,51.48,22.287z"/>\r
+ <g>\r
+ <path i:knockout="Off" fill="#9291B7" d="M0.437,61.69L0.437,61.69c-0.003,0.005-0.003,0.005-0.003,0.016\r
+ c-2.277,14.258,4.563,28.717,17.059,35.98c12.494,7.272,28.444,6.074,39.726-2.968c0,0,0.001,0.002,0.01-0.005l0,0\r
+ c0.019-0.01,0.038-0.027,0.06-0.043l-1.297-1.733c-9.48,6.639-23.767,6.508-35.54-0.333\r
+ C8.687,85.764,1.513,73.418,2.596,61.897l-2.148-0.276C0.441,61.636,0.438,61.666,0.437,61.69z"/>\r
+ <path i:knockout="Off" fill="#4A477A" d="M52.531,82.311c-6.915,4.855-17.354,4.746-25.942-0.256\r
+ c-8.601-4.997-13.845-14.007-13.063-22.422l-2.152-0.279c-0.006,0.031-0.006,0.053-0.008,0.079l0,0l-0.001,0.002\r
+ c-1.689,10.662,3.425,21.45,12.743,26.873c9.325,5.423,21.225,4.532,29.65-2.204c0.007-0.007,0.012-0.009,0.017-0.007\r
+ l-0.005-0.005c0.025-0.016,0.05-0.027,0.065-0.043L52.531,82.311z"/>\r
+ <path i:knockout="Off" d="M20.357,53.638c-1.381,8.681,2.628,17.121,10.226,21.541c7.513,4.371,17.084,3.652,23.834-1.809\r
+ l-1.308-1.732c-5.402,3.808-13.576,3.719-20.342-0.222c-6.754-3.921-10.881-10.984-10.253-17.575l-2.154-0.278\r
+ c0.004,0.026-0.003,0.047-0.003,0.072l-0.002,0.002C20.355,53.637,20.354,53.642,20.357,53.638z"/>\r
+ </g>\r
+ <path i:knockout="Off" d="M49.258,59.804c-0.215,0.356-0.556,0.591-0.933,0.681c-0.375,0.093-0.786,0.043-1.141-0.173\r
+ l-5.254-3.183l-5.256-3.183c-0.356-0.216-0.591-0.558-0.685-0.932c-0.091-0.378-0.04-0.788,0.175-1.144l3.184-5.255\r
+ l3.185-5.254c0.216-0.356,0.557-0.59,0.934-0.682c0.375-0.094,0.786-0.043,1.141,0.17l5.255,3.185l5.254,3.186\r
+ c0.355,0.214,0.591,0.557,0.682,0.931c0.094,0.376,0.044,0.786-0.172,1.142l-3.185,5.256L49.258,59.804z"/>\r
+ <path i:knockout="Off" fill="#4A477A" d="M40.835,39.122c0.427-0.706,1.104-1.2,1.907-1.4c0.802-0.193,1.631-0.066,2.335,0.357\r
+ c0,0,4.465,2.707,8.011,4.857l1.662-2.744c0.501-0.831,0.236-1.921-0.596-2.425l-12.28-7.441\r
+ c-0.828-0.504-1.918-0.235-2.422,0.593l-7.443,12.285c-0.501,0.83-0.231,1.919,0.596,2.423l3.137,1.9L40.835,39.122z"/>\r
+ <g>\r
+ <path i:knockout="Off" fill="#282F40" d="M133.086,40.279c-0.033-0.014-0.067-0.023-0.104-0.025L133.086,40.279"/>\r
+ <path i:knockout="Off" fill="#282F40" d="M201.865,42.719c-1.637-3.538-5.438-5.579-9.242-5.569c-5.428,0-10.855,0-16.283,0\r
+ c0-3.472,0-6.945,0-10.417l-3.593,2.183c0,4.552,0,9.104,0,13.656c-1.125-1.647-2.476-3.136-4.267-4.066\r
+ c-1.938-1.021-4.129-1.413-6.304-1.413v0.038c-4.152,0.159-7.834,2.727-9.106,6.736l-0.441-0.073\r
+ c0.26-3.066-2.847-5.661-5.517-6.336c-3.053-0.772-6.354,0.235-8.382,2.665c-1.899-2.237-4.798-3.224-7.683-2.962v0.021\r
+ c-1.511,0.294-2.938,0.911-4.078,1.962c-1.053,0.971-2.249,2.391-2.249,3.905c-1.091-1.769-2.459-3.375-4.293-4.403\r
+ c-1.999-1.121-4.293-1.553-6.568-1.553v0.038c-4.317,0.166-7.842,2.852-9.177,6.944l-0.443-0.071V26.738l-3.5,2.175\r
+ c0,4.588,0,9.175,0,13.763c-1.085-1.603-2.369-3.075-4.076-4.034c-1.997-1.122-4.292-1.55-6.564-1.55V37.1\r
+ c-4.962,0-9.925,0-14.887,0c0-3.455,0-6.911,0-10.366l-3.593,2.182c0,3.958,0,7.917,0,11.876c0,4.076-0.197,8.156,0,12.229\r
+ c0,2.332,1.212,4.581,3.375,5.57c1.272,0.582,2.6,0.538,3.967,0.538c1.888,0,3.774,0,5.662,0c1.718,0,3.436,0.013,5.155,0.019\r
+ c1.548,0.007,3.063,0.026,4.57-0.386c2.716-0.74,4.815-2.487,6.391-4.771c0,1.681,0,3.36,0,5.043h3.5v-7.06l0.439-0.082\r
+ c0.753,1.941,1.892,3.822,3.507,5.167c1.781,1.482,4.057,1.989,6.325,2.075c4.22,0.157,7.735-1.81,10.085-5.292\r
+ c0,1.607,0,3.215,0,4.822h3.547c0-3.703,0-7.406,0-11.11c0-1.521-0.266-3.258,0.36-4.688c0.533-1.223,1.611-2.201,2.919-2.511\r
+ l-0.038,0.013c0.371-0.164,1.161-0.286,1.613-0.115c3.178,0.009,3.807,3.249,3.875,5.809\r
+ c0.112,4.191-0.033,8.408-0.033,12.603h3.546c0-4.083,0-8.164,0-12.246c0-1.696-0.09-3.448,1.129-4.792\r
+ c0.946-1.043,2.393-1.552,3.784-1.367c3.266,0.432,3.91,3.614,3.888,6.364c-0.032,4.013-0.012,8.028-0.012,12.042h3.455\r
+ v-6.501l0.437-0.085c0.767,1.878,1.882,3.698,3.459,5.002c1.775,1.468,4.046,1.969,6.301,2.054\r
+ c4.124,0.154,7.661-1.72,9.979-5.134c0.29,1.751,1.249,3.455,2.784,4.397c1.928,1.184,4.563,0.73,6.716,0.73\r
+ c2.665,0,5.331,0.026,7.997-0.002c2.263-0.024,4.555-0.296,6.44-1.655v-3.774c-2.595,3.038-7.227,2.865-10.005,0.172\r
+ c-3.463-3.357-3.116-10.438,1.374-12.772c-0.014-0.003,0,0,0,0c3.353-1.902,8.198-0.776,10.235,2.506\r
+ c1.28,2.061,0.852,4.726,0.852,7.042c0,2.733,0,5.468,0,8.201h3.456c0-2.879,0-5.758,0-8.637\r
+ C202.654,47.728,202.938,45.036,201.865,42.719 M78.124,55.822c-1.291-0.129-2.59-0.783-2.59-2.263\r
+ c-0.161-2.067,0-4.212,0-6.286c0-2.273,0-4.547,0-6.82H82.6c-3.732,4.402-3.19,11.073,0.347,15.369H78.124 M84.032,49.533\r
+ c-0.764-2.958,0.159-6.587,2.917-8.208c2.875-1.688,6.672-1.143,8.907,1.331L84.032,49.533 M100.513,49.501l-2.163-0.439\r
+ c-0.184,3.191-2.178,5.509-5.248,6.387c-2.693,0.772-5.68-0.463-7.381-2.609l14.792-8.499V49.501 M107.791,49.531\r
+ c-0.786-2.998,0.123-6.534,2.896-8.191c2.872-1.717,6.676-1.167,8.926,1.316L107.791,49.531 M124.369,49.518l-2.261-0.457\r
+ c-0.191,3.195-2.175,5.508-5.252,6.389c-2.704,0.774-5.657-0.485-7.382-2.611l14.895-8.555V49.518 M155.963,49.877\r
+ c-0.841-3.1-0.13-6.718,2.681-8.58c3.143-2.082,7.19-1.337,9.637,1.414C164.177,45.105,160.069,47.491,155.963,49.877\r
+ M172.747,44.377c0,1.796,0,3.592,0,5.388c-0.708-0.144-1.416-0.288-2.122-0.432c-0.283,3.155-2.188,5.206-5.123,6.255\r
+ c-3.081,0.948-6.131-0.414-8.058-2.814c5.104-2.923,10.201-5.861,15.303-8.79V44.377 M183.545,56.048\r
+ c-1.725,0-3.898,0.357-5.54-0.265c-1.43-0.541-1.619-1.96-1.594-3.313c0.077-4.08,0.024-8.165,0.024-12.246\r
+ c1.541,0,3.081,0,4.624,0c0.618,0,1.246-0.03,1.864,0.004c0.222,0.012,0.931,0.167,1.103-0.005\r
+ c-4.105,4.343-4.232,11.549,0.042,15.824H183.545"/>\r
+ </g>\r
+ </g>\r
+ </g>\r
+ </switch>\r
+ <i:pgf id="adobe_illustrator_pgf">\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ I0/2Fkju07YvhNhPSr7V0GzWBfI+ixXFA+IW8FhU1FtSEQO8cUiuiQcoFozo8u7JH9Q4cLdR1X5x
+O7P2wcrevHHJLHFz2GQoQkDKhHNMnDIC2j6kBRqQEnJrGh6cSYNDuAJshiwe56j1Lu944LP+6wTd
+TJIfJN5MTQDAWLFtMG4i3oawzBp923lScQ4qR6t356m7avM9LAE0M6N8mve1Xj8oNFM6YDC1pgOJ
+5ap5NulKpq5UQTcIbmbEfXARsOkKip5qUldcO+QeHq4TZemssaM25UBzbDRYljkI7oCm2nPmYhEE
+izgNJT5M+qx1z2ZwRwPqyjuyUfMnDEYO/Nl1nYz776gfaGdGwuLG0J0jFH/7RcTpgPW1M2HQyQGw
+sPC4cWGGqhyxWHwL7ipMBFSj+Zoj2U/rvlbrJ6VtXEtT+reHHoxfcMoTorFSLcUFNDwResVHHIPM
+48aiMMO1eha7x40OUzoYgyV73EmnjM/4HuXCpFIOeISwwoB0c3q8CsyNJvnRoYLHRACHXhwEDmHk
+IvVq0Yh110r2c9xDfz0wOcUTVdXiiLFanIlGG7zqcLFvCiQgwJ1UY+kMQW6CR9yEW2Vs+vNAZxAY
+wCjyad3Xav2klM5BisJrkAOOsVzsVFExsdDFE4XCtgMPF716M2IjVovzYM1CTIQzK2Yo5l3hyBCL
+pLFYDBBwRqt8mgrhS1EUb6XNxSJxbiwWSwKnU94Vs+KySJ5sYpfOuhWxWF1AX86bFkMLqhWM/z7n
+D3+VwxgE/CoMJLq8WhdSgMV9lopNEji+rrVhKsHm1+5/fNr2tVg/qNwjgwKfHfHoOZ+10nkuYgMP
+PBZQKnm5zF65WOVQFQSEuXlLo7qMHUlpxnRbCBNf/RwuKLo0hi/sQSK4xl1Djcgt5jyvVzmsYAjT
+uZXaiT+p6gObIfFDiDMVpo0zhhPrsz1qOB0QeHLnb7+oYkwFGfESRLs6rqOKNE9iVSGsj8fcCkoc
+dH7DEZmquMQlfVr4tWI/6BjgGsUJB+y2hNyk4JHNdGlwfeiswSUxuM0ejJgak4n1UrEeMzpbrN9M
+Zrf8Z7HOWTMByNn1Q+eJpReGA4MTSejxBEEO4vW9niObU+138BpwSESVWfbIsDQu9BG0pTf5r3NQ
+pQT7djVmLVaLxLTwEmMpuOqM5AuCaFxCLL4uMf4EBo2ZOJCaAoEKGZAkgP1p21ep7icNCq7L5E3I
+QsU/UUDipi5yb1R9KiwjkDEVl1TtBoXN++YS8HdprrJ46KsZLwsLEdSwVCKI5WIxH6AfTtK6fo+N
+sXQNkQgD8qpz3EE5JYcI885d67NlM2TLnCnUz5yXi/VSRWZrtwOYwMWZ6nn+7RepE2yFCxahhWEk
+1y3Om0u8476yu6zA9nCbSuMmzxeJwT5N/FqzH3RF8OVwWQJCckY+CcXPPGGKkYutP1h8IPo40a6P
+gTb34ppJtIA4QMLQPJWCAwceetyAx5UXK4fhQOEeKSZAx94oygYKggOEgQcKTaGySQCLcrxp5JXH
+Pi25116Tc/HXDXWHkgtrwWatiAWrqoKinABLT8HLKtoZOHGsDFtp71fkPMIcsoWGFIc5RpZv/rTu
+e7X+O/Dc+JOs2cBYK07BYK2GvB9z7ObSFB1fF3zv4NKqYTlt3N29qRicQ744brzNpmb2woZMzXCc
+isGIXPEuJE0xuQBG1upjRo4Ipct4IDxjE1bwfLGRTNUSmofS9Z7468kQSPXUllisYqnoVGB/DOvW
+Io5eptaJuafutv1gdEQjIGsTcGwLF4eGC4rHGJ7W/brvg3uI88AS3PwnIvIhlKCw2lmJTItp8+yA
+pz/UeGJQplmBJaYIEdZxdGU5mhyS1onV2ge2qYSnbe8LplCIbhhUHOqOkJYBbgIRIT4Czha7uQnO
+xu4a7498z23pjycFQMS8Zcb1vKD+jhUF9g3pFoK/6vlMpGrLcgu4nVlaOlc2eNSn+BiqDlMMg7Cy
+9WHfLxpNjLzBPQE/F6hJUpQXOcGsixe8qJhmJfQ7KYv19RELNVQU4j1L1bLGn9lZLBDoyPz5zi5h
+P97RiC2KNKb4Z7u6V9jp+rPlzEXQxWmUVkUTY6+CWGL5csxydvF39MeTqvQlcIxbVo51UoVqeMAh
+3z4PCQRrobNp4nzcJRyFUlnsRNjj+jZqQX8Y91Um/Jk68KvnJG2VaEupq+R+0lAfK7v1MyQUHHt9
++iXUqh2H4WZI2pHvmAI58x1LVasVF7Fgvsug60RK/G5wUWLht2d3Y81GAXyV6Iekpp1Njpl/76F9
+IwPsKnI3JZjs03S0IQUOKQnLUwPZRxWeqe4zDHY0EZEYIquk2czZjYUEw0/XYC7SoonNp3dMiWas
+pPl9w69AxsO5SjCQ8aYIG1WlQ7YRkejd+rrwKpv1c27Ez4f6up0DhjHWHbsqWGElNuUBu81UkUUV
+cVSTE6mjRJu1OzmT2kcRZwn2Ico0ILwyu5DY7iY5tGwlajPMLSK6qrG5hdbbZWVa6ZanpZVYvrCV
+WNBEawhMeO7cEA8rWt3XQ33dRQHxAwG3Qyo5spIBVcP08kuZMERvIGWcja+C2Q4ZISq0KHkPN0kg
+E4oEddqDbbWx5rx7q1PiDuCn5NQ2oxhwWSFWTvg/ElyHlZw620raPE0g5Cnxi+7u9udDfde3MPk9
+QCUoPYeFCPsfSfWvpebAqKau6erGjKrydVQ8JVniYSSwZCJSAAMqstzNzTcHkfM2EIfXfFKq3NPc
+ouhI+L++920gl0xtIM4w9BZEAFRvggPa9J6vR/q6W7B1WwElAYSIxbC0kIApkgvW45pVQHeQXYEZ
+Bybr+Sa1Yr49PBpHxsRKakkiSreuSJDYBf2x5QZ4/NDfEvvL3NI8TLAeKy9hJGTTvYWRODgL0BbC
+wyles27134+H+rZEr3uLYJp6xNbUSxpZwLjp6S74g3Jzag8rCEQLkbtn1MNPJZa+IlJRz5TNzu67
+TcSq12UiYq9MyzkN2Uv4B0LFbxNh0JkWKqIsJByGlKqsoXPIZWIbPR/p66q4xxoCimmVYg37j6za
+5RR2fjRNN+McogY42oPEKXuwZFTB1MARhVxoOj4xnzKoJwPvM5QOT2t/F3E+gXoS1VeaiBXCMJGT
+TduIYOcpeJF17LtLVR/P9HUtGtURdD/3zRUEOsWi+SReyoBoLsopMdKj1gXmlpsicploiullmKiZ
+avYg4stSdVjyXwgEzoiPtCNB3NfJlsQdMY36SIe7M0y0pEppExF0CwwuyjIumAGbjNzz/UzfVoAt
+iY6JpHSCo6TxEVzim5wTjMBHs3C3peEsvyMLuYoHqRvKL2XPCWfdxB7vnJVem2/pighmFzq4SB4Y
+ewqvTGReze12RZsxvQ2UhaLFcNGQfks3u9XHA31bb50aFRtWKRBhtYoFuNBR1BgqFw9wQnQpedOT
+t6dmphunsCHuEEQm8C4zxUGle5/1nsc33TFoQFlN0KQfNhQE2BL/YYX2dyLGGAPRkihU8RMjP4Tf
+yIfBYMjkP57p6zLnFJJ+IEGM0HEri8OQ0SLPIkcyR1djjDIgkChqmmr65WhTan9N4zVb2eJ0EDcZ
+Zc9yhjc7McSILCkDLw8C5kxSauEfGJ3c9uHT2j5MCAFrR42oi9YTRwoDRB/P821JcapYOIqoCP+x
+897cQWwXeUB5eJredFnXjyXFTEe2UBjHLKEZqOFuEJHjthrWkyBkI8wjzmgr9mWp1E6H9IlXIP5M
+2Meke3/5QVGN4e9ICKPRnSxzxZ1qZkx9PzWsYDMg9JR44xAiO/mwwJdVv6HOCrzTivBpKU4ZZhLq
+ApSMLq+6hVWlbloUv8D7hn4DjG6uMp5aNxuHZhfgv3bcRI29SugvINdPkv8mRXPhhkvKfcKgRZa2
+QYm6w+8Sn9Qj2Qxpk3I6/NjOeouJCek4SvbdrsYMox8m+Lo0N1SpQCAJINU/kZaBf8J8C120XQOQ
+fRJ3MF+2rt6vqEPIypwVWTrqUDHiCIkVC5wC2KDXxUbq86SKB9Fm04lSEmwBGip3+qe69/DgRML/
+sWfzf210j9PZ6Lzh6ad5RMWMXjR0mx32FBX1bHW2XqIM0Jy5oYGWcExfVvqiwJZFDI+o9CRJRVAa
+RPgoHqmkOKyGg5lVRrpHiXeq/UKPiuRE3AY9mEr17q6b6lfkrrynXG1Dy0YacSUIE+BNgKKMxSFX
+fFaylgjFhRhNpkdQBWmpHua1YTQ4pkYGE/6PVbJYm6aYLzwMQ+QmwkqLeTDq4lZloQ4/HtI2o0sQ
+u3ZuagabMCHF6N4W/bqo1k9ufMgdlkVsBePORnWjClT4W6Gr+120iiJcFTY86lpV75j+x31r6nTJ
+mKFSiJ6MSt5kHoEL1EvLiYia2P8dEVEiA/6uklUKBaYlkYr3o3xbTuuqK1CppfdwFZz/RJJKWvbi
+WHqIljN7UYClOWxlEHNF4kToSiL5He9TlMQT+aTo+DieHGBcl+rRXUpkIAWGGLVX0JQkvXbeEaMK
+0xExUqSJferrGEF059q70Or6eKCvK2ldaGZQu+4gxJzKWLOXDBE0EFKosiLixF5ib7Ur8ggDCSji
+0eSMnZzLgW8NA5PXA7nZ1dsg4SYYp7gbSMWEYFevzfcN9ZCJK9ILmFJVMWhhS2Px44m+rqK5t8NU
+K7oLprXOXYp9OCvUagAgBsT5RaSqpT+a4jkghVWeZ0s/htShpJ5S42UKwRVBEWIL4HY62WZI6bVE
+9ZT02tLCQHSRDhg5izbZWalKsrEgnUpMr8f5rnzW5OKpfJS8e0y/EeIB2fiU7CYxstEsQuB8itXZ
+EuroJIEZYcsNVpeIhmfoxkOHTtoSQL+zi6w+DsBjKF4kvhZFBNtmieDtpBtUi2P2Xi3fkwTj/3ii
+r6tnTTQGcCqo2dlCLVdV5En8m3R0oA5jSR2OVlKuZ98BoGYSihrBSwDIKhLx7gacUVo2EHUEajSF
+BVUndpwXPl+cT9kD0OcVmvECwypnrwLngXwblCAfD/Rt5awprsWF1GKSfagzncdREyKTEOs7yPa7
+sHJHKzNnk6FkBZhL9dugJHRRv/aHKGmzdxqGD4vtLjDxNA65zo5x9qm+ZrU6KH5J/uTkW0S9tffz
+fF03a0LfouJ+Yt2ux4Q0NU7kUvUdSiFV5V+D0UrA+ingWJpGA01Np/n/qfwDVCYEkB3ULKJBsXFR
+nFh2gVXQCE56cV5hH9zWOea8kXep7CQ6dE5DoZTJ+eD383xdM6vqlWTfRbYPyQ6zh2CWUD3gogJi
+eStPRe9nR2Uzm2ISatdUrlKqA3tRxkDUivWhUF0NaW2WyFQhGs4chyXpxfM2UBYq7+TzwxJSrEcO
+OpwBxO7H83xbMKviIshmX//HThv3R3ZjZWrpsrfRUiqJqYpT69hiwQOjwSABHwv2MBYC5mZW0iIo
+sM1DuDwwa2iL48yIxnAo9ikCm4R1ijynrUOZsyCfL2rzoLkHFNjHA31bMKsMsbLZQQ==\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ c8mKiFwRky+5YmKdlbUe+e/oxaAoo0kTl9EjxS7yD4ZvN5jMhvHVcP7Kuo7OmibjfXVNxvs6rWtf
+UC53fb2ZZFXN+luIibV5iInL3WdmXDl2YegXTD/b+Rc/wOon+Iyeu5ocruRFqwF1NbCuXLlw7o2x
+H7nf4k5cGHvciQvjV5M2z+wy8Y/M8WAqXU2pdyuKBdO5iunBdK5iPpprfoqAvlHPXcw9qzXosQ9r
+R28DeRrtJ/TcVQ5M4VvDZjXtZfNOt+yD8x65yuxVoq/i/mEZhlk18Egve6sev0xhtSt2Hnflit2j
+yPtUSN+yLvo+sm4d074ykWOWsKv4faEjzKMaBryQIk96okeTdTo+rervfRe+HaBvInOWqIu8XaXx
+XVg/Cge+2ZXHXLvyuI5sZoGVQx7Z6MMhfY+TvNJyIfWdJ9McV9nH+EiIVZSuovblzH00FusJsW0B
+S6zGlRmy1Kx+F0oabHNgn//kIWb+1CMGYoVzz2jvBQu+IsVXIPkrkPPQSTNjzi6ICaa0IpjuIAyL
+t2tWlMwD7vyVw9fG2fhMrN+EsVphIiuM5InMy1Q8T6BuXUazDvY1ROpj7PbkwVkdgoOvcEGDDr2X
+W9GC5vpcKGzOe/8Dzo/PxAJOnV++uHZouw3gmolllT05qlZn1ursejXAv8F/2tuf/fnbL/4L/vxn
+/Ce8/fwfbe4k9gysI1fpJvl41MogRO1/FwZkxQCcnyQsC4PzfaKdyqPSGGw8jFdwR0VU+3ZEFQKM
+35SUTb37f/x8TgBR1IncznJ+PtfEFOk1B3Rl7w7IN/UIrx9WfQvWt692dQpuyp5T/sbqEcV4aEif
+eb1jdFZa16op58bpVNGL1CojFzTGZ3KtnZtyUDfloI6HMCuH56DGQ/lf65zNW4DK2Am2iYXbwYIV
+VRiBDQx9ka/kH+xhVALvzboYFd9HKhBlU1NA+uiCfAVg/wxeYGACO3uuZtqDDvghuaLDlk9N8Vxr
+WtX8s7TXQ1s7VLVepkk9pRBqP569wDEBSpQyuXgJ0oBtNL/+xuM6+UnWR5TbfFgefRnY8uC/gLxb
++590ccyknIjoCwP/BI+mn1bFn2hNTH2a8sdnXw+Wmj1bn/IP9+mnWgpTx4xjbR0UBcHaMjDmtlWw
+MUfvuAiCVD67DQ/B6uYvHBfAw3DGTgRt6MO0nUyOjcZYH/8oFyY4f+b7/5Nc77sC1tq0J3AvEECW
+ewLbtVG++UN/qk1hUgabxKpvCkT3APjku8JVYHeEWYyv+RPsDHMPF4BnMyhju7YHAzmyl/u/3suf
+couYu2qbhBrjvFVQ5Au/yb3CdwTbLOyfabPgralvFnyTmMm/9APjvPfOdoxhvrVfcKMotW8YbLfq
+xP7QD3zoT75p9NXjW4OvHt8yfPX8adfOSs6BkH3d+KYRfNcIo4j+Ey2ZpWNLiFjuy8V2D1si81r5
+066UpYeX1nMtE9tJfJW4nmQrQXvJuEZsL7ElYnuJrZBlfTyObe6RbSh9Rm078ZVh+4kvjGVZ/J9d
+FIjR3U5eGKvXI0PBfhBSwXNXPpQpBbV4DyTuZ8nx89x8ZT0OpZX+O//dr+d5c+p1yOV8tXv83f4O
+flunanatuFnc7vPfvY/evoxjdlH+NCuWNsVj0DnZsMdvjh2BwuWb/cjKOr55Teput+Nde/M2uuH9
+SV7Yey8nvd5nd+0yK+q9eUjx5V+1NnXRnhz7O/n1Pi8jjjYR4rxkCDrmwWTW3o1O+5iAwO6ytj28
+XS1TV/dwvcnf3BMqHGOhXrvLf21vV8vT4H8qGXTA74aCWHA8Fg8eP5kwKAc54hTB90qNrUvcesoT
+f8R970Qg8d7jzS/5ptIf0ddqtyptSvNIp459tF9ax6ZH+GMN/lq/tI+uY5mMfchnEdKVHQtbOjBC
+abPyY7A0JslXv9forgHaPUemaLU3ZK/kvjFBTK1X2qlKxLt+7rfpYd6a5/f7Ld4He4N3cRjBawPO
+ef0X578//w/pv//Fb//uP/3qn/7p17/7rTX8+1//j9/81pr+3duf/ed/+N0//fOv//xn/8b/wkIp
+FCmBbv6zGynT5RKP1C5h7eah2277l+ff//Ns/Ze3/e2v3v7rf9ve/u5naP/FX4tjx7dLPNsnrO3r
+2GafVaM9+9Q2Pvtb9eM/6ufg7i1a8GTIM2FZd1aVsn8KbJO2Pv70nfx+2PYO9zLQcbTLk2iRcskC
+hxQj1N2IwfSAKBC4xPcmnJ83HqceCPcGUkC08/O/NAF7bhhCusPuKsvo0e9MuNMb/c5y3blbrZv0
+TQEUT43nHbwzj4/v1kVLOOF38kN7G98ZrLGon97Ix09ped15PkaHzb6PjcUe34cR7RjRxsbr6zs6
+vase9dUYeuN1Z2q98frQuQR3vvMYhpkOu9O6dF6r37u+8bf8xtZ7M/Q79SeHfme7M42NTTOBpFoj
+gbIRaGi0mThFxED0XVQ7tnnKNWdhfLz2Kb8IlLc+kdf0ZH/n1Jjt8fGd8Fzd7zyscWS4HGb+XZn8
+D8O2l6QORvPDKmYFGfbcc6f/7kMUC/xDkenetnHJxLEREJpNhdTTtWRyXx1lpJ93to48rzvH2Tsw
+v+fWi3/HJSMC5PHxZF0cyX9e6EPT7Pnk13H2bIQnD0284+sojksmG5OWccnkLa+rI3WeP8Ylo8Y8
+3Jlab4zjkgn2zjouGX8n7wTis6RrrfqS8d7Eccns93WU7c40Nprsg4dqXDKc7ak3PhMnobZxyQQj
++jTld04+SmeOYcW1PpFpXDLOzmlcCO2+OsrzneHGcDnM/Lsy+bhkfvwuEw9LIRwU4SIrQ1LjOUbm
+rVeiFQA0ztPOSY2hcbM77XG/s+HOkwWPuHnjbo372Jj1TnBCLWtjnO/MKa+P79qckcPoejzanW1s
+DNb5c9ldj58iW5nbtuP8t/cdbeeaBZLXP6NB1vHbh72xzY2i5jaSw8aTp2/b46daO4z8lPObcpkP
+d57z3Ao1EJzsvZdltyCkoa0BKVBM3p29nl72y6fpHk0dP17e9v7Gk9T5Yp5kzEPF1+nfjHmGxs3u
+tMcnNoOmcJFwt8Z9bDyMo8JM12bMM81AMOYZGpPxycSl0e6cZnWzzseR84N1Po2d97HXsUt7b5xG
+1Ix9phElm53hnTaiPH3dHkd2zfFD1WZ8WrYZB6WFVWJux9p2RCC3GK3OULrpZb98mvDRmqQYcTsn
+9OpvsFblpMBZzwkSDUIaT8mk2J/GMe+omMgSE0TMcgF2w0uSrLwW5bmVBdeiognleCoiwPHsuxKw
+ARW+J570K6w8qX5T2nD9ne04KcJyaY17lbn6fAndMb+0fZtAFfybfORQS9GYN1V79D2WWx3Qe8cp
+Z7FpMiQW+kbmcXmiynjS33d6VA16dujAfyAtnkXrAj1IER9w7u9kLiDPtArPkUd8HY0R1ptTRT8O
+I7NyZXFT4m5SU4/LCsdB9HJiZOT55oayoMhncH7vb10Sbypmwkx4kE+Axh5XeKWy0J0LowVDJfKm
+ymzIBUcxBFQCEQdNYi9XYRjoIICk6qFz+9mAcMmi4KlUxC3RBEByYzYrMDp27Vark7VTbzz/Ve7u
+UwYgoH23CGVME9aAw5Bo2TtvSvBMYKcHRAtnmU0xwzXvtNjt3jsoFeA12idkSAiItsMRre360Mgc
+XzpzZDEHrRKnkESazmy58Na5HJnDcYkSw9WCGARbM6uqoddoPbyYAwTOZoZw5kjRGhE3lZDvVMzQ
+dtXc3FBWAvPuJl62bdbGCKeMpDzgAiSTAevEomqhmMgvxiotqW7ISRkV9AMTklVUBfNfYRXWEWLo
+O+dxOxQmvPM6wEbjnWt5U/JCRIEkqLKNc7BPnGLXzim7PbQbp/A4jy8dmTk9XddOu2fLxywzAQ6U
++kw7lIYYJa9w5oYt7rDV/sWUUubjQJh50SEYkT4gZVZyIKVKhjXXI+p3pBNnOSCKasQoouAsGAcz
+v87ryCgfMYfgfXm7tp7OJ4Bko5FxdufH98yO7sfOuE1aOzDpm1MIjcV2NtgBYxFLgwkOZWKk+RfK
+ZXVjH9Z/VOVrzva5lQkscnJKVuhpOwIpeEozD4bCTRtxf5S0eDPKHuyF2wU+jCFhPtPmIZmgceXk
+cuEhPVZiQsv9ZKbOJ7p0NjmfLt6GXQJ5xvARbFRQH2DrhrwJzo+Y4Rr5lZ3dBpeUQ1zS8msuAf4T
+XHJsLFgQkTYJhGqNX6LvD4rVsdlqwTEJzAqRDQACdhvif4Pk/zqvI59YMhHLjJFt7yHvGAs5iO9K
+XJOYKobv23JwPsnK/zrtg0j+Bc8RdOGT6U/eIa4QAgMJVSncC2VDil4+mY35ajx3qRg3WcoP4yWg
+G2D2OrYrmtixbypAtSMyQhsSSyuCTRqlDvB0zjrazqMVrwc7VNM6D0oZZvvCLHcvV0LahQpG4J6V
+ZNPeLeskeAef8WtnHmbn9kZacjSXchQU2XnBKD3KAbwZKqVVAySe6ajPa1rWMk3KbdRFnHsUanSu
+FGSq4P63E/J4cliVVAMh6c5z3jmVo0uGw4QlFSGci/FtneonjPyP24uKVhfER2uddaT+IVbBLScI
+4EWt6rMNfKNK2k0zdrLIHpu06Q6WYWNsajw3lGiR+jixQSU5hTajLqoiEZxtvE6ZPIFQdGUXylCC
+4mHpapOkzBdXgI8mOxG0CrwEq55JddG7kzdSpXTgQhffnOorM0tXWQMRu1i2phPqyDltWKOwWVJV
+tUacXSAqYPYD3BfSoJKxuKU64xAdStNgo2ORR2AwDnkBGmaU6QtkMgSqHCrMF8J9Ne/7IVplOkIp
+toEs7Yri2ZmAQkOclMLkeCpThFnEYp9neuCc52NCDUyzMm89GbFjaIxKjiH94iQ0Iq1i04IFALZ0
+By0a4bQ9G3Ol+GhC/W5wHUWQbuczrWsO5/tARxxM4YqJWR5VcsHJ4zFLjoILIIlcr9mb8tWfo0x4
+MfgVpmvmPKhCbcDcFMrFBMxdukNBymQCSaltZgK/dibYok8kJh8ibeOba2zUQvIGFQWwgHQhuFsI
+/FLGSQ5nWSQJgsEI3A/DPNxNTPPv6xp9px6TVF8Idj9kfwNdTu1Hh6NmgOPkylBSIDt4BRaUc/MJ
+UFogZXjQmeb101tP1qCPOquyBcdINEIdRNQxAggOU/MjtJCN40jXeRKN4WrktR7i9S/tptLadBOD
+XOBdwd4NhRgRGLgO8WKntqmUCdkS5xzUYgOt0Q1cJ2m8MQ6SaCs6bVRW1TzH0gwXkHXN+C5M5BUA
+fQ6UW+FGZSflbkLOCzsNuxHQ+bH1Rswf3Mh4BwtGnJpuxhkJZ/Ljct1qJZow2cXsh0WYYmeL5JuI
+g40rybEK4EB9Eace7BRHkZ5PS/NuXv/tiqqgF7kqWXzCli+rCY4B6+R/Wt8tXRYMzGSb0dmIwD/f
+izKENW7EsQ4x/tD/MO27GEybNORmyD20v0FBRmOq2rQKi9V8c8rSg9e5Vl27atoZLA==\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ Bw/eYANAcOpgxKAanHJgAhiO/hS71+vPk6m9kmuQGsMkTrERlh8APKTf8lSxQQaSGgRokBFwI48p
+ftdkFINbRdrslE47kg7ywEVKn6Ig3rF6zjqZ/FAdqn0SZXokVXopqaRJXLT3XiprcXV/ktdSXGri
+FmoMcbQak8BzPsYSdY/YN7LfIdwrerKoIj348HnJjz1kUHGIc2xS+ziwLeSoqTBxHypvG6Lc2Qbg
+EuB8HZuXAAlI6qoXNiV5EvtvoiIgljhKveTXGF9kbLC4Bt/ca/cZ/7HdS27UauIEOz7qu1nYUjNp
+b8cvfSphnWA7PcIHTzL0kMdk0JlcEQgjIvjMmVzcV/zFsqBYCEXtNVHXosK+ItVPapCDUs/VFjjJ
+FLGFML5YlA6lGJZ9/5jry4vY2xCjiwZ0RRDwoH9ItnWVVBaGcue6gQIPeQdYhmg8dJXHcx4OcSYH
+Wvlg/A/yD/kSGtjFyo6C80rIPvu8oqSw6OcqdU5yxTFGCkvRt0KkbEt++563j3lZM82g2YhdReXF
+JPexJ5sZTfNqrepMHG4s1D67GU1wT+4BtEMHA9TwIKx48N74+M9ruggSiNUFflq8D0yqe7Mz+omo
+ugqn0xDZUUwXOl/jElIhq28RIn8sNLt93x/wox0QB1AQ7rHieaafSoIUeDsEsmDhRo57wC6pIdNt
+7HHnt/fH4hhaE1LNqj519lV/V1Wyvd57shGBGBoQQ2pBJ1V0QmC1Qxm/uCtFN7XTwUjZ4lU5Vnwt
+ZHeq76KqzrQK4ueXmIcYQ/8Nty1pwgo9vuDd7cdLuZmr2gaupibidRjx1/wV/WR7cqG5GMmJ/RIh
+264yBZgbU+27c9LnuKIphgBfpIkoBhAv7N5Nth6488Uu0mTsupvT4rBfVEqEMzknmTV51yT3fZLJ
+A++xJM4RfiP8gPsn/3gDcHPlZn52L/74GAZpsqhB2UogCOqzuhWjBAebTFO4oR8qDqnGfCSh43+z
+55Y0JWTZS3I0o9DtUEOBsGaHZreuXYJBQ7bWJVn27Z3f5oF3gTLKEpC0ijlgZYrxYEU4XfbAQ3tx
+LVt8b51r1YhJ+lDHbSdbsc4ylJKBo7WDHyvcFB/IbiB9CfR0iHFbNUSxMPj1y+ONf4w1T+726qJL
+LwHJdKoPRlLysZsnyFjd7ghEbPJwiLu7sh/KyhDECO+XYapxrP0voj7+PG7XMXbo8B4//Xk8IDR3
+bXm88/WBH9ps80aye/Li8VdlAnmd5joX8f/HqbteJxqUPR1pnYFApTDirOIWuLfAyMHi5BKgmUOt
+qevCQNUuOsJLvI/3e9vKvzyGdDQ1y43E36FmnGglmeGeMDcTsYvP9kKGQlZqjKNdm51xQdaiDmP4
+ltX0Nyumjp63ZEJSXSIK/Y8FciLf1qkaiKqyKBSFIbNomJhaLJ+inLMmZNEaFNVLMXpRrnXExW73
+IbkTQpEEKK684jEHz/clSKXc/qOqOueQXWTsA8if7WcsQ5N/TfWGf8zru91h/v8VVTSgu5ruwm/L
+Gkz1SS7utjqJZy3mRHPvaIuOx6LqEoCiLHsztioz6d8MZPW3DbU+LCQNU9dElABX+tTs1H6ZTOhQ
+LcumEGEN1Zv8rCbBE0R66A632I+pZKgvRcfOSpYcFWndv/5np6aPpopnBdwvE3Sl4OKp2pkIup7C
+nceRtXOIhxgnDlpSEXJ2u8Z0FaNm1+AleiFcIcxiHJrTfvkKx9bc8tDxFo9J1B8RRJyvVcbPZsMF
+/FwKl0QEgjFSzCgLA1aHVH4wUUkCAbNwW3PC8kx2D+byYmAVnJqgGvvsvzpF78A6UtXSQv9JVfTh
+chATg+tgkioAa9BUvjyjkxSObfse4hpq0qZ9f8/vp/e5wiqtMetrq862GWYYbsC5/je/nuiAu8wa
+6N0QyAmQJseqgjuOijEozIZl5zoK6DqUQpUaYwL9wCs81ljH3+IYvV3Hvy39Nqa/nSIV8ebE60jF
+PdYYu/qxYwHO4vontLSFnfjdexqKH9HweRDtWvy0hEu+bHfBUTxfb8BMGQgwzrnG1E1n6m89pjY/
+bRtrnsm8/W3XF6Gz5Jq102NzmzWH3NFlcI09JHPfgqfY5MkfX5DEREqAPg7lq/+t6MwSYj6qGnDS
+RbeYaXJA0pcCkFFFNQaSxFbWmPoMm98kJorRxSKMrcfIY43YyXad/rbfxvS3BntapDJ/aXsXvyv7
+n/QFLwVRBs6rFrO66J66fdVXlq4j7ZftLowN9XVnPgXcKCmtt+KtwBp4Mfq6bWnbxtqaSVLbWlS8
+Tz62WTs1lk7Vgvk6ze4hlrlPH0jmEvP3c2Rd1T8ozEP0Qod7F3POjXsYUAxySasCVWNDDni7Y3qI
+hGwql1xZACIOlK66jYGzZ6EcUYzCCvK+3/Hxim/7jyhJIbNEIi7za4wxppaEDPnkeWC53ZR33g0u
+n0L8fPYlbHc3GbRj/QFAZUKQdLPfDWWpfvMfsOFZF66aVVcsBmcFZGc/l3a5aN0MIk0JJBYrsby8
+m6Obu3rbWh4Hb3cX/wDyapV0Hl01NlmSuChyYmwKTBE/Sf9Wbr/H4u5GHod9k4taXYLbiJmPpl88
+96e2pb7Jzi+O0VHcsWETwtutCE8zXlehrL96UKyqlbhLlH+FjHOgyjGIozgIK5Z2oXqsiJw1pa1C
+D+FpF5KzCjJBNxBFCV04T9ZQkOqBdU2AiOgmaJ9EnJJco1CGStZ2F/5OfWdXEoatYNGrY6/vn6JG
+6HJ52ChC/ABTpRC0a3uzFmSkB8uRq0j1xZO/+Nl/qA+DKbvh8tFgxh/WByIHQx9Iz0UyZFH7i4ly
+mnn9Jpwfu5cozjlFNkAi+hBllDar7Z4/nBVXMy1ZivYuiQkjZEmmN5Q8xLm2+zSQnCyiMFkkoP5h
+LUTFsp8QFROYIkJFU5lCHpCkGjB101CD899sUEix4bA22zUj8CiUXXT96NoUQrTsgtmNMJpu72oo
+2UnoW78YwrupYoe43FBBmMkuRCWMTOuUo79WrcYq/jPSVRjct59FHM3xJyAHT4FuPBeBgIhEHrJ6
+OxgPVRnnuUQYwlcttLlqP+2fj0Fsnuw5IbZkFoAHqpJ+OgYrG6syCwk44aQNUg0qz3khNlXwKeVO
+QwDjSTo9GhBAw+XYh9RI4jUMrnM3uaEsD5WPG8J1XOiRotcREtMOzMJUSgGYpkSOD3qUC+ekMTUo
+9RbL+vG8/XYRQjyFbY2Tz9jPif0DwF6j+5JbkDpQeJDCrApw4Ui/CzQYCw/3CxpXbi4p96y6uUOn
+qOP6hQoB+wxytaf2Ihd3EC6e3OP10wev9raLMIW5Y/F9JNqHlbAZy2mq/ao3dENzlHbkoGVr6q0E
+VhuyhiosTuZLeGlmf9tzSdcYD6HRHd1MpvHr0gxELjHROCwXlehUUZQ42Fc2Ygq/qWmOevCCsZFS
+Nx+voAG/becNRLPh3zC43hVEOrUO+8bXYNe0y4KCfRx/HMvvUJ3CSROsNz+09Z0iWzlVsZOcbfny
+gRB2of4RF2GaiPAQm/DX/RHHlsYaDhXkVUrZzJ2P1HKmYs8mMc5obL3kRjqyouMyfiKaWEwCUVV6
+4GBRjNG+qqlXV8fw9YtqY0GLckLLzFKtivoA2qzo42pVpFqHqopWN2JtNnoSmvmGLGkWVjXleE+l
+D5V+f9l3pFy7AAWWdJOTQncAfQom9xTVKxxi4pvK+YSoyaI5g/TjJocfdzd1+1loy7FV2rHeKAss
+bhGJCLDoeAJPlESiwNs7EMuTXtB/mtsmuW1psfyKqgQjnOcxHgCTKL+cFVq/mGzy2lX7ehGwFeMA
+BVctZo3csGuVxImdJEIkxhKfY4+cGU2hxcNKt6YTwxDQuCmLMFSV3X9d28swVF6MTyLi74oaTTsv
+lw8x3RpHnNinoqqT/36q9dVtH7oL4/2DmJwGkqP0aCNvS74Lt6r3FfY35H3M0UxZp+iw4rFMC5Pt
+nSiAtn5Rb1e2qlLFuTxJ0NpEGI7zPGhx8EnrarUaFjIZzTdI1ET3rLnxlv7YZt+SJNH1UPuUroeE
+XyG+U89qAsWGD8eTkpziJZ+qudhl0AVuIyM/HcjbFH4/U/SdPmBsW4SSm6tD4CFyY5RO4AyOOid4
+FQBk5uBhYrTjpLuz5Xke3d40OJTk6DsaDwTnbA88tj9HmK/rnm1lmwBDwqR3k1BpsLtN7VQRRAwS
+fwknrax7GgOBY/b150NfiOP9sQ3GK21Xnuvp18tXI9Rv317d0gItEtcrVVOdspamXFc2v/ztz2PS
+b4MST9omBNTYHuQrkbF8u+h3X9TaoEvPiAX6OIh1g+nKGpWZWzeuetUQXWX+xo8Bn3p9vml4b8wH
+xfSX9zG9WN7wEaSa19teU4+mgXHlNTiFa7yRS7jG+jZ2rvm4xB76FTr7VPR3y7/RQ9ed5VgBEG1n
+uN2yF+IKOVelctH0eEa1P1Q1i5thebrF9fb3C6fCQjjbvZy7pamMVOCcDqTR82XeJvDiDVW+yh55
+8XVLz3qwKBTzY8NWpNR++HUfXDgvZZj7ivXDmZN5vsy7NIJlLHMGfF/wXsuauXlevB3BDjgBXx8c
+b/N4ZcJeWI7ClPL+hD2y9U9PqUTLN4cWvnpZ2p+66JFrunystgmiP9rFIUPxzXXZX7rdL4dsthBw
+HnLqzIYSY2JIz/uFF2066X01WPTXaWyA6mwTB0L6FQUGTTV735374OE/n/ugtwyQjV/3jMGx8T/n
+ul6JV2abTdCS4na/+yI9w2Dc3DUxKW8UhNm7xz6D6E5GtVBs777HbRODvZRQqH3MEtlnv3iu5jbT
+oXpzewb2p/oYq1ljY28SWEPCR982J96v3psJMvBV96aDQ8GttmvbXSvfSyfVFi/cdhXP33Q6tM9x
+7hPljzjvkze+uS7bet2F9s3k5avt4rHrOB8cXIuh4xrsOmSEOp/ftnwsmnxkanbNlT6e++Cx/nwb
+LOvK2z01OLZmjrmuV0rWcWoWkPG7jp9W/NM6roVQ9MWh4+05rWg/9LQI5fhW74tX722shL7cLBGv
+O7eZDkO8J57KGVas7zrusbrruEXcdh3n/W66e5o6fF8zQ2DItqvbXS03Hf8IIjsUfAFko54XGbw5
+yi/PJPqyo8xpbYTVMmg7QgoQA1YTVh3L4yPJJAEmyxZlsXFP4PEiuRuzAYzc9ddRoNi2fS52Dgyu
+zK0ByyTRrEsOnI/W903ylG5jcKVap1AVDfjsq50p60v6zXsY7qudd6fAKxrIwfVoj7Vx33U12LcL
+u+Xd9zNA1bNvH1NUpNTaNj1hnW+D6L1WNBWr7C97Y0UJKdK8XVVEqNRt0TACjYQPPyGeGpsqyFDZ
+7cMWCHzgNf4uWDvLRpGRY5oLL7yP7f5J9pTWdj+XqU712D1xH+LbTSLJckdV77nGNAF1mz5bLyhs
+vsb0PnmfUm9kgOgsXah+cr5mlJ1jnw++FsCmcN3CvAmu+wPrQ7vSc1EVuzC3NQmMiA==\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ F8k0Pb74bdZm4ypr2cpp1+Atphqm7maNj4+mIN5xx+GuHXWv5l5KWO/zEk+/mYvbe/54OwGNECnh
+sS8X72hhJ/K4b/QqC+33d80O4VyFHWHa7nEd+xMoTlVrNZJDVvl9n20no/B0AwrPFSRKe6SD5vz+
+WPeSy4/oSRzvN9trWGS+OS3e2vKuzc3Qk3uUxyXh+ZaxcKlm3h2rdkWO+vHNnN30Pq3A02Y60orP
+XrUrsYODQeUaRB0h2KRPoR7CHKkq7ubDeSUD6XT9eb7iazdvz+K4/flNX3bL/pZhyl7bYZjizftu
+g2Lwpms5P0PY689dGRYLMmb8d18UVXvaMY1Ijzs9JfKX2KCPfIWlnm//rpFp57rfsWbjNRiqRW+0
+uRiLfUq2zzl8kWzksT5nrOa6/VgBtG0xxe0ee+btRX5sRVaM8tDDvnpBCcOQNkabIJq5By6bHDFQ
+215Xut6dpK3tWo+KZt6qVM1fMH5dTI7Nua7z7mxybN7HaDPK/mDniua+QI44lWyq548+7xaZa2Yv
+Ibuu20457aOY8GMW3/Wamo9S6dh4FZCQ9rTWfa7jtec2DRTKuU+/Ld9jWk+/9fbNj0f/5Exzz1lH
+11cEYaqx57rrrwhIotSx4bTEhr6g0TmT18Cvlc2iRexP2ipwSDel1gPuXgAeBexorGbYJ5vaYgOZ
+0YwJ9aeDDcXdkuL2im/7Y0Mo2nZsdRdD7TkQKAaHNNrTsPynH+QeH8D11bpBodoqI5LHYzbtIW+g
+LwAYSx3+4pmeLKEnxifZVoBBAcFL1EgS9thF8/qbJ4fhStbYA1b8Opugjy5ZRBW2703eNQlSVGaB
+mF85f1nluKfAdKiSQNEAqvlAUI4sSlrNabuw/rzoQJkzqaybCbkfU/Z2u1Fs2GoRv1oNg30MKoNE
+A5vYoMuiGmxRW6bgS3jBI1qwDlHBkI6OjLsVdTxEKpGJjhUg4MMBebdpcUWCnRR1B3pHlQ5AtA8h
+NQMgbKmxXzEkgHAgIkSAzLJB/HHKOclcCmwWHmIT+m6I4Da7QVwR6hYFfejDCy8Rrx9SO9DZrNpd
+yY5U45CTogMXRDdyWg3SHvN4K5j8AxBT1LuipQRuf8bKQEt0tChAwQh7QR+CaEIuoFL+WC6MweM+
+mRzJJ5o91ho4dbZMh1xAkBwk8mScPdQxaSxk+zzZheQmmPWMg32XzPJPpYdJqmqhzLZIURkccqm1
+ENkIZqTsHsnVPUlzEhtuNZO35JKkTBwEsBRB9045VehMyAWQWXb5K788p/HHNBFTfcTZW+5cdPOs
+HkCWtZEGsk7ZH1YldDWexXFkda4d+gSyPqB9CyTOfnE1Da7ek2UDc9mv6QacxqQmt80rgQOc1vvB
+L/vNX0mrj8r21+3AtNkrNVS/k4oBePg5ouE8BDo5XWxmkEz/Q66Ywm7T7AOLqQuycdBqAmIWlXzJ
+bGPRk/AxY28bIzW85hut3sdNfNmoX4ERwisUv/YkNz3bGkVHTM9onxIacflDpFOk1GQR1ZyKdx1h
+QF1IhamZbDbCHfZ1m0HKQoFwpxqERO+EJJmQqBw6D/2FjNg/AuD2eS4BhdDY/oLtBIENP9QliIGk
+wd9VKo9gYMiMnhZerJu6ATpS3Vf9i2eNJQ0o+IGiPGbxJ712B/WyunVQJAcIt0d1DOobwHUxVA9D
+jPtpDZ9bx+vX9HcstMnaWNAOvdQbdgW9Lk1Qxqa05WKmH/rcUcR6jzlAIToSJ1NdEiGCGqYsTLlb
+uqDbA9qsgzkHDbZACYByAEwvSjtizqN9KTs6Ys6xADHnSb8/mnOuCyPjcF80cUY2/Fjdf4EZRjfR
+IRrtxzS+Tej8uh/BnEBxBWENkh7oTIBynMHGG+SCA/3by5jDa0WbhGrKJ08ZzTzURZrMwpbqtrdD
+vYUQzep1tRdgpxvsfYjce52TN6gF8Se4MtDhzI9g6RTYG3AzEO9COdjWl7rIRgDkegvicigoCZCi
+SRBIHtQUNnZyxsERDypRE0rfqaonMXorJDcGeomFXYJDLApwDzXQeEzjT5ZCUblecSJCZ3B5amBF
+vELz6v6KENARafaoroOSRnQ0uRE5NAgLn8zF0tRFMQIrjIQJUA6sXktyRrFBYs3AGWFm85R/8Rd7
+KA0NpOCpojcBkCBVmAyCFb54uySUAHUIffn4j298O3CR3Gi8JJVZhQuPFQPqeCwOO2Qg64S4P9vL
+QP4W/EBsnvwyYSpupP1saqKJ7+mhy010P4iAIXM0hSbAAh5swoAU+6FmsVZMZqKAKWEnM3sJmFhk
+WpsYwDmFr/f/i9WH7gL+ZlBOsu6nXwcx4UJZYPf9S+yqTSGnM8spoScZTBogfWKfV0eJw8NkKxny
+C+ObivLfqwgD3SpfokPocEY/eoRxFJxijhviRclecbltFnd5ydL8MGUsF85yfp+yejdMwz4rOFsd
+vwYICrQsKIsUZ+VQwq+IZf2zvaMkBCUjdV3Zc9QfHok/YcpY9NmXO4pyXcQ40VEDPIuNe+VEPegp
+/53cWPEXbHaCu8CQJ0qerRcpIjTwQaZEFF8YXpJHKpR78uTJjKYIv6skRROF30sjQf4Mjym7TCWD
+5pPeGHeTz16FbJ4IceGcgKULQwhRK+zGAz5LNGNrROwVb5bjrOmm7phV7K5QG3iGWF9L1lBkQFmg
+DziI3oVzo7T/A+cRsJskEQqSnvOrv5/V3HgEkC6YURr7pGPe5/D0EWGB0iE89cF7Td0bV+CMMkh/
+wY8tKbSmJBy+D+FzhlqYYX6g110YHFb6xhIbMrnZ0QB7iXCMYV9OFaFlQ1NDbdgzFF+VRa+tGqwo
+QnKBHdu31qU2zKll9yyH2gDUjt9T90qxOI96rUqt8kOdt6BGtGwH+xWG2rBYkuozxS6DDjXZvWth
+MXBGhYXE2SvMCnvUwIqS1uEhtLfDNRm0sycfcGLZhhaIlfJQvR/ZpHA4OVTSGVrw2qwpQfIsYB+C
+Jp+ynlYDthfFfdCqbNrZOFQoZz04oTtsW1PLL+78B5N4EHoC2eLrUVBpNWBdcza+5lQlN5C6ENup
+Th856aQqNUjqQg9VgbOEBlOovmU3A7VIrbPxHqzbXHpA+ggoLd1/uor4WSR+dRdG2fpSAh98eZSH
+UnEH2JcOyeXJM4SNLM7EyHgIYy2yA5xBz7o0gFXF3Ed5t0tetS+/4CbEywWAj8GO2oeM0lc7KOSg
+PBQMg+Bg4VmrGRi58FVOtbaa4gKhcKftoDvwBvMp/OSsunMIAmBLZWMaYn72RLnPZ4MjkvYyfDYU
+KR06WkCUUIXf7HBVTTObvzlIiLXkLV9sUklma0ku6SK6z4zrJN13DO8S81KZEF6Svacrml1yFr9D
+eCD1A3WVt2uqM/Io9hMaysDpskUjYLwZyj+57x9UzJJ1EVscf7GUaEsw27jzU2rvtlvBUkVfRNwf
+6zC0gN26sPJwPmMnr8ai7nPVXb5eDPgi9PeB8TtNlHKqItlqQIRintE6ixRCAC0f7OvAWBq0ovR1
+sOSVmBI8CFYaYUOEVhtDkx2dT4majmnEyRDNnKHpKFKEIsgVm2wE1wThRFwPFbnSgy4QQHbrQp60
+W7r07VS7Li674zqTyDZkld1iweIQhASigo2M4GATGufmNBTzUtCSYxfQ7tUDOYs9E4FWzGRRA/mb
+SH5yjpk6dmT3fAwBHnD8c7RtVIwD8uTnPeQZOyLjJ5AWChpNUAk0+XCyGiv/5J/RccZBbtCN5xZg
+xAlXefSoBNlNp2vfoJb/SHnySAsBkqfB0TdaxsJunTyxZ0fOQqAkMWKgvpw6hHUuSPrCpwv0s0pC
+V1QSZwT26tDiZ5Vrbopu082UMl4bBv0DG2JAFPE7nPc6LokmBPVztDF+yOj9gIHaBua5pR6RvGFv
+vfmruwQ3ROmy+TC/WMZk8wIdw8E+oYwF4Cc4nyxkhn6zOc5O7esQMg5WWBiNn8svs5B50qMjcjBU
+IQIJoz6xxzYtrnPFXdCrJVNeIClJ7jJr6j+ImK5vlmMVIlZ2NqvbXxrm5WOjR0wxd3c0E1yB01No
+7lwUdE1X1vdEQ02e/CS8jJN1/NFs0ln1K379LtKCEVmw5AgpVoKjRrs8fsJPnNVtOwp7p2DYx5Va
+LGRzYSF2qzrOFNGutKKFXbaG8tf93j7fowwKBa/Xq4lcZ71ax/krKTqOvLRYFuhtI8sNd71sp/Jo
+42A5oj6G9LNyf66nvRtKxrTwEr/3UBDkem82805uo1q9Dyn8+933JouaqluLysqTsz7rae9yi6DW
+F/EC7CjR7AxjVH5xIKFoSq2GyT6DHhjlogVpbmt9femBaGhiWqq5A25WLP3xsLdpMBr6hJDjYkEf
+0rHUkDVYgHR70ptyyod4jCADBAvc2+Y334/w/kNagdufrPDnf66n/ZicpMlhjpdCtvdimnksn0+3
+P9hcY7TiHevLWOpXLy6M5HTiXgd90hg5UDcUpDQG5Lrb21OObY7EROvFyCMULwYuMLJVMceaDalI
+Su3hJ/K7WeR0K2EKfxgwt8ywZErUtaOpL5Wf9iekepg3v95bbA3XeyeWQ4COC+85SPqlupqPX1v7
+qqgP4b01asrJrs7rYe8uT2wx7TIreJXNHOJkn0gnNpPihfRtkmpt8qEYT1KIeE03XKOkRCIOW3r0
+wIxdT/uxhj/072vMCGzx9WrHvAooPtLY/+xFqmLyKqacKKS/DQYynvlc/AUGA56KwmL8FtQqy9Cy
+sDixHJ2UxYBGw342k9TtfU0bQmTf8n4ShtORXlhAmPbBa71lv5p8xfiksGKMNq3vBBlVv352AZvj
+t4KWbpOD/REnQqDL4YsAnw4PlnVnY4obIAiIgBnGnojWtcgrADaJizBXsNINWYyz3+eqKJ56m6ss
+t707OEoq1MGqf4akUSo6icDui3IMFZhdmOLCruUgx0QH66Yk23Nm3t6eX/edk/cd+0yTeSYGQT6A
+DXj97jqrx2/NWhMcBJ3GMgvL1P83i7MugNhdSbOYaEnByS7AupEUZLnLFGcG4s/PiXbL1n2iG3Iz
+bJvKee6iMWaWEz+RoMK6WKAXsF2w8VjWcba1pSjk93nOy9vuRBeFIe6/z3ND/i4GUdEAdBkuPjTv
+Km/x75hnZrjaVCwLTMpDhMxs2Y1JfX11BwXmit3b/sIkAFMAaDMT8oc0GcsDserHRJPk7THRSLh0
+E8kCocau6EWZ3ygtB+ywRM/75qQHLEaWJgs41ZX4ec7M+85PEYgy3iJcN5LMdh9hm6FVzYFjuEgv
+WbDd1XoL9Mermh7pfRHx9Ppdtevc/ggwZyTESKsjU6Om1VmJKbYaRBN0RMuPvARE3mHYIeTOWR+N
+TtEIxR9e9nPeBVT1NzcBVWEk8HegbG1+Y5JdD0cJm7nxyMF90nG9TdhPzkhVyLLhbirhzFGBgMdm
+BdXFuZLXHsS+fC/3ASWaAGXgPaAB3biLz76IwCaqM1S1C9HRXHQHtQESoY1NXSBFLA==\r
+ ]]>\r
+ <![CDATA[\r
+ 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
+edyZ0m1jbZYrJsEr00ZSbZzsrXlmXHjeT5Zk1buFQ9Z1F4c7FaPdG9wk44PP7bnJbcH3xjVYiLru
+oojOJiO/UViD8l5NhLZ5MKad3Ya2v75N49sBBdPW3zii4cbP9nhFEkOd+JbrwUEye5tXj6VbUyO7
+hxD0fsfbs69veTZ/ev3+V6///ov/ofz7f/XX//hv/sN//a//6R/+yoGGgX//r/+vv/6bf/j7v/7X
+v//rf/m7v/P4v/xP/+Xv/7r/y9/+zb/+v/lvU//2L//hv/0//8e61z/7t3/963/4+p/+4y/pn//t
+3xy//Av8z7/773/7N/+N/7dp8/+LX//j6//7P19j//2X+sv/9Mv/9r8fv/zHv3392//yt3/zd689
+cqLlUAfA4CRU4O9emyG6hYJ+MYY/PYYPgIIVgbtu8eHgdYO/Xq/3P+N/nqvu9QAspuMl9Ne9hsqM
+9T7Z9aIcZzhYg4SYcpC8qhrs5Pt9eX2rKkrjry0h7gyuIQ9il9TFKAHRYKrDzyoAkvkOkHvld3Yh
+HDTYEFrgxaTT9ZUI8HOQZ6V1B1bC6s5JOuSbwPpz/GWPxzVewGfHJ752Mn4gfD5gFA==\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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
+nw+xdDFSn0A9KgpIEVCaTO0BI/QHopkwN1mn/mPmB8KOin8dqjtss3hpyPi36N4YQ6pviOOw51XY
+GytsozWOPmDxyslIrvknSkrte7xxCE6OYMw3zHMMkA6h1H8ZJO8jQv85QvtfgP775sd/Wd+wP65O
++WvZ2rs2/QvK1t/8Nhz1rXD+y+u9/nv6TSorvyX9P3/3/6rht7/7h3/134yvP3qz/et/8+/X//Hv
+/vwP//Y//z//9//1P/39f/kv//if/wzrv/3H//M//vmr/b/9X/7857///Md/+E3Nv8H+W/vvZPB/
+I//j7/6rTrf93/Rb/vJI//3rv/2nl+2//tZ++x9++9/+9/TbP/yr1//uf9Yp2en1jlLtWg+p635s
+P7/YupUnfz7+aWDyf/lnPM//aLPweLC//zLsNLii/334GVIukyKHPwNojML/lMLyz2iQn/qhPpRs
+DY9njS+SzJKp11LFAkLjJ+3JWGFaaoRCcKaEo3SboWRvMjnalxE57B/8i9XgKcpQtTzPcmobq38w
+4pdyrTxFwl/uKZ4ZN6IO2zQ5sCbb9+gzlI6nPYqIYu9pcGToWIv2uFEM1/B+GkpGV3dBW/l8GcHi
+AJk3qJrLM/QMI7A7OsNWH5TC1GzrjPDLzJ+PIozbgilSAVr/KK/fbcyzeb32pSofmwLP2fABapyu
+lKT21vEwuy3+WNs72SyZQGzwDD8ejzdm3pxqJ1PvzAtG/slepKcDrU3uOYx71vcvW6zj3BKpnHWW
+3C9/7kyUdFgsm3+RKktq9ydpuZAGq9riZrQQVo2jcT2/3Cc+iefc1kSfKxu1c4DV2m/hI5x5qmRb
+8veftEP2Ut6zuTyB5RnXSaJ/93DWgEpnZFOKIJkehr7epso9hCF1IvoZoFgDAVlIyIrKb61/jizU
+Znn31+tBRk8l5V0efgtnrMFuzarUZukAXUfYQKIlN3GQHJ1dsY9WsVe0ZP2Tj5atmsDavhnr4Moo
+/HNv0/vjL1gXqjRkdhMHtldcGNyJ1MX0S47RHxv6XWt6W4oN0Y+zV/6JhVH8cJ0qIe9P93LJsb40
+z/vT7XbN6rbP9di/DnP2hXeJldUk0aZz59vWiqV+zUzKt+r72+2QJhcDqKCaXiMNRtn35myKvUOq
+v5kCtB2SCYu3+aUwHoRYsS8cYkPVWX/SDAkJWVDIne9m+A17c2R831/uTKx4NOqxSQlfICufbp+2
+u7prYQixPtkm6ISZq7E1Gsdh23fylRS1AOkNkc5uMI6Nffj2DOfx5FizQcbDIxXe/xgJn0XLnz9p
+B8hV9gKPMZFwWL5NG4UKwCiQD+v4GBUw2C3zRkocAVmwBfFOM4JWLX/LJZDldV5BGGY7l/MMhX+u
+zcUReKnOB2tJ7KVOLhnoQIjcQuXRpkAXM448MQ+Hyy526FvodZHcGRFRdh5Oz3nrbJAn8A7U9GTw
+xbeGapsYp8lvCe6krnr+4sI92eni6wi4iOR/vYcvmI2/9eg+s1FktBGgLLId7brEdXajSkvBTTxb
+bbKbyuqm1mHGisNqmNZ1uK6+LLnGrekpbzHzWBfm/Ovf/vSfj8lNKwCNn/Ew56hZTBgbII0O6l4m
+02MPKkTfn7SX1QsvjsYWE6ByyzI1yrYac8VBsR+3n1AOR31cSWZUrU1bOugMJF0jMh3F+mgXstgQ
+SrYo6u5bWkQu/LgP7KvtN60gQFwxRRqO+NvV6b+tfDNWQF9GKAkpqMhVoPYmuU3sqIyKMfO5fIEt
+6riI8RRIpBeKFRtX9xYv8lxzcYmiYYG0AFl0Sx9Il5QeF37aEL94OteuQbL/tFODsRwx6pRMwAcb
+1qMQeQwjj8uiQFV+bzvX7SQ5X/6X5fNcutvdJNVe8JWVrXfQ80RarE/wx1xBiStoehc4+XH3EYYv
+FvRw0ljBusC9PwMfT979dYjClT6KqmLOxXdKx5zS3RrWovX7r1Ly5tGzjY0vxmG+a/ck4NsTPJ8t
+VR4ICv/1h2uZ21i3zk//m4OusQYWx274TH4dDF78PC/+LL/8RX8YkSGtCy+kjLJPt6fqMzW9xcjg
+pi9oCp+1nN8f5/wPjoDuzhqcVY7w8tf3Y02aEZSyL/tY7ACgyAop039syOWzwPRpJ925g34x1eRV
+6Y1kSiynRs8MuBbVuZ30V0+9XXVxk7uULfuPd2MEcwpjYDmqZlR/FsYMBatLd7GslQovR8oeZ8k3
+060r82jwSk+DSl8aKa0s8ij+YNDgTVKLavCWH+2GpT/NomvNWmAarNjLqrDZTQB92A+L59qTkFUS
+fstUSQIaxQZgT6Rqak74pVnQb143ulcARLHH2JfyzyEjnoS1mTz4n7Ad50ALcD4Aupyob4xam+tl
+6HVrkyWNmkywS77ukdFJhZRrPQoLRYNya53Xx2JrKs2d2tI/PFoZ4ew3bkLRSeRlw/48Kft5Nw1u
+40cK9DUfXzdli/zWI9DSX/qDvSKufkZ4vQQ2FV8iU61KX4Ltqor7D+mIlKRMhq9cd/j3kmLmRyNR
+LiX3+LvJU/kAWvNSe0MNTz57qlgyrRoAXaS2G7f0PNqUqqrtJ4vMGJZYZxMWWU2oVKXxyJ9QDTkN
+u5TtIOtn6Q9jedjIy6oQaVLjWMOA09kJUSWcolPSrQyGoaAqNl8ODfyltKh4qMGTkypE49yfV4OO
+n7S/Vgn9Fz7Fsj4iNvGoV6fl63c8uXMiqe4+tq4IOwRSoa/kOuubuCFdp65gpM2opo8Ade7kPx6m
+QYIDx8rgMsHFS4EZJVO7/Xrj6dQ8YMxn2HMlKgDGR0CpaUGqE8Mi7yXXB0d9TNg6La4SG1ZwVZkR
+5TK9l/zUZDLg6a/J0cur5jRGEjjB5vPOzjN6DyYnW/KePgKs8C+hjJyfPP2fOb3i6ue+ufwWrI94
+6VGc1htoNLoiQIIUMvWf84tOCNgCLiEkf6572FyNpiXX0p5fw2MFd8wKt7V7V1wTnW90c9k963Un
+ZE6FC7M3cynt1fbIZ4RZGXiTKib+ROtfXerAIznOytvjfbo98QVb9vdrA2NTqVqMuQ==\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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
+/cIXv/L8iy/+7u9965u//fx3vvcnz//io49c+usHP/uuf/8N2OMtb9x4+Jehye//3W//7d/9zve+
+953f/sJnHv3UL333O8f9T/yV+//Lqx/4EV6iW95y1y9/6++++Pe+971v/fr+7PPf/e4vffxn3/3j
+7/7U17/26I+/6V1/7b/7jZ9/G7e89e33/9a3v3D4X3/3u//V/e/9q5/6+tc/dcdb3/TvvfPBL33p
+wR+97ac+8+Lf+pC2fMcDX/v2X78we+Hrn/zJN/8HD+UG73zDLRn8rd964Eff+oEvfOsLH3jLLdLn
+h3/7j37zY49/9Wsf/4k3YVfv/Eu3/iX8y4+988Nf/OZn3v2mW2ScH/i1P37xswff/B+P+//w3fD1
+n3rnO975U/CXO+/85PNfe+Rdb5CdedO797/90m/85h9//8XLH//U51966Zc/9eADD37q83/4h5//
+9Kd/6TvPP/gOPR1veNfHf/8f/dHf/9P/+5/8wddfeOnP/tkfv/iVL33p6y/903/60gsv/OH3vmFa
+3vqOh178/j/4zv/yz/7spRe+/gf/JP/C86e1fPuHv/rHX/svfvV/eunzn/r45Re//0ef/+SD+vVv
+f820zFP6le9+cfbZ33nh0+/5j8Plb734n9/5Yz9256dfeOHT733vp5//8gOm5Zve/dnf+/r+YW55
+50/89MUXf+fTpuXXvmRa5ik98sJ3fv03XvruL33yr+Wv5n89+OAnfylva/763/ni/W8vLfN+fumP
+/vClfDae//LzcETyjPDfL7z40t//Fd0iHGh87ssv/M7f/ubXv/qVr379m/Av/PcLv/MH/9vf29ct
+woH+J/d+8oknZrMn4B/+V/737PA3XvrGo7pF1HL7P9t5Yu6fi0//5ktfN4uUW77Z7f/Gl75c//OV
+r77w+3/wD//R8x9+e93ys3/zt/DnX/rSb9E/X/rKN/7nP/1//t8//Vvbb7Utf/jHwv0f+9Qv7PzC
+Jz/24AP0z0OfeOYb/8e//tf/+6/f/TYzzh+69Yff+h/1Dz4++/SHN3/8R+Eiv+NHf8IffOv/+rf/
+9v/8vV/4K2+0ROGWN/2nH/8b3/w7L3xueOsbiDq89Wd/7R//q3/37/7VP/4bP/OWquVb7vrCn/zg
+X/zZ1+7nO3Pr2z78uz/487/4iz//we9++G2Wet36I/d99Z//m//vX/z3siantsx9/ur3/+W/+cE3
+ZE1uecvPZODP//xffv9XR19/409+4ivf/+d/8isCE/CDH3z/K5/4yWpGP3Trm+/8xK9+9QuPKIzA
+N77xq5+4880jIvuGN//kXffdtfGXbzXAz9x//8/85Jvf8EOjfzLB+5G3vPHWCshk+40LyHYmorfM
+EV6L3HHHzx1eBFvN7bc99vPFwi82owfE2NlsfBT+aNgqBP977O6xpb7dePb2zRhTA+a9BGbXuBW7
+tmezfAMmcDRXCn5BDJ7OuQRGsmar731HeO5oK4CZO+M92cMz/nCxft2fP/6Z26GDfqvxDVhMU/6E
+az3bYmEg3keDUwcLf3Qg33Qx4Tdd/mabyq/MD+dAfQVa37Jt1HdlmOi3gANstoZ2aLnXvgv8q8Mg
+bgZmRehrQ/5Gbgm/0pJFnn+l22qb4Bb9SvJbrRdjo2vTIMvQb6VEc01befCD/kpqPPQNveXv9Um2
+CufaoAFccPoVOQwPzh2GHfghbv8QtxoX0FSdtjpXRg54j/iwFYOLbJR1eXAwtrxGfdNv0LKEjg4K
+gKETyzjYjbvO4AC2W23kTiM4LjAE9loawaC/D7hH23zIC5/QiA470rSOLOsBxsIj8A==\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ wJJzpA8LVY8pOb32J32KiMaooE/JZRy4sY7D72Wy8/iAoG8BfQ0BjAXntzwK2yMwy3nm0sTXDAme
+O4WanisY8yQr4U7OV6X6thklWEAsFwJtSr4EWERhfRhjKLlr2Ney8aV946fH+4a8Pt7vuWkLySOB
+ZMbxUR/PTbHOYuMuWHaJina+h7UKoGWWLQfXxqavVRonGNMoJ8HgEuylsU79sskD/De8MIaRpn5c
+9bkPEU6LORdDlo11ndS3ozWZn1xygENrpg5fViexvp2XwfnHcq51SVrzQN1cUacZ+uqCrMWecwG7
+wlGXGYEpVrIEwwhHq9rxVewHsFkuymq46cK8fS1jRi+Ro+uv+72OupDuDzTG5L+SI5dBHd1QoFyx
+kkLUYw2wxtZtoFtz8DFDgqdO8kSLdC6eDqHt1VrFqUTy5hYaI6+hUEOXBRcqr5SYR36IxFm3i3SB
+X+XGVeyZpM2nPbOAsGcWkKtLpJZPZbDSFlNAWDGKhJ8a486Wwc7U0u2ZrxtFutzogpcW9gKSOZ7e
+Ih9XQJKQIDmEiuSo9PGXoDoPVqMJKYw07AfXKwFYVG+6CqbSSlfBVP/pOlqssnR3TassSShiIcFV
+7w8SoKfTVdnBsLy4QYQfFznBZEbONN8anZ25wmTCTTsPXYMIPJnyhPBU6kksDTuD5E/Kkt+k1NNb
+uFL/r7XDNFfz7dKflMWxlnkSpVvIek+N0yWfNdTwFi4h8pj5lSMNmj9cVAus9v8sFUN3KSoUTV8z
+wWJ7z/JjFORB5a7DnE5Fpd0W/QUBqB+dZvbSrygRHrnc1dNa8BjIHBta9PwpyJFCnyL9NqUqOtVH
+XEqlx8fEl0/vU1bs4Q04J07dgHP2pRePJnUR6xnp1TFXcPjgaP4WEM9yMAyYbkGlgyj7kJonYa7N
+hgA3dqaamT3IPJzyoDPsIbmPlEf5nlP+PLHM+Ckwnh6W1oLVXq7mW7pjkMy8cxLouuXX2oFUBXIn
+hYTV4EcKKjWmcvexR9creZoS6f5OYh38x582XiRXsFw7SUJqRXmocIfjYKtafaovtXGC0MAIrK+c
+kvOunjZOUtSpY92IFFbzNt3ViwTcyakPrly+3sKV0T+Wg5+uAKkl/ATq1h6SXSnpQmJyQ4VyB9Gj
+k6M4PYGuk4cSlo1DgQ+NDfeCfy32VwgxZdRtqg84vA4oaaim6n+vAva/Z3ddby2YG4D7bvzJq5+t
+tHWNEW1XcERQcxmF9GW5Ekn9p4H1EXhNp7yu0Mw5g6iaFoVPhtDVEo/vm6s47zC0OVxG2vXadkhC
+bpB5saHtsdikCk6cIdjkCohn1UWRfSuNE4wiZQzqSnmNAy3MfIsCorejFAjmxrEXcYepD8v7xgGI
+k4YeF2cd78lxMlcTZTLA0GGT2hedoKkxlIxP0kXSrEvqECkoqThV5T8bk5aeSlIBvTButXlnrTMK
+881atxlRnPXXa3hAweHEIQEFdL4pgCHBS7CRb6hI8FDrLF5eAyIKjnCGAlIXAPqjviBh6dof68tl
+7AN1jbyFLJn9bPxy1NiLuFex+BJr3xL/2PgjqEEZr29MnrpUsQuIWVLdd3kloMfltE7nWxaBdo/Y
+utpoRuVFsHPZOtwa/W73crDSPOXGH0G+NcbugMa/1/soXUpSlw5vHanMP74a7i+pM4dfsGBZE4dU
+/DKKuAyEr5FuE8UvmduQr5TfgLETsQhgtNLyDliXZX5zWlU8ERD3k7WiMTte1z2aNQzSvEtQvdEh
+AVsZrZ6PM/e1zj6sng8SyFOeLWtwQEomx3wud3Lt5y5SXfu5YRQJaEwOeN5aeByi9CW/RVTUZLFR
+fhN9+IIEr9UJfJUQb8EtNe7B+5AcPBmllIVMM1iE2X44k44KnHJkSVQ3rWIdRMeiD4nTW3jV0/oW
++zz7+1vwK3+QUIYXEupemBLKaZPHFVZbfuGSbkNzh8xXDIbFLqfexZS/dH6Q0YXBMIMw+PnYLzoC
+lkV60Al0u1GoHqlQULg4LVmyaOb6JgNLbhse0xobD6xHZMeIjYetDWG3qVf7OJjS+5ZbX8HcwrP+
+uW+0pWlisAwktuqFEJvmfOpTOiqp/8VLQC+b/r8cFh6BHNhq3smvQzb+/DSkb+YMqWYuxsM6nhOS
+bF8M8nfMOUY2Me5YWK6yY9VTkeptprQUMFTsGAcMzjqXSEePeUffkkecvC0Fj28ZejubeeIYXcw8
++eHTx00fnq4vOZ8KuQ1NXbpvceMwQiRYogjoBkOX1FBn+DqbtyU3CbxsdektpPtWAXHnWyWgcdoP
+Chj3bwZ7OiHpotz+nuFtuEnuQSxLVhvJ5IlMezLc7FGWiswrQpk7VhPCcyhlRSeyF2zBZkymHH9c
+FWvWhjBiVNvEr2JxSaFkLfEehPvPo7Gv29htVzCqQ4ZtBuA3XJDubXxw8GCTE3MLquh0d0LCF9yg
+HrbGEsJnet22QH+xyxVgSEg83iL97RtT28KZW8chQgxYQgYp0Fuk59nBCLyAX700TvDw2loFPPuk
+yIWUHB1O334B4dt3MPzq8LeXxvDMlz4kuGfZvZTA45DuepKQ0QH+Fl+QkI21D38Az/YxLSM8jTuc
+oUe+rrxvGZolqTX9XiSQyY4l9B8kYLlkYBdjiIjaucplaYvtIQPnKBQhG9re4s8PIpq0GVJIFtk8
+MyzMwS8IsDLAseutBI0cfZGRYQX0JJ8HHFmUKjOCEOzx+41r+yqEIi2C5w+gvTRF+mXjzH7rUp/w
+AuiJbojV+IIET46i84Yap+mygGQ2LzgM75mIVUHnTQAYfUDjtPOT2PRK0Ku5FvaNkcT4UBRW5lx5
+mlr5ypUUjkIxUwujxqkBFZDjJDJBi+IkYgb+BJIWVnCobH8Funr4kkBhGdmx1OjpLbxljKRPbO4w
+jySUOwooLXoczajMAswvnC64N8Xgt5EVCjXh35Sg8Pn/xkc4hHvfiI094eOfgF1xnSeI6ce9W0kc
+yi0RbGzNsUgOYTiYc8bdzNLAyS0C6pV3Se0Q/Gqb48HjmxIi34Of5S2jD+huUKEJeAw8zgl5BGz7
+flMfvv5UQj4u+pAd8zShL7xFdjgkPA+ZrS+vdjzCCnGbv4UMVbuXDifodEMG6kgvJFOCX05eScP+
+A9j7wdlHX5CQkuNrcmPP/6lgMjwJrlRslFc07tMq/TLBk4DnLHxW3gXGPQdKQCsClVROgj2aJ1HC
+fePvVTUoHZCSINefYDSfE6bHMxgvwGDSbAnebvCCxRiiPGoZQwY70V1fdqzWT9b/3re+fke5UZ2d
+5oz3gfGYeAkGE9TQGjXdE+c0R84lMO6kT0Or3ww3dnmWXQW1ZUg428k0QQZa7WVKdhLQai/XTL+K
+u7FLWbvHdMPjDiLu52p0vj0SYoVzmvkwVZHFjg1Km5mZ50I1IPTpRlvNHqq0zH0EazQT42GICPsi
+B8Ak6MnmYc6Exc4Pj9/A3WjHRpKwnpIRIAx2i/Em7HB84U+Q7vBh3qjh8gWPxmFFq6DbQhaTQVg4
+amO3kXBABYPsHmUJ2vj3ag4hp2fET7HbNG0cJXSZjBHkrU67QyqHGeUERfRljDiy7AWDCEUgCa5U
+Rx8SPyOA0N0oqdQT5reK1eWSN4gf/t59WeVSUOB8PBzHjMHDbFi4zxEOlWaMbEomhLTFVDNG2kdK
+YxhoyLaRoF/hXjEAfhU0EC71IgGdrRLSeESGkARJAoMtK3zTK1Mf0sRDYtOiVC7wpTEu8BR3VEAY
+hMrlOYM3rtt0yV+DInbIkJExIdWYkmae606i/Yg0qaCHr1zT6L2/YRHyEBjgv9j6w2BaeaSwUZQQ
+JEPPNC351yCSgQo6IQE69gWTEBoX+5EHoNc+eG4l+vDBLBUS8pVzeOl9HQzL2MfGbhrDt4iEVLfD
+kdWD4nbSNkE2vzqBM26HZtoPYE4eNRCGhJxpMBySPfIHsPYhjZexXhiE0aRYNHkR5dIoWwHWLO2l
+ubrdthDLEBtX2Y2xGWZoGe26JTGj4EjMIPCKooMF5Eg2Nlt3r4pHdnMKvUuwBjXlaUX29LTdZw4R
+nYAlkaw4EOAUSNdX3vXJ21GDedJfQupLevWKvwS+wprRkDoN+eRSVUIkARWVgZc4/KuJu2O8gu6E
+Zx2QPfaiMz76pztC3b0vjb0mTHqqGWTqUJYQ/lVWRcPfrlVltrePt+Kedy/g1e836IVtCvP5h8Z/
+AHc1OYkCqDGr5Ayqp/p7lVDuEOd5+jV34porZYhOuvPFRShhWBHy7xnDzcaw1w0kL22i+bX1IpZ3
+inoVjevDT43jQh3fbLkO5xDQVY7F6g3xX3gc+savhitX0F8L2ObmY5AU5TwOQTDOA9ZRWl5GttvC
+Bmd4jDgulMElLhL2fbQFzG/DBOMsOYjE+UpNEvJK7h2L+3viTnLOd/UCptikSf+x8UdweVbYAGBD
+KI0P28ySqr221NorLytCVLepw+uFWngkuaAPX+KLBAxv1F5hsVwkpeKulLCEqHbEz+LKf/zpo0Qf
+zygS280iPWvlFF6EUVmGZzpJyIXFBWvYPECvnLaBqKRTW2alIV5wUTSHlyZJiO106UOub+oDS6CO
+4VkOvowZ5ZXRmL5FjgNXgmQJUfSxgupd/Ld34yMf9xeg9uFDh70+zo8fLj+xtozJg3kSBUe5cRTU
+5JH0gpqvTx/1O2lLRNHTIvaWC9I58y28w15mtnzkKMVKJ/QtdHlx54mILSnIC4UvosZQ/7foKbKn
+UAx62H+yMZ3Fd4PSWd8r3XK0q1N3s611t74qFxXmoXG8CvgBPK/2UYLiFYxqxzRpxHK93yTB53Rt
+nOAY96L93KeVR19PUuBl/fwEKs/i99qHZ28+7mt5XNSY5gkizrezp0Ljik5WqeZv6Y1XMFXvitPj
+UuwH0HsbaquHBcryOnbovZhkMwo0Z+jdLda9jULyzMAnldc3p6SMxlyOPYIbAwyjnQV6R013Ay2A
+j6u/E+hF5UNC4hQvlSBFXNm6CvD1FkUCOrZnNjGL1bCAxXgZ+AqSBLutCHj18Yr6+rHxR7D2we5H
+l3S9n/UmtYBm/hSwHZkyBaOm4FGTlsVGWCFMrdEyJOTjZsYgmk10Ae3adz3/4oxmxIgJ3trZlw4X
+EL09/n5dnSTgcUea1PlxIyMs81kq4QuXWru/XmKhRUgobroCztkQXGhG2WtzKve4WFsk4iX21bMa
+VQVDYgUsmoKNpMwK48AlNgXn3Ip482j8i+y30fKDBBRfD5OggBHADQPFJXa9IwOXYc0IvEqY5vBY
+WP0Ej1Bg2EsLCOPhJWldLVzVYX4RXKvEsh01GrPtJVp+kNBnryn9l5qujgUUi+G1k1HRLJCCX15c
+pDSOmtfcchY2x8SpscWpLaAZzQJcDJshuYI7as6mLU7AI+3cEeomOKq/hEFPwO6sh2H6e7ZmC4sJ
+kyAaO/4noFlcA3z1oTROcPcKNAXUa21ISMndOSlLHy67MNe3UAmLefba5cJcS0Bfwg==\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ w0uyEdluZHJMrC6jsmNiGu8dxa6VaDUf3aopxzXMgmySwkTZrcQVMyE10dQc9rFYimBOLwo758cl
+vh/Wky9HbdTci62VFoqqifcJJXaOnBjwRszKYcwE0GaFRjwWPCBYKokv+IrKU3ycx33cqrvEsYU2
+LKLLrrx6BfCpA2Rn5PEBPXP4hBxCk4CVJ5BKzM9Ox384w1joUTFtPMDiwqQoAI5JIG8qMuF3GL0Y
+cCJOsOK0DCIZJoFghdX7FI1HGbkQVxRIoxjvz4JoZOQGZDSIhbHYZ0cI5iunMuj2h3h7M2H05GSD
+7FWuAd4kF40Q+aIcmRc5IrXQwRKJikVoItZCWSZHWTktODLenDfDlLaX119MLjDWNihyOj3CIISl
+wycQAygKiUpOQEE26l5ctWNzU4KrW3G10TXJipMP2VUsorhmXnt8TE7RGAGZJ5LDH26ImbkqI4h7
+jh1r7wVSTSvIgNiAI6mmwVVSbhSaNCMhmEE+zpMQyHWY5lBiQGhSmJiiLbly5swEUaM89U1vuZEt
+w+RSmfvRQi+ICDs314iAAAjmCJoEGZQun/gkYHbEThahNDAGjdjLlOY4wmqPPITWkhFTdpKDheHL
+DSTaTGS1KvaMSlLyZt9cMLMXY7FdhCOu3a6TfW0kktbPwLtCaa78JjTgbcosX3L0JJ3O8WQziTMY
+eAx3mrvN+IKYqowbDmJWsNOaIiIiXj5OwFIgS0gdGJYkhxyFeP4ERCnmyrUbnh7RZRVdS23ygSTm
+a2coI2YdDj14EnklecpQuLEKZdd1LYhoOI8Lk515ZcK+SliwIBXHjPUB9UBvaGvax7iRQE5kdm/d
+6YrbJ1cQYP4RBQJdDkrTLvUIEgK9TQxiNrEx4dRxiwpKu4o11JMwoVXbkaPbDykdPWTE8P4jxxWd
+TNKzVefho4uatu3sOkWlI8ouGjFm+ICiUYP7XzSwqGzEgIEnFjWHx06B/8D/924G/8Xn3R79R48e
+OHL4GWNGDxsyfGCHESPPumhk/3EDR2Z/k1YD3tHv9OEDzhpXdsGIYZLQbuCgIcMlqWm3gaNG9R80
+cOSQgUV/HnjBidWrOUVt4T+9L6leTevZbhFcGBQ5+v/cot7jIKeL/vtC/a9LioKibkV9z3WKBlTX
+z/8Jyw/7dRgybODJ/De+6k/9R+la61edqH/Yu2P1an31j6nAFnoDS1rCoHhaIS06t0i/Sg+cfmzw
+Nh+DZHqU/psU+foxveTgF4H+P0dXoAm+vX3/0f1PLnJ9rUxXr9a7c7Xy//n8z2fPf6pYn//suuzS
+p8qOf/6zq1z4sxMN+a/ZzN3ekP+UNu6uGu63vc+ebuNea8iBeZ9KtnQvt6jyrTgIP3/AT9WqVavJ
+pyp+KF0/kN/YnW7j3mzIIQcfXP2QQ2pUr66/NWvob41aNeGr/8AvpOsH9GP6YdPSitq4W1q3OxpS
+gxpSW39r1ahTs0adWjXq1q55aParU+pgbm1sMrXUNLNgG3eldfnN2ZWG1KtdA761DqlX8+B6NavV
+r1WtQW34Hi5f/bdO1FnwTO0a1NjaOLLUzIJt3LnW5beLmmPaUvmGHIYNObxOtYZ1qx1Rt1rjQ6s1
+rle1qH7VYw6remyDasfhV/+h/6kTddaRh1ZrWAcbKy2lZuqX2m3c6QbaTaPB0sVSo2pRW2rVOLSy
+DalGDdFNaHJ4tRMaHtz0iEOaHln9pEY1mjeu0aJxzZZHwbfFUTWbN67ZrFENnXV8w4OPO5waCyXo
+lupi9St01+k26mro+tB6rMwsrah1OU3TnVcbB0g3p36t6tQWPaP027fdkGbYEN0Ep6ime0wt75ha
+/rG1w+NqR01qx/Q9Hv4bHVc7OLa2zm1VVEs3Flt6yAlHHNIEW9qoXlX9Lt2HdWvV1DXRVdrpBtqt
+S5umJ16tmvXq1NDt0gMELapX9Whsi+7tE6wRsRsSSEOS42urE+qc3LTOKSfW+eNJdVs3g2+bZofi
+F/7WiTpLP6Nbqn+if+seXcs5ulbLopp6iE86srpu5lH1cMbWrkGDWPlZWrB1euD0QrNH7VBsml4a
+epj0/NGjozsZmnM0tiVtSG27IW2aH9q2xaFtWx5a3PLQ9q3qne7U6+jW199Obj397eDU79Cqns7S
+z+iHTz2xrm5jQgOK3xCHVTdWd12Tww/W80T3sO5qvVJ0DXe0gXbrdBfVkqbpiUGjpleEHjLdNP06
+PUx6puk66CpRc9o0r6vraTdEN6Gzd1gX/7Cu+hscVhI26G59SwJI7+xiG1scqruCxlH3D3313/RP
+3WTdh3qG6Lmqa6IXfsFZWskG6qHXY0et02tNLzRsGsg6PRtPwlHTr9NLRjcN28WN0i3q7NXXddY1
+hyZEDXpEh/eIDz8zPvxPSe5Xp+tnqIH6tzSC1MCc0aeG6zFtVVRTT1RdGd3nunqVbGDO/NQ/0T/U
+M4Bap7tLrzXdNL3KdNNa4IT0j62FA1fbtE7PNGgatqtH1ICacLZq2FN/T27Yy/rqf+p0aqAe0C7e
+Yfq3xS3r6dHXpf0RmlaHmgbFtuI5rJt5atM6/jG1tNjR0kaLUy0T9CjsRANp+PS6072kx063Tnca
+jZp7NEu/uAkvNLuBuqowcNi6s6ldp+jvEb3191T46r/1V6f/STU8E4dPT11oXQsQNTR2uoHUOj2m
+enp3xblNnaDTda/qVa+XiV6GdSw5U8kGmvmpf6h/rtfdkXWraWHSvFEN3TTdLhIgJAyNGKF1Z+oD
+I4gTEhsILaLWUQNN63Ds6ut1qn9r1p0UCKXpeWvmg/6vnh76SV0BPYX0MtR6jp5gWs7sRAO1eNE/
+1GJKF6L7Sgt/3Tq9T9niHeaS9U1nFI8jz1I9jr2kmaZ1MDMDqLBuhf4VbQ3Yb/AKXZSertBXwWFm
+qusO0V2ny9edoJehlnJ64dStXUCQVqaBWhPTAkqLKV2IXnp6D9LC5I8npuKRRLquW0YmnJhOVy1q
+aChJtuhm0hfWXXS4rrmuv26F/jmJR9ruFfahLkGvOPg5tq4nrmL9hy5Np+sHdG/rJaPVJBSkldop
+ciSMaaAuRBellQrdt/q9ejrpbtcDBFIdxAILN11J6n+zKmnG2nNMjxrNNF1zu3W6XQFuczT/dS/p
+3+oH9FrWncMTAIUSNNCprwvX0ltL8obcwBq6tjvaQC1Ca6GE0YXoonSP6X7TzYG5x5sX1JNEnz0K
+PBA409rgTGPRSpug3g487hnzK90uLZC1bMxpoH6LvYqhgVEDna4bqB/WGuAO7RQVNVAXoovSPaaL
+1cMHiyJuQCuiO4l3WURUVT0QAe37x9fWIl23gmZ1B9z09X9ps9Nt/yOsu9qkkvnH2iNYNzOCLIdh
+BHtgA3WZ+mGtZmADq+9SA+tgA484RFdAN1D3PPWq2cJ0e3Wiro9poH7S3kRYJKL8adcc5rO9bGkE
+jT6GP9ELuS6thXQNyr6pF6/WiFo3O1RPab0VanVxl0ewut1AM22ggSjncxoIB4HjbL06VUcLfE8E
+ndOoZGbfMWIKBxG3G5JO0kCdq1+hFW/e63e5gU2xgbrboYGRNYIRLEPd1SBnaL7hcGSahjoJfvP2
+lGY8oPawmlyWUbjke4iOp9/eBRtIe70+l+ltupLKTGVGUEt+GkGzBrXEAEHajAfCPgrRtMRvXXMU
+4vMR6papDoZfXpvYUt5SW9TjLRWEML4RG0h7vdbztWJceWWmMg3Ur6P+PFM0ZJqfrZuZfbCukSrt
+LalCmyZ9KSsVrQGoBPq/oo5in5g2ohDuAno7Hz06YwP1DNlRZaYyDSQpSi+SvYwVSN00WTu5+4LZ
+NOmLRyfWAfQkPxO7y5wpqEzotObZNnrQFXTowAaCMnPsjigz25ai3jEgvXXPmxfpmpCWdZosHCMZ
+uqKyrXcTrnkk+2Ygh0HMNdq4OVl0x0WtFwKNYzpX+Zyi91CeM9RArSEfjg2sjDKz3X0QN3o+61Hr
+zNnNVMPWHqnyRj37E44UHwlV9qBhNHBpo8zVulYb69HEpl7VU5ROhYdXWpmpqIEN67ImozuNNPzM
+Zn1S3dNOymudYvXDHI6gISfzYNnt6qO/f8Sv3UbRH+gVWbnE5w4tZPIbuG1BWmEDWRetCToGapjF
+KCvSV2t9rAVMId3z1DrdFqvyR/Y5NT0rmS9n2V9qIx2j5KDRzto+6F2k4OkNVwsZfaCgBlZmr89v
+oFG2dTm6NF0m7cL2WakNykwtfHSfG9WxcP0Lff/Smr99WsM/acTP5jaKEENlHnZS3FVJ+dFCr1nj
+GsegkKmkZSangfZxSUtjvatq/VaXDG3E7cAsPdyO66eKsbTOVL6SX2oytJEOjPZihP40Cg9oSs7R
+tfQR9ejDqh7GQmbHpqg58OoG4oG3qlZm9CyV43ydU/MUKj7XnEIzE0ZkhxvIbYQJbBYjaUrmvK9b
+p3UYffTQM0rL9sb1YB/clQayyeJQWIZacyCThX1MSJdeAqIjnZw718DW1mI8uaFRlkhykjaoK6Cr
+oWeU3iOOROsobfQ7tE0YmwwZnfQy1JNBD2LLo2rq3kv40F03nZwxHLpZMJrV13rHvziCJJRkopqz
+P0gbaqCeS3p+6oWjJbxWtuvU3LEGmmVIRlGapY3QqqbXtXtMLa1Ok1Uh50RjhD99//zHHf7yb2ln
+wT3UnDppEPUa1A3U/ax7u6g+SBjd/1rZrowBP7+BelbDLK0FF0Z6s9A9po9guvcibKAW4DQ/c6wu
+PU/eDV86HOGRswE2sH4HaWCAG4TemmkB0h6hx2JHG5gzS8k0qovVhevTtH6RVkGNkZC0L/yCQYns
+2DvzlZ9zaWLVt6ZoHb1BaGmgdy6tYh2K1xP2HrFfxddM+Q00uyEMYk0wgBzboKo+ZmoRbWap0aDo
+DgW/h+2OLxSl1UK9CtrThUUzsGnryeMUgVlbTyctGeAyFBdgvgjddgPNLKXLlxz7djMjTsmAdmKq
+aeD30N3xteyuJ6LJ7vhUfuo6ND60Gs3Pim7QKj9L6e6MVqLuNGqj7sMWjWu2KoLLO7rH3HNfuiKE
+y9DGWnjCNWhjvAOtXwvkA83Pgg0sz/tsexD1fqrbKDeDYA3W74JLT7z3pG/T3fc1Zery9Vv0u/Qb
+9XuPrIvCc3u32JVsIA2i7iI9z2tbt4T1s/fve/qr33J4HeN0cfB2/RB2qIGmjentfM0axo+FHQ/q
+wNl/j3zr1KBXmDeSz8y2PUkq2cCcNpITgl6SOQ4we+dLr6NX2y5PFbWuYAO33UbjIZPvUbZ3Pttw
+Wqtk6wo20G6j/cl3CNwLn4I1KVjnihpYURu33di9/9l2JbfRusq08b/4Z7ut++/bzMo37b9Le3ex
+Rf+/+fxnj8Nu/eyjP7uhiH321Z/94D87VZ4UocXh/gccgJvrgQcesP9++1a+sJwi9O5ctdrBh1Sv
+URPM+AdXPegAXVglSihQRM1ateseWr9BwyMbNTryiAZam6p6YEVlpV2x3/4Fi2hcdA==\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ fyF0km0geymXbzxzRpyugm6okVssH6meqpo3kD9c8wayBzVvIHN5zavlADKjytqdKNQVd8gICoBY
+NhKlIcQU8ubFvpHObsoN+fFCuDnRebA1MlOzYddsdk9qEyg34VN/9IKNuTfnukvgkDZ0Ttq4YPse
+qqpF5YFUJ1P5XhOVLVnoaS6lM4GeHTWrIFMxmczWnaKUKZ9JKk0ietWjfIlMqnmw0Yx99cQQsuUK
+vaq0uplkSVHbAOTJ54rpIYQOsonBz6v4fkK1cWtlzBUglN1QcpzMFJqVEtudSSS3DJFZ7qz5XKne
+XIKsobUwWu6EcA6lU0CW7nSpP5Gv2lBrZcemJIr0ViN5c0MIvcrYzXftdXP2pIrp3uyQ/Z7PF5rx
+vFxXdiBXn1jjiqm6iyfm29pgvrL70DrFDb3AiFyh4fM0o9mIXLZEvnQ/kBOW7Rq25zR79fOHdw2v
+2aqfOdgzhswa2jE8S69di7Kusn27dvvCvRW1jkEesXInBjJ1tyqRq4EDRLGU4Wz5fE+dj0I+/miQ
+sXaRIg9M2Uyk1agqc4FCipddHdetAb2gDh9VvqdRXxLbNjjqirkUuhCZqu7wwGe0ReaOh86/Qx3g
+ak1e+F6iNNRiUBBqZaGYgvIKdRoPWYtb0nmxrGa3DLkQgjLB7o4RrZyf654nNI1wG4OrOZFrdmdX
+fHHlZUTZdRpnAv9qCA5MMWvh8rP+hRq/NkeGRoXX6Iqt5gFHvUQ3R5NX0DXPrJrXPFx9vrVZFn3B
+U56pq+bVDuVrhUudVr7UWVp2qdPoFR0UU+9eTg9faGZzwV1QPJ3F+yTY0CMv8SIEcvyaeZnMACqe
+oqvyez03jAg5hNZ0trVvqHHnUjO/vCMP1QwuykVFWhN5ui5Pp+odiWRBc6AHxbRa1jfQ351NpDP1
+9lD50op0aqv4d3v9vVnmbheitjLVDS81UCGMcQ0BqAmRtiCd7QnLfqPvVU0Bw4jS7mq8PQ+2opbu
+3GDowFj/3dBVWKjK9Ye8/DW+pJVv2kN+cpno/q7g7rfuKBcS2/eiT8tfG2aXlr88rB6FV4ffoRVv
+Dac/4dVhdOfCXDaX7AMAc2SnRt881Xu5qmutuuMCRdTpWquhr0d3cP2pSW+0FOopSjL3skK6fyHc
+YDSQV+wCjWZF0Z9V/7ZArZKiY+bVvwQIFlRUgaAWywKzb63TfmUbV6aGuv2RbyzGg0C7GADRi1tz
+hS0dgb47vBdnDXlBVfPVpXtd22X1L3/ke7PgxqRjiFurssxLhzr4lOUeTjXK+qmeeFOl09l6x2yZ
+F60v81pb2aqidtq6Mz+w8KCBp4EqKbWxkW2W9KFlIUNv41pVnQLFc1KwQqpMjavrWm8uTGyrp8k2
+VEQ6W1urbaQA0nRnVd7oN/w+aK2stJLOuhdlsIbcNZTpY4j3Q1p4/SWNdMSWZCHXnSh1JLanCiHU
+hsjCLVPKatXpxa80yeUTWXVrL7N1rZgDMk3SXaq+M+TnYFWN+Ih4ipOJDiRSvoKHoo7JdMgwYYTe
+yyZzISyAFTxBd6rQOq7OA+IZhhpD624+kYzKsCwlRjk4aYYfdfZuikhdlagCskAdMulkULmpEQeL
+UCSlCqclGELyZoKxlg8h7qN4EE6KpnyYON1pGjOzOGHV6LYF85Ob2icsMVpmHj5r/XhrxuKN092V
+ptYzNTVlbBb/nDqvmNvUvrFj4OD2URPXaBVpE2es6J6sGZmS3bJ0WfuymVPy63znMKf/MPGZaU0b
+23NYmvjg1GJL18Dy8S3Z7t4ivzT98P6WBStnH1QoTD+0u2VSftH8mQv84nRv7rSVze25w6wVswtr
+D9PaDmtfvaz90JZDk1jexOmH5sdaRXPMkokz+kqm+EyjNRpGdRLZOZkVm7tnbVy4pKVlUlZfJz4z
+dYa+wms7qGdgdlvr3LXroiozPT9hWl4UPrep1Rhz6Ma25oGZy1vctRtWO6vzemf7uCWrMvytZMu4
+tk35CXrLsvmlgSBNfIaSF6yaUBIFzR9oa17cN61QsNrSmuGMzs9ccXDXGMqva52J9gmlcYnZk9Yt
+mjzLmWSM5oI25mYWClOLy0TvTZqn6U2bp2DtqJ9mLW0FB8qi115aYazPbRnnLEkdMtEe1TphsTVt
+yZRlEw9d6vQV1mnFac1mh29MnD5n1DiraBQXiuqs8JonF705lnf41M3izwkTtJ5xq9vKv7q2sG7h
+2iX4VZC08g+Ll9319pR565sjv7p+zKKOml910gvmjI36qvhMoTBt1PhCUR9biGpu0evU11qjjSmH
+RH21ePCkhU01vmr3jU8cvHo2flV8pqq51oS1E6cZvUsivzq6fb110PJ8piPqq1r7rAUzo74qPiM+
+7Bw0JluYcGh0J1ur12vtmxZ1RX91zqhp4/T5G5ZFfnXOXGMZfhVXgepONg6bvmwjflU/pKV7dvnQ
+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\r
+ ]]>\r
+ <![CDATA[\r
+ 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
+3Jt1uH3AOFm83Me9p57nmz191DMoY/m492KTxWwf9/bmF2M1zB/3Zh6lnvyy95y+TlYWdPy4N0Nf
+528/7u1AQ+d0N/PHvVlpiKthO/2TVVB6Tp8Z8jkN+zHTcCbL4nmMgUdwPG9yfNVlIpfJcYZE33Sv
++jKT4wxj49O96kt/8mT+2PhCmVuXyfGliLaa04CnxsZ/VV41JsdX0c7DMDnOgBPdm99NjjOMjbsS
+bckcl8vYuM/8CPcqD4CYHRv3uXzQaZHJcfZOyF9NjjNk4NzLROyT4wxj4zbxXHpynEHjua+GfXKc
+/XPvv5ocd9jI6bHxOZ7NAo/0nKR0NGsLTo7bmNdtbHze3rBOji+yN7+YHHck5GShYjV74+kY+xY8
+fdRpcnwFH69nmRxn8EB81ueplp4cZxgbnyhF/HYO331sfDJaW25ynIGarv3QC0yOM4yNL15enZ0c
+Z5iAduwdXHBynGFs3Odxth3L5DjD2PhUO89Sk+PLE23BiU7PsXFPuWEYh2Yw3FOR9FKT4ww4Wa29
+y0+Oz+Lk1Kv+68lx1sH/X06Oe4+NT3R343Jb092JzGt1Oixo/MFxrHjM/eY4+yD9vA==\r
+ ]]>\r
+ <![CDATA[\r
+ D47PNvX9aqTdTUf5pia9WBFc8IPjng3+q/nguM1IO39zfOkdmfjguI/5QMBffXDc0bmdN+HN5OjM
+LNjnfH6a9c3xX0/Jk/FumhdYIhO42AfHrYrHUlPybO7NAmc/vM3M6DEftQJOkr1GcPJ30+w+lwNo
+VzzNzpK2W8E0+7RO+6Np9jlEW+U0u28FhzUyTLP7WA9r/N00+0RH199Ns/tYPuLw+2l2338ezUyr
+mWZ3aE76i2l233jYz3EIelXT7D5rgFlllLhlptl9y37Zb7Fpdg+irWqanfRDLz/BxTrNPlPF/Ztp
+9tle9T+ZZmcejPndNPtkl+qfTbPP7VJd3TS7b6FTFJeeZnezniueZmdmgd9Ns08lU/5qmn228/5P
+ptlXwWkM0+yTabs/m2af5LQ/m2b3/cc+3vCLaXbnJouVT7P7yCGnAmuddtlpdsx1znwtfvXT7OxN
+5L+aZrczNPuM3MLT7EZ20M0TWtU0u+FyiKuinMuMnOP8zeqn2V2yHKueZl8hp80Wxh1OUVxwRm7B
+afapLMdfTbP7pk8c+5tpdp/7AbSrnGb3jUewtpmPkFtimt33m9N52KfZiRbw+kr47z0Qn/m5d4aR
+ml9MsztnB1c+ze7BabPT7IuOnk8eaeT4qYvVTbP78MvlTh3aq51m99Evyf6+NWz+NPuMsvmbaXbS
+/eCRs1jBNLulbPg11k+3LjHN7lvyVKsFp9nnJVNWOM2Orvp4oP1PptmJpZ70bP5smt1nffxkgS8r
+LzzNzlJYWcE0u1MY9QfT7JQFXMecVzXN7rONY7NmupeYZvfwBVY1zb5YwL70NPtsdvBPptlJc5I5
+0P530+zYL+Bw8OWqp9lxNeOB9r+bZncurKx8mt1WWGHORC4xzU57B936nVY2zW5pgXRU/btpdq8G
+/xVNs/sWOj9t6Wl2n8v5afOn2WdJNWeaHcfWffjl8r+aXLfG1lEL/NnkunUdIdpfTa5b18Fr/m5y
+3WM1q5pct66D1/zd5Lo1ATzuHfyLyXVrbN02rrD6yXULO9/EZ6tXPLnOOPj/28n16cH/P5pc9x78
+X8nkujVAjhHBn02uW2PrY3vzF5PrhoXotLGE93eT65bHaIZRfzK57tp5v9rJ9WnP5o8m12cyUH8z
+ub7CDwjOm1xfZm5ticn1+Z94XdnkujW2vkwHMfPkurXgmXzaKifXnZrI/2By3bmJfOWT61ZN3GvG
+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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ <![CDATA[\r
+ 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\r
+ ]]>\r
+ </i:pgf>\r
+ </svg>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.44.1"
+ sodipodi:docname="architecture.fr.svg"
+ sodipodi:docbase="/home/olivier/dev/telemeta/doc/devel"
+ inkscape:export-filename="/home/olivier/dev/telemeta/doc/devel/architecture.fr.png"
+ inkscape:export-xdpi="300"
+ inkscape:export-ydpi="300">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.6081777"
+ inkscape:cx="373.30355"
+ inkscape:cy="835.63412"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ gridspacingx="10px"
+ gridspacingy="10px"
+ inkscape:grid-points="true"
+ inkscape:window-width="1016"
+ inkscape:window-height="677"
+ inkscape:window-x="0"
+ inkscape:window-y="31" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g3137"
+ transform="translate(230,109.9563)">
+ <rect
+ y="152.40588"
+ x="-110"
+ height="49.956299"
+ width="290"
+ id="rect2160"
+ style="fill:#4e9a06;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3021"
+ transform="translate(-618.8906,-61.10662)"
+ style="fill:#eeeeec"><flowRegion
+ id="flowRegion3023"><rect
+ id="rect3025"
+ width="279.50085"
+ height="41.732269"
+ x="520.49915"
+ y="220.62991"
+ style="fill:#eeeeec" /></flowRegion><flowPara
+ id="flowPara3027"
+ style="font-size:12px;font-weight:bold;fill:#eeeeec">Modèle</flowPara><flowPara
+ style="font-size:8px;fill:#eeeeec"
+ id="flowPara3035">Le Modèle fournit une couche d'abstraction des données, à travers une API bien conçue, pour les méta données et fichiers audio.</flowPara></flowRoot> </g>
+ <g
+ id="g3053"
+ transform="translate(310,99.9563)">
+ <rect
+ y="162.40588"
+ x="110"
+ height="50"
+ width="110"
+ id="rect3055"
+ style="fill:#729fcf;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3057"
+ y="182.40588"
+ x="120"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="182.40588"
+ x="120"
+ sodipodi:role="line"
+ id="tspan3083"
+ style="font-size:8px">Système de Fichiers</tspan><tspan
+ y="192.40588"
+ x="120"
+ sodipodi:role="line"
+ style="font-size:8px;font-weight:normal"
+ id="tspan3348">Stocke les fichiers</tspan><tspan
+ y="202.40588"
+ x="120"
+ sodipodi:role="line"
+ style="font-size:8px;font-weight:normal"
+ id="tspan3377">audio WAV sources</tspan></text>
+ </g>
+ <g
+ transform="translate(90,159.9563)"
+ id="g3067">
+ <rect
+ style="fill:#729fcf;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3069"
+ width="410"
+ height="40"
+ x="30"
+ y="162.40588" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="43.980469"
+ y="181.52307"
+ id="text3071"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="43.980469"
+ y="181.52307"
+ id="tspan3079">Base de données relationelle</tspan><tspan
+ sodipodi:role="line"
+ x="43.980469"
+ y="192.53607"
+ id="tspan3346"
+ style="font-size:8px;font-weight:normal">Stocke les méta données</tspan></text>
+ </g>
+ <g
+ id="g3335"
+ inkscape:export-xdpi="600"
+ inkscape:export-ydpi="600">
+ <g
+ id="g3142"
+ transform="translate(20,19.9563)">
+ <rect
+ y="122.40588"
+ x="100"
+ height="109.9563"
+ width="160"
+ id="rect3144"
+ style="fill:#204a87;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <flowRoot
+ style="fill:#eeeeec"
+ transform="translate(-390.4766,-71.10662)"
+ id="flowRoot3091"
+ xml:space="preserve"
+ inkscape:export-xdpi="144"
+ inkscape:export-ydpi="144"
+ inkscape:export-filename="/home/olivier/dev/telemeta/doc/devel/architecture.png"><flowRegion
+ id="flowRegion3093"><rect
+ style="fill:#eeeeec"
+ y="220.62991"
+ x="520.49915"
+ height="81.732269"
+ width="139.50085"
+ id="rect3095" /></flowRegion><flowPara
+ style="font-size:12px;font-weight:bold;fill:#eeeeec"
+ id="flowPara3097">Contrôleur</flowPara><flowPara
+ id="flowPara3101"
+ style="font-size:8px;fill:#eeeeec">Le contrôleur reçoit les requêtes des utilisateurs, administrateurs, et systèmes distants, en général via HTTP, et met en oeuvre le Modèle, et la ou les Vue(s) adéquate(s).</flowPara></flowRoot> </g>
+ <g
+ id="g3107"
+ transform="matrix(1,0,0,0.583181,169.9999,144.3046)">
+ <rect
+ y="82.405945"
+ x="120"
+ height="102.88401"
+ width="240.00011"
+ id="rect3109"
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ id="g3117"
+ transform="translate(320,49.9563)">
+ <rect
+ y="92.405884"
+ x="150"
+ height="40"
+ width="60"
+ id="rect3119"
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3121"
+ y="110.13611"
+ x="179.79346"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ id="tspan3125"
+ y="110.13611"
+ x="179.79346"
+ sodipodi:role="line">Vue de</tspan><tspan
+ y="121.38611"
+ x="179.79346"
+ sodipodi:role="line"
+ id="tspan3356">sauvegarde</tspan></text>
+ </g>
+ <g
+ transform="translate(170,9.912598)"
+ id="g3127">
+ <rect
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3129"
+ width="50"
+ height="39.956299"
+ x="120"
+ y="132.44958" />
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="144.70776"
+ y="150.01953"
+ id="text3131"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="144.70776"
+ y="150.01953"
+ id="tspan3350">Vue</tspan><tspan
+ sodipodi:role="line"
+ x="144.70776"
+ y="161.26953"
+ id="tspan3360">HTML</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3141"
+ transform="translate(-220.4766,-21.10662)"
+ style="fill:#eeeeec"><flowRegion
+ id="flowRegion3143"><rect
+ id="rect3145"
+ width="219.50085"
+ height="51.732269"
+ x="520.49915"
+ y="220.62991"
+ style="fill:#eeeeec" /></flowRegion><flowPara
+ id="flowPara3147"
+ style="font-size:12px;font-weight:bold;fill:#eeeeec">Vues</flowPara><flowPara
+ style="font-size:8px;fill:#eeeeec"
+ id="flowPara3149">Il y a plusieurs Vues, pour la génération HTML, les sauvegardes XML, les exports OGG/MP3, etc.. à partir du Modèle, comme requis par le Contrôleur.</flowPara></flowRoot> <g
+ id="g3153"
+ transform="translate(290,-20.0437)">
+ <rect
+ y="162.40588"
+ x="120"
+ height="39.956299"
+ width="50"
+ id="rect3155"
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3157"
+ y="179.97583"
+ x="144.69238"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="179.97583"
+ x="144.69238"
+ sodipodi:role="line"
+ id="tspan3354">Vue</tspan><tspan
+ y="191.22583"
+ x="144.69238"
+ sodipodi:role="line"
+ id="tspan3373">d'export</tspan></text>
+ </g>
+ <g
+ id="g3165"
+ transform="translate(230,9.912598)">
+ <rect
+ y="132.44958"
+ x="120"
+ height="39.956299"
+ width="50"
+ id="rect3167"
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3169"
+ y="144.53296"
+ x="144.94287"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="144.53296"
+ x="144.94287"
+ sodipodi:role="line"
+ id="tspan3352">Vue</tspan><tspan
+ y="155.78296"
+ x="144.94287"
+ sodipodi:role="line"
+ id="tspan3367">Dublin</tspan><tspan
+ y="167.03296"
+ x="144.94287"
+ sodipodi:role="line"
+ id="tspan3369">Core</tspan></text>
+ </g>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.44.1"
+ sodipodi:docname="architecture.svg"
+ sodipodi:docbase="/home/olivier/dev/telemeta/doc/devel"
+ inkscape:export-filename="/home/olivier/dev/telemeta/doc/devel/architecture.png"
+ inkscape:export-xdpi="144"
+ inkscape:export-ydpi="144">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.6081777"
+ inkscape:cx="373.30355"
+ inkscape:cy="802.18075"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ gridspacingx="10px"
+ gridspacingy="10px"
+ inkscape:grid-points="true"
+ inkscape:window-width="1016"
+ inkscape:window-height="677"
+ inkscape:window-x="0"
+ inkscape:window-y="31" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g3137"
+ transform="translate(230,109.9563)">
+ <rect
+ y="152.40588"
+ x="-110"
+ height="49.956299"
+ width="300"
+ id="rect2160"
+ style="fill:#4e9a06;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3021"
+ transform="translate(-618.8906,-61.10662)"
+ style="fill:#eeeeec"><flowRegion
+ id="flowRegion3023"><rect
+ id="rect3025"
+ width="299.50085"
+ height="41.732269"
+ x="520.49915"
+ y="220.62991"
+ style="fill:#eeeeec" /></flowRegion><flowPara
+ id="flowPara3027"
+ style="font-size:12px;font-weight:bold;fill:#eeeeec">Model</flowPara><flowPara
+ style="font-size:8px;fill:#eeeeec"
+ id="flowPara3035">The Model provides a complete data abstraction layer, through a well designed API, for both audio content and metadata.</flowPara></flowRoot> </g>
+ <g
+ id="g3053"
+ transform="translate(320,99.9563)">
+ <rect
+ y="162.40588"
+ x="110"
+ height="50"
+ width="100"
+ id="rect3055"
+ style="fill:#729fcf;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3057"
+ y="181.52307"
+ x="120.66016"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="181.52307"
+ x="120.66016"
+ sodipodi:role="line"
+ id="tspan3083">File system</tspan><tspan
+ y="192.53607"
+ x="120.66016"
+ sodipodi:role="line"
+ id="tspan3344"
+ style="font-size:8px;font-weight:normal">Stores audio source </tspan><tspan
+ y="202.53607"
+ x="120.66016"
+ sodipodi:role="line"
+ style="font-size:8px;font-weight:normal"
+ id="tspan3348">WAV Files</tspan></text>
+ </g>
+ <g
+ transform="translate(90,159.9563)"
+ id="g3067">
+ <rect
+ style="fill:#729fcf;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3069"
+ width="410"
+ height="40"
+ x="30"
+ y="162.40588" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="43.980469"
+ y="181.52307"
+ id="text3071"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="43.980469"
+ y="181.52307"
+ id="tspan3079">Relational Database</tspan><tspan
+ sodipodi:role="line"
+ x="43.980469"
+ y="192.53607"
+ id="tspan3346"
+ style="font-size:8px;font-weight:normal">Stores metadata</tspan></text>
+ </g>
+ <g
+ id="g3335">
+ <g
+ id="g3142"
+ transform="translate(20,19.9563)">
+ <rect
+ y="122.40588"
+ x="100"
+ height="109.9563"
+ width="160"
+ id="rect3144"
+ style="fill:#204a87;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <flowRoot
+ style="fill:#eeeeec"
+ transform="translate(-390.4766,-71.10662)"
+ id="flowRoot3091"
+ xml:space="preserve"
+ inkscape:export-xdpi="144"
+ inkscape:export-ydpi="144"
+ inkscape:export-filename="/home/olivier/dev/telemeta/doc/devel/architecture.png"><flowRegion
+ id="flowRegion3093"><rect
+ style="fill:#eeeeec"
+ y="220.62991"
+ x="520.49915"
+ height="81.732269"
+ width="139.50085"
+ id="rect3095" /></flowRegion><flowPara
+ style="font-size:12px;font-weight:bold;fill:#eeeeec"
+ id="flowPara3097">Controller</flowPara><flowPara
+ id="flowPara3101"
+ style="font-size:8px;fill:#eeeeec">The Controller receives requests from users, administrators, or remote systems, usually via HTTP, and routes them to the proper View(s) and Model calls.</flowPara></flowRoot> </g>
+ <g
+ id="g3107"
+ transform="matrix(1,0,0,0.583181,169.9999,144.3046)">
+ <rect
+ y="82.405945"
+ x="120"
+ height="102.88401"
+ width="240.00011"
+ id="rect3109"
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ id="g3117"
+ transform="translate(320,49.9563)">
+ <rect
+ y="92.405884"
+ x="150"
+ height="40"
+ width="60"
+ id="rect3119"
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3121"
+ y="110.13611"
+ x="179.79346"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ id="tspan3125"
+ y="110.13611"
+ x="179.79346"
+ sodipodi:role="line">Backup</tspan><tspan
+ y="121.38611"
+ x="179.79346"
+ sodipodi:role="line"
+ id="tspan3356">View</tspan></text>
+ </g>
+ <g
+ transform="translate(170,9.912598)"
+ id="g3127">
+ <rect
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3129"
+ width="50"
+ height="39.956299"
+ x="120"
+ y="132.44958" />
+ <text
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="144.70776"
+ y="150.01953"
+ id="text3131"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="144.70776"
+ y="150.01953"
+ id="tspan3135">HTML</tspan><tspan
+ sodipodi:role="line"
+ x="144.70776"
+ y="161.26953"
+ id="tspan3350">View</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3141"
+ transform="translate(-220.4766,-21.10662)"
+ style="fill:#eeeeec"><flowRegion
+ id="flowRegion3143"><rect
+ id="rect3145"
+ width="219.50085"
+ height="51.732269"
+ x="520.49915"
+ y="220.62991"
+ style="fill:#eeeeec" /></flowRegion><flowPara
+ id="flowPara3147"
+ style="font-size:12px;font-weight:bold;fill:#eeeeec">Views</flowPara><flowPara
+ style="font-size:8px;fill:#eeeeec"
+ id="flowPara3149">There are several Views, for generating HTML, XML based backups, OGG/MP3 exports, etc.. out of the Model, as required by the Controller.</flowPara></flowRoot> <g
+ id="g3153"
+ transform="translate(290,-20.0437)">
+ <rect
+ y="162.40588"
+ x="120"
+ height="39.956299"
+ width="50"
+ id="rect3155"
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3157"
+ y="179.97583"
+ x="144.69238"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ id="tspan3161"
+ y="179.97583"
+ x="144.69238"
+ sodipodi:role="line">Export</tspan><tspan
+ y="191.22583"
+ x="144.69238"
+ sodipodi:role="line"
+ id="tspan3354">View</tspan></text>
+ </g>
+ <g
+ id="g3165"
+ transform="translate(230,9.912598)">
+ <rect
+ y="132.44958"
+ x="120"
+ height="39.956299"
+ width="50"
+ id="rect3167"
+ style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.93383527px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3169"
+ y="144.53296"
+ x="144.94287"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ id="tspan3171"
+ y="144.53296"
+ x="144.94287"
+ sodipodi:role="line">Dublin</tspan><tspan
+ y="155.78296"
+ x="144.94287"
+ sodipodi:role="line"
+ id="tspan3175">Core</tspan><tspan
+ y="167.03296"
+ x="144.94287"
+ sodipodi:role="line"
+ id="tspan3352">View</tspan></text>
+ </g>
+ </g>
+</svg>
--- /dev/null
+<?xml version = "1.0" encoding = "UTF-8" ?>
+<uml version="5">
+ <argo version="5">
+ <documentation>
+ <authorname></authorname>
+ <authoremail></authoremail>
+ <version>0.24</version>
+ <description>
+
+ </description>
+ </documentation>
+ <settings>
+ <notationlanguage>UML 1.4</notationlanguage>
+ <useguillemots>false</useguillemots>
+ <showvisibility>false</showvisibility>
+ <showmultiplicity>false</showmultiplicity>
+ <showinitialvalue>false</showinitialvalue>
+ <showproperties>false</showproperties>
+ <showtypes>true</showtypes>
+ <showstereotypes>false</showstereotypes>
+ <showsingularmultiplicities>true</showsingularmultiplicities>
+ <defaultshadowwidth>1</defaultshadowwidth>
+ </settings>
+
+ <searchpath href="PROJECT_DIR" />
+ <member type="xmi"
+ name="class_diagram.xmi" />
+ <member type="pgml"
+ name="class_diagram_ClassDiagram1.pgml"
+ diagramclass="org.argouml.uml.diagram.static_structure.ui.UMLClassDiagram"
+ diagramname="Class Diagram 1" />
+ <member type="pgml"
+ name="class_diagram_UseCaseDiagram1.pgml"
+ diagramclass="org.argouml.uml.diagram.use_case.ui.UMLUseCaseDiagram"
+ diagramname="Use Case Diagram 1" />
+ <member type="todo"
+ name="class_diagram.todo" />
+ <historyfile name="" />
+ </argo>
+<XMI xmi.version = '1.2' xmlns:UML = 'org.omg.xmi.namespace.UML' timestamp = 'Mon Mar 26 22:14:57 CEST 2007'>
+ <XMI.header> <XMI.documentation>
+ <XMI.exporter>ArgoUML (using Netbeans XMI Writer version 1.0)</XMI.exporter>
+ <XMI.exporterVersion>0.24(5) revised on $Date: 2006-11-06 19:55:22 +0100 (Mon, 06 Nov 2006) $ </XMI.exporterVersion>
+ </XMI.documentation>
+ <XMI.metamodel xmi.name="UML" xmi.version="1.4"/></XMI.header>
+ <XMI.content>
+ <UML:Model xmi.id = '10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077B'
+ name = 'untitledModel' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Namespace.ownedElement>
+ <UML:Package xmi.id = '10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077C'
+ name = 'Model' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Namespace.ownedElement>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000800'
+ name = 'contain' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000801'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'composite' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A0C'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A0B'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000804'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000808'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000807'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000809'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000080A'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'aggregate' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000080B'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000080C'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077F'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000080D'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000827'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000826'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000833'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000834'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'composite' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000835'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000836'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000837'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000083B'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000083A'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000787'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000083C'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000083D'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000083E'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000083F'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000785'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000840'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000846'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000845'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000787'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Stereotype xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E8'
+ name = 'import' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Stereotype.baseClass>Permission</UML:Stereotype.baseClass>
+ </UML:Stereotype>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000085B'
+ name = 'notifies' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000085C'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'false' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000085D'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000085E'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000085F'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000863'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000862'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Interface xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E5'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Class xmi.id = '10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077F'
+ name = 'Collection' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'
+ name = 'MediaItem' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783'
+ name = 'Part' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Interface xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E5'
+ name = 'IMediaItemObserver' visibility = 'public' isSpecification = 'false'
+ isRoot = 'false' isLeaf = 'false' isAbstract = 'false'/>
+ </UML:Namespace.ownedElement>
+ </UML:Package>
+ <UML:Stereotype xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000007EF'
+ name = 'realize' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Stereotype.baseClass>Abstraction</UML:Stereotype.baseClass>
+ </UML:Stereotype>
+ <UML:Abstraction xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000864'
+ isSpecification = 'false'>
+ <UML:ModelElement.stereotype>
+ <UML:Stereotype xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000007EF'/>
+ </UML:ModelElement.stereotype>
+ <UML:Dependency.client>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000860'/>
+ </UML:Dependency.client>
+ <UML:Dependency.supplier>
+ <UML:Interface xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000862'/>
+ </UML:Dependency.supplier>
+ </UML:Abstraction>
+ <UML:Abstraction xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000871'
+ isSpecification = 'false'>
+ <UML:ModelElement.stereotype>
+ <UML:Stereotype xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000007EF'/>
+ </UML:ModelElement.stereotype>
+ <UML:Dependency.client>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000086F'/>
+ </UML:Dependency.client>
+ <UML:Dependency.supplier>
+ <UML:Interface xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000862'/>
+ </UML:Dependency.supplier>
+ </UML:Abstraction>
+ <UML:Package xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000873'
+ name = 'Core' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Namespace.ownedElement>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000087C'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000087D'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000087E'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000087F'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000874'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000880'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000884'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000883'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000876'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000885'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000886'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000887'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000888'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000876'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000889'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000088D'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000088C'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000878'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008B0'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008B1'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008B2'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008B3'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000878'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008B4'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008B5'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008B6'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008AE'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ </UML:Namespace.ownedElement>
+ </UML:Package>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008AE'
+ name = 'Interface' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000878'
+ name = 'ExtensionPoint' visibility = 'public' isSpecification = 'false'
+ isRoot = 'false' isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000876'
+ name = 'Component' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000874'
+ name = 'ComponentManager' visibility = 'public' isSpecification = 'false'
+ isRoot = 'false' isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000787'
+ name = 'ItemDynamicProperty' visibility = 'public' isSpecification = 'false'
+ isRoot = 'false' isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000785'
+ name = 'ItemDynamicPropertyDefinition' visibility = 'public' isSpecification = 'false'
+ isRoot = 'false' isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Abstraction xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008EB'
+ isSpecification = 'false'>
+ <UML:ModelElement.stereotype>
+ <UML:Stereotype xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000007EF'/>
+ </UML:ModelElement.stereotype>
+ <UML:Dependency.client>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008E9'/>
+ </UML:Dependency.client>
+ <UML:Dependency.supplier>
+ <UML:Interface xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000862'/>
+ </UML:Dependency.supplier>
+ </UML:Abstraction>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F4'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F5'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'false' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F6'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F7'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F8'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008FC'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008FB'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Interface xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000862'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:DataType xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008FD'
+ name = 'int' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'/>
+ <UML:Generalization xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000912'
+ isSpecification = 'false'>
+ <UML:Generalization.child>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000086F'/>
+ </UML:Generalization.child>
+ <UML:Generalization.parent>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000909'/>
+ </UML:Generalization.parent>
+ </UML:Generalization>
+ <UML:Generalization xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000913'
+ isSpecification = 'false'>
+ <UML:Generalization.child>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000860'/>
+ </UML:Generalization.child>
+ <UML:Generalization.parent>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000909'/>
+ </UML:Generalization.parent>
+ </UML:Generalization>
+ <UML:Generalization xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000914'
+ isSpecification = 'false'>
+ <UML:Generalization.child>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008E9'/>
+ </UML:Generalization.child>
+ <UML:Generalization.parent>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000909'/>
+ </UML:Generalization.parent>
+ </UML:Generalization>
+ <UML:Package xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000915'
+ name = 'ExportView' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Namespace.ownedElement>
+ <UML:Dependency xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A08'
+ isSpecification = 'false'>
+ <UML:Dependency.client>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E3'/>
+ </UML:Dependency.client>
+ <UML:Dependency.supplier>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0'/>
+ </UML:Dependency.supplier>
+ </UML:Dependency>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000860'
+ name = 'OggExporter' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'>
+ <UML:ModelElement.clientDependency>
+ <UML:Abstraction xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000864'/>
+ </UML:ModelElement.clientDependency>
+ <UML:GeneralizableElement.generalization>
+ <UML:Generalization xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000913'/>
+ </UML:GeneralizableElement.generalization>
+ </UML:Class>
+ <UML:Interface xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000862'
+ name = 'IExporter' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:000000000000086F'
+ name = 'FlacExporter' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'>
+ <UML:ModelElement.clientDependency>
+ <UML:Abstraction xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000871'/>
+ </UML:ModelElement.clientDependency>
+ <UML:GeneralizableElement.generalization>
+ <UML:Generalization xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000912'/>
+ </UML:GeneralizableElement.generalization>
+ </UML:Class>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008E9'
+ name = 'Mp3Exporter' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'>
+ <UML:ModelElement.clientDependency>
+ <UML:Abstraction xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008EB'/>
+ </UML:ModelElement.clientDependency>
+ <UML:GeneralizableElement.generalization>
+ <UML:Generalization xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000914'/>
+ </UML:GeneralizableElement.generalization>
+ </UML:Class>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0'
+ name = 'Exporter' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'>
+ <UML:ModelElement.clientDependency>
+ <UML:Abstraction xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E9'/>
+ </UML:ModelElement.clientDependency>
+ </UML:Class>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000909'
+ name = 'ExporterCore' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Abstraction xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E9'
+ isSpecification = 'false'>
+ <UML:ModelElement.comment>
+ <UML:Comment xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000864'/>
+ </UML:ModelElement.comment>
+ <UML:ModelElement.stereotype>
+ <UML:Stereotype xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000007EF'/>
+ </UML:ModelElement.stereotype>
+ <UML:Dependency.client>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0'/>
+ </UML:Dependency.client>
+ <UML:Dependency.supplier>
+ <UML:Interface xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E5'/>
+ </UML:Dependency.supplier>
+ </UML:Abstraction>
+ </UML:Namespace.ownedElement>
+ </UML:Package>
+ <UML:Package xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E2'
+ name = 'WebView' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Namespace.ownedElement>
+ <UML:Class xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E3'
+ name = 'MediaItemEditor' visibility = 'public' isSpecification = 'false'
+ isRoot = 'false' isLeaf = 'false' isAbstract = 'false' isActive = 'false'>
+ <UML:ModelElement.clientDependency>
+ <UML:Dependency xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A08'/>
+ </UML:ModelElement.clientDependency>
+ </UML:Class>
+ </UML:Namespace.ownedElement>
+ </UML:Package>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009EA'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009EB'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009EC'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009ED'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E3'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009EE'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009EF'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009F0'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009F8'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009F9'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009FA'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009FB'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E3'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009FC'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A07'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A06'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009FF'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A00'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A01'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A02'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E3'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A03'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A04'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A05'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077F'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Comment xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000864'
+ isSpecification = 'false' body = 'The Exporter refreshes its cache when a MediaItem gets created or updated.'>
+ <UML:Comment.annotatedElement>
+ <UML:Abstraction xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E9'/>
+ </UML:Comment.annotatedElement>
+ </UML:Comment>
+ <UML:TagDefinition xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000866'
+ name = 'documentation' isSpecification = 'false' tagType = 'String'>
+ <UML:TagDefinition.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000868'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000867'
+ lower = '0' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:TagDefinition.multiplicity>
+ </UML:TagDefinition>
+ <UML:Package xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000954'
+ name = 'BackupView' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Namespace.ownedElement>
+ <UML:Class xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000955'
+ name = 'Serializer' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ <UML:Class xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000957'
+ name = 'Unserializer' visibility = 'public' isSpecification = 'false' isRoot = 'false'
+ isLeaf = 'false' isAbstract = 'false' isActive = 'false'/>
+ </UML:Namespace.ownedElement>
+ </UML:Package>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000972'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000973'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000974'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000975'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000955'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000976'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000988'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000987'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077F'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000979'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000097A'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000098A'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000989'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000097D'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000097E'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000097F'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000955'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000980'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000981'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000098C'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000098B'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000984'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000985'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000986'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000955'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000996'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000997'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000998'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000999'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000957'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000099A'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009AC'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009AB'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000099D'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000099E'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000099F'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009A0'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000957'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009A1'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009B0'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009AF'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009A4'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009A5'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009AE'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009AD'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077F'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009A8'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009A9'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009AA'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000957'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009B8'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009B9'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009BA'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009BB'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009BC'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C7'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C6'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009BF'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C0'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C1'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C2'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C3'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C4'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C5'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C8'
+ name = '' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C9'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009CA'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009CB'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009CC'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009D2'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009D1'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077F'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ <UML:Association xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009DC'
+ name = 'contain' isSpecification = 'false' isRoot = 'false' isLeaf = 'false'
+ isAbstract = 'false'>
+ <UML:Association.connection>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009DD'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'composite' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009DE'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009DF'
+ lower = '1' upper = '1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ <UML:AssociationEnd xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E0'
+ visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered'
+ aggregation = 'none' targetScope = 'instance' changeability = 'changeable'>
+ <UML:AssociationEnd.multiplicity>
+ <UML:Multiplicity xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E4'>
+ <UML:Multiplicity.range>
+ <UML:MultiplicityRange xmi.id = '10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E3'
+ lower = '0' upper = '-1'/>
+ </UML:Multiplicity.range>
+ </UML:Multiplicity>
+ </UML:AssociationEnd.multiplicity>
+ <UML:AssociationEnd.participant>
+ <UML:Class xmi.idref = '10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783'/>
+ </UML:AssociationEnd.participant>
+ </UML:AssociationEnd>
+ </UML:Association.connection>
+ </UML:Association>
+ </UML:Namespace.ownedElement>
+ </UML:Model>
+ </XMI.content>
+</XMI>
+<pgml description="org.argouml.uml.diagram.static_structure.ui.UMLClassDiagram|10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077B"
+ name="Class Diagram 1"
+>
+ <group name="Fig0"
+ description="org.argouml.uml.diagram.static_structure.ui.FigPackage[80, 328, 720, 400]pathVisible=false;stereotypeVisible=true;visibilityVisible=false"
+ href="10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077C"
+ fill="1"
+ fillcolor="200 255 200"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig0.0"
+ x="80"
+ y="328"
+ width="720"
+ height="400"
+ fill="0"
+ fillcolor="200 255 200"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig0.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[80, 328, 670, 3]"
+ fill="1"
+ fillcolor="200 255 200"
+ stroke="1"
+ strokecolor="black"
+ visibility="0"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig0.1.0"
+ x="80"
+ y="328"
+ width="670"
+ height="3"
+ fill="1"
+ fillcolor="200 255 200"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig0.2"
+ x="80"
+ y="328"
+ fill="1"
+ fillcolor="200 255 200"
+ stroke="1"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ >Model</text>
+ <rectangle name="Fig0.3"
+ x="81"
+ y="330"
+ width="668"
+ height="2"
+ fill="1"
+ fillcolor="200 255 200"
+ stroke="1"
+ strokecolor="200 255 200"
+ visibility="0"
+ />
+ <text name="Fig0.4"
+ x="80"
+ y="348"
+ fill="1"
+ fillcolor="200 255 200"
+ stroke="1"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ ></text>
+ </group>
+ <group name="Fig1"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[96, 440, 160, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077F"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig0"
+ </private>
+
+ <rectangle name="Fig1.0"
+ x="96"
+ y="440"
+ width="160"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig1.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[96, 440, 160, 2]"
+ href="10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077F"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig1.1.0"
+ x="96"
+ y="440"
+ width="160"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig1.2"
+ x="96"
+ y="442"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >Collection</text>
+ <group name="Fig1.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[97, 484, 159, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig1.3.0"
+ x="97"
+ y="484"
+ width="159"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig1.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="97"
+ y="484" />
+ <lineto x="256"
+ y="484" />
+ </path>
+ </group>
+ <group name="Fig1.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[97, 463, 159, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig1.4.0"
+ x="97"
+ y="463"
+ width="159"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig1.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="97"
+ y="463" />
+ <lineto x="256"
+ y="463" />
+ </path>
+ </group>
+ <rectangle name="Fig1.5"
+ x="96"
+ y="440"
+ width="160"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig2"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[320, 440, 152, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig0"
+ </private>
+
+ <rectangle name="Fig2.0"
+ x="320"
+ y="440"
+ width="152"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig2.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[320, 440, 152, 2]"
+ href="10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000781"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig2.1.0"
+ x="320"
+ y="440"
+ width="152"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig2.2"
+ x="320"
+ y="442"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >MediaItem</text>
+ <group name="Fig2.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[321, 484, 151, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig2.3.0"
+ x="321"
+ y="484"
+ width="151"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig2.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="321"
+ y="484" />
+ <lineto x="472"
+ y="484" />
+ </path>
+ </group>
+ <group name="Fig2.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[321, 463, 151, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig2.4.0"
+ x="321"
+ y="463"
+ width="151"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig2.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="321"
+ y="463" />
+ <lineto x="472"
+ y="463" />
+ </path>
+ </group>
+ <rectangle name="Fig2.5"
+ x="320"
+ y="440"
+ width="152"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig3"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[544, 440, 152, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig0"
+ </private>
+
+ <rectangle name="Fig3.0"
+ x="544"
+ y="440"
+ width="152"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig3.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[544, 440, 152, 2]"
+ href="10-0-1-2-529699b9:1117f3aa477:-8000:0000000000000783"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig3.1.0"
+ x="544"
+ y="440"
+ width="152"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig3.2"
+ x="544"
+ y="442"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >Part</text>
+ <group name="Fig3.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[545, 484, 151, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig3.3.0"
+ x="545"
+ y="484"
+ width="151"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig3.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="545"
+ y="484" />
+ <lineto x="696"
+ y="484" />
+ </path>
+ </group>
+ <group name="Fig3.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[545, 463, 151, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig3.4.0"
+ x="545"
+ y="463"
+ width="151"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig3.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="545"
+ y="463" />
+ <lineto x="696"
+ y="463" />
+ </path>
+ </group>
+ <rectangle name="Fig3.5"
+ x="544"
+ y="440"
+ width="152"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig4"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000800"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig2.0"
+ destPortFig="Fig3.0"
+ sourceFigNode="Fig2"
+ destFigNode="Fig3"
+ </private>
+ <path name="Fig4.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="472"
+ y="464" />
+ <lineto x="544"
+ y="464" />
+ </path>
+ </group>
+ <group name="Fig5"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000809"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig1.0"
+ destPortFig="Fig2.0"
+ sourceFigNode="Fig1"
+ destFigNode="Fig2"
+ </private>
+ <path name="Fig5.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="256"
+ y="456" />
+ <lineto x="320"
+ y="456" />
+ </path>
+ </group>
+ <group name="Fig6"
+ description="org.argouml.uml.diagram.static_structure.ui.FigPackage[856, 344, 480, 400]pathVisible=false;stereotypeVisible=true;visibilityVisible=false"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000915"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig6.0"
+ x="856"
+ y="344"
+ width="480"
+ height="400"
+ fill="0"
+ fillcolor="255 200 200"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig6.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[856, 344, 430, 3]"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ visibility="0"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig6.1.0"
+ x="856"
+ y="344"
+ width="430"
+ height="3"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig6.2"
+ x="856"
+ y="344"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ >ExportView</text>
+ <rectangle name="Fig6.3"
+ x="857"
+ y="346"
+ width="428"
+ height="2"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="255 200 200"
+ visibility="0"
+ />
+ <text name="Fig6.4"
+ x="856"
+ y="364"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ ></text>
+ </group>
+ <group name="Fig7"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[1080, 536, 90, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000860"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig6"
+ </private>
+
+ <rectangle name="Fig7.0"
+ x="1080"
+ y="536"
+ width="90"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig7.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[1080, 536, 90, 2]"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000860"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig7.1.0"
+ x="1080"
+ y="536"
+ width="90"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig7.2"
+ x="1080"
+ y="538"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >OggExporter</text>
+ <group name="Fig7.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[1081, 580, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig7.3.0"
+ x="1081"
+ y="580"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig7.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1081"
+ y="580" />
+ <lineto x="1170"
+ y="580" />
+ </path>
+ </group>
+ <group name="Fig7.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[1081, 559, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig7.4.0"
+ x="1081"
+ y="559"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig7.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1081"
+ y="559" />
+ <lineto x="1170"
+ y="559" />
+ </path>
+ </group>
+ <rectangle name="Fig7.5"
+ x="1080"
+ y="536"
+ width="90"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig8"
+ description="org.argouml.uml.diagram.static_structure.ui.FigInterface[1064, 376, 118, 60]pathVisible=false;operationsVisible=true"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000862"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig6"
+ </private>
+
+ <rectangle name="Fig8.0"
+ x="1064"
+ y="376"
+ width="118"
+ height="60"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig8.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[1064, 376, 118, 15]"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000862"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig8.1.0"
+ x="1064"
+ y="376"
+ width="118"
+ height="15"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ <text name="Fig8.1.1"
+ x="1065"
+ y="377"
+ fill="0"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ ><<interface>></text>
+ </group>
+ <text name="Fig8.2"
+ x="1064"
+ y="391"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >IExporter</text>
+ <group name="Fig8.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[1065, 412, 117, 23]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig8.3.0"
+ x="1065"
+ y="412"
+ width="117"
+ height="23"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig8.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1065"
+ y="412" />
+ <lineto x="1182"
+ y="412" />
+ </path>
+ </group>
+ <rectangle name="Fig8.4"
+ x="1064"
+ y="376"
+ width="118"
+ height="60"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig9"
+ description="org.argouml.uml.diagram.ui.FigRealization"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000864"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig7.0"
+ destPortFig="Fig8.0"
+ sourceFigNode="Fig7"
+ destFigNode="Fig8"
+ </private>
+ <path name="Fig9.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1128"
+ y="536" />
+ <lineto x="1128"
+ y="436" />
+ </path>
+ </group>
+ <group name="Fig10"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[944, 536, 90, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:000000000000086F"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig6"
+ </private>
+
+ <rectangle name="Fig10.0"
+ x="944"
+ y="536"
+ width="90"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig10.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[944, 536, 90, 2]"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:000000000000086F"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig10.1.0"
+ x="944"
+ y="536"
+ width="90"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig10.2"
+ x="944"
+ y="538"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >FlacExporter</text>
+ <group name="Fig10.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[945, 580, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig10.3.0"
+ x="945"
+ y="580"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig10.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="945"
+ y="580" />
+ <lineto x="1034"
+ y="580" />
+ </path>
+ </group>
+ <group name="Fig10.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[945, 559, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig10.4.0"
+ x="945"
+ y="559"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig10.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="945"
+ y="559" />
+ <lineto x="1034"
+ y="559" />
+ </path>
+ </group>
+ <rectangle name="Fig10.5"
+ x="944"
+ y="536"
+ width="90"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig11"
+ description="org.argouml.uml.diagram.ui.FigRealization"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000871"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig10.0"
+ destPortFig="Fig8.0"
+ sourceFigNode="Fig10"
+ destFigNode="Fig8"
+ </private>
+ <path name="Fig11.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1016"
+ y="536" />
+ <lineto x="1016"
+ y="480" />
+ <lineto x="1128"
+ y="480" />
+ <lineto x="1128"
+ y="436" />
+ </path>
+ </group>
+ <group name="Fig12"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[1200, 536, 90, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000008E9"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig6"
+ </private>
+
+ <rectangle name="Fig12.0"
+ x="1200"
+ y="536"
+ width="90"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig12.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[1200, 536, 90, 2]"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000008E9"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig12.1.0"
+ x="1200"
+ y="536"
+ width="90"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig12.2"
+ x="1200"
+ y="538"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >Mp3Exporter</text>
+ <group name="Fig12.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[1201, 580, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig12.3.0"
+ x="1201"
+ y="580"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig12.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1201"
+ y="580" />
+ <lineto x="1290"
+ y="580" />
+ </path>
+ </group>
+ <group name="Fig12.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[1201, 559, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig12.4.0"
+ x="1201"
+ y="559"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig12.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1201"
+ y="559" />
+ <lineto x="1290"
+ y="559" />
+ </path>
+ </group>
+ <rectangle name="Fig12.5"
+ x="1200"
+ y="536"
+ width="90"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig13"
+ description="org.argouml.uml.diagram.ui.FigRealization"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000008EB"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig12.0"
+ destPortFig="Fig8.0"
+ sourceFigNode="Fig12"
+ destFigNode="Fig8"
+ </private>
+ <path name="Fig13.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1248"
+ y="536" />
+ <lineto x="1248"
+ y="480" />
+ <lineto x="1128"
+ y="480" />
+ <lineto x="1128"
+ y="436" />
+ </path>
+ </group>
+ <group name="Fig14"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[896, 432, 96, 65]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig6"
+ </private>
+
+ <rectangle name="Fig14.0"
+ x="896"
+ y="432"
+ width="96"
+ height="65"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig14.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[896, 432, 96, 2]"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F0"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig14.1.0"
+ x="896"
+ y="432"
+ width="96"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig14.2"
+ x="896"
+ y="434"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >Exporter</text>
+ <group name="Fig14.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[897, 476, 95, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig14.3.0"
+ x="897"
+ y="476"
+ width="95"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig14.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="897"
+ y="476" />
+ <lineto x="992"
+ y="476" />
+ </path>
+ </group>
+ <group name="Fig14.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[897, 455, 95, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig14.4.0"
+ x="897"
+ y="455"
+ width="95"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig14.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="897"
+ y="455" />
+ <lineto x="992"
+ y="455" />
+ </path>
+ </group>
+ <rectangle name="Fig14.5"
+ x="896"
+ y="432"
+ width="96"
+ height="65"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig15"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000008F4"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig14.0"
+ destPortFig="Fig8.0"
+ sourceFigNode="Fig14"
+ destFigNode="Fig8"
+ </private>
+ <path name="Fig15.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="992"
+ y="432" />
+ <lineto x="1064"
+ y="432" />
+ </path>
+ </group>
+ <group name="Fig16"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[1072, 656, 96, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000909"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig6"
+ </private>
+
+ <rectangle name="Fig16.0"
+ x="1072"
+ y="656"
+ width="96"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig16.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[1072, 656, 96, 2]"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000909"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig16.1.0"
+ x="1072"
+ y="656"
+ width="96"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig16.2"
+ x="1072"
+ y="658"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >ExporterCore</text>
+ <group name="Fig16.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[1073, 700, 95, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig16.3.0"
+ x="1073"
+ y="700"
+ width="95"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig16.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1073"
+ y="700" />
+ <lineto x="1168"
+ y="700" />
+ </path>
+ </group>
+ <group name="Fig16.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[1073, 679, 95, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig16.4.0"
+ x="1073"
+ y="679"
+ width="95"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig16.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1073"
+ y="679" />
+ <lineto x="1168"
+ y="679" />
+ </path>
+ </group>
+ <rectangle name="Fig16.5"
+ x="1072"
+ y="656"
+ width="96"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig17"
+ description="org.argouml.uml.diagram.ui.FigGeneralization"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000914"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig12.0"
+ destPortFig="Fig16.0"
+ sourceFigNode="Fig12"
+ destFigNode="Fig16"
+ </private>
+ <path name="Fig17.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1256"
+ y="600" />
+ <lineto x="1256"
+ y="632" />
+ <lineto x="1120"
+ y="632" />
+ <lineto x="1120"
+ y="656" />
+ </path>
+ </group>
+ <group name="Fig18"
+ description="org.argouml.uml.diagram.ui.FigGeneralization"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000913"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig7.0"
+ destPortFig="Fig16.0"
+ sourceFigNode="Fig7"
+ destFigNode="Fig16"
+ </private>
+ <path name="Fig18.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1120"
+ y="600" />
+ <lineto x="1120"
+ y="656" />
+ </path>
+ </group>
+ <group name="Fig19"
+ description="org.argouml.uml.diagram.ui.FigGeneralization"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000912"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig10.0"
+ destPortFig="Fig16.0"
+ sourceFigNode="Fig10"
+ destFigNode="Fig16"
+ </private>
+ <path name="Fig19.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1016"
+ y="600" />
+ <lineto x="1016"
+ y="632" />
+ <lineto x="1120"
+ y="632" />
+ <lineto x="1120"
+ y="656" />
+ </path>
+ </group>
+ <group name="Fig20"
+ description="org.argouml.uml.diagram.static_structure.ui.FigPackage[80, 136, 320, 176]pathVisible=false;stereotypeVisible=true;visibilityVisible=true"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E2"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig20.0"
+ x="80"
+ y="136"
+ width="320"
+ height="176"
+ fill="0"
+ fillcolor="255 200 200"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig20.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[80, 136, 270, 3]"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ visibility="0"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig20.1.0"
+ x="80"
+ y="136"
+ width="270"
+ height="3"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig20.2"
+ x="80"
+ y="136"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ >WebView</text>
+ <rectangle name="Fig20.3"
+ x="81"
+ y="138"
+ width="268"
+ height="2"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="255 200 200"
+ visibility="0"
+ />
+ <text name="Fig20.4"
+ x="80"
+ y="156"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ ></text>
+ </group>
+ <group name="Fig21"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[168, 216, 90, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E3"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig20"
+ </private>
+
+ <rectangle name="Fig21.0"
+ x="168"
+ y="216"
+ width="90"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig21.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[168, 216, 90, 2]"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000009E3"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig21.1.0"
+ x="168"
+ y="216"
+ width="90"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig21.2"
+ x="168"
+ y="218"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >MediaItemEditor</text>
+ <group name="Fig21.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[169, 260, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig21.3.0"
+ x="169"
+ y="260"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig21.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="169"
+ y="260" />
+ <lineto x="258"
+ y="260" />
+ </path>
+ </group>
+ <group name="Fig21.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[169, 239, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig21.4.0"
+ x="169"
+ y="239"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig21.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="169"
+ y="239" />
+ <lineto x="258"
+ y="239" />
+ </path>
+ </group>
+ <rectangle name="Fig21.5"
+ x="168"
+ y="216"
+ width="90"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig22"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000009EA"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig21.0"
+ destPortFig="Fig2.0"
+ sourceFigNode="Fig21"
+ destFigNode="Fig2"
+ </private>
+ <path name="Fig22.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="192"
+ y="280" />
+ <lineto x="192"
+ y="368" />
+ <lineto x="328"
+ y="368" />
+ <lineto x="328"
+ y="440" />
+ </path>
+ </group>
+ <group name="Fig23"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000009F8"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig21.0"
+ destPortFig="Fig3.0"
+ sourceFigNode="Fig21"
+ destFigNode="Fig3"
+ </private>
+ <path name="Fig23.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="200"
+ y="280" />
+ <lineto x="200"
+ y="360" />
+ <lineto x="584"
+ y="360" />
+ <lineto x="584"
+ y="440" />
+ </path>
+ </group>
+ <group name="Fig24"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:00000000000009FF"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig21.0"
+ destPortFig="Fig1.0"
+ sourceFigNode="Fig21"
+ destFigNode="Fig1"
+ </private>
+ <path name="Fig24.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="184"
+ y="280" />
+ <lineto x="184"
+ y="368" />
+ <lineto x="136"
+ y="368" />
+ <lineto x="136"
+ y="440" />
+ </path>
+ </group>
+ <group name="Fig25"
+ description="org.argouml.uml.diagram.ui.FigDependency"
+ href="10-0-1-2--159db96c:1118e45989a:-8000:0000000000000A08"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig21.0"
+ destPortFig="Fig14.0"
+ sourceFigNode="Fig21"
+ destFigNode="Fig14"
+ </private>
+ <path name="Fig25.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="258"
+ y="280" />
+ <lineto x="928"
+ y="280" />
+ <lineto x="928"
+ y="432" />
+ </path>
+ </group>
+ <group name="Fig26"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000085B"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig2.0"
+ destPortFig="Fig41"
+ sourceFigNode="Fig2"
+ destFigNode="Fig41"
+ </private>
+ <path name="Fig26.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="448"
+ y="504" />
+ <lineto x="448"
+ y="664" />
+ <lineto x="560"
+ y="664" />
+ </path>
+ </group>
+ <group name="Fig27"
+ description="org.argouml.uml.diagram.static_structure.ui.FigComment[872, 672, 170, 56]pathVisible=false;"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000864"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig6"
+ </private>
+
+ <rectangle name="Fig27.0"
+ x="872"
+ y="672"
+ width="170"
+ height="56"
+ fill="0"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig27.1"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="872"
+ y="672" />
+ <lineto x="1031"
+ y="672" />
+ <lineto x="1041"
+ y="682" />
+ <lineto x="1041"
+ y="727" />
+ <lineto x="872"
+ y="727" />
+ <lineto x="872"
+ y="672" />
+ </path>
+ <path name="Fig27.2"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="1"
+ fillcolor="178 178 178"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="1031"
+ y="672" />
+ <lineto x="1041"
+ y="682" />
+ <lineto x="1031"
+ y="682" />
+ <lineto x="1031"
+ y="672" />
+ </path>
+ <group name="Fig27.3"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[874, 674, 156, 2]"
+ fill="0"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ visibility="0"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig27.3.0"
+ x="874"
+ y="674"
+ width="156"
+ height="2"
+ fill="0"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig27.4"
+ x="874"
+ y="674"
+ fill="0"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ >The Exporter refreshes its cache
+when a MediaItem gets created
+or updated.</text>
+ </group>
+ <group name="Fig28"
+ description="org.argouml.uml.diagram.static_structure.ui.FigPackage[80, 760, 576, 176]pathVisible=false;stereotypeVisible=true;visibilityVisible=false"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000954"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig28.0"
+ x="80"
+ y="760"
+ width="576"
+ height="176"
+ fill="0"
+ fillcolor="255 200 200"
+ stroke="0"
+ strokecolor="black"
+ />
+ <group name="Fig28.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[80, 760, 526, 3]"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ visibility="0"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig28.1.0"
+ x="80"
+ y="760"
+ width="526"
+ height="3"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig28.2"
+ x="80"
+ y="760"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ >BackupView</text>
+ <rectangle name="Fig28.3"
+ x="81"
+ y="762"
+ width="524"
+ height="2"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="255 200 200"
+ visibility="0"
+ />
+ <text name="Fig28.4"
+ x="80"
+ y="780"
+ fill="1"
+ fillcolor="255 200 200"
+ stroke="1"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ ></text>
+ </group>
+ <group name="Fig29"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[128, 856, 90, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000955"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig28"
+ </private>
+
+ <rectangle name="Fig29.0"
+ x="128"
+ y="856"
+ width="90"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="0 255 255"
+ />
+ <group name="Fig29.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[128, 856, 90, 2]"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000955"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig29.1.0"
+ x="128"
+ y="856"
+ width="90"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig29.2"
+ x="128"
+ y="858"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >Serializer</text>
+ <group name="Fig29.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[129, 900, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig29.3.0"
+ x="129"
+ y="900"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig29.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="129"
+ y="900" />
+ <lineto x="218"
+ y="900" />
+ </path>
+ </group>
+ <group name="Fig29.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[129, 879, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig29.4.0"
+ x="129"
+ y="879"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig29.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="129"
+ y="879" />
+ <lineto x="218"
+ y="879" />
+ </path>
+ </group>
+ <rectangle name="Fig29.5"
+ x="128"
+ y="856"
+ width="90"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig30"
+ description="org.argouml.uml.diagram.static_structure.ui.FigClass[304, 856, 90, 64]pathVisible=false;operationsVisible=true;attributesVisible=true"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000957"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig28"
+ </private>
+
+ <rectangle name="Fig30.0"
+ x="304"
+ y="856"
+ width="90"
+ height="64"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="0 255 255"
+ />
+ <group name="Fig30.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[304, 856, 90, 2]"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000957"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig30.1.0"
+ x="304"
+ y="856"
+ width="90"
+ height="2"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <text name="Fig30.2"
+ x="304"
+ y="858"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >Unserializer</text>
+ <group name="Fig30.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[305, 900, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig30.3.0"
+ x="305"
+ y="900"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig30.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="305"
+ y="900" />
+ <lineto x="394"
+ y="900" />
+ </path>
+ </group>
+ <group name="Fig30.4"
+ description="org.argouml.uml.diagram.ui.FigAttributesCompartment[305, 879, 89, 20]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig30.4.0"
+ x="305"
+ y="879"
+ width="89"
+ height="20"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig30.4.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="305"
+ y="879" />
+ <lineto x="394"
+ y="879" />
+ </path>
+ </group>
+ <rectangle name="Fig30.5"
+ x="304"
+ y="856"
+ width="90"
+ height="64"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig31"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000972"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig29.0"
+ destPortFig="Fig1.0"
+ sourceFigNode="Fig29"
+ destFigNode="Fig1"
+ </private>
+ <path name="Fig31.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="136"
+ y="856" />
+ <lineto x="136"
+ y="504" />
+ </path>
+ </group>
+ <group name="Fig32"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000979"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig2.0"
+ destPortFig="Fig29.0"
+ sourceFigNode="Fig2"
+ destFigNode="Fig29"
+ </private>
+ <path name="Fig32.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="376"
+ y="504" />
+ <lineto x="376"
+ y="552" />
+ <lineto x="144"
+ y="552" />
+ <lineto x="144"
+ y="856" />
+ </path>
+ </group>
+ <group name="Fig33"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000980"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig3.0"
+ destPortFig="Fig29.0"
+ sourceFigNode="Fig3"
+ destFigNode="Fig29"
+ </private>
+ <path name="Fig33.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="544"
+ y="496" />
+ <lineto x="512"
+ y="496" />
+ <lineto x="512"
+ y="560" />
+ <lineto x="152"
+ y="560" />
+ <lineto x="152"
+ y="856" />
+ </path>
+ </group>
+ <group name="Fig34"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:0000000000000996"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig30.0"
+ destPortFig="Fig2.0"
+ sourceFigNode="Fig30"
+ destFigNode="Fig2"
+ </private>
+ <path name="Fig34.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="328"
+ y="856" />
+ <lineto x="328"
+ y="808" />
+ <lineto x="296"
+ y="808" />
+ <lineto x="296"
+ y="520" />
+ <lineto x="344"
+ y="520" />
+ <lineto x="344"
+ y="504" />
+ </path>
+ </group>
+ <group name="Fig35"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:000000000000099D"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig30.0"
+ destPortFig="Fig3.0"
+ sourceFigNode="Fig30"
+ destFigNode="Fig3"
+ </private>
+ <path name="Fig35.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="336"
+ y="856" />
+ <lineto x="336"
+ y="800" />
+ <lineto x="304"
+ y="800" />
+ <lineto x="304"
+ y="584" />
+ <lineto x="608"
+ y="584" />
+ <lineto x="608"
+ y="504" />
+ </path>
+ </group>
+ <group name="Fig36"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009A4"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig1.0"
+ destPortFig="Fig30.0"
+ sourceFigNode="Fig1"
+ destFigNode="Fig30"
+ </private>
+ <path name="Fig36.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="248"
+ y="504" />
+ <lineto x="248"
+ y="520" />
+ <lineto x="288"
+ y="520" />
+ <lineto x="288"
+ y="816" />
+ <lineto x="320"
+ y="816" />
+ <lineto x="320"
+ y="856" />
+ </path>
+ </group>
+ <group name="Fig37"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009B8"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig14.0"
+ destPortFig="Fig3.0"
+ sourceFigNode="Fig14"
+ destFigNode="Fig3"
+ </private>
+ <path name="Fig37.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="896"
+ y="464" />
+ <lineto x="720"
+ y="464" />
+ <lineto x="720"
+ y="416" />
+ <lineto x="648"
+ y="416" />
+ <lineto x="648"
+ y="440" />
+ </path>
+ </group>
+ <group name="Fig38"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009BF"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig14.0"
+ destPortFig="Fig2.0"
+ sourceFigNode="Fig14"
+ destFigNode="Fig2"
+ </private>
+ <path name="Fig38.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="896"
+ y="456" />
+ <lineto x="728"
+ y="456" />
+ <lineto x="728"
+ y="408" />
+ <lineto x="400"
+ y="408" />
+ <lineto x="400"
+ y="440" />
+ </path>
+ </group>
+ <group name="Fig39"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009C8"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig14.0"
+ destPortFig="Fig1.0"
+ sourceFigNode="Fig14"
+ destFigNode="Fig1"
+ </private>
+ <path name="Fig39.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="896"
+ y="448" />
+ <lineto x="736"
+ y="448" />
+ <lineto x="736"
+ y="400" />
+ <lineto x="184"
+ y="400" />
+ <lineto x="184"
+ y="440" />
+ </path>
+ </group>
+ <group name="Fig40"
+ description="org.argouml.uml.diagram.ui.FigAssociation"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009DC"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig3.0"
+ destPortFig="Fig3"
+ sourceFigNode="Fig3"
+ destFigNode="Fig3"
+ </private>
+ <path name="Fig40.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="696"
+ y="496" />
+ <lineto x="768"
+ y="496" />
+ <lineto x="768"
+ y="584" />
+ <lineto x="664"
+ y="584" />
+ <lineto x="664"
+ y="504" />
+ </path>
+ </group>
+ <group name="Fig41"
+ description="org.argouml.uml.diagram.static_structure.ui.FigInterface[560, 632, 107, 60]pathVisible=false;operationsVisible=true"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E5"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ enclosingFig="Fig0"
+ </private>
+
+ <rectangle name="Fig41.0"
+ x="560"
+ y="632"
+ width="107"
+ height="60"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="0 255 255"
+ />
+ <group name="Fig41.1"
+ description="org.argouml.uml.diagram.ui.FigStereotypesCompartment[560, 632, 107, 15]"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E5"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig41.1.0"
+ x="560"
+ y="632"
+ width="107"
+ height="15"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ <text name="Fig41.1.1"
+ x="561"
+ y="633"
+ fill="0"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ font="Dialog"
+ textsize="10"
+ ><<interface>></text>
+ </group>
+ <text name="Fig41.2"
+ x="560"
+ y="647"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="red"
+ font="Dialog"
+ textsize="10"
+ >IMediaItemObserver</text>
+ <group name="Fig41.3"
+ description="org.argouml.uml.diagram.ui.FigOperationsCompartment[561, 668, 106, 23]"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ >
+ <private>
+ </private>
+
+ <rectangle name="Fig41.3.0"
+ x="561"
+ y="668"
+ width="106"
+ height="23"
+ fill="1"
+ fillcolor="white"
+ stroke="0"
+ strokecolor="black"
+ />
+ <path name="Fig41.3.1"
+ description="org.argouml.uml.diagram.ui.FigFeaturesCompartment$FigSeperator"
+ fill="1"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="561"
+ y="668" />
+ <lineto x="667"
+ y="668" />
+ </path>
+ </group>
+ <rectangle name="Fig41.4"
+ x="560"
+ y="632"
+ width="107"
+ height="60"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ />
+ </group>
+ <group name="Fig42"
+ description="org.argouml.uml.diagram.ui.FigRealization"
+ href="10-0-1-2-2007e52b:1118f7e9684:-8000:00000000000009E9"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig14.0"
+ destPortFig="Fig41.0"
+ sourceFigNode="Fig14"
+ destFigNode="Fig41"
+ </private>
+ <path name="Fig42.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="920"
+ y="497" />
+ <lineto x="920"
+ y="640" />
+ <lineto x="667"
+ y="640" />
+ </path>
+ </group>
+ <group name="Fig43"
+ description="org.argouml.uml.diagram.static_structure.ui.FigEdgeNote"
+ stroke="1"
+ strokecolor="black"
+ >
+ <private>
+ sourcePortFig="Fig27.0"
+ destPortFig="Fig42.2.0"
+ sourceFigNode="Fig27"
+ destFigNode="Fig42.2"
+ </private>
+ <path name="Fig43.0"
+ description="org.tigris.gef.presentation.FigPoly"
+ fill="0"
+ fillcolor="white"
+ stroke="1"
+ strokecolor="black"
+ >
+ <moveto x="872"
+ y="672" />
+ <lineto x="865"
+ y="641" />
+ </path>
+ </group>
+</pgml>
+<pgml description="org.argouml.uml.diagram.use_case.ui.UMLUseCaseDiagram|10-0-1-2-529699b9:1117f3aa477:-8000:000000000000077B"
+ name="Use Case Diagram 1"
+>
+</pgml>
+<todo>
+<todolist>
+</todolist>
+<resolvedcritics>
+</resolvedcritics>
+</todo>
+</uml>
--- /dev/null
+====================
+Telemeta - Maquettes
+====================
+
+En prévision de Telemeta 1.0, deux maquettes graphiques (bitmaps) sont
+nécessaires pour présenter l'orientation visuelle et la faire valider
+par client final.
+
+Dans le cas où une première proposition ne conviendrait pas au client
+il peut être nécessaire d'avoir à en faire une seconde. Il faut donc
+prévoir deux propositions graphiques (2 x 2 maquettes).
+
+Page d'accueil
+--------------
+
+Dans le prototype, Telemeta 0.4, il n'y a pas encore de page d'accueil,
+car on s'est concentré sur des détails fonctionnels dans un premier
+temps.
+
+Cependant, avec la mise en production, la page d'accueil devient
+importante, même si Telemeta n'est pas un site internet, il faut que
+son interface soit attractive au premier abord.
+
+Ce que nous avons prévu en page d'accueil :
+
+ * La page est charpentée de façon similaire à Telemeta 0.4 : logo, menu
+ horizontal (avec champ de recherche intégré au menu et à gauche),
+ pied de page
+
+ * Le corps de la page contient :
+
+ * un texte d'introduction avec une (ou éventuellement) plusieurs photos,
+ éditables par les administrateurs
+
+ * Une petite mappemonde google map, qui est un lien vers l'affichage du
+ navigateur géographique
+
+ * Un bloc de news reprenant les dernière modifications de la base de données
+
+ * Un petit lecteur multimédia TimeSide pour la sélection musicale du mois
+
+
+Page intérieure
+---------------
+
+Pour la page intérieure, il suffit de décliner le formulaire d'édition
+d'item avec une nouvelle charte graphique. La structure de la page
+apparaît bien sur la maquette suivante :
+
+http://telemeta.org/browser/trunk/design/maquette_v0.4_item_edit_2.png
+
+La charte graphique doit cependant évoluer. Par ailleurs, sur cette
+page de formulaire, il faut faire apparaître le lecteur multimédia
+TimeSide avec marqueurs, comme vu ici :
+
+http://telemeta.org/browser/trunk/design/maquette_v0.4_item_view_2.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null
+
+==================
+Telemeta - Widgets
+==================
+
+.. contents:: Table des matières
+
+Introduction
+============
+
+Le présent document décrit les différents widgets prévus pour composer
+l'interface utilisateur de Telemeta. Il est destiné à permettre la
+conception HTML+CSS de ces widgets, dans un premier temps sous une forme
+purement statique (galerie de widgets).
+
+Chaque widget est associé à une classe CSS principale. Un travail sur
+l'interface a par ailleurs déjà été effectué, si bien que pour un
+certain nombre de ces widgets il existe une référence (ref) donnant un
+aperçu. Les descriptions ci-dessous priment cependant sur ces références
+qui ont pour seul but d'illustrer les premières.
+
+Définitions
+===========
+
+Ressources :
+ les ressources sont les structures de données centrales dans Telemeta,
+ telles que les collection ou les items.
+
+Données CREM prioritaires :
+ certaines données ont été identifiées comme prioritaires. Au niveau
+ graphique elles peuvent être celles qui sont assorties d'un petit
+ icône. Il s'agit de :
+
+ - la cote (code alpha-numérique identifiant une ressource)
+ - le titre
+ - la zone géographique
+ - le nom du collecteur, c'est à dire le chercheur qui a collecté cet (ces)
+ enregistrement(s)
+ - les instruments de musique utilisés
+ - l'année/date d'enregistrement
+ - l'ethnie / le contexte ethnographique
+
+Widgets
+=======
+
+Tableau de ressources
+~~~~~~~~~~~~~~~~~~~~~
+
+:classe: resource-table
+:ref: http://crem.telemeta.org/items
+
+Les tableaux de ressources listent des collections ou des items, soit leur
+totalité, soit un résultat de recherche, etc...
+
+Ces tableaux peuvent avoir un nombre indéterminé de colonnes et de lignes,
+mais possèdent toujours des en-têtes de colonnes.
+
+Les lignes impaires doivent être différenciées, ainsi que les lignes
+survolées par la souris.
+
+Une ou plusieurs colonnes sont généralement mises en évidence (titre,
+etc..).
+
+Chaque ligne est cliquable dans son intégralité, les cellules contenant
+donc toutes un lien qui ne change pas d'apparence après avoir été visité.
+
+Il peut y avoir une ou plusieurs colonnes contenant des icônes cliquables.
+
+Les en-têtes de colonnes sont cliquables et permettent de trier le tableau,
+elles doivent donc pouvoir comporter un indicateur (flèche) de tri.
+
+L'impression de ces tableaux est importante et peut donc nécessiter des
+règles CSS print spécifiques.
+
+Liste de ressources
+~~~~~~~~~~~~~~~~~~~
+
+:classe: resource-list
+
+Les listes de ressources présentent le même type d'information que les
+tableaux de ressources mais avec possiblement plus de détails. Elles
+ressemblent aux résultat de recherche Google, c'est à dire des blocs
+d'information successifs, avec un titre bien mis en évidence et cliquable.
+
+En plus du titre peut apparaître une description, ainsi qu'une ou plusieurs
+propriétés (données CREM prioritaires uniquement). Les propriétés
+doivent s'afficher de façon différenciée de la description, et être
+soient en dessous, soit au dessus (à choisir au moment de la conception
+du widget). Elles peuvent être assorties d'un icône (à voir).
+
+Au dessus de la liste, un champ déroulant permet de sélectionner une
+méthode de tri.
+
+Menu principal
+~~~~~~~~~~~~~~
+
+:classe: main-menu
+:ref: http://telemeta.org/browser/trunk/design/maquette_v0.4_item_view_2.png
+
+Le menu principal est horizontal et contient un certain nombre d'items
+texte cliquable. Il n'y a pas de listes déroulantes.
+
+Un champ de recherche rapide est intégré dans ce menu, sur la gauche.
+
+Sous-menu
+~~~~~~~~~
+
+:classe: sub-menu
+:ref: http://telemeta.org/browser/trunk/design/maquette_v0.4_item_view_2.png
+
+Le sous-menu est horizontal et apparaît à droite. Il permet notamment
+de changer le mode d'affichage, par exemple de passer d'un tableau de
+ressources à la liste de ressources correspondante, ou encore de passer à
+la vue dublin core ou à l'édition d'un item lorsqu'on le visualise, etc...
+
+Il peut contenir d'une part des liens texte simples, et d'autre part
+(en dessous) un ou plusieurs boutons (Edit, etc..)
+
+Titre de page
+~~~~~~~~~~~~~
+
+:classe: main-title
+:ref: http://crem.telemeta.org/items/BM.000.003.001--04__01-01/
+
+Le titre de page est par exemple le titre de collection lors de la
+visualisation d'une collection, ou encore "Geographic Navigator" lors
+qu'on est dans le navigateur géographique, "Recherche", etc...
+
+Le titre peut éventuellement être assorti d'un icône (à décider au
+moment de la conception du widget). Dans le cas où l'icône est différent
+suivant le type de page, prévoir un maximum de 10 icônes.
+
+Bloc de propriétés
+~~~~~~~~~~~~~~~~~~
+
+:classe: property-block
+:ref: http://crem.telemeta.org/items/BM.000.010.001__01-ii
+:ref: http://telemeta.org/browser/trunk/design/maquette_v0.4_item_edit_2.png
+
+Sur la page d'une ressource, apparaissent un certain nombre de blocs
+groupant des propriétés. A l'exception du premier bloc, ces blocs
+possèdent un titre et contiennent une liste de propriété qui peut
+être replié.
+
+Les titres de blocs et/ou propriétés peuvent être assortis d'un petit
+icône. Notamment pour les types de données prioritaires CREM. D'autres
+icônes peuvent s'avérer nécessaire. Il y en aura en tout au maximum 15.
+
+Outre l'affichage, ces blocs peuvent servir à l'édition et à la recherche,
+contenant alors des champs d'entrée. Cependant, pour différencier les
+trois contextes (affichage, édition, recherche) il faut une variante
+graphique, par exemple un titre de bloc de couleur différente.
+
+Par ailleurs, les propriétés d'un bloc sont susceptibles de s'afficher
+sur une ou deux colonnes de largeur variable.
+
+En plus de l'affichage de propriétés de façon horizontal (titre à
+gauche, valeur à droite), des tableaux de propriétés sont aussi prévus,
+notamment pour les formations musicales.
+
+L'impression de ces blocs est importante et peut donc nécessiter des
+règles CSS print spécifiques.
+
+Formulaire de propriétés
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+:classe: property-form
+:ref: http://telemeta.org/browser/trunk/design/maquette_v0.4_item_edit_2.png
+
+Ce widget pouvant être utilisé pour l'édition comme pour la recherche
+contient un certain nombre de blocs de propriétés. Les champs d'entrée
+peuvent être de 4 types:
+
+ * champ texte (input)
+ * champ texte multi-ligne (textarea)
+ * liste simple (select)
+ * liste arborescente
+
+Les champs texte peuvent utiliser la complétion, c'est à dire faire
+apparaître une liste d'éléments automatiquement au cours de la frappe.
+
+La liste arborescente est destinée à sélectionner des éléments dans
+un thésaurus (instruments, lieux, ..). C'est un menu déroulant avec un
+nombre indéterminé de niveaux. Il est possible d'être plus ou moins
+précis dans la sélection, c'est à dire qu'il n'est pas nécessaire
+d'aller jusqu'au dernier niveau pour effectuer une sélection. Par exemple
+on peut vouloir chercher les collections enregistrées en France, ou plus
+précisément en Ile-de-France, ou encore Paris, etc...
+
+Pour cette raison, le premier item de chaque niveau doit être différencié
+et servir à sélectionner l'ensemble des éléments de ce niveau (ex:
+France > [France : Tout], Bretagne, Ile de France, etc...)
+
+Dans les blocs de propriétés, comme pour l'affichage, ces champs d'entrée
+apparaissent généralement avec un label sur la gauche, mais peuvent
+aussi apparaître sous forme de tableau de propriétés. Dans ce dernier
+cas, il doit être possible d'ajouter et supprimer des lignes.
+
+Historique de modifications
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+:classe: history
+
+Telemeta conserve un historique des modifications de chaque ressource. Une
+liste affichant cette historique est donc prévue avec pour chaque entrée :
+le type de modification (création, modification, ..), la date, et le nom
+de l'utilisateur.
+
+Il y a cependant deux formes d'historique : l'une pour une ressource donnée,
+l'autre pour différentes ressources (dernières modifications sur toute
+la base, ou sur les items d'Afrique, etc...). Dans ce dernier cas, chaque
+entrée doit donc comporter le type et le titre de la ressource.
+
+Cet historique est destiné à s'afficher en pleine page.
+
+News
+~~~~
+
+:classe: news
+
+Les news dans Telemeta sont généralement des historiques de modifications
+compacts, destinés à occuper un espace restreint sur la page. C'est une
+boîte de news, avec un titre, des boutons RSS et ATOM. Y figurent titre,
+date et (dans la majorité des cas, c'est à dire l'affichage d'historiques
+compacts) le type de modification (création, modification, ..)
+
+Graphiquement, il faut vraiment les traiter comme des news, et donc utiliser
+un (ou des) icône(s) spécifiques.
+
+Enumeration
+~~~~~~~~~~~
+
+:classe: enumeration
+:ref: http://crem.telemeta.org/admin/enumerations/physicalformat/
+
+Ce widget composite est principalement destinée à la partie administration
+du site. Dans Telemeta il y a un certain nombre d'énumérations, c'est
+à dire de listes plates de valeurs. Par exemple la liste des ethnie.
+
+L'administrateur doit pouvoir consulter, ajouter, modifier et supprimer
+des valeurs d'une énumération.
+
+Pour ce faire, un tableau simple est prévu. Chaque ligne peut figurer un
+ou plusieurs des icônes suivants : édition, suppression, et alias. Dans
+certaines situations des éléments de l'énumération peuvent être
+en lecture seule et soit ne figurer aucun icônes, soit des icônes
+désactivés.
+
+Un bouton ajout (pour ajouter une valeur à la liste) est également
+nécessaire.
+
+Ce système d'édition d'énumération doit aussi permettre d'éditer des
+structures de données plus complexes tels que les thesaurus. Pour cela,
+un fil d'ariane peut optionnellement s'afficher au dessus de la liste, pour
+indiquer à quel niveau se trouve l'énumération en cours d'édition et
+permettre de revenir à l'un des niveaux supérieurs.
+
+L'ajout ou de la modification d'un item se font dans une popup DHTML
+figurant un champ texte simple (+ label et barre de titre de popup).
+
+Pagination
+~~~~~~~~~~
+
+:classe: pager
+:ref: http://crem.telemeta.org/items/
+
+Un certain nombre de listes peuvent nécessiter une pagination (listes et
+tableaux de ressources, énumérations, etc...)
+
+Ce widget doit donc permettre de passer à la page suivante, précédente
+ou à l'une des pages intermédiaires.
+
+Une attention particulière doit être apportée à l'ergonomie de ce widget.
+
+Il peut apparaître au dessus et/ou en dessous des listes.
+
+Informations de connexion
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+:classe: login-info
+:ref: http://telemeta.org/browser/trunk/design/maquette_v0.4_item_view_2.png
+
+Ce petit widget apparaît en haut à droite et permet de se connecter. Il
+figure donc un bouton "Se connecter", puis une fois connecté : "Connecté
+: <nom>", éventuellement assorti d'un picto. Un lien "préférences"
+apparaît également.
+
+Pied de page
+~~~~~~~~~~~~
+
+:classe: footer
+:ref: http://telemeta.org/browser/trunk/design/maquette_v0.4_item_view_2.png
+:ref: http://crem.telemeta.org/
+
+Le pied de page figure le logo Telemeta, des informations concernant les auteurs
+et sponsors, ainsi qu'un lien vers la page officielle du projet Telemeta.
+
+Lecteur multimédia
+~~~~~~~~~~~~~~~~~~
+
+:classe: media-player
+
+Ce widget complexe et principalement destiné à l'audio dans un premier
+temps est en cours de développement dans le projet externe TimeSide.
+
+Sa structure HTML dynamique est documentée à l'URL suivant:
+http://code.google.com/p/timeside/wiki/UiGuide#Markup_structure
+
+Ce lecteur est "skinable". A l'heure actuelle, dans Telemeta c'est la skin
+"lab" qui est utilisée:
+http://svn.samalyse.com/timeside/tags/release-0.1/skins/lab/style.css
+
+Elle est cependant modifiée pour Telemeta par la surcharge de certaines
+classes CSS:
+http://telemeta.org/browser/trunk/telemeta/htdocs/css/player.css
+
+Outre la visualisation de la forme d'onde, l'affichage de marqueurs sous
+forme de lignes verticales ainsi que les boutons de contrôles de la lecture,
+sont aussi prévus :
+
+ * un mode playlist, pour pouvoir écouter chaque item, depuis une page de
+ collection. Ceci est actuellement implémenté à l'aide d'un lecteur
+ alternatif qui a vocation a être remplacé par Timeside. Voir:
+ http://crem.telemeta.org/collections/DI.005.005.040/
+ * une liste de marqueurs éditables, apparaissant sous le lecteur. Voir:
+ http://telemeta.org/browser/trunk/design/maquette_v0.4_item_view_2.png
+
+La conception de ce widget, plus complexe, peut faire l'objet d'un maquettage
+jpeg simple, qui sera ensuite répercuté au cours du développement. Il
+n'est pas à priori pas nécessaire de faire figurer ce widget dans la
+galerie de widgets.
+
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
+<HTML
+><HEAD
+><TITLE
+>telemeta</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.79"></HEAD
+><BODY
+CLASS="REFENTRY"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><H1
+><A
+NAME="AEN1"
+></A
+>telemeta</H1
+><DIV
+CLASS="REFNAMEDIV"
+><A
+NAME="AEN15"
+></A
+><H2
+>Name</H2
+>telemeta -- backups, transcodes, tags and marks any audio content with metadata</DIV
+><DIV
+CLASS="REFSYNOPSISDIV"
+><A
+NAME="AEN18"
+></A
+><H2
+>Synopsis</H2
+><P
+><B
+CLASS="COMMAND"
+>telemeta</B
+> [<CODE
+CLASS="OPTION"
+><TT
+CLASS="REPLACEABLE"
+><I
+>OPTIONS</I
+></TT
+></CODE
+>] [<TT
+CLASS="REPLACEABLE"
+><I
+>COLLECTION</I
+></TT
+>] [<CODE
+CLASS="OPTION"
+><TT
+CLASS="REPLACEABLE"
+><I
+>OPTIONS</I
+></TT
+></CODE
+>] [<CODE
+CLASS="OPTION"
+><TT
+CLASS="REPLACEABLE"
+><I
+>MEDIA</I
+></TT
+></CODE
+>]</P
+></DIV
+><DIV
+CLASS="REFSECT1"
+><A
+NAME="AEN32"
+></A
+><H2
+>DESCRIPTION</H2
+><P
+><B
+CLASS="COMMAND"
+>telemeta</B
+> is an audio tool which creates audio transcoded collections fast from fresh mastered files. It can be useful to backup digitalized audio media from vinyls, old tapes or whatever and include them in a database.</P
+><P
+>Telemeta first creates a simple file structure where the original sounds will be backuped. The files can be transcoded to WAV, FLAC, MP3 and OGG including the corresponding tags.</P
+><P
+>Here are some cool functions:</P
+><P
+></P
+><DIV
+CLASS="VARIABLELIST"
+><DL
+><DT
+><CODE
+CLASS="OPTION"
+></CODE
+></DT
+><DD
+><P
+>- XML generation for metadata tags of backuped WAV</P
+><P
+>- Audio marking from a given file or from tags thanks to the Festival speech systhesis tool</P
+><P
+>- File corruption security with par2 recovery files</P
+><P
+>- Collection synchronizing to remote servers (ssh+rsync)</P
+><P
+>- Modify metadata from XML or interactive shell</P
+></DD
+></DL
+></DIV
+></DIV
+><DIV
+CLASS="REFSECT1"
+><A
+NAME="AEN48"
+></A
+><H2
+>OPTIONS</H2
+><P
+>These programs follow the usual <ACRONYM
+CLASS="ACRONYM"
+>GNU</ACRONYM
+> command line syntax,
+ with long options starting with two dashes (`-'). A summary of
+ options is included below. For a complete description, see the
+ <SPAN
+CLASS="APPLICATION"
+>Info</SPAN
+> files.</P
+><P
+></P
+><DIV
+CLASS="VARIABLELIST"
+><DL
+><DT
+><CODE
+CLASS="OPTION"
+>--create</CODE
+></DT
+><DD
+><P
+>creates a collection repository</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--backup</CODE
+></DT
+><DD
+><P
+>backups and transcodes wave files to a collection</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--album</CODE
+></DT
+><DD
+><P
+>proccesses an entire directory (one shot album)</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--backup</CODE
+></DT
+><DD
+><P
+>backups a media to the collection</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--from-xml</CODE
+></DT
+><DD
+><P
+>takes tags and opts in original xml source</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--force</CODE
+></DT
+><DD
+><P
+>forces file conversion (no audio test)</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--par2</CODE
+></DT
+><DD
+><P
+>forces par2 security file creation</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--all-default</CODE
+></DT
+><DD
+><P
+>chooses default argument for all question</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--recover</CODE
+></DT
+><DD
+><P
+>check an repair the backuped media with the previously created "par2" security files</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--rsync</CODE
+></DT
+><DD
+><P
+>synchronizes collection to a remote server (ssh+rsync)</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--erase</CODE
+></DT
+><DD
+><P
+>erases a collection (flac, ogg, mp3 only !)</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--help</CODE
+></DT
+><DD
+><P
+>Show summary of options.</P
+></DD
+><DT
+><CODE
+CLASS="OPTION"
+>--version</CODE
+></DT
+><DD
+><P
+>Show version of program.</P
+></DD
+></DL
+></DIV
+></DIV
+><DIV
+CLASS="REFSECT1"
+><A
+NAME="AEN119"
+></A
+><H2
+>EXAMPLES</H2
+><P
+><B
+CLASS="COMMAND"
+>telemeta --create my_collection</B
+></P
+><P
+><B
+CLASS="COMMAND"
+>telemeta --backup my_collection file.wav</B
+></P
+><P
+><B
+CLASS="COMMAND"
+>telemeta --backup my_collection --album /path/to/directory/</B
+></P
+><P
+><B
+CLASS="COMMAND"
+>telemeta --backup my_collection --album --par2 --rsync /path/to/directory/</B
+></P
+><P
+><B
+CLASS="COMMAND"
+>telemeta --backup my_collection --album --par2 --rsync --force /path/to/directory/</B
+></P
+></DIV
+><DIV
+CLASS="REFSECT1"
+><A
+NAME="AEN131"
+></A
+><H2
+>DOWNLOAD</H2
+><P
+>Telemeta is written in python. So it doesn't require any compilation step.</P
+><P
+>On Debian or Ubuntu just add these lines to your /etc/apt/sources-list:</P
+><P
+><B
+CLASS="COMMAND"
+>deb http://yomix.org/debian/ binary/</B
+></P
+><P
+><B
+CLASS="COMMAND"
+>deb-src http://yomix.org/debian/ source/</B
+></P
+><P
+>Then,</P
+><P
+><B
+CLASS="COMMAND"
+>sudo apt-get update</B
+></P
+><P
+><B
+CLASS="COMMAND"
+>sudo apt-get install telemeta</B
+></P
+><P
+>On other linux platforms, <A
+HREF="http://yomix.org/telemeta/download/"
+TARGET="_top"
+>download</A
+> the lastest .tar.gz archive, uncompress it, go into the created directory and just type this with your favorite shell :</P
+><P
+><B
+CLASS="COMMAND"
+>python install.py</B
+></P
+><P
+>See README and INSTALL file for more informations.</P
+><P
+>You can also get the lastest version of Telemeta with subversion (just type 'enter' for the password:</P
+><P
+>svn co http://svn.yomix.org/svn/telemeta/trunk telemeta --username=anonymous</P
+></DIV
+><DIV
+CLASS="REFSECT1"
+><A
+NAME="AEN151"
+></A
+><H2
+>DEPENDS</H2
+><P
+>python (>= 2.3.5-7), python-xml, python-central (>= 0.5), python-mutagen, sox, vorbis-tools, flac, lame, normalize-audio, ecasound, festival, par2</P
+></DIV
+><DIV
+CLASS="REFSECT1"
+><A
+NAME="AEN154"
+></A
+><H2
+>SEE ALSO</H2
+><P
+>The program is documented fully by Guillaume Pellerin. More info at <I
+CLASS="CITETITLE"
+><A
+HREF="http://svn.yomix.org/telemeta/"
+TARGET="_top"
+>http://svn.yomix.org/telemeta/</A
+></I
+>.</P
+></DIV
+><DIV
+CLASS="REFSECT1"
+><A
+NAME="AEN159"
+></A
+><H2
+>AUTHOR</H2
+><P
+>This manual page was written by Guillaume Pellerin <<CODE
+CLASS="EMAIL"
+><<A
+HREF="mailto:yomguy@altern.org"
+>yomguy@altern.org</A
+>></CODE
+>> for
+ the <SPAN
+CLASS="PRODUCTNAME"
+>Debian</SPAN
+> system (but may be used by others). Permission is
+ granted to copy, distribute and/or modify this document under
+ the terms of the <ACRONYM
+CLASS="ACRONYM"
+>GNU</ACRONYM
+> General Public License, Version 2 any
+ later version published by the Free Software Foundation.
+ </P
+><P
+> On Debian systems, the complete text of the GNU General Public
+ License can be found in /usr/share/common-licenses/GPL.
+ </P
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file
--- /dev/null
+# -*- coding: utf-8 -*-
+from distutils.core import setup
+from distutils.command.install import INSTALL_SCHEMES
+import os
+import sys
+
+def fullsplit(path, result=None):
+ """
+ Split a pathname into components (the opposite of os.path.join) in a
+ platform-neutral way.
+ """
+ if result is None:
+ result = []
+ head, tail = os.path.split(path)
+ if head == '':
+ return [tail] + result
+ if head == path:
+ return result
+ return fullsplit(head, [tail] + result)
+
+# Tell distutils to put the data_files in platform-specific installation
+# locations. See here for an explanation:
+# http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb
+for scheme in INSTALL_SCHEMES.values():
+ scheme['data'] = scheme['purelib']
+
+# Compile the list of packages available, because distutils doesn't have
+# an easy way to do this.
+packages, data_files = [], []
+root_dir = os.path.dirname(__file__)
+if root_dir != '':
+ os.chdir(root_dir)
+telemeta_dir = 'telemeta'
+
+for dirpath, dirnames, filenames in os.walk(telemeta_dir):
+ # Ignore dirnames that start with '.'
+ for i, dirname in enumerate(dirnames):
+ if dirname.startswith('.'): del dirnames[i]
+ if '__init__.py' in filenames:
+ packages.append('.'.join(fullsplit(dirpath)))
+ elif filenames:
+ data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])
+
+# Dynamically calculate the version based on telemeta.VERSION.
+version = __import__('telemeta').__version__
+
+setup(
+ name = "telemeta",
+ url = "/http://svn.parisson.org/telemeta",
+ description = "web frontend to backup, transcode and tag any audio content with metadata",
+ author = ["Guillaume Pellerin, Olivier Guilyardi"],
+ author_email = ["pellerin@parisson.com","olivier@samalyse.com"],
+ version = version,
+ packages = packages,
+ data_files = data_files,
+ long_description = """
+Telemeta is a web audio archiving program which introduces useful and secure methods to
+backup, index, transcode, analyse and publish any digitalized audio file with its metadata.
+It is dedicated to professionnals who wants to easily backup and publish documented sounds
+from collections of vinyls, magnetic tapes or audio CDs over a strong database, in accordance
+with open standards.
+
+Here are the main features of Telemeta:
+
+ * Secure archiving, editing and publishing of audio files over internet.
+ * User friendly web frontend including workflows and high level search methods
+ * Smart dynamical and skinnable audio player (thanks to Timeside and soundmanager2)
+ * "On the fly" analyzing, transcoding and metadata embedding based on an easy plugin architecture
+ * Multi-format support : FLAC, OGG, MP3, WAV and more
+ * GEO Navigator for audio geolocalization
+ * DublinCore compatibility
+ * OAI-PMH data provider
+ * XML serialized backup
+ * Strong SQL backend
+
+The Telemeta data model is based on 'collections' and 'items'. A collection is described
+by its metadata and includes original audio items (sounds) and its own metadata. This
+existing model has been designed to fit the one of the French Centre of Etnomusicology (CREM)
+but could be easily adapted/overrided to sue other data structures.
+
+See http://telemeta.org for more informations.
+"""
+)
--- /dev/null
+# -*- coding: utf-8 -*-
+
+"""
+Telemeta
+
+U{http://telemeta.org}
+
+@author: Guillaume Pellerin <pellerin@parisson.com>
+@author: Olivier Guilyardi <olivier@samalyse.com>
+@author: David Lipszyc <davidlipszyc@gmail.com>
+"""
+
+__docformat__ = 'epytext en'
+__version__ = '0.5.2'
+__url__ = 'http://telemeta.org'
+__copyright__ = '(C) 2007-2010 Parisson SARL and Samalyse SARL'
+__license__ = 'CeCILL-2'
+__license_long__ = """
+Copyright Parisson SARL (2010)
+
+<guillaume.<pellerin@parisson.com>
+<olivier@samalyse.com>
+
+This software is a computer program whose purpose is to backup, analyse,
+transcode and stream any audio content with its metadata.
+
+This software is governed by the CeCILL v2 license under French law and
+abiding by the rules of distribution of free software. You can use,
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info".
+
+As a counterpart to the access to the source code and rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty and the software's author, the holder of the
+economic rights, and the successive licensors have only limited
+liability.
+
+In this respect, the user's attention is drawn to the risks associated
+with loading, using, modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean that it is complicated to manipulate, and that also
+therefore means that it is reserved for developers and experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or
+data to be ensured and, more generally, to use and operate it in the
+same conditions as regards security.
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+"""
+
+from models import *
+from util import *
+
+
--- /dev/null
+from telemeta.models.media import MediaCollection, MediaItem
+from django.contrib import admin
+
+admin.site.register(MediaCollection)
+admin.site.register(MediaItem)
+
--- /dev/null
+from telemeta.backup.core import CollectionSerializer
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Author: Olivier Guilyardi <olivier@samalyse.com>
+
+import os
+import libxml2
+from xml.dom.minidom import getDOMImplementation, Node
+import shutil
+import md5
+from django.conf import settings
+from telemeta.models import MediaItem
+
+class CollectionSerializer(object):
+ """Provide backup-related features"""
+
+ def __init__(self, collection):
+ self.collection = collection
+
+ def __get_file_md5(self, path):
+ "Compute the MD5 hash of a file (Python version of md5sum)"
+ file = open(path, "rb")
+ hash = md5.new()
+ while True:
+ buffer = file.read(0x10000)
+ if len(buffer) == 0:
+ break
+ hash.update(buffer)
+ file.close()
+ return hash.hexdigest()
+
+ def __get_media_filename(self, item):
+ return item.id + ".wav"
+
+ def store(self, dest_dir):
+ """Serialize and store the collection with related items and media
+ files into a subdirectory of the provided directory
+ """
+ coll_dir = dest_dir + "/" + self.collection.id
+ os.mkdir(coll_dir)
+
+ xml = self.get_xml()
+ file = open(coll_dir + "/collection.xml", "wb")
+ file.write(xml.encode("utf-8"))
+ file.close()
+
+ if self.collection.has_mediafile():
+ md5_file = open(coll_dir + "/MD5SUM", "wb")
+
+ items = self.collection.items.all()
+ for item in items:
+ if item.file:
+ dst_basename = self.__get_media_filename(item)
+ dst = coll_dir + "/" + dst_basename
+ shutil.copyfile(item.file.path, dst)
+ hash = self.__get_file_md5(dst)
+ md5_file.write(hash + " " + dst_basename + "\n")
+
+ md5_file.close()
+
+ def get_xml(self):
+ """Return a string containing the XML representation of the collection
+ and related items
+ """
+ impl = getDOMImplementation()
+ doc = impl.createDocument(None, "telemeta", None)
+ coll_doc = self.collection.to_dom()
+ coll_node = doc.documentElement.appendChild(coll_doc.documentElement)
+ coll_doc.unlink()
+ items_node_name = MediaItem.get_dom_element_name() + "List"
+ items_node = doc.createElement(items_node_name)
+ coll_node.appendChild(items_node)
+
+ items = self.collection.items.all()
+ for item in items:
+ if item.file:
+ item.file = self.__get_media_filename(item)
+ item_doc = item.to_dom()
+ items_node.appendChild(item_doc.documentElement)
+ item_doc.unlink()
+ doc.normalize()
+
+ # libxml2 has prettier output than xml.dom:
+ tree = libxml2.parseDoc(doc.toxml(encoding="utf-8"))
+ doc.unlink()
+ xml = unicode(tree.serialize(encoding="utf-8", format=1), "utf-8")
+ tree.free()
+
+ return xml
+
+
--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Author: Olivier Guilyardi <olivier@samalyse.com>
+
+import os
+import sys
+import time
+from django.core.management import setup_environ
+
+def print_usage(toolname):
+ print "Usage: " + toolname + " <project_dir> <backup_dir>"
+ print " project_dir: the directory of the Django project which hosts Telemeta"
+ print " backup_dir: the destination backup folder (must exist)"
+
+def write_readme(dest_dir, coll_num):
+ readme = open(dest_dir + "/" + "README", "w")
+ timestr = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
+ readme.write("Telemeta Backup\n\n")
+ readme.write("- date: " + timestr + "\n")
+ readme.write("- number of collections: " + str(coll_num) + "\n\n")
+ readme.close()
+
+def backup(dest_dir):
+ from telemeta.models import MediaCollection
+ from telemeta.backup import CollectionSerializer
+
+ collections = MediaCollection.objects.order_by('id')
+ count = collections.count()
+
+ print "Writing README file..",
+ write_readme(dest_dir, count)
+ print "Done."
+
+ i = 0
+ for collection in collections:
+ if i % 100 == 0:
+ set_dir = dest_dir + ("/collections-%d-%d" % (i+1, i+100))
+ os.mkdir(set_dir)
+ i += 1
+ print "Processing collection %d/%d (%d%%) with id: %s.. " \
+ % (i, count, i*100/count, collection.id),
+ sys.stdout.flush()
+ serializer = CollectionSerializer(collection)
+ serializer.store(set_dir)
+ print "Done"
+
+def run():
+ if len(sys.argv) != 3:
+ print_usage(os.path.basename(sys.argv[0]))
+ sys.exit(1)
+ else:
+ project_dir = sys.argv[1]
+ backup_dir = sys.argv[2]
+ sys.path.append(project_dir)
+ import settings
+ setup_environ(settings)
+ backup(backup_dir)
+
+if __name__ == '__main__':
+ run()
--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2010 Guillaume Pellerin
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://svn.parisson.org/telemeta/TelemetaLicense.
+#
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+#
+
+import os
+import sys
+import csv
+import logging
+import datetime
+from django.core.management import setup_environ
+from django.core.files.base import ContentFile
+
+class Logger:
+
+ def __init__(self, file):
+ self.logger = logging.getLogger('myapp')
+ self.hdlr = logging.FileHandler(file)
+ self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
+ self.hdlr.setFormatter(self.formatter)
+ self.logger.addHandler(self.hdlr)
+ self.logger.setLevel(logging.INFO)
+
+ def write_info(self, prefix, message):
+ self.logger.info(' ' + prefix + ' : ' + message.decode('utf8'))
+
+ def write_error(self, prefix, message):
+ self.logger.error(prefix + ' : ' + message.decode('utf8'))
+
+
+class TelemetaWavImport:
+
+ def __init__(self, source_dir, log_file):
+ self.logger = Logger(log_file)
+ self.source_dir = source_dir
+ self.collections = os.listdir(self.source_dir)
+ self.buffer_size = 0x1000
+
+ def wav_import(self):
+ from telemeta.models import media
+ for collection in self.collections:
+ self.collection_name = collection.split(os.sep)[-1]
+ msg = '************************ ' + collection + ' ******************************'
+ self.logger.write_info(collection, msg[:70])
+
+ collection_files = os.listdir(self.source_dir + os.sep + collection)
+ if not collection + '.csv' in collection_files:
+ msg = 'Le fichier CSV est mal nommé ou inexistant'
+ self.logger.write_error(collection, msg)
+ else:
+ c = csv.reader(open(self.source_dir + os.sep + collection + os.sep + collection + '.csv'), delimiter=';')
+ for row in c:
+ old_ref = row[0]
+ new_ref = row[1]
+ print old_ref + ' : ' + new_ref
+ filename = new_ref + '.wav'
+ wav_file = self.source_dir + os.sep + collection + os.sep + filename
+ items = media.MediaItem.objects.filter(old_code=old_ref)
+ if len(items) != 0:
+ item = items[0]
+ print item.old_code + ' : id = ' + str(item.id) + " : title = " + item.title
+ f = open(wav_file, 'r')
+ file_content = ContentFile(f.read())
+ item.file.save(filename, file_content)
+ f.close()
+ item.code = new_ref
+ item.save()
+ else:
+ msg = old_ref + ' : item inexistant dans la base de données !'
+ print msg
+ self.logger.write_error(collection, msg)
+
+
+def print_usage(tool_name):
+ print "Usage: "+tool_name+" <project_dir> <source_dir> <log_file>"
+ print " project_dir: the directory of the Django project which hosts Telemeta"
+ print " source_dir: the directory containing the wav files to include"
+ print " log_file: the log file of the import"
+
+def run():
+ if len(sys.argv) < 4:
+ print_usage(os.path.basename(sys.argv[0]))
+ sys.exit(1)
+ else:
+ project_dir = sys.argv[-3]
+ source_dir = sys.argv[-2]
+ log_file = sys.argv[-1]
+ sys.path.append(project_dir)
+ import settings
+ setup_environ(settings)
+ t = TelemetaWavImport(source_dir, log_file)
+ t.wav_import()
+
+if __name__ == '__main__':
+ run()
--- /dev/null
+from django.conf import settings
+
+def check():
+ """Perform general configuration verifications"""
+ if not len(settings.ADMINS):
+ raise ConfigurationError("The ADMINS configuration option must be set in settings.py.")
+
+class ConfigurationError(Exception):
+ pass
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Samalyse SARL
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution.
+#
+# Author: Olivier Guilyardi <olivier@samalyse.com>
+
+__all__ = ['TelemetaError']
+
+
+class TelemetaError(Exception):
+ """Exception base class for errors in Telemeta."""
+ # FIXME: is this redundant with Django's error handling ?
+
+# def __init__(self, message, title=None, show_traceback=False):
+# Exception.__init__(self, message)
+# self.message = message
+# self.title = title
+# self.show_traceback = show_traceback
+
--- /dev/null
+/* Shamelessly stolen from trac's admin.css... */\r
+\r
+.tabs {\r
+ border: 1px solid black;\r
+ border-color: gray black black gray;\r
+ margin: 2em 0;\r
+ padding: .5em 0 0;\r
+ float: left;\r
+ width: 12em;\r
+}\r
+.tabs ul { list-style: none; margin: 0 0 .5em; padding: 0 }\r
+.tabs li { margin: 0; padding: 0.1em .5em }\r
+.tabs li li { margin: 0 -0.5em; padding-left: 1.5em }\r
+.tabs li li.active { background: #ccb; }\r
+.tabs :link, .tabs :visited { border: none; display: block }\r
+.tabs :link:hover, .tabs :visited:hover { background: transparent }\r
+\r
+.tabcontents {\r
+ padding: 0.4em 2em;\r
+ margin-left: 12em;\r
+ min-height: 300px;\r
+}\r
+p.help { color: #666; font-size: 90%; margin: 1em .5em .5em }\r
+\r
+form.addnew { clear: right; float: right; margin: -2em 0 4em; width: 33% }\r
+form.mod { margin-top: 1em; }\r
+form.mod .field { margin: .5em 0; }\r
+form .field em { color: #888; font-size: smaller }\r
+form .field .disabled em { color: #d7d7d7 }\r
+\r
+table.listing { clear: none; width: 64% }\r
+table.listing .sel, table.listing .default { text-align: center; width: 1% }\r
+\r
+\r
+\r
--- /dev/null
+.ac_results {
+ padding: 0px;
+ border: 1px solid black;
+ background-color: white;
+ overflow: hidden;
+ z-index: 99999;
+}
+
+.ac_results ul {
+ width: 100%;
+ list-style-position: outside;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.ac_results li {
+ margin: 0px;
+ padding: 2px 5px;
+ cursor: default;
+ display: block;
+ /*
+ if width will be 100% horizontal scrollbar will apear
+ when scroll mode will be used
+ */
+ /*width: 100%;*/
+ font: menu;
+ font-size: 12px;
+ /*
+ it is very important, if line-height not setted or setted
+ in relative units scroll will be broken in firefox
+ */
+ line-height: 16px;
+ overflow: hidden;
+}
+
+.ac_loading {
+ background: white url('indicator.gif') right center no-repeat;
+}
+
+.ac_odd {
+ background-color: #eee;
+}
+
+.ac_over {
+ background-color: #0A246A;
+ color: white;
+}
--- /dev/null
+.ts-skin-lab .ts-player {
+ padding: 0;
+ clear: both;
+ background: white;
+ border: solid 1px #ADADAD;
+ margin-top: 2px;
+}
+
+.ts-skin-lab .ts-player .ts-wave {
+ height: 130px;
+}
+.ts-skin-lab .ts-player .ts-wave .ts-image {
+ width: 360px;
+ height: 130px;
+ background: transparent;
+}
+
+#player_maximized .ts-player .ts-wave, #player_maximized .ts-player .ts-image {
+ height: 170px;
+}
+
+.ts-skin-lab .ts-player .ts-viewer {
+ margin: 0;
+ border: 0;
+}
+.ts-skin-lab .ts-player .ts-viewer .ts-pointer {
+ background: #BB0000;
+ color: #DDD;
+}
+.ts-skin-lab .ts-player .ts-viewer a.ts-pointer {
+ color: #BB0000;
+ background: white;
+
+}
+
+.ts-skin-lab .ts-player .ts-viewer .ts-marker {
+ background: #0C1A70;
+ color: #DDD;
+}
+.ts-skin-lab .ts-player .ts-ruler .ts-section .ts-label {
+ background: white;
+ color: #555;
+}
+
+.ts-skin-lab .ts-player .ts-ruler .ts-section .ts-lines {
+ background: #F2F2F2;
+ color: #ADADAD;
+ border-bottom: solid 1px #adadad;
+}
+
+.ts-skin-lab .ts-player .ts-control {
+ background: url('../images/player_controlbg.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback a {
+ padding: 20px 0 0 0;
+ height /**/:20px; /* for IE5/Win only */
+ margin-right: 4px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-layout {
+ margin-left: 3px;
+}
+
+#player_maximized, #player_minimized {
+ position: relative;
+}
+
+
+#player_maximized .toggle, #player_minimized .toggle {
+ position: relative;
+ display: block;
+ overflow: hidden;
+ float: right;
+ width: 18px;
+ padding: 10px 0 0 0;
+ height: 0px !important;
+ height /**/:10px; /* for IE5/Win only */
+ background-image: url('../images/maximize.gif');
+ text-decoration: none;
+ border: none;
+}
+
+#player_maximized .toggle:hover, #player_minimized .toggle:hover {
+ background-position: 0px -10px;
+}
+
+#player_maximized {
+ margin: 10px 0 15px 0;
+ display: none;
+}
--- /dev/null
+body {margin: 0; padding: 0;}\r
+a {text-decoration: none; color: #969696;}\r
+a img {border: none;}\r
+html, input, select, textarea, h1, h2, h3, h4, h5, h6 {\r
+ font-size: 100%;\r
+}\r
+body {\r
+ font: 0.8125em/1em Verdana, sans-serif;\r
+ line-height: 1.3em;\r
+ color: #333;\r
+ background: #FFF;\r
+ margin: 1.3em;\r
+}\r
+\r
+a:link, a:visited {\r
+ border-bottom:1px dotted #BBB;\r
+ color:#BB0000;\r
+ text-decoration:none;\r
+}\r
+a:link:hover, a:visited:hover {\r
+ background-color:#EEE;\r
+ color:#555;\r
+}\r
+a img { border: none; }\r
+\r
+.rst-content h1, h3 {\r
+ font-size: 1.2em;\r
+ font-weight: bold;\r
+ color: #353535;\r
+}\r
+.nett {\r
+ clear: both;\r
+ height: 5px;\r
+}\r
+\r
+.wazing {\r
+ clear: both;\r
+ position: relative;\r
+}\r
+\r
+/* Min-width */\r
+#layout {\r
+ min-width: 740px;\r
+}\r
+\r
+#content {\r
+ position: relative;\r
+}\r
+\r
+#content ul, #content ul ul, #content ol {\r
+ list-style: square;\r
+ padding: .7em;\r
+ padding-left: 2em;\r
+ font-size: 0.8em;\r
+ clear: both;\r
+}\r
+#content ul ul {\r
+ font-size: 1.1em;\r
+ padding-left: 0;\r
+}\r
+#content li {\r
+ padding: .2em;\r
+ padding-left: 0;\r
+}\r
+#content li a {\r
+ padding: .1em 0;\r
+}\r
+#header {\r
+ padding: 0.2em 0;\r
+ margin-bottom: .9em;\r
+}\r
+\r
+#logo a, #logo a:hover { border: none; background: transparent; }\r
+\r
+#submenu {\r
+ position: relative;\r
+ margin: 5px 0 0;\r
+ z-index: 10;\r
+}\r
+#submenu h3, #submenu div {\r
+ min-height: 1.6em;\r
+}\r
+#submenu h3 {\r
+ margin-right: 80px;\r
+}\r
+#submenu div {\r
+ position: absolute;\r
+ right: 0;\r
+ top: 0;\r
+}\r
+#submenu a {\r
+ height: 1.6em;\r
+ color: #4d508a;\r
+ font-size: 0.9em;\r
+ font-weight: bold;\r
+}\r
+\r
+#rightcol {\r
+ position: relative;\r
+ z-index: 1;\r
+ float: right;\r
+ width: 362px;\r
+ border: 1px dotted #999;\r
+ padding: 6px;\r
+ background-color: #eee;\r
+}\r
+#rightcol .analyzer, #rightcol .exporter {\r
+ text-align: left;\r
+ position: relative;\r
+}\r
+#rightcol form {\r
+ width: 360px;\r
+ margin-top: 5px;\r
+ background-color: #fff;\r
+ border: 1px solid #adadad;\r
+}\r
+\r
+#rightcol p {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+.exporter {\r
+ background-color: #fff;\r
+ color: #555;\r
+ border: 1px solid #adadad;\r
+ width: 301px;\r
+ padding: 2px;\r
+ height: 17px;\r
+ margin: 5px 0 0;\r
+ font-size: 1em;\r
+}\r
+\r
+.analyzer {\r
+ background-color: #fff;\r
+ color: #000;\r
+ border: 1px solid #adadad;\r
+ width: 356px;\r
+ padding: 2px;\r
+ margin: 5px 0 0;\r
+ font-size: 1em;\r
+}\r
+\r
+.analyzer-title {\r
+ background-color: #f2f2f2;\r
+ color: #000;\r
+ padding: 2px;\r
+}\r
+\r
+.analyzer-line {\r
+ background-color: #fdfdfd;\r
+ color: #000;\r
+ padding: 4px;\r
+}\r
+\r
+/* Geographic navigator */\r
+ul.continents, ul.continents ul { list-style: none; margin: 0; padding: 0;}\r
+ul.continents { margin: 1em 0; }\r
+ul.continents ul {margin-left: 0; margin-bottom: 0.9em; padding: 0 1em 1em 0;}\r
+ul.continents li.name { width: 460px; float: left; clear: left; margin-right: 30px;}\r
+ul.continents li.odd { clear: none;}\r
+ul.continents li.name b { font-size: 120%; font-weight: bold; }\r
+ul.continents ul li { display: inline; padding-right: 2em;}\r
+ul.continents ul li a { line-height: 1.8em; }\r
+\r
+/* Collection */\r
+#content .intro {\r
+ font-size: 1em;\r
+ font-weight: bold;\r
+ color: #444;\r
+ margin: 5px 0;\r
+ padding-left: 13px;\r
+ font-size: 0.8em;\r
+ background: #FFF url(indent.png) no-repeat 0 1px;\r
+}\r
+#content .intro span {\r
+ padding: 3px;\r
+\r
+}\r
+\r
+/* Forms */\r
+input, textarea, select { margin: 2px }\r
+input, select { vertical-align: middle }\r
+input[type=button], input[type=submit], input[type=reset] {\r
+ background: #f2f2f2;\r
+ color: #444;\r
+ border: 3px double #ccc;\r
+ padding: .1em .5em;\r
+ font-weight: bold;\r
+ cursor: pointer;\r
+}\r
+input[type=button]:hover, input[type=submit]:hover, input[type=reset]:hover {\r
+ background: #8D8C94;\r
+ color: #fff;\r
+}\r
+input[type=button][disabled], input[type=submit][disabled],\r
+input[type=reset][disabled] {\r
+ background: #f6f6f6;\r
+ border-style: solid;\r
+ color: #999;\r
+}\r
+input[type=text], input[type=password], input.textwidget, textarea { border: 1px solid #ccc; }\r
+input[type=text], input[type=password], input.textwidget { padding: .25em .1em }\r
+input[type=text]:focus, input[type=password]:focus, input.textwidget:focus, textarea:focus {\r
+ border-color: #aaa;\r
+}\r
+option { border-bottom: 1px dotted #d7d7d7; }\r
+fieldset { border: 1px solid #d7d7d7; padding: .5em; margin: 0 }\r
+fieldset.iefix { background: transparent; border: none; padding: 0; margin: 0 }\r
+* html fieldset.iefix { width: 98% }\r
+fieldset.iefix p { margin: 0 }\r
+legend { color: #999; padding: 0 .25em; font-size: 90%; font-weight: bold }\r
+label.disabled { color: #d7d7d7 }\r
+.buttons { margin: .5em .5em .5em 0 }\r
+.buttons form, .buttons form div { display: inline }\r
+.buttons input { margin: 1em .5em .1em 0 }\r
+.inlinebuttons input {\r
+ font-size: 70%;\r
+ border-width: 1px;\r
+ border-style: dotted;\r
+ margin: 0;\r
+ padding: 0.1em;\r
+ background: none;\r
+}\r
+\r
+/* Quick search */\r
+#quick_search {\r
+ position: absolute;\r
+ top: 2.5em;\r
+ right: 1.1em;\r
+}\r
+#quick_search form {\r
+ float: left;\r
+ margin-right: 12px;\r
+}\r
+#quick_search p {\r
+ margin-top: .3em;\r
+ clear: left;\r
+}\r
+\r
+#quick_search a {\r
+ font-size: .8em;\r
+ font-weight: bold;\r
+}\r
+\r
+#quick_search input {\r
+ vertical-align: middle;\r
+ font-size: .8em;\r
+ margin-right: 0;\r
+}\r
+#quick_search_pattern {\r
+ background: #FFF url(search_bg.png) no-repeat;\r
+ padding: .4em .1em;\r
+ padding-left: 25px;\r
+ width: 150px;\r
+ color: #555;\r
+ font-weight: bold;\r
+}\r
+\r
+/* Authentication */\r
+#auth_info {\r
+ position: absolute;\r
+ top: 0.2em;\r
+ right: 1.1em;\r
+ margin-right: 12px;\r
+ font-size: .8em;\r
+}\r
+\r
+#auth_info a {\r
+ /* font-weight: bold; */\r
+}\r
+\r
+form.login {\r
+ font-size: 0.8em;\r
+ float: left;\r
+ margin-top: 2em;\r
+ margin-bottom: 4em;\r
+ padding: .5em;\r
+ border: 1px dotted #888;\r
+}\r
+\r
+.login-error {\r
+ color: #BB0000;\r
+}\r
+\r
+form.login label {\r
+ display: block;\r
+ width: 11em;\r
+ float: left;\r
+ clear: left;\r
+ font-weight: bold;\r
+ padding-top: 0.3em;\r
+}\r
+\r
+form.login .submit {\r
+ float: right;\r
+ margin-top: 1em;\r
+}\r
+\r
+/* Search form */\r
+#searchform {\r
+ margin: 15px 0;\r
+}\r
+#searchform fieldset {\r
+ padding: 0;\r
+ padding: .5em;\r
+ width: 650px;\r
+ border: none;\r
+ border: 1px dotted #888;\r
+ margin-bottom: 1em;\r
+}\r
+#searchform p {\r
+ background-color: #fff;\r
+ padding: .5em 0;\r
+}\r
+#searchform label {\r
+ font-size: 0.8em;\r
+ display: block;\r
+ float: left;\r
+ width: 30%;\r
+ margin-left: 15px;\r
+ margin-top: .2em;\r
+ line-height: 1.8em;\r
+ font-weight: bold;\r
+ color: #333;\r
+ text-transform: uppercase;\r
+}\r
+#searchform select {\r
+ width: 59%;\r
+}\r
+#searchform fieldset input {\r
+ width: 56%;\r
+}\r
+#searchform select, #searchform fieldset input {\r
+ font-size: 0.8em;\r
+}\r
+#searchform .submit {\r
+ padding: 0;\r
+ clear: both;\r
+ width: 450px;\r
+}\r
+\r
+#searchform select.tiny {\r
+ width: 12%;\r
+}\r
+\r
+/* Navigation (borrowed from Trac) */\r
+.nav h2, .nav hr { display: none }\r
+.nav ul { font-size: 10px; list-style: none; margin: 0; text-align: left }\r
+.nav li {\r
+ border-right: 1px solid #d7d7d7;\r
+ display: inline;\r
+ padding: 0 .75em;\r
+ white-space: nowrap;\r
+}\r
+.nav li.last { border-right: 1px solid #000000; }\r
+\r
+/* Main navigation bar (borrowed from Trac) */\r
+#menu {\r
+ background: #f7f7f7 url(../images/topbar_gradient.png) 0 0;\r
+ border: 1px solid #000;\r
+ font: normal 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;\r
+ margin: .66em 0 .33em;\r
+ padding: .2em 0;\r
+}\r
+#menu li { border-right: none; padding: .25em 0 }\r
+#menu li.last { border-right: 1px solid #000 }\r
+#menu :link, #menu :visited {\r
+ background: url(../images/dots.gif) 0 0 no-repeat;\r
+ border-right: 1px solid #fff;\r
+ border-bottom: none;\r
+ border-left: 1px solid #555;\r
+ color: #000;\r
+ padding: .2em 20px;\r
+}\r
+* html #menu :link, * html #menu :visited { background-position: 1px 0 }\r
+#menu :link:hover, #menu :visited:hover {\r
+ background-color: #ccc;\r
+ border-right: 1px solid #ddd;\r
+}\r
+#menu .active :link, #menu .active :visited {\r
+ background: #333 url(../images/topbar_gradient2.png) 0 0 repeat-x;\r
+ border-top: none;\r
+ border-right: 1px solid #000;\r
+ color: #eee;\r
+ font-weight: bold;\r
+}\r
+#menu .active :link:hover, #menu .active :visited:hover {\r
+ border-right: 1px solid #000;\r
+}\r
+\r
+/* Footer (borrowed from Trac) */\r
+#footer {\r
+ clear: both;\r
+ color: #bbb;\r
+ font-size: 10px;\r
+ border-top: 1px solid;\r
+ height: 31px;\r
+ padding: .25em 0;\r
+ margin-top: 2.5em;\r
+}\r
+#footer :link, #footer :visited { color: #bbb; }\r
+#footer hr { display: none }\r
+#footer #telemeta_powered { border: 0; float: left }\r
+#footer #telemeta_powered:hover { background: transparent }\r
+#footer p { margin: 0 }\r
+#footer p.left {\r
+ float: left;\r
+ margin-left: 1em;\r
+ padding: 0 1em;\r
+ border-left: 1px solid #d7d7d7;\r
+ border-right: 1px solid #d7d7d7;\r
+}\r
+#footer p.right {\r
+ float: right;\r
+ text-align: right;\r
+}\r
+\r
+/* Homepage */\r
+.homelinks a { font-size: 120%;}\r
+\r
+\r
+/* Definition list */\r
+dl {\r
+ position: relative;\r
+ margin: .5em 0;\r
+}\r
+dl dt, dl dd {\r
+ position: relative;\r
+ margin: 0;\r
+ margin-bottom: .5em;\r
+ padding: 0;\r
+ font-size: 0.8em;\r
+ line-height: 1.4em;\r
+ min-height: 1.4em;\r
+}\r
+dl dd {\r
+ border: 1px solid transparent;\r
+}\r
+dl dt {\r
+ float: left;\r
+ clear: left;\r
+}\r
+\r
+dl.listing dt {\r
+ width: 18em;\r
+ background-color: #f9f9f9;\r
+ border: .1em solid #eee;\r
+ border-right: .3em solid #ddd;\r
+ padding-left: .3em;\r
+ margin-right: .8em;\r
+ color: #444;\r
+}\r
+dl.listing dt.group {\r
+ float: none;\r
+ margin-top: .9em;\r
+ background-color: #DDDDDD;\r
+ border-color: #ccc;\r
+ border-right: .1em solid #ccc;\r
+ width: 18.2em;\r
+}\r
+dl.listing dd {\r
+ margin-left: 19.4em;\r
+ font-weight: bold;\r
+}\r
+\r
+/* dublin core display */\r
+h4.dublincore {\r
+ text-align: left;\r
+ padding: 5px 0 10px;\r
+ font-weight: bold;\r
+ color: #666;\r
+}\r
+dl.dublincore dt {\r
+ margin-right: .8em;\r
+ width: 23em !important;\r
+ font-style: italic;\r
+}\r
+dl.dublincore dd {\r
+ margin-left: 23.4em;\r
+ font-weight: bold;\r
+}\r
+dl.dublincore dt span {\r
+ width: 13em;\r
+ display: block;\r
+ float: left;\r
+ font-style: normal;\r
+ background-color: #f9f9f9;\r
+ border: 1px solid #eee;\r
+ border-right: 3px solid #ddd;\r
+ padding-left: .3em;\r
+ margin-right: 1.2em;\r
+ color: #444;\r
+}\r
+dl.dublincore .caption {\r
+ background-color: #B8B7C1;\r
+ margin: .5em 0;\r
+ margin-top: 0;\r
+ border-bottom: 1px dotted #666;\r
+ padding-top: .4em;\r
+ padding-bottom: .4em;\r
+ padding-left: .3em;\r
+ color: #fff;\r
+ font-weight: bold;\r
+ border-right: 1px solid #fff;\r
+}\r
+dl.dublincore dt.caption span {\r
+ background-color: #B8B7C1;\r
+ border: none;\r
+ border-right: 1px solid #fff;\r
+ color: #fff;\r
+}\r
+dl.dublincore dd.caption {\r
+ padding-top: .3em;\r
+ padding-left: .4em;\r
+ margin-left: 23.4em;\r
+}\r
+\r
+/* infos item/collection */\r
+.infos, .extraInfos {\r
+ margin-bottom: 15px;\r
+}\r
+\r
+.extraInfos dl, .extraInfos table {\r
+ position: relative;\r
+}\r
+\r
+.extraInfos div {\r
+ padding: 0;\r
+ margin-bottom: 5px;\r
+}\r
+.extraInfos .nett {\r
+ position: relative;\r
+ height: 0;\r
+ margin-bottom: -5px;\r
+}\r
+.extraInfos h4 {\r
+ /* clear: both; */\r
+ font-size: 0.9em;\r
+ line-height: 1.4em;\r
+ border-bottom: 1px dotted #aaa;\r
+}\r
+.with-rightcol .extraInfos h4 {\r
+ margin-right: 395px;\r
+}\r
+\r
+.extraInfos h4 a {\r
+ position: relative;\r
+ display: block;\r
+ color: #333 !important;\r
+ text-decoration: none;\r
+ margin: 0;\r
+ background: #fff url(more.gif) no-repeat left top;\r
+ background-position: 0 -17px;\r
+ padding-bottom: 2px;\r
+ padding-left: 16px;\r
+ border-bottom: none !important;\r
+ outline: none;\r
+}\r
+.extraInfos h4 a:hover {\r
+ background-color: transparent;\r
+ border-bottom: none;\r
+ color: #555 !important;\r
+}\r
+.extraInfos .folded h4 {\r
+ border-bottom: none;\r
+}\r
+.extraInfos .folded h4 a {\r
+ background-position: 0 0px;\r
+}\r
+\r
+/* Pagination */\r
+.pagination {\r
+ margin-top: .7em;\r
+ margin-bottom: .3em;\r
+ padding: .3em 0;\r
+ font-size: .9em;\r
+ background-color: #fff;\r
+ border-bottom: 1px solid #aaa;\r
+ color: #333;\r
+ font-weight: bold;\r
+}\r
+.pagination a {\r
+ background-color: #eee;\r
+ border-bottom: none;\r
+ font-size: .9em;\r
+ padding: .3em;\r
+}\r
+\r
+/* Item instruments */\r
+div.instruments {\r
+ position: relative;\r
+ margin-left: -.7em;\r
+ margin-right: .5em;\r
+}\r
+table.instruments {\r
+ border: none;\r
+ border-collapse: separate;\r
+ /* width: 100%; */\r
+ border-spacing: .7em;\r
+}\r
+table.instruments td {\r
+ font-size: .8em;\r
+ padding: 0 .2em;\r
+}\r
+table.instruments thead td {\r
+ background-color: #F9F9F9;\r
+ border: .1em solid #E1E1E1;\r
+ border-bottom: .3em solid #E1E1E1;\r
+}\r
+table.instruments tbody td {\r
+ border-bottom: .1em solid #E1E1E1;\r
+}\r
+\r
+/* Styles for tabular listings (stolen from trac) */\r
+table.listing {\r
+ clear: both;\r
+ border-spacing: 0;\r
+}\r
+\r
+.fullpage table.listing {\r
+ width: 100%;\r
+}\r
+\r
+table.listing th {\r
+ text-align: left;\r
+ padding: 0 14em .1em 0;\r
+ font-size: 1em;\r
+}\r
+table.listing th, table.listing td {\r
+ font-size: 0.8em;\r
+ border-bottom: 1px solid #dfdfdf;\r
+}\r
+table.listing thead { background: #e8eaf0 }\r
+table.listing thead th {\r
+ font-size: 0.9em;\r
+ padding: 3px .5em 3px;\r
+}\r
+table.listing thead th :link:hover, table.listing thead th :visited:hover {\r
+ background-color: transparent;\r
+}\r
+table.listing a {\r
+ border: none;\r
+}\r
+table.listing thead th a {\r
+ padding-right: 12px;\r
+}\r
+table.listing th.asc a, table.listing th.desc a { font-weight: bold }\r
+table.listing th.asc a, table.listing th.desc a {\r
+ background-position: 100% 50%;\r
+ background-repeat: no-repeat;\r
+}\r
+table.listing th.asc a { background-image: url(../images/asc.png) }\r
+table.listing th.desc a { background-image: url(../images/desc.png) }\r
+table.listing tbody td, table.listing tbody th {\r
+ padding: .33em .5em;\r
+ vertical-align: top;\r
+ font-weight: normal;\r
+}\r
+table.listing tbody td {\r
+ font-weight: bold;\r
+}\r
+table.listing tbody td.tmp {\r
+ width: 100%;\r
+}\r
+table.listing tbody td a:hover, table.listing tbody th a:hover {\r
+ background-color: transparent;\r
+}\r
+table.listing tbody tr { border-top: 1px solid #ddd }\r
+table.listing tbody tr.even { background-color: #fcfcfc }\r
+table.listing tbody tr.odd { background-color: #f7f7f7 }\r
+table.listing tbody tr:hover { background: #f7f8fa !important }\r
+\r
+.gmap {\r
+ border: solid 1px #888;\r
+ margin-top: 0.8em;\r
+}\r
+\r
+.rst-content {\r
+}\r
+\r
+.rst-content img.align-left {\r
+ margin-right: 1em;\r
+ margin-top: 0.6ex;\r
+}\r
+\r
+.rst-content img.align-right {\r
+ margin-left: 1em;\r
+ margin-top: 0.6ex;\r
+}\r
+\r
+#content .rst-content ul, #content .rst-content ol {\r
+ clear: none;\r
+ font-size: 1em;\r
+ margin-left: 0.4em;\r
+}\r
+\r
+.module-set {\r
+ float: right;\r
+ clear: right;\r
+}\r
+\r
+.module {\r
+ border: 1px dotted #999;\r
+ background: #EEE;\r
+ padding: 1em;\r
+ margin: 0 0 1.5em 1.5em;\r
+}\r
+\r
+.module h3 {\r
+ margin-top: 0;\r
+ margin-bottom: 0.8em;\r
+ font-size: 1.1em;\r
+}\r
+\r
+a.image-link {\r
+ border: none;\r
+}\r
+\r
+.map-thumbnail {\r
+ border: solid 1px #999;\r
+}\r
+\r
+.home-content .module {\r
+ width: 338px;\r
+}\r
+\r
+.home-description {\r
+ padding-right: 370px;\r
+}\r
+\r
+#content ul.playlist {\r
+ list-style-type: none;\r
+ border-top: solid 1px #e1e1e1;\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+#content ul.playlist li {\r
+ display: block;\r
+ border: solid 1px #e1e1e1;\r
+ border-top: 0;\r
+ background: white;\r
+ margin: 0;\r
+ padding: 1em;\r
+}\r
--- /dev/null
+dl.listing, #rightcol {\r
+ margin-top: .4em;\r
+}\r
+dl.listing dd {\r
+ margin-top: .2em;\r
+}\r
+dl dd {\r
+ border-color: #fff;\r
+}\r
+dl.dublincore dd.caption {\r
+ margin-top: -.1em;\r
+}\r
+div.instruments {\r
+ margin-left: -.1em;\r
+ margin-right: .9em;\r
+}\r
+\r
--- /dev/null
+/* Min-width */\r
+#submenu h3, #submenu div {\r
+ height: 1.6em;\r
+}\r
--- /dev/null
+\r
+function foldInfoBlocks() {\r
+ var extra = $('.extraInfos');\r
+ extra.find('.folded dl, .folded table').css('display', 'none');\r
+ extra.find('a').click(function() { \r
+ $(this).parents('.extraInfos').children().toggleClass('folded').find('dl, table').toggle(100); \r
+ return false; \r
+ });\r
+}\r
+\r
+$(document).ready(function() {\r
+ foldInfoBlocks();\r
+});\r
+\r
--- /dev/null
+/*
+ * jQuery Autocomplete plugin 1.1
+ *
+ * Copyright (c) 2009 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
+ */
+
+;(function($) {
+
+$.fn.extend({
+ autocomplete: function(urlOrData, options) {
+ var isUrl = typeof urlOrData == "string";
+ options = $.extend({}, $.Autocompleter.defaults, {
+ url: isUrl ? urlOrData : null,
+ data: isUrl ? null : urlOrData,
+ delay: isUrl ? $.Autocompleter.defaults.delay : 10,
+ max: options && !options.scroll ? 10 : 150
+ }, options);
+
+ // if highlight is set to false, replace it with a do-nothing function
+ options.highlight = options.highlight || function(value) { return value; };
+
+ // if the formatMatch option is not specified, then use formatItem for backwards compatibility
+ options.formatMatch = options.formatMatch || options.formatItem;
+
+ return this.each(function() {
+ new $.Autocompleter(this, options);
+ });
+ },
+ result: function(handler) {
+ return this.bind("result", handler);
+ },
+ search: function(handler) {
+ return this.trigger("search", [handler]);
+ },
+ flushCache: function() {
+ return this.trigger("flushCache");
+ },
+ setOptions: function(options){
+ return this.trigger("setOptions", [options]);
+ },
+ unautocomplete: function() {
+ return this.trigger("unautocomplete");
+ }
+});
+
+$.Autocompleter = function(input, options) {
+
+ var KEY = {
+ UP: 38,
+ DOWN: 40,
+ DEL: 46,
+ TAB: 9,
+ RETURN: 13,
+ ESC: 27,
+ COMMA: 188,
+ PAGEUP: 33,
+ PAGEDOWN: 34,
+ BACKSPACE: 8
+ };
+
+ // Create $ object for input element
+ var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
+
+ var timeout;
+ var previousValue = "";
+ var cache = $.Autocompleter.Cache(options);
+ var hasFocus = 0;
+ var lastKeyPressCode;
+ var config = {
+ mouseDownOnSelect: false
+ };
+ var select = $.Autocompleter.Select(options, input, selectCurrent, config);
+
+ var blockSubmit;
+
+ // prevent form submit in opera when selecting with return key
+ $.browser.opera && $(input.form).bind("submit.autocomplete", function() {
+ if (blockSubmit) {
+ blockSubmit = false;
+ return false;
+ }
+ });
+
+ // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
+ $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
+ // a keypress means the input has focus
+ // avoids issue where input had focus before the autocomplete was applied
+ hasFocus = 1;
+ // track last key pressed
+ lastKeyPressCode = event.keyCode;
+ switch(event.keyCode) {
+
+ case KEY.UP:
+ event.preventDefault();
+ if ( select.visible() ) {
+ select.prev();
+ } else {
+ onChange(0, true);
+ }
+ break;
+
+ case KEY.DOWN:
+ event.preventDefault();
+ if ( select.visible() ) {
+ select.next();
+ } else {
+ onChange(0, true);
+ }
+ break;
+
+ case KEY.PAGEUP:
+ event.preventDefault();
+ if ( select.visible() ) {
+ select.pageUp();
+ } else {
+ onChange(0, true);
+ }
+ break;
+
+ case KEY.PAGEDOWN:
+ event.preventDefault();
+ if ( select.visible() ) {
+ select.pageDown();
+ } else {
+ onChange(0, true);
+ }
+ break;
+
+ // matches also semicolon
+ case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
+ case KEY.TAB:
+ case KEY.RETURN:
+ if( selectCurrent() ) {
+ // stop default to prevent a form submit, Opera needs special handling
+ event.preventDefault();
+ blockSubmit = true;
+ return false;
+ }
+ break;
+
+ case KEY.ESC:
+ select.hide();
+ break;
+
+ default:
+ clearTimeout(timeout);
+ timeout = setTimeout(onChange, options.delay);
+ break;
+ }
+ }).focus(function(){
+ // track whether the field has focus, we shouldn't process any
+ // results if the field no longer has focus
+ hasFocus++;
+ }).blur(function() {
+ hasFocus = 0;
+ if (!config.mouseDownOnSelect) {
+ hideResults();
+ }
+ }).click(function() {
+ // show select when clicking in a focused field
+ if ( hasFocus++ > 1 && !select.visible() ) {
+ onChange(0, true);
+ }
+ }).bind("search", function() {
+ // TODO why not just specifying both arguments?
+ var fn = (arguments.length > 1) ? arguments[1] : null;
+ function findValueCallback(q, data) {
+ var result;
+ if( data && data.length ) {
+ for (var i=0; i < data.length; i++) {
+ if( data[i].result.toLowerCase() == q.toLowerCase() ) {
+ result = data[i];
+ break;
+ }
+ }
+ }
+ if( typeof fn == "function" ) fn(result);
+ else $input.trigger("result", result && [result.data, result.value]);
+ }
+ $.each(trimWords($input.val()), function(i, value) {
+ request(value, findValueCallback, findValueCallback);
+ });
+ }).bind("flushCache", function() {
+ cache.flush();
+ }).bind("setOptions", function() {
+ $.extend(options, arguments[1]);
+ // if we've updated the data, repopulate
+ if ( "data" in arguments[1] )
+ cache.populate();
+ }).bind("unautocomplete", function() {
+ select.unbind();
+ $input.unbind();
+ $(input.form).unbind(".autocomplete");
+ });
+
+
+ function selectCurrent() {
+ var selected = select.selected();
+ if( !selected )
+ return false;
+
+ var v = selected.result;
+ previousValue = v;
+
+ if ( options.multiple ) {
+ var words = trimWords($input.val());
+ if ( words.length > 1 ) {
+ var seperator = options.multipleSeparator.length;
+ var cursorAt = $(input).selection().start;
+ var wordAt, progress = 0;
+ $.each(words, function(i, word) {
+ progress += word.length;
+ if (cursorAt <= progress) {
+ wordAt = i;
+ return false;
+ }
+ progress += seperator;
+ });
+ words[wordAt] = v;
+ // TODO this should set the cursor to the right position, but it gets overriden somewhere
+ //$.Autocompleter.Selection(input, progress + seperator, progress + seperator);
+ v = words.join( options.multipleSeparator );
+ }
+ v += options.multipleSeparator;
+ }
+
+ $input.val(v);
+ hideResultsNow();
+ $input.trigger("result", [selected.data, selected.value]);
+ return true;
+ }
+
+ function onChange(crap, skipPrevCheck) {
+ if( lastKeyPressCode == KEY.DEL ) {
+ select.hide();
+ return;
+ }
+
+ var currentValue = $input.val();
+
+ if ( !skipPrevCheck && currentValue == previousValue )
+ return;
+
+ previousValue = currentValue;
+
+ currentValue = lastWord(currentValue);
+ if ( currentValue.length >= options.minChars) {
+ $input.addClass(options.loadingClass);
+ if (!options.matchCase)
+ currentValue = currentValue.toLowerCase();
+ request(currentValue, receiveData, hideResultsNow);
+ } else {
+ stopLoading();
+ select.hide();
+ }
+ };
+
+ function trimWords(value) {
+ if (!value)
+ return [""];
+ if (!options.multiple)
+ return [$.trim(value)];
+ return $.map(value.split(options.multipleSeparator), function(word) {
+ return $.trim(value).length ? $.trim(word) : null;
+ });
+ }
+
+ function lastWord(value) {
+ if ( !options.multiple )
+ return value;
+ var words = trimWords(value);
+ if (words.length == 1)
+ return words[0];
+ var cursorAt = $(input).selection().start;
+ if (cursorAt == value.length) {
+ words = trimWords(value)
+ } else {
+ words = trimWords(value.replace(value.substring(cursorAt), ""));
+ }
+ return words[words.length - 1];
+ }
+
+ // fills in the input box w/the first match (assumed to be the best match)
+ // q: the term entered
+ // sValue: the first matching result
+ function autoFill(q, sValue){
+ // autofill in the complete box w/the first match as long as the user hasn't entered in more data
+ // if the last user key pressed was backspace, don't autofill
+ if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
+ // fill in the value (keep the case the user has typed)
+ $input.val($input.val() + sValue.substring(lastWord(previousValue).length));
+ // select the portion of the value not typed by the user (so the next character will erase)
+ $(input).selection(previousValue.length, previousValue.length + sValue.length);
+ }
+ };
+
+ function hideResults() {
+ clearTimeout(timeout);
+ timeout = setTimeout(hideResultsNow, 200);
+ };
+
+ function hideResultsNow() {
+ var wasVisible = select.visible();
+ select.hide();
+ clearTimeout(timeout);
+ stopLoading();
+ if (options.mustMatch) {
+ // call search and run callback
+ $input.search(
+ function (result){
+ // if no value found, clear the input box
+ if( !result ) {
+ if (options.multiple) {
+ var words = trimWords($input.val()).slice(0, -1);
+ $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
+ }
+ else {
+ $input.val( "" );
+ $input.trigger("result", null);
+ }
+ }
+ }
+ );
+ }
+ };
+
+ function receiveData(q, data) {
+ if ( data && data.length && hasFocus ) {
+ stopLoading();
+ select.display(data, q);
+ autoFill(q, data[0].value);
+ select.show();
+ } else {
+ hideResultsNow();
+ }
+ };
+
+ function request(term, success, failure) {
+ if (!options.matchCase)
+ term = term.toLowerCase();
+ var data = cache.load(term);
+ // recieve the cached data
+ if (data && data.length) {
+ success(term, data);
+ // if an AJAX url has been supplied, try loading the data now
+ } else if( (typeof options.url == "string") && (options.url.length > 0) ){
+
+ var extraParams = {
+ timestamp: +new Date()
+ };
+ $.each(options.extraParams, function(key, param) {
+ extraParams[key] = typeof param == "function" ? param() : param;
+ });
+
+ $.ajax({
+ // try to leverage ajaxQueue plugin to abort previous requests
+ mode: "abort",
+ // limit abortion to this input
+ port: "autocomplete" + input.name,
+ dataType: options.dataType,
+ url: options.url,
+ data: $.extend({
+ q: lastWord(term),
+ limit: options.max
+ }, extraParams),
+ success: function(data) {
+ var parsed = options.parse && options.parse(data) || parse(data);
+ cache.add(term, parsed);
+ success(term, parsed);
+ }
+ });
+ } else {
+ // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
+ select.emptyList();
+ failure(term);
+ }
+ };
+
+ function parse(data) {
+ var parsed = [];
+ var rows = data.split("\n");
+ for (var i=0; i < rows.length; i++) {
+ var row = $.trim(rows[i]);
+ if (row) {
+ row = row.split("|");
+ parsed[parsed.length] = {
+ data: row,
+ value: row[0],
+ result: options.formatResult && options.formatResult(row, row[0]) || row[0]
+ };
+ }
+ }
+ return parsed;
+ };
+
+ function stopLoading() {
+ $input.removeClass(options.loadingClass);
+ };
+
+};
+
+$.Autocompleter.defaults = {
+ inputClass: "ac_input",
+ resultsClass: "ac_results",
+ loadingClass: "ac_loading",
+ minChars: 1,
+ delay: 400,
+ matchCase: false,
+ matchSubset: true,
+ matchContains: false,
+ cacheLength: 10,
+ max: 100,
+ mustMatch: false,
+ extraParams: {},
+ selectFirst: true,
+ formatItem: function(row) { return row[0]; },
+ formatMatch: null,
+ autoFill: false,
+ width: 0,
+ multiple: false,
+ multipleSeparator: ", ",
+ highlight: function(value, term) {
+ return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
+ },
+ scroll: true,
+ scrollHeight: 180
+};
+
+$.Autocompleter.Cache = function(options) {
+
+ var data = {};
+ var length = 0;
+
+ function matchSubset(s, sub) {
+ if (!options.matchCase)
+ s = s.toLowerCase();
+ var i = s.indexOf(sub);
+ if (options.matchContains == "word"){
+ i = s.toLowerCase().search("\\b" + sub.toLowerCase());
+ }
+ if (i == -1) return false;
+ return i == 0 || options.matchContains;
+ };
+
+ function add(q, value) {
+ if (length > options.cacheLength){
+ flush();
+ }
+ if (!data[q]){
+ length++;
+ }
+ data[q] = value;
+ }
+
+ function populate(){
+ if( !options.data ) return false;
+ // track the matches
+ var stMatchSets = {},
+ nullData = 0;
+
+ // no url was specified, we need to adjust the cache length to make sure it fits the local data store
+ if( !options.url ) options.cacheLength = 1;
+
+ // track all options for minChars = 0
+ stMatchSets[""] = [];
+
+ // loop through the array and create a lookup structure
+ for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
+ var rawValue = options.data[i];
+ // if rawValue is a string, make an array otherwise just reference the array
+ rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
+
+ var value = options.formatMatch(rawValue, i+1, options.data.length);
+ if ( value === false )
+ continue;
+
+ var firstChar = value.charAt(0).toLowerCase();
+ // if no lookup array for this character exists, look it up now
+ if( !stMatchSets[firstChar] )
+ stMatchSets[firstChar] = [];
+
+ // if the match is a string
+ var row = {
+ value: value,
+ data: rawValue,
+ result: options.formatResult && options.formatResult(rawValue) || value
+ };
+
+ // push the current match into the set list
+ stMatchSets[firstChar].push(row);
+
+ // keep track of minChars zero items
+ if ( nullData++ < options.max ) {
+ stMatchSets[""].push(row);
+ }
+ };
+
+ // add the data items to the cache
+ $.each(stMatchSets, function(i, value) {
+ // increase the cache size
+ options.cacheLength++;
+ // add to the cache
+ add(i, value);
+ });
+ }
+
+ // populate any existing data
+ setTimeout(populate, 25);
+
+ function flush(){
+ data = {};
+ length = 0;
+ }
+
+ return {
+ flush: flush,
+ add: add,
+ populate: populate,
+ load: function(q) {
+ if (!options.cacheLength || !length)
+ return null;
+ /*
+ * if dealing w/local data and matchContains than we must make sure
+ * to loop through all the data collections looking for matches
+ */
+ if( !options.url && options.matchContains ){
+ // track all matches
+ var csub = [];
+ // loop through all the data grids for matches
+ for( var k in data ){
+ // don't search through the stMatchSets[""] (minChars: 0) cache
+ // this prevents duplicates
+ if( k.length > 0 ){
+ var c = data[k];
+ $.each(c, function(i, x) {
+ // if we've got a match, add it to the array
+ if (matchSubset(x.value, q)) {
+ csub.push(x);
+ }
+ });
+ }
+ }
+ return csub;
+ } else
+ // if the exact item exists, use it
+ if (data[q]){
+ return data[q];
+ } else
+ if (options.matchSubset) {
+ for (var i = q.length - 1; i >= options.minChars; i--) {
+ var c = data[q.substr(0, i)];
+ if (c) {
+ var csub = [];
+ $.each(c, function(i, x) {
+ if (matchSubset(x.value, q)) {
+ csub[csub.length] = x;
+ }
+ });
+ return csub;
+ }
+ }
+ }
+ return null;
+ }
+ };
+};
+
+$.Autocompleter.Select = function (options, input, select, config) {
+ var CLASSES = {
+ ACTIVE: "ac_over"
+ };
+
+ var listItems,
+ active = -1,
+ data,
+ term = "",
+ needsInit = true,
+ element,
+ list;
+
+ // Create results
+ function init() {
+ if (!needsInit)
+ return;
+ element = $("<div/>")
+ .hide()
+ .addClass(options.resultsClass)
+ .css("position", "absolute")
+ .appendTo(document.body);
+
+ list = $("<ul/>").appendTo(element).mouseover( function(event) {
+ if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
+ active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
+ $(target(event)).addClass(CLASSES.ACTIVE);
+ }
+ }).click(function(event) {
+ $(target(event)).addClass(CLASSES.ACTIVE);
+ select();
+ // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
+ input.focus();
+ return false;
+ }).mousedown(function() {
+ config.mouseDownOnSelect = true;
+ }).mouseup(function() {
+ config.mouseDownOnSelect = false;
+ });
+
+ if( options.width > 0 )
+ element.css("width", options.width);
+
+ needsInit = false;
+ }
+
+ function target(event) {
+ var element = event.target;
+ while(element && element.tagName != "LI")
+ element = element.parentNode;
+ // more fun with IE, sometimes event.target is empty, just ignore it then
+ if(!element)
+ return [];
+ return element;
+ }
+
+ function moveSelect(step) {
+ listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
+ movePosition(step);
+ var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
+ if(options.scroll) {
+ var offset = 0;
+ listItems.slice(0, active).each(function() {
+ offset += this.offsetHeight;
+ });
+ if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
+ list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
+ } else if(offset < list.scrollTop()) {
+ list.scrollTop(offset);
+ }
+ }
+ };
+
+ function movePosition(step) {
+ active += step;
+ if (active < 0) {
+ active = listItems.size() - 1;
+ } else if (active >= listItems.size()) {
+ active = 0;
+ }
+ }
+
+ function limitNumberOfItems(available) {
+ return options.max && options.max < available
+ ? options.max
+ : available;
+ }
+
+ function fillList() {
+ list.empty();
+ var max = limitNumberOfItems(data.length);
+ for (var i=0; i < max; i++) {
+ if (!data[i])
+ continue;
+ var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
+ if ( formatted === false )
+ continue;
+ var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
+ $.data(li, "ac_data", data[i]);
+ }
+ listItems = list.find("li");
+ if ( options.selectFirst ) {
+ listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
+ active = 0;
+ }
+ // apply bgiframe if available
+ if ( $.fn.bgiframe )
+ list.bgiframe();
+ }
+
+ return {
+ display: function(d, q) {
+ init();
+ data = d;
+ term = q;
+ fillList();
+ },
+ next: function() {
+ moveSelect(1);
+ },
+ prev: function() {
+ moveSelect(-1);
+ },
+ pageUp: function() {
+ if (active != 0 && active - 8 < 0) {
+ moveSelect( -active );
+ } else {
+ moveSelect(-8);
+ }
+ },
+ pageDown: function() {
+ if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
+ moveSelect( listItems.size() - 1 - active );
+ } else {
+ moveSelect(8);
+ }
+ },
+ hide: function() {
+ element && element.hide();
+ listItems && listItems.removeClass(CLASSES.ACTIVE);
+ active = -1;
+ },
+ visible : function() {
+ return element && element.is(":visible");
+ },
+ current: function() {
+ return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
+ },
+ show: function() {
+ var offset = $(input).offset();
+ element.css({
+ width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
+ top: offset.top + input.offsetHeight,
+ left: offset.left
+ }).show();
+ if(options.scroll) {
+ list.scrollTop(0);
+ list.css({
+ maxHeight: options.scrollHeight,
+ overflow: 'auto'
+ });
+
+ if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
+ var listHeight = 0;
+ listItems.each(function() {
+ listHeight += this.offsetHeight;
+ });
+ var scrollbarsVisible = listHeight > options.scrollHeight;
+ list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
+ if (!scrollbarsVisible) {
+ // IE doesn't recalculate width when scrollbar disappears
+ listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
+ }
+ }
+
+ }
+ },
+ selected: function() {
+ var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
+ return selected && selected.length && $.data(selected[0], "ac_data");
+ },
+ emptyList: function (){
+ list && list.empty();
+ },
+ unbind: function() {
+ element && element.remove();
+ }
+ };
+};
+
+$.fn.selection = function(start, end) {
+ if (start !== undefined) {
+ return this.each(function() {
+ if( this.createTextRange ){
+ var selRange = this.createTextRange();
+ if (end === undefined || start == end) {
+ selRange.move("character", start);
+ selRange.select();
+ } else {
+ selRange.collapse(true);
+ selRange.moveStart("character", start);
+ selRange.moveEnd("character", end);
+ selRange.select();
+ }
+ } else if( this.setSelectionRange ){
+ this.setSelectionRange(start, end);
+ } else if( this.selectionStart ){
+ this.selectionStart = start;
+ this.selectionEnd = end;
+ }
+ });
+ }
+ var field = this[0];
+ if ( field.createTextRange ) {
+ var range = document.selection.createRange(),
+ orig = field.value,
+ teststring = "<->",
+ textLength = range.text.length;
+ range.text = teststring;
+ var caretAt = field.value.indexOf(teststring);
+ field.value = orig;
+ this.selection(caretAt, caretAt + textLength);
+ return {
+ start: caretAt,
+ end: caretAt + textLength
+ }
+ } else if( field.selectionStart !== undefined ){
+ return {
+ start: field.selectionStart,
+ end: field.selectionEnd
+ }
+ }
+};
+
+})(jQuery);
\ No newline at end of file
--- /dev/null
+/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * $LastChangedDate: 2007-07-21 18:45:56 -0500 (Sat, 21 Jul 2007) $
+ * $Rev: 2447 $
+ *
+ * Version 2.1.1
+ */
+(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery);
\ No newline at end of file
--- /dev/null
+/*!
+ * jQuery JavaScript Library v1.4.1
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Jan 25 19:43:33 2010 -0500
+ */
+(function(z,v){function la(){if(!c.isReady){try{r.documentElement.doScroll("left")}catch(a){setTimeout(la,1);return}c.ready()}}function Ma(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var n in b)X(a,n,b[n],f,e,d);return a}if(d!==v){f=!i&&f&&c.isFunction(d);for(n=0;n<j;n++)e(a[n],b,f?d.call(a[n],n,e(a[n],b)):d,i);return a}return j?
+e(a[0],b):null}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function ma(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function na(a){var b,d=[],f=[],e=arguments,i,j,n,o,m,s,x=c.extend({},c.data(this,"events").live);if(!(a.button&&a.type==="click")){for(o in x){j=x[o];if(j.live===a.type||j.altLive&&c.inArray(a.type,j.altLive)>-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete x[o]}i=c(a.target).closest(f,
+a.currentTarget);m=0;for(s=i.length;m<s;m++)for(o in x){j=x[o];n=i[m].elem;f=null;if(i[m].selector===j.selector){if(j.live==="mouseenter"||j.live==="mouseleave")f=c(a.relatedTarget).closest(j.selector)[0];if(!f||f!==n)d.push({elem:n,fn:j})}}m=0;for(s=d.length;m<s;m++){i=d[m];a.currentTarget=i.elem;a.data=i.fn.data;if(i.fn.apply(i.elem,e)===false){b=false;break}}return b}}function oa(a,b){return"live."+(a?a+".":"")+b.replace(/\./g,"`").replace(/ /g,"&")}function pa(a){return!a||!a.parentNode||a.parentNode.nodeType===
+11}function qa(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var i in f)for(var j in f[i])c.event.add(this,i,f[i][j],f[i][j].data)}}})}function ra(a,b,d){var f,e,i;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&a[0].indexOf("<option")<0&&(c.support.checkClone||!sa.test(a[0]))){e=true;if(i=c.fragments[a[0]])if(i!==1)f=i}if(!f){b=b&&b[0]?b[0].ownerDocument||b[0]:r;f=b.createDocumentFragment();
+c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=i?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(ta.concat.apply([],ta.slice(0,b)),function(){d[this]=a});return d}function ua(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Na=z.jQuery,Oa=z.$,r=z.document,S,Pa=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Qa=/^.[^:#\[\.,]*$/,Ra=/\S/,Sa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Ta=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,O=navigator.userAgent,
+va=false,P=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,Q=Array.prototype.slice,wa=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Pa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:r;if(a=Ta.exec(a))if(c.isPlainObject(b)){a=[r.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ra([d[1]],
+[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=r.getElementById(d[2])){if(b.id!==d[2])return S.find(a);this.length=1;this[0]=b}this.context=r;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=r;a=r.getElementsByTagName(a)}else return!b||b.jquery?(b||S).find(a):c(b).find(a);else if(c.isFunction(a))return S.ready(a);if(a.selector!==v){this.selector=a.selector;this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a,
+this)},selector:"",jquery:"1.4.1",length:0,size:function(){return this.length},toArray:function(){return Q.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=0;ba.apply(this,a);return this},each:function(a,b){return c.each(this,
+a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(r,c);else P&&P.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(Q.apply(this,arguments),"slice",Q.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};
+c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,n;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(i in e){j=a[i];n=e[i];if(a!==n)if(f&&n&&(c.isPlainObject(n)||c.isArray(n))){j=j&&(c.isPlainObject(j)||c.isArray(j))?j:c.isArray(n)?[]:{};a[i]=c.extend(f,j,n)}else if(n!==v)a[i]=n}return a};c.extend({noConflict:function(a){z.$=
+Oa;if(a)z.jQuery=Na;return c},isReady:false,ready:function(){if(!c.isReady){if(!r.body)return setTimeout(c.ready,13);c.isReady=true;if(P){for(var a,b=0;a=P[b++];)a.call(r,c);P=null}c.fn.triggerHandler&&c(r).triggerHandler("ready")}},bindReady:function(){if(!va){va=true;if(r.readyState==="complete")return c.ready();if(r.addEventListener){r.addEventListener("DOMContentLoaded",L,false);z.addEventListener("load",c.ready,false)}else if(r.attachEvent){r.attachEvent("onreadystatechange",L);z.attachEvent("onload",
+c.ready);var a=false;try{a=z.frameElement==null}catch(b){}r.documentElement.doScroll&&a&&la()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,"isPrototypeOf"))return false;var b;for(b in a);return b===v||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;
+return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return z.JSON&&z.JSON.parse?z.JSON.parse(a):(new Function("return "+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Ra.test(a)){var b=r.getElementsByTagName("head")[0]||
+r.documentElement,d=r.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(r.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,i=a.length,j=i===v||c.isFunction(a);if(d)if(j)for(f in a){if(b.apply(a[f],d)===false)break}else for(;e<i;){if(b.apply(a[e++],d)===false)break}else if(j)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=
+a[0];e<i&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Sa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==
+v;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,i=a.length;e<i;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,i=0,j=a.length;i<j;i++){e=b(a[i],i,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=v}else if(b&&!c.isFunction(b)){d=b;b=v}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},
+uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});O=c.uaMatch(O);if(O.browser){c.browser[O.browser]=true;c.browser.version=O.version}if(c.browser.webkit)c.browser.safari=true;if(wa)c.inArray=function(a,b){return wa.call(b,a)};S=c(r);if(r.addEventListener)L=function(){r.removeEventListener("DOMContentLoaded",
+L,false);c.ready()};else if(r.attachEvent)L=function(){if(r.readyState==="complete"){r.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=r.documentElement,b=r.createElement("script"),d=r.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support=
+{leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:r.createElement("select").appendChild(r.createElement("option")).selected,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};
+b.type="text/javascript";try{b.appendChild(r.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,a.firstChild);if(z[f]){c.support.scriptEval=true;delete z[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function n(){c.support.noCloneEvent=false;d.detachEvent("onclick",n)});d.cloneNode(true).fireEvent("onclick")}d=r.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=r.createDocumentFragment();a.appendChild(d.firstChild);
+c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var n=r.createElement("div");n.style.width=n.style.paddingLeft="1px";r.body.appendChild(n);c.boxModel=c.support.boxModel=n.offsetWidth===2;r.body.removeChild(n).style.display="none"});a=function(n){var o=r.createElement("div");n="on"+n;var m=n in o;if(!m){o.setAttribute(n,"return;");m=typeof o[n]==="function"}return m};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props=
+{"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ua=0,xa={},Va={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var f=a[G],e=c.cache;if(!b&&!f)return null;f||(f=++Ua);if(typeof b==="object"){a[G]=f;e=e[f]=c.extend(true,
+{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Va:(e[f]={});if(d!==v){a[G]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[G]}catch(i){a.removeAttribute&&a.removeAttribute(G)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===v){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===v&&this.length)f=c.data(this[0],a);return f===v&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);
+return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===v)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||
+a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var ya=/[\n\t]/g,ca=/\s+/,Wa=/\r/g,Xa=/href|src|style/,Ya=/(button|input)/i,Za=/(button|input|object|select|textarea)/i,$a=/^(a|area)$/i,za=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=
+c(this);m.addClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className)for(var i=" "+e.className+" ",j=0,n=b.length;j<n;j++){if(i.indexOf(" "+b[j]+" ")<0)e.className+=" "+b[j]}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var m=c(this);m.removeClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string"||a===v)for(var b=(a||"").split(ca),
+d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var i=(" "+e.className+" ").replace(ya," "),j=0,n=b.length;j<n;j++)i=i.replace(" "+b[j]+" "," ");e.className=i.substring(1,i.length-1)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var i=c(this);i.toggleClass(a.call(this,e,i.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,i=0,j=c(this),n=b,o=
+a.split(ca);e=o[i++];){n=f?n:!j.hasClass(e);j[n?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(ya," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===v){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||
+{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i<d;i++){var j=e[i];if(j.selected){a=c(j).val();if(b)return a;f.push(a)}}return f}if(za.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Wa,"")}return v}var n=c.isFunction(a);return this.each(function(o){var m=c(this),s=a;if(this.nodeType===1){if(n)s=a.call(this,o,m.val());
+if(typeof s==="number")s+="";if(c.isArray(s)&&za.test(this.type))this.checked=c.inArray(m.val(),s)>=0;else if(c.nodeName(this,"select")){var x=c.makeArray(s);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),x)>=0});if(!x.length)this.selectedIndex=-1}else this.value=s}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return v;if(f&&b in c.attrFn)return c(a)[b](d);
+f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==v;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Xa.test(b);if(b in a&&f&&!i){if(e){b==="type"&&Ya.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Za.test(a.nodeName)||$a.test(a.nodeName)&&a.href?0:v;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=
+""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?v:a}return c.style(a,b,d)}});var ab=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==z&&!a.frameElement)a=z;if(!d.guid)d.guid=c.guid++;if(f!==v){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j=
+function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):v};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var n,o=0;n=b[o++];){var m=n.split(".");n=m.shift();if(o>1){d=c.proxy(d);if(f!==v)d.data=f}d.type=m.slice(0).sort().join(".");var s=e[n],x=this.special[n]||{};if(!s){s=e[n]={};if(!x.setup||x.setup.call(a,f,m,d)===false)if(a.addEventListener)a.addEventListener(n,i,false);else a.attachEvent&&a.attachEvent("on"+n,i)}if(x.add)if((m=x.add.call(a,
+d,f,m,s))&&c.isFunction(m)){m.guid=m.guid||d.guid;m.data=m.data||d.data;m.type=m.type||d.type;d=m}s[d.guid]=d;this.global[n]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===v||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);for(var n=0;i=b[n++];){var o=i.split(".");i=o.shift();var m=!o.length,s=c.map(o.slice(0).sort(),ab);s=new RegExp("(^|\\.)"+
+s.join("\\.(?:.*\\.)?")+"(\\.|$)");var x=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var A in f[i])if(m||s.test(f[i][A].type))delete f[i][A];x.remove&&x.remove.call(a,o,j);for(e in f[i])break;if(!e){if(!x.teardown||x.teardown.call(a,o)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(A=c.data(a,"handle"))A.elem=null;c.removeData(a,
+"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return v;a.result=v;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,
+b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(i){}if(!a.isPropagationStopped()&&f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){d=a.target;var j;if(!(c.nodeName(d,"a")&&e==="click")&&!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){try{if(d[e]){if(j=d["on"+e])d["on"+e]=null;this.triggered=true;d[e]()}}catch(n){}if(j)d["on"+e]=j;this.triggered=false}}},handle:function(a){var b,
+d;a=arguments[0]=c.event.fix(a||z.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==v){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||r;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=r.documentElement;d=r.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==v)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;b.liveProxy=a;c.event.add(this,b.live,na,b)},remove:function(a){if(a.length){var b=
+0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],na)}},special:{}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};
+c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y};var Aa=function(a){for(var b=
+a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ba=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ba:Aa,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ba:Aa)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return ma("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return ma("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this,
+"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var da=/textarea|input|select/i;function Ca(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ea(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Ca(d);if(a.type!=="focusout"||
+d.type!=="radio")c.data(d,"_change_data",e);if(!(f===v||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}}c.event.special.change={filters:{focusout:ea,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ea.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ea.call(this,a)},beforeactivate:function(a){a=
+a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Ca(a))}},setup:function(a,b,d){for(var f in T)c.event.add(this,f+".specialChange."+d.guid,T[f]);return da.test(this.nodeName)},remove:function(a,b){for(var d in T)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),T[d]);return da.test(this.nodeName)}};var T=c.event.special.change.filters}r.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,
+f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){e=f;f=v}var j=b==="one"?c.proxy(e,function(n){c(this).unbind(n,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a,
+b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+
+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e){var i,j=0;if(c.isFunction(f)){e=f;f=v}for(d=(d||"").split(/\s+/);(i=d[j++])!=null;){i=i==="focus"?"focusin":i==="blur"?"focusout":i==="hover"?d.push("mouseleave")&&"mouseenter":i;b==="live"?c(this.context).bind(oa(i,this.selector),{data:f,selector:this.selector,
+live:i},e):c(this.context).unbind(oa(i,this.selector),e?{guid:e.guid+this.selector+i}:null)}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});z.attachEvent&&!z.addEventListener&&z.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g){for(var h="",k,l=0;g[l];l++){k=g[l];if(k.nodeType===3||k.nodeType===4)h+=k.nodeValue;else if(k.nodeType!==8)h+=a(k.childNodes)}return h}function b(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===k){y=l[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=k;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}l[q]=y}}}function d(g,h,k,l,q,p){q=0;for(var u=l.length;q<u;q++){var t=l[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===
+k){y=l[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=k;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(o.filter(h,[t]).length>0){y=t;break}}t=t[g]}l[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,i=Object.prototype.toString,j=false,n=true;[0,0].sort(function(){n=false;return 0});var o=function(g,h,k,l){k=k||[];var q=h=h||r;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||
+typeof g!=="string")return k;for(var p=[],u,t,y,R,H=true,M=w(h),I=g;(f.exec(""),u=f.exec(I))!==null;){I=u[3];p.push(u[1]);if(u[2]){R=u[3];break}}if(p.length>1&&s.exec(g))if(p.length===2&&m.relative[p[0]])t=fa(p[0]+p[1],h);else for(t=m.relative[p[0]]?[h]:o(p.shift(),h);p.length;){g=p.shift();if(m.relative[g])g+=p.shift();t=fa(g,t)}else{if(!l&&p.length>1&&h.nodeType===9&&!M&&m.match.ID.test(p[0])&&!m.match.ID.test(p[p.length-1])){u=o.find(p.shift(),h,M);h=u.expr?o.filter(u.expr,u.set)[0]:u.set[0]}if(h){u=
+l?{expr:p.pop(),set:A(l)}:o.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=u.expr?o.filter(u.expr,u.set):u.set;if(p.length>0)y=A(t);else H=false;for(;p.length;){var D=p.pop();u=D;if(m.relative[D])u=p.pop();else D="";if(u==null)u=h;m.relative[D](y,u,M)}}else y=[]}y||(y=t);y||o.error(D||g);if(i.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))k.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&
+y[g].nodeType===1&&k.push(t[g]);else k.push.apply(k,y);else A(y,k);if(R){o(R,q,k,l);o.uniqueSort(k)}return k};o.uniqueSort=function(g){if(C){j=n;g.sort(C);if(j)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};o.matches=function(g,h){return o(g,null,null,h)};o.find=function(g,h,k){var l,q;if(!g)return[];for(var p=0,u=m.order.length;p<u;p++){var t=m.order[p];if(q=m.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");l=m.find[t](q,
+h,k);if(l!=null){g=g.replace(m.match[t],"");break}}}}l||(l=h.getElementsByTagName("*"));return{set:l,expr:g}};o.filter=function(g,h,k,l){for(var q=g,p=[],u=h,t,y,R=h&&h[0]&&w(h[0]);g&&h.length;){for(var H in m.filter)if((t=m.leftMatch[H].exec(g))!=null&&t[2]){var M=m.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(u===p)p=[];if(m.preFilter[H])if(t=m.preFilter[H](t,u,k,p,l,R)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=u[U])!=null;U++)if(D){I=M(D,t,U,u);var Da=
+l^!!I;if(k&&I!=null)if(Da)y=true;else u[U]=false;else if(Da){p.push(D);y=true}}if(I!==v){k||(u=p);g=g.replace(m.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)o.error(g);else break;q=g}return u};o.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var m=o.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*(['"]*)(.*?)\3|)\s*\]/,
+TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,h){var k=typeof h==="string",l=k&&!/\W/.test(h);k=k&&!l;if(l)h=h.toLowerCase();l=0;for(var q=g.length,
+p;l<q;l++)if(p=g[l]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[l]=k||p&&p.nodeName.toLowerCase()===h?p||false:p===h}k&&o.filter(h,g,true)},">":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var l=0,q=g.length;l<q;l++){var p=g[l];if(p){k=p.parentNode;g[l]=k.nodeName.toLowerCase()===h?k:false}}}else{l=0;for(q=g.length;l<q;l++)if(p=g[l])g[l]=k?p.parentNode:p.parentNode===h;k&&o.filter(h,g,true)}},"":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=
+h=h.toLowerCase();q=b}q("parentNode",h,l,g,p,k)},"~":function(g,h,k){var l=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,l,g,p,k)}},find:{ID:function(g,h,k){if(typeof h.getElementById!=="undefined"&&!k)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var k=[];h=h.getElementsByName(g[1]);for(var l=0,q=h.length;l<q;l++)h[l].getAttribute("name")===g[1]&&k.push(h[l]);return k.length===0?null:k}},
+TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,k,l,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var u;(u=h[p])!=null;p++)if(u)if(q^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))k||l.push(u);else if(k)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&
+"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,l,q,p){h=g[1].replace(/\\/g,"");if(!p&&m.attrMap[h])g[1]=m.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,l,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=o(g[3],null,null,h);else{g=o.filter(g[3],h,k,true^q);k||l.push.apply(l,g);return false}else if(m.match.POS.test(g[0])||m.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);
+return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!o(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===
+g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,h){return h===0},last:function(g,h,k,l){return h===l.length-1},even:function(g,h){return h%2===
+0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return h<k[3]-0},gt:function(g,h,k){return h>k[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,l){var q=h[1],p=m.filters[q];if(p)return p(g,k,h,l);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=h[3];k=0;for(l=h.length;k<l;k++)if(h[k]===g)return false;return true}else o.error("Syntax error, unrecognized expression: "+
+q)},CHILD:function(g,h){var k=h[1],l=g;switch(k){case "only":case "first":for(;l=l.previousSibling;)if(l.nodeType===1)return false;if(k==="first")return true;l=g;case "last":for(;l=l.nextSibling;)if(l.nodeType===1)return false;return true;case "nth":k=h[2];var q=h[3];if(k===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var u=0;for(l=p.firstChild;l;l=l.nextSibling)if(l.nodeType===1)l.nodeIndex=++u;p.sizcache=h}g=g.nodeIndex-q;return k===0?g===0:g%k===0&&g/k>=
+0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=m.attrHandle[k]?m.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var l=h[2];h=h[4];return g==null?l==="!=":l==="="?k===h:l==="*="?k.indexOf(h)>=0:l==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:l==="!="?k!==h:l==="^="?
+k.indexOf(h)===0:l==="$="?k.substr(k.length-h.length)===h:l==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,l){var q=m.setFilters[h[2]];if(q)return q(g,k,h,l)}}},s=m.match.POS;for(var x in m.match){m.match[x]=new RegExp(m.match[x].source+/(?![^\[]*\])(?![^\(]*\))/.source);m.leftMatch[x]=new RegExp(/(^(?:.|\r|\n)*?)/.source+m.match[x].source.replace(/\\(\d+)/g,function(g,h){return"\\"+(h-0+1)}))}var A=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};
+try{Array.prototype.slice.call(r.documentElement.childNodes,0)}catch(B){A=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,l=g.length;k<l;k++)h.push(g[k]);else for(k=0;g[k];k++)h.push(g[k]);return h}}var C;if(r.documentElement.compareDocumentPosition)C=function(g,h){if(!g.compareDocumentPosition||!h.compareDocumentPosition){if(g==h)j=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===
+h?0:1;if(g===0)j=true;return g};else if("sourceIndex"in r.documentElement)C=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)j=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)j=true;return g};else if(r.createRange)C=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)j=true;return g.ownerDocument?-1:1}var k=g.ownerDocument.createRange(),l=h.ownerDocument.createRange();k.setStart(g,0);k.setEnd(g,0);l.setStart(h,0);l.setEnd(h,0);g=k.compareBoundaryPoints(Range.START_TO_END,
+l);if(g===0)j=true;return g};(function(){var g=r.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var k=r.documentElement;k.insertBefore(g,k.firstChild);if(r.getElementById(h)){m.find.ID=function(l,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(l[1]))?q.id===l[1]||typeof q.getAttributeNode!=="undefined"&&q.getAttributeNode("id").nodeValue===l[1]?[q]:v:[]};m.filter.ID=function(l,q){var p=typeof l.getAttributeNode!=="undefined"&&l.getAttributeNode("id");
+return l.nodeType===1&&p&&p.nodeValue===q}}k.removeChild(g);k=g=null})();(function(){var g=r.createElement("div");g.appendChild(r.createComment(""));if(g.getElementsByTagName("*").length>0)m.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var l=0;k[l];l++)k[l].nodeType===1&&h.push(k[l]);k=h}return k};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")m.attrHandle.href=function(h){return h.getAttribute("href",
+2)};g=null})();r.querySelectorAll&&function(){var g=o,h=r.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){o=function(l,q,p,u){q=q||r;if(!u&&q.nodeType===9&&!w(q))try{return A(q.querySelectorAll(l),p)}catch(t){}return g(l,q,p,u)};for(var k in g)o[k]=g[k];h=null}}();(function(){var g=r.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===
+0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){m.order.splice(1,0,"CLASS");m.find.CLASS=function(h,k,l){if(typeof k.getElementsByClassName!=="undefined"&&!l)return k.getElementsByClassName(h[1])};g=null}}})();var E=r.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,h){return g!==h&&(g.contains?g.contains(h):true)},w=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},fa=function(g,h){var k=[],
+l="",q;for(h=h.nodeType?[h]:h;q=m.match.PSEUDO.exec(g);){l+=q[0];g=g.replace(m.match.PSEUDO,"")}g=m.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)o(g,h[q],k);return o.filter(l,k)};c.find=o;c.expr=o.selectors;c.expr[":"]=c.expr.filters;c.unique=o.uniqueSort;c.getText=a;c.isXMLDoc=w;c.contains=E})();var bb=/Until$/,cb=/^(?:parents|prevUntil|prevAll)/,db=/,/;Q=Array.prototype.slice;var Ea=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,i){return!!b.call(e,i,e)===d});else if(b.nodeType)return c.grep(a,
+function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Qa.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;c.find(a,this[f],b);if(f>0)for(var i=d;i<b.length;i++)for(var j=0;j<d;j++)if(b[j]===b[i]){b.splice(i--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=
+0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ea(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ea(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i={},j;if(f&&a.length){e=0;for(var n=a.length;e<n;e++){j=a[e];i[j]||(i[j]=c.expr.match.POS.test(j)?c(j,b||this.context):j)}for(;f&&f.ownerDocument&&f!==b;){for(j in i){e=i[j];if(e.jquery?e.index(f)>
+-1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var o=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(m,s){for(;s&&s.ownerDocument&&s!==b;){if(o?o.index(s)>-1:c(s).is(a))return s;s=s.parentNode}return null})},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),
+a);return this.pushStack(pa(a[0])||pa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},
+nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);bb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):
+e;if((this.length>1||db.test(f))&&cb.test(a))e=e.reverse();return this.pushStack(e,a,Q.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===v||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==
+b&&d.push(a);return d}});var Fa=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ga=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/<tbody/i,gb=/<|&\w+;/,sa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ia=function(a,b,d){return eb.test(d)?a:b+"></"+d+">"},F={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></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==v)return this.empty().append((this[0]&&this[0].ownerDocument||r).createTextNode(a));return c.getText(this)},
+wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?
+d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,
+false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&
+!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Fa,"").replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){qa(this,b);qa(this.find("*"),b.find("*"))}return b},html:function(a){if(a===v)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Fa,""):null;else if(typeof a==="string"&&!/<script/i.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(Ha.exec(a)||
+["",""])[1].toLowerCase()]){a=a.replace(Ga,Ia);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var i=c(this),j=i.html();i.empty().append(function(){return a.call(this,e,j)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,
+b,f))});else a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(s){return c.nodeName(s,"table")?s.getElementsByTagName("tbody")[0]||s.appendChild(s.ownerDocument.createElement("tbody")):s}var e,i,j=a[0],n=[];if(!c.support.checkClone&&arguments.length===3&&typeof j===
+"string"&&sa.test(j))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(j))return this.each(function(s){var x=c(this);a[0]=j.call(this,s,b?x.html():v);x.domManip(a,b,d)});if(this[0]){e=a[0]&&a[0].parentNode&&a[0].parentNode.nodeType===11?{fragment:a[0].parentNode}:ra(a,this,n);if(i=e.fragment.firstChild){b=b&&c.nodeName(i,"tr");for(var o=0,m=this.length;o<m;o++)d.call(b?f(this[o],i):this[o],e.cacheable||this.length>1||o>0?e.fragment.cloneNode(true):e.fragment)}n&&c.each(n,
+Ma)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);for(var e=0,i=d.length;e<i;e++){var j=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),j);f=f.concat(j)}return this.pushStack(f,a,d.selector)}});c.each({remove:function(a,b){if(!a||c.filter(a,[this]).length){if(!b&&this.nodeType===1){c.cleanData(this.getElementsByTagName("*"));c.cleanData([this])}this.parentNode&&
+this.parentNode.removeChild(this)}},empty:function(){for(this.nodeType===1&&c.cleanData(this.getElementsByTagName("*"));this.firstChild;)this.removeChild(this.firstChild)}},function(a,b){c.fn[a]=function(){return this.each(b,arguments)}});c.extend({clean:function(a,b,d,f){b=b||r;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||r;var e=[];c.each(a,function(i,j){if(typeof j==="number")j+="";if(j){if(typeof j==="string"&&!gb.test(j))j=b.createTextNode(j);else if(typeof j===
+"string"){j=j.replace(Ga,Ia);var n=(Ha.exec(j)||["",""])[1].toLowerCase(),o=F[n]||F._default,m=o[0];i=b.createElement("div");for(i.innerHTML=o[1]+j+o[2];m--;)i=i.lastChild;if(!c.support.tbody){m=fb.test(j);n=n==="table"&&!m?i.firstChild&&i.firstChild.childNodes:o[1]==="<table>"&&!m?i.childNodes:[];for(o=n.length-1;o>=0;--o)c.nodeName(n[o],"tbody")&&!n[o].childNodes.length&&n[o].parentNode.removeChild(n[o])}!c.support.leadingWhitespace&&V.test(j)&&i.insertBefore(b.createTextNode(V.exec(j)[0]),i.firstChild);
+j=c.makeArray(i.childNodes)}if(j.nodeType)e.push(j);else e=c.merge(e,j)}});if(d)for(a=0;e[a];a++)if(f&&c.nodeName(e[a],"script")&&(!e[a].type||e[a].type.toLowerCase()==="text/javascript"))f.push(e[a].parentNode?e[a].parentNode.removeChild(e[a]):e[a]);else{e[a].nodeType===1&&e.splice.apply(e,[a+1,0].concat(c.makeArray(e[a].getElementsByTagName("script"))));d.appendChild(e[a])}return e},cleanData:function(a){for(var b=0,d;(d=a[b])!=null;b++){c.event.remove(d);c.removeData(d)}}});var hb=/z-?index|font-?weight|opacity|zoom|line-?height/i,
+Ja=/alpha\([^)]*\)/,Ka=/opacity=([^)]*)/,ga=/float/i,ha=/-([a-z])/ig,ib=/([A-Z])/g,jb=/^-?\d+(?:px)?$/i,kb=/^-?\d/,lb={position:"absolute",visibility:"hidden",display:"block"},mb=["Left","Right"],nb=["Top","Bottom"],ob=r.defaultView&&r.defaultView.getComputedStyle,La=c.support.cssFloat?"cssFloat":"styleFloat",ia=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===v)return c.curCSS(d,f);if(typeof e==="number"&&!hb.test(f))e+="px";c.style(d,f,e)})};
+c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return v;if((b==="width"||b==="height")&&parseFloat(d)<0)d=v;var f=a.style||a,e=d!==v;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=Ja.test(a)?a.replace(Ja,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Ka.exec(f.filter)[1])/100+"":""}if(ga.test(b))b=La;b=b.replace(ha,ia);if(e)f[b]=d;return f[b]},css:function(a,
+b,d,f){if(b==="width"||b==="height"){var e,i=b==="width"?mb:nb;function j(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(i,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,"border"+this+"Width",true))||0})}a.offsetWidth!==0?j():c.swap(a,lb,j);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&
+a.currentStyle){f=Ka.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ga.test(b))b=La;if(!d&&e&&e[b])f=e[b];else if(ob){if(ga.test(b))b="float";b=b.replace(ib,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ha,ia);f=a.currentStyle[b]||a.currentStyle[d];if(!jb.test(f)&&kb.test(f)){b=e.left;var i=a.runtimeStyle.left;a.runtimeStyle.left=
+a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=i}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var pb=
+J(),qb=/<script(.|\s)*?\/script>/gi,rb=/select|textarea/i,sb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ja=/\?/,tb=/(\?|&)_=.*?(&|$)/,ub=/^(\w+:)?\/\/([^\/?#]+)/,vb=/%20/g;c.fn.extend({_load:c.fn.load,load:function(a,b,d){if(typeof a!=="string")return this._load(a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=
+c.param(b,c.ajaxSettings.traditional);f="POST"}var i=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(j,n){if(n==="success"||n==="notmodified")i.html(e?c("<div />").append(j.responseText.replace(qb,"")).find(e):j.responseText);d&&i.each(d,[j.responseText,n,j])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&
+(this.checked||rb.test(this.nodeName)||sb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,
+b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:z.XMLHttpRequest&&(z.location.protocol!=="file:"||!z.ActiveXObject)?function(){return new z.XMLHttpRequest}:
+function(){try{return new z.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&e.success.call(o,n,j,w);e.global&&f("ajaxSuccess",[w,e])}function d(){e.complete&&e.complete.call(o,w,j);e.global&&f("ajaxComplete",[w,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}
+function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),i,j,n,o=a&&a.context||e,m=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(m==="GET")N.test(e.url)||(e.url+=(ja.test(e.url)?"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||
+N.test(e.url))){i=e.jsonpCallback||"jsonp"+pb++;if(e.data)e.data=(e.data+"").replace(N,"="+i+"$1");e.url=e.url.replace(N,"="+i+"$1");e.dataType="script";z[i]=z[i]||function(q){n=q;b();d();z[i]=v;try{delete z[i]}catch(p){}A&&A.removeChild(B)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===false&&m==="GET"){var s=J(),x=e.url.replace(tb,"$1_="+s+"$2");e.url=x+(x===e.url?(ja.test(e.url)?"&":"?")+"_="+s:"")}if(e.data&&m==="GET")e.url+=(ja.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&
+c.event.trigger("ajaxStart");s=(s=ub.exec(e.url))&&(s[1]&&s[1]!==location.protocol||s[2]!==location.host);if(e.dataType==="script"&&m==="GET"&&s){var A=r.getElementsByTagName("head")[0]||r.documentElement,B=r.createElement("script");B.src=e.url;if(e.scriptCharset)B.charset=e.scriptCharset;if(!i){var C=false;B.onload=B.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;b();d();B.onload=B.onreadystatechange=null;A&&B.parentNode&&
+A.removeChild(B)}}}A.insertBefore(B,A.firstChild);return v}var E=false,w=e.xhr();if(w){e.username?w.open(m,e.url,e.async,e.username,e.password):w.open(m,e.url,e.async);try{if(e.data||a&&a.contentType)w.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[e.url]);c.etag[e.url]&&w.setRequestHeader("If-None-Match",c.etag[e.url])}s||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",
+e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(fa){}if(e.beforeSend&&e.beforeSend.call(o,w,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");w.abort();return false}e.global&&f("ajaxSend",[w,e]);var g=w.onreadystatechange=function(q){if(!w||w.readyState===0||q==="abort"){E||d();E=true;if(w)w.onreadystatechange=c.noop}else if(!E&&w&&(w.readyState===4||q==="timeout")){E=true;w.onreadystatechange=c.noop;j=q==="timeout"?"timeout":!c.httpSuccess(w)?
+"error":e.ifModified&&c.httpNotModified(w,e.url)?"notmodified":"success";var p;if(j==="success")try{n=c.httpData(w,e.dataType,e)}catch(u){j="parsererror";p=u}if(j==="success"||j==="notmodified")i||b();else c.handleError(e,w,j,p);d();q==="timeout"&&w.abort();if(e.async)w=null}};try{var h=w.abort;w.abort=function(){w&&h.call(w);g("abort")}}catch(k){}e.async&&e.timeout>0&&setTimeout(function(){w&&!E&&g("timeout")},e.timeout);try{w.send(m==="POST"||m==="PUT"||m==="DELETE"?e.data:null)}catch(l){c.handleError(e,
+w,null,l);d()}e.async||g();return w}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=
+f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(j,n){if(c.isArray(n))c.each(n,
+function(o,m){b?f(j,m):d(j+"["+(typeof m==="object"||c.isArray(m)?o:"")+"]",m)});else!b&&n!=null&&typeof n==="object"?c.each(n,function(o,m){d(j+"["+o+"]",m)}):f(j,n)}function f(j,n){n=c.isFunction(n)?n():n;e[e.length]=encodeURIComponent(j)+"="+encodeURIComponent(n)}var e=[];if(b===v)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var i in a)d(i,a[i]);return e.join("&").replace(vb,"+")}});var ka={},wb=/toggle|show|hide/,xb=/^([+-]=)?([\d+-.]+)(.*)$/,
+W,ta=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(ka[d])f=ka[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();
+ka[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&
+c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var i=c.extend({},e),j,n=this.nodeType===1&&c(this).is(":hidden"),
+o=this;for(j in a){var m=j.replace(ha,ia);if(j!==m){a[m]=a[j];delete a[j];j=m}if(a[j]==="hide"&&n||a[j]==="show"&&!n)return i.complete.call(this);if((j==="height"||j==="width")&&this.style){i.display=c.css(this,"display");i.overflow=this.style.overflow}if(c.isArray(a[j])){(i.specialEasing=i.specialEasing||{})[j]=a[j][1];a[j]=a[j][0]}}if(i.overflow!=null)this.style.overflow="hidden";i.curAnim=c.extend({},a);c.each(a,function(s,x){var A=new c.fx(o,i,s);if(wb.test(x))A[x==="toggle"?n?"show":"hide":x](a);
+else{var B=xb.exec(x),C=A.cur(true)||0;if(B){x=parseFloat(B[2]);var E=B[3]||"px";if(E!=="px"){o.style[s]=(x||1)+E;C=(x||1)/A.cur(true)*C;o.style[s]=C+E}if(B[1])x=(B[1]==="-="?-1:1)*x+C;A.custom(C,x,E)}else A.custom(C,x,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",
+1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration==="number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,
+b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==
+null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(i){return e.step(i)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===
+"width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=
+this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=
+c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=
+null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in r.documentElement?function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),
+f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=
+b,e=b.ownerDocument,i,j=e.documentElement,n=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var o=b.offsetTop,m=b.offsetLeft;(b=b.parentNode)&&b!==n&&b!==j;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;i=e?e.getComputedStyle(b,null):b.currentStyle;o-=b.scrollTop;m-=b.scrollLeft;if(b===d){o+=b.offsetTop;m+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){o+=parseFloat(i.borderTopWidth)||
+0;m+=parseFloat(i.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&i.overflow!=="visible"){o+=parseFloat(i.borderTopWidth)||0;m+=parseFloat(i.borderLeftWidth)||0}f=i}if(f.position==="relative"||f.position==="static"){o+=n.offsetTop;m+=n.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){o+=Math.max(j.scrollTop,n.scrollTop);m+=Math.max(j.scrollLeft,n.scrollLeft)}return{top:o,left:m}};c.offset={initialize:function(){var a=r.body,b=r.createElement("div"),
+d,f,e,i=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);
+d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i;a.removeChild(b);c.offset.initialize=c.noop},
+bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),i=parseInt(c.curCSS(a,"top",true),10)||0,j=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,d,e);d={top:b.top-e.top+i,left:b.left-
+e.left+j};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=
+this.offsetParent||r.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],i;if(!e)return null;if(f!==v)return this.each(function(){if(i=ua(this))i.scrollTo(!a?f:c(i).scrollLeft(),a?f:c(i).scrollTop());else this[d]=f});else return(i=ua(e))?"pageXOffset"in i?i[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&i.document.documentElement[d]||i.document.body[d]:e[d]}});
+c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(i){var j=c(this);j[d](f.call(this,i,j[d]()))});return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||
+e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===v?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});z.jQuery=z.$=c})(window);
--- /dev/null
+function choix(formulaire)
+ {
+ var j;
+ var i = formulaire.department.selectedIndex;
+ if (i == 0)
+ for(j = 1; j < '+ str(self.len_departments) + '; j++)
+ formulaire.conference.options[j].text="";
+ else{
+ switch (i){
+ for k in range(0, self.len_departments):
+ department = self.departments[k]
+ conferences = department['conferences']
+ #print conferences
+ conferences_t = dict2tuple(conferences)
+ #print conferences
+ conferences = '"'+'","'.join(conferences_t)+'"'
+ case '+str(k+1)+' : var text = new Array('+conferences+');
+ break;
+ }
+ for(j = 0; j<'+str(self.conference_nb_max)+'; j++)
+ formulaire.conference.options[j+1].text=text[j];
+ formulaire.conference.options[j+1].value=text[j];
+ }
+formulaire.conference.selectedIndex=0;}
--- /dev/null
+var sound = null;
+var soundUrl = null;
+var soundEngineReady = false;
+var map;
+var provider;
+var player;
+var player_image_url = null;
+
+function togglePlayerMaximization() {
+ var view = $('#player');
+ $('#player_maximized, #player_minimized').css('display', 'none');
+ var ctr;
+ if (view.parents('#player_maximized').length) {
+ ctr = $('#player_minimized').append(view);
+ } else {
+ ctr = $('#player_maximized').append(view);
+ }
+ ctr.css({opacity: 0, display: 'block'});
+ if (player)
+ player.resize();
+ ctr.animate({opacity: 1}, 100);
+}
+
+function load_sound() {
+ if (!sound && soundUrl && soundEngineReady) {
+ sound = soundManager.createSound({
+ id: 'sound',
+ url: soundUrl
+ });
+
+ TimeSide.load(function() {
+ provider.setSource(sound);
+ });
+ // sound.load(); // Auto-loading overloads the Django test server
+ }
+}
+
+function change_visualizer() {
+ set_player_image_url($('#visualizer_id').get(0).value);
+ if (player)
+ player.refreshImage();
+ return false;
+}
+
+function load_player(duration) {
+ $(document).ready(function () {
+ if (!$('#player').length)
+ return;
+
+ soundUrl = $('.ts-wave a').attr('href');
+
+ $('.ts-wave a img').insertAfter('.ts-wave a');
+ $('.ts-wave a').remove();
+
+ TimeSide.load(function() {
+ map = new TimeSide.MarkerMap();
+ provider = new TimeSide.SoundProvider({duration: duration});
+ player = new TimeSide.Player('#player', {
+ image: get_player_image_src
+ });
+ controller = new TimeSide.Controller({
+ player: player,
+ soundProvider: provider,
+ map: map
+ });
+ change_visualizer();
+ player.resize();
+ });
+
+ $('#visualizer_id').change(change_visualizer);
+ $('#visualizer_id_form').submit(change_visualizer);
+
+ $('#player_maximized .toggle, #player_minimized .toggle').click(function() {
+ togglePlayerMaximization();
+ this.blur();
+ return false;
+ });
+
+ load_sound();
+ });
+
+ soundManager.onload = function() {
+ soundEngineReady = true;
+ load_sound();
+ }
+
+}
+
+function set_player_image_url(str) {
+ player_image_url = str;
+}
+
+function get_player_image_src(width, height) {
+ var src = null;
+ if (player_image_url && (width || height)) {
+ src = player_image_url.replace('WIDTH', width + '').replace('HEIGHT', height + '');
+ }
+ return src;
+}
+
+
+
--- /dev/null
+function ResourceMap(list, cfg) {
+ var that = this;
+ that.list = null;
+ that.container = null;
+ that.map = null;
+
+ that.init = function(list, cfg) {
+ that.cfg = cfg;
+ $(document).ready(function() {
+ that.log("init");
+ that.list = $(list);
+ that.container = $('<div/>').addClass('gmap').css({'width': '100%', 'height': 300});
+ that.list.css('display', 'none').after(that.container);
+ var resizeTimer = null;
+ $(window).resize(function() {
+ if (resizeTimer)
+ clearTimeout(resizeTimer);
+ resizeTimer = setTimeout(that.resize, 100);
+ });
+ that.resize();
+ });
+ google.load('maps', '2');
+ google.setOnLoadCallback(function() {
+ that.createMap();
+ that.parseResources();
+ $(window).bind('unload', google.maps.Unload);
+ });
+ }
+
+ that.resize = function() {
+ if (that.container.css('display') == 'block') {
+ newHeight = that.container.height() + $(window).height() - $("#layout").height() + $('#footer').height();
+ if (newHeight < 300)
+ newHeight = 300;
+ if (newHeight != that.container.height()) {
+ that.container.height(newHeight);
+ if (that.map) {
+ that.map.checkResize();
+ }
+ }
+
+ }
+ }
+
+ that.toggle = function(force) {
+ force = typeof(force) == "undefined" ? null : force;
+ if (force == 'list' || (!force && that.list.css('display') == 'none')) {
+ that.container.css('display', 'none');
+ that.list.css('display', 'block');
+ } else {
+ that.container.css('display', 'block');
+ that.list.css('display', 'none');
+ that.resize();
+ }
+ }
+
+ that.log = function(msg) {
+ if (typeof(console) != "undefined" && typeof(console.log) != undefined) {
+ console.log(msg);
+ }
+ }
+
+ that.makeInfoBox = function(name, link, linktitle) {
+ var info = $('<div/>').addClass('resourcemap-info');
+ info.append($('<h2/>').text(name));
+ info.append($('<a/>').attr('href', link).text(linktitle));
+ return info.wrap('<div/>').parent().html();
+ }
+
+ that.showResourceInfo = function(marker, resourceElement) {
+ var info = $('<div/>').addClass('resourcemap-info');
+ marker.openInfoWindowHtml(info.get(0));
+ var re = /^resource-/;
+ var id = resourceElement.attr('id').replace(re, '');
+ var uri = that.cfg.countryInfoUri.replace('RESOURCEID', id);
+
+ $.get(uri, function(data) {
+ info.html(data);
+ //marker.openInfoWindowHtml(info.get(0));
+ });
+ }
+
+ that.parseResources = function() {
+ $('.resourcemap-element').each(function(i, e) {
+ e = $(e)
+ var input = e.find('.resourcemap-lat');
+ if (input.length) {
+ var lat = parseFloat(input.attr('value'));
+ var lng = parseFloat(e.find('.resourcemap-lng').attr('value'));
+ //var name = $.trim(e.find('.resourcemap-name').text());
+ //var link = e.find('a').attr('href');
+ //var linktitle = e.find('a').attr('title');
+ var marker = new google.maps.Marker(new GLatLng(lat, lng), {title: name});
+ //var info = that.makeInfoBox(name, link, linktitle);
+ google.maps.Event.addListener(marker, "click", function() {
+ that.showResourceInfo(marker, e);
+ //marker.openInfoWindowHtml(info);
+ });
+ that.map.addOverlay(marker);
+ }
+ });
+ }
+
+ that.createMap = function() {
+ that.log("GMap loaded");
+ if (google.maps.BrowserIsCompatible()) {
+ that.map = new google.maps.Map2(that.container[0]);
+ var bounds = new GLatLngBounds();
+ that.map.setCenter(new GLatLng(0, 0), that.map.getBoundsZoomLevel(bounds)); // France
+ that.map.setUIToDefault();
+ } else {
+ that.log("Browser isn't compatible with GMap ?!");
+ that.toggle();
+ }
+ }
+
+ that.init(list, cfg);
+}
--- /dev/null
+/*!\r
+ SoundManager 2: Javascript Sound for the Web\r
+ --------------------------------------------\r
+ http://schillmania.com/projects/soundmanager2/\r
+\r
+ Copyright (c) 2008, Scott Schiller. All rights reserved.\r
+ Code licensed under the BSD License:\r
+ http://schillmania.com/projects/soundmanager2/license.txt\r
+\r
+ V2.90a.20081028\r
+*/\r
+\r
+function SoundManager(smURL,smID) {\r
+ \r
+ this.flashVersion = 8; // version of flash to require, either 8 or 9. Some API features require Flash 9.\r
+ this.debugMode = true; // enable debugging output (div#soundmanager-debug, OR console if available + configured)\r
+ this.useConsole = true; // use firebug/safari console.log()-type debug console if available\r
+ this.consoleOnly = false; // if console is being used, do not create/write to #soundmanager-debug\r
+ this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r
+ this.nullURL = 'null.mp3'; // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only)\r
+ this.allowPolling = true; // allow flash to poll for status update (required for "while playing", peak, sound spectrum functions to work.)\r
+ this.useMovieStar = false; // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio + video formats (AAC, M4V, FLV, MOV etc.)\r
+ this.useHighPerformance = true; // flash positioning trick, improves JS/flash callback speed, minimizes delay\r
+ this.bgColor = '#ffffff'; // movie (.swf) background color, useful if showing on-screen for video etc.\r
+\r
+ this.defaultOptions = {\r
+ 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r
+ 'stream': true, // allows playing before entire file has loaded (recommended)\r
+ 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true)\r
+ 'onid3': null, // callback function for "ID3 data is added/available"\r
+ 'onload': null, // callback function for "load finished"\r
+ 'whileloading': null, // callback function for "download progress update" (X of Y bytes received)\r
+ 'onplay': null, // callback for "play" start\r
+ 'onpause': null, // callback for "pause"\r
+ 'onresume': null, // callback for "resume" (pause toggle)\r
+ 'whileplaying': null, // callback during play (position update)\r
+ 'onstop': null, // callback for "user stop"\r
+ 'onfinish': null, // callback function for "sound finished playing"\r
+ 'onbeforefinish': null, // callback for "before sound finished playing (at [time])"\r
+ 'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second)\r
+ 'onbeforefinishcomplete':null, // function to call when said sound finishes playing\r
+ 'onjustbeforefinish':null, // callback for [n] msec before end of current sound\r
+ 'onjustbeforefinishtime':200, // [n] - if not using, set to 0 (or null handler) and event will not fire.\r
+ 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r
+ 'position': null, // offset (milliseconds) to seek to within loaded sound data.\r
+ 'pan': 0, // "pan" settings, left-to-right, -100 to 100\r
+ 'volume': 100 // self-explanatory. 0-100, the latter being the max.\r
+ };\r
+\r
+ this.flash9Options = { // flash 9-only options, merged into defaultOptions if flash 9 is being used\r
+ 'isMovieStar': null, // "MovieStar" MPEG4 audio/video mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r
+ 'usePeakData': false, // enable left/right channel peak (level) data\r
+ 'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire.\r
+ 'useEQData': false // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.\r
+ };\r
+\r
+ this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio/video options, merged into defaultOptions if flash 9 + movieStar mode is enabled\r
+ 'onmetadata': null, // callback for when video width/height etc. are received\r
+ 'useVideo': false // if loading movieStar content, whether to show video\r
+ }\r
+\r
+ this.flashBlockHelper = {\r
+ 'enabled': false, // experimental, removed with >v2.80\r
+ 'message': [] // "nag bar" to show when messaging the user, if SM2 fails on firefox etc.\r
+ };\r
+\r
+ var _s = this; \r
+ this.version = null;\r
+ this.versionNumber = 'V2.90a.20081028';\r
+ this.movieURL = null;\r
+ this.url = null;\r
+ this.altURL = null;\r
+ this.swfLoaded = false;\r
+ this.enabled = false;\r
+ this.o = null;\r
+ this.id = (smID||'sm2movie');\r
+ this.oMC = null;\r
+ this.sounds = [];\r
+ this.soundIDs = [];\r
+ this.muted = false;\r
+ this.isIE = (navigator.userAgent.match(/MSIE/i));\r
+ this.isSafari = (navigator.userAgent.match(/safari/i));\r
+ this.isGecko = (navigator.userAgent.match(/gecko/i));\r
+ this.debugID = 'soundmanager-debug';\r
+ this._debugOpen = true;\r
+ this._didAppend = false;\r
+ this._appendSuccess = false;\r
+ this._didInit = false;\r
+ this._disabled = false;\r
+ this._windowLoaded = false;\r
+ this._hasConsole = (typeof console != 'undefined' && typeof console.log != 'undefined');\r
+ this._debugLevels = ['log','info','warn','error'];\r
+ this._defaultFlashVersion = 8;\r
+ this.filePatterns = {\r
+ flash8: /\.(mp3)/i,\r
+ flash9: /\.(mp3)/i\r
+ };\r
+ this.netStreamTypes = ['aac','flv','mov','mp4','m4v','f4v','m4a','mp4v','3gp','3g2']; // Flash v9.0r115+ "moviestar" formats\r
+ this.netStreamPattern = new RegExp('.('+this.netStreamTypes.join('|')+')','i');\r
+ this.filePattern = null;\r
+ this.features = {\r
+ peakData: false,\r
+ waveformData: false,\r
+ eqData: false\r
+ };\r
+\r
+ this.sandbox = {\r
+ 'type': null,\r
+ 'types': {\r
+ 'remote': 'remote (domain-based) rules',\r
+ 'localWithFile': 'local with file access (no internet access)',\r
+ 'localWithNetwork': 'local with network (internet access only, no local access)',\r
+ 'localTrusted': 'local, trusted (local + internet access)'\r
+ },\r
+ 'description': null,\r
+ 'noRemote': null,\r
+ 'noLocal': null\r
+ };\r
+\r
+ this._setVersionInfo = function() {\r
+ if (_s.flashVersion != 8 && _s.flashVersion != 9) {\r
+ alert('soundManager.flashVersion must be 8 or 9. "'+_s.flashVersion+'" is invalid. Reverting to '+_s._defaultFlashVersion+'.');\r
+ _s.flashVersion = _s._defaultFlashVersion;\r
+ }\r
+ _s.version = _s.versionNumber+(_s.flashVersion==9?' (AS3/Flash 9)':' (AS2/Flash 8)');\r
+ // set up default options\r
+ if (_s.flashVersion > 8) {\r
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.flash9Options);\r
+ }\r
+ if (_s.flashVersion > 8 && _s.useMovieStar) {\r
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.movieStarOptions);\r
+ _s.filePatterns.flash9 = new RegExp('.(mp3|'+_s.netStreamTypes.join('|')+')','i');\r
+ } else {\r
+ _s.useMovieStar = false;\r
+ }\r
+ _s.filePattern = _s.filePatterns[(_s.flashVersion!=8?'flash9':'flash8')];\r
+ _s.movieURL = (_s.flashVersion==8?'soundmanager2.swf':'soundmanager2_flash9.swf');\r
+ _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_s.flashVersion==9);\r
+ }\r
+\r
+ this._overHTTP = (document.location?document.location.protocol.match(/http/i):null);\r
+ this._waitingforEI = false;\r
+ this._initPending = false;\r
+ this._tryInitOnFocus = (this.isSafari && typeof document.hasFocus == 'undefined');\r
+ this._isFocused = (typeof document.hasFocus != 'undefined'?document.hasFocus():null);\r
+ this._okToDisable = !this._tryInitOnFocus;\r
+\r
+ this.useAltURL = !this._overHTTP; // use altURL if not "online"\r
+\r
+ var flashCPLink = 'http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html';\r
+\r
+ // --- public methods ---\r
+ \r
+ this.supported = function() {\r
+ return (_s._didInit && !_s._disabled);\r
+ };\r
+\r
+ this.getMovie = function(smID) {\r
+ return _s.isIE?window[smID]:(_s.isSafari?document.getElementById(smID)||document[smID]:document.getElementById(smID));\r
+ };\r
+\r
+ this.loadFromXML = function(sXmlUrl) {\r
+ try {\r
+ _s.o._loadFromXML(sXmlUrl);\r
+ } catch(e) {\r
+ _s._failSafely();\r
+ return true;\r
+ };\r
+ };\r
+\r
+ this.createSound = function(oOptions) {\r
+ if (!_s._didInit) throw new Error('soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods');\r
+ if (arguments.length==2) {\r
+ // function overloading in JS! :) ..assume simple createSound(id,url) use case\r
+ var oOptions = {'id':arguments[0],'url':arguments[1]};\r
+ };\r
+ var thisOptions = _s._mergeObjects(oOptions); // inherit SM2 defaults\r
+ var _tO = thisOptions; // alias\r
+ _s._wD('soundManager.createSound(): '+_tO.id+' ('+_tO.url+')',1);\r
+ if (_s._idCheck(_tO.id,true)) {\r
+ _s._wD('soundManager.createSound(): '+_tO.id+' exists',1);\r
+ return _s.sounds[_tO.id];\r
+ };\r
+ if (_s.flashVersion > 8 && _s.useMovieStar) {\r
+ if (_tO.isMovieStar == null) {\r
+ _tO.isMovieStar = (_tO.url.match(_s.netStreamPattern)?true:false);\r
+ }\r
+ if (_tO.isMovieStar) {\r
+ _s._wD('soundManager.createSound(): using MovieStar handling');\r
+ }\r
+ if (_tO.isMovieStar && (_tO.usePeakData || _tO.useWaveformData || _tO.useEQData)) {\r
+ _s._wD('Warning: peak/waveform/eqData features unsupported for non-MP3 formats');\r
+ _tO.usePeakData = false;\r
+ _tO.useWaveformData = false;\r
+ _tO.useEQData = false;\r
+ }\r
+ };\r
+ _s.sounds[_tO.id] = new SMSound(_tO);\r
+ _s.soundIDs[_s.soundIDs.length] = _tO.id;\r
+ // AS2:\r
+ if (_s.flashVersion == 8) {\r
+ _s.o._createSound(_tO.id,_tO.onjustbeforefinishtime);\r
+ } else {\r
+ _s.o._createSound(_tO.id,_tO.url,_tO.onjustbeforefinishtime,_tO.usePeakData,_tO.useWaveformData,_tO.useEQData,_tO.isMovieStar,(_tO.isMovieStar?_tO.useVideo:false));\r
+ };\r
+ if (_tO.autoLoad || _tO.autoPlay) {\r
+ window.setTimeout(function() {\r
+ if (_s.sounds[_tO.id]) {\r
+ _s.sounds[_tO.id].load(_tO);\r
+ }\r
+ },20);\r
+ }\r
+ if (_tO.autoPlay) {\r
+ if (_s.flashVersion == 8) {\r
+ _s.sounds[_tO.id].playState = 1; // we can only assume this sound will be playing soon.\r
+ } else {\r
+ _s.sounds[_tO.id].play(); \r
+ }\r
+ }\r
+ return _s.sounds[_tO.id];\r
+ };\r
+\r
+ this.createVideo = function(oOptions) {\r
+ if (arguments.length==2) {\r
+ var oOptions = {'id':arguments[0],'url':arguments[1]};\r
+ };\r
+ if (_s.flashVersion >= 9) {\r
+ oOptions.isMovieStar = true;\r
+ oOptions.useVideo = true;\r
+ } else {\r
+ _s._wD('soundManager.createVideo(): flash 9 required for video. Exiting.',2);\r
+ return false;\r
+ }\r
+ if (!_s.useMovieStar) {\r
+ _s._wD('soundManager.createVideo(): MovieStar mode not enabled. Exiting.',2);\r
+ }\r
+ return _s.createSound(oOptions);\r
+ }\r
+\r
+ this.destroySound = function(sID,bFromSound) {\r
+ // explicitly destroy a sound before normal page unload, etc.\r
+ if (!_s._idCheck(sID)) return false;\r
+ for (var i=0; i<_s.soundIDs.length; i++) {\r
+ if (_s.soundIDs[i] == sID) {\r
+ _s.soundIDs.splice(i,1);\r
+ continue;\r
+ };\r
+ };\r
+ // conservative option: avoid crash with ze flash 8\r
+ // calling destroySound() within a sound onload() might crash firefox, certain flavours of winXP + flash 8??\r
+ // if (_s.flashVersion != 8) {\r
+ _s.sounds[sID].unload();\r
+ // }\r
+ if (!bFromSound) {\r
+ // ignore if being called from SMSound instance\r
+ _s.sounds[sID].destruct();\r
+ };\r
+ delete _s.sounds[sID];\r
+ };\r
+\r
+ this.destroyVideo = this.destroySound;\r
+\r
+ this.load = function(sID,oOptions) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].load(oOptions);\r
+ };\r
+\r
+ this.unload = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].unload();\r
+ };\r
+\r
+ this.play = function(sID,oOptions) {\r
+ if (!_s._idCheck(sID)) {\r
+ if (typeof oOptions != 'Object') oOptions = {url:oOptions}; // overloading use case: play('mySound','/path/to/some.mp3');\r
+ if (oOptions && oOptions.url) {\r
+ // overloading use case, creation + playing of sound: .play('someID',{url:'/path/to.mp3'});\r
+ _s._wD('soundController.play(): attempting to create "'+sID+'"',1);\r
+ oOptions.id = sID;\r
+ _s.createSound(oOptions);\r
+ } else {\r
+ return false;\r
+ };\r
+ };\r
+ _s.sounds[sID].play(oOptions);\r
+ };\r
+\r
+ this.start = this.play; // just for convenience\r
+\r
+ this.setPosition = function(sID,nMsecOffset) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ nMsecOffset = Math.min((nMsecOffset||0),_s.duration); // don't allow seek past loaded duration\r
+ _s.sounds[sID].setPosition(nMsecOffset);\r
+ };\r
+\r
+ this.stop = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.stop('+sID+')',1);\r
+ _s.sounds[sID].stop(); \r
+ };\r
+\r
+ this.stopAll = function() {\r
+ _s._wD('soundManager.stopAll()',1);\r
+ for (var oSound in _s.sounds) {\r
+ if (_s.sounds[oSound] instanceof SMSound) _s.sounds[oSound].stop(); // apply only to sound objects\r
+ };\r
+ };\r
+\r
+ this.pause = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].pause();\r
+ };\r
+\r
+ this.pauseAll = function() {\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].pause();\r
+ }\r
+ };\r
+\r
+ this.resume = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].resume();\r
+ };\r
+\r
+ this.resumeAll = function() {\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].resume();\r
+ }\r
+ };\r
+\r
+ this.togglePause = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].togglePause();\r
+ };\r
+\r
+ this.setPan = function(sID,nPan) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].setPan(nPan);\r
+ };\r
+\r
+ this.setVolume = function(sID,nVol) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].setVolume(nVol);\r
+ };\r
+\r
+ this.mute = function(sID) {\r
+ if (typeof sID != 'string') sID = null;\r
+ if (!sID) {\r
+ var o = null;\r
+ _s._wD('soundManager.mute(): Muting all sounds');\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].mute();\r
+ }\r
+ _s.muted = true;\r
+ } else {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.mute(): Muting "'+sID+'"');\r
+ _s.sounds[sID].mute();\r
+ }\r
+ };\r
+\r
+ this.muteAll = function() {\r
+ _s.mute();\r
+ };\r
+\r
+ this.unmute = function(sID) {\r
+ if (typeof sID != 'string') sID = null;\r
+ if (!sID) {\r
+ var o = null;\r
+ _s._wD('soundManager.unmute(): Unmuting all sounds');\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].unmute();\r
+ }\r
+ _s.muted = false;\r
+ } else {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.unmute(): Unmuting "'+sID+'"');\r
+ _s.sounds[sID].unmute();\r
+ }\r
+ };\r
+\r
+ this.unmuteAll = function() {\r
+ _s.unmute();\r
+ };\r
+\r
+ this.setPolling = function(bPolling) {\r
+ if (!_s.o || !_s.allowPolling) return false;\r
+ // _s._wD('soundManager.setPolling('+bPolling+')');\r
+ _s.o._setPolling(bPolling);\r
+ };\r
+\r
+ this.disable = function(bUnload) {\r
+ // destroy all functions\r
+ if (_s._disabled) return false;\r
+ _s._disabled = true;\r
+ _s._wD('soundManager.disable(): Disabling all functions - future calls will return false.',1);\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s._disableObject(_s.sounds[_s.soundIDs[i]]);\r
+ };\r
+ _s.initComplete(); // fire "complete", despite fail\r
+ _s._disableObject(_s);\r
+ };\r
+\r
+ this.handleFlashBlock = function(bForce) {\r
+ // experimental, removed with >v2.80.\r
+ return false;\r
+ };\r
+\r
+ this.canPlayURL = function(sURL) {\r
+ return (sURL?(sURL.match(_s.filePattern)?true:false):null); \r
+ };\r
+\r
+ this.getSoundById = function(sID,suppressDebug) {\r
+ if (!sID) throw new Error('SoundManager.getSoundById(): sID is null/undefined');\r
+ var result = _s.sounds[sID];\r
+ if (!result && !suppressDebug) {\r
+ _s._wD('"'+sID+'" is an invalid sound ID.',2);\r
+ // soundManager._wD('trace: '+arguments.callee.caller);\r
+ };\r
+ return result;\r
+ };\r
+\r
+ this.onload = function() {\r
+ // window.onload() equivalent for SM2, ready to create sounds etc.\r
+ // this is a stub - you can override this in your own external script, eg. soundManager.onload = function() {}\r
+ soundManager._wD('<em>Warning</em>: soundManager.onload() is undefined.',2);\r
+ };\r
+\r
+ this.onerror = function() {\r
+ // stub for user handler, called when SM2 fails to load/init\r
+ };\r
+\r
+ // --- "private" methods ---\r
+\r
+ this._idCheck = this.getSoundById;\r
+\r
+ this._disableObject = function(o) {\r
+ for (var oProp in o) {\r
+ if (typeof o[oProp] == 'function' && typeof o[oProp]._protected == 'undefined') o[oProp] = function(){return false;};\r
+ };\r
+ oProp = null;\r
+ };\r
+\r
+ this._failSafely = function() {\r
+ // exception handler for "object doesn't support this property or method" or general failure\r
+ var fpgssTitle = 'You may need to whitelist this location/domain eg. file:///C:/ or C:/ or mysite.com, or set ALWAYS ALLOW under the Flash Player Global Security Settings page. The latter is probably less-secure.';\r
+ var flashCPL = '<a href="'+flashCPLink+'" title="'+fpgssTitle+'">view/edit</a>';\r
+ var FPGSS = '<a href="'+flashCPLink+'" title="Flash Player Global Security Settings">FPGSS</a>';\r
+ if (!_s._disabled) {\r
+ _s._wD('soundManager: Failed to initialise.',2);\r
+ _s.disable();\r
+ };\r
+ };\r
+ \r
+ this._normalizeMovieURL = function(smURL) {\r
+ if (smURL) {\r
+ if (smURL.match(/\.swf/)) {\r
+ smURL = smURL.substr(0,smURL.lastIndexOf('.swf'));\r
+ }\r
+ if (smURL.lastIndexOf('/') != smURL.length-1) {\r
+ smURL = smURL+'/';\r
+ }\r
+ }\r
+ return(smURL && smURL.lastIndexOf('/')!=-1?smURL.substr(0,smURL.lastIndexOf('/')+1):'./')+_s.movieURL;\r
+ };\r
+\r
+ this._getDocument = function() {\r
+ return (document.body?document.body:(document.documentElement?document.documentElement:document.getElementsByTagName('div')[0]));\r
+ };\r
+\r
+ this._getDocument._protected = true;\r
+\r
+ this._createMovie = function(smID,smURL) {\r
+ if (_s._didAppend && _s._appendSuccess) return false; // ignore if already succeeded\r
+ if (window.location.href.indexOf('debug=1')+1) _s.debugMode = true; // allow force of debug mode via URL\r
+ _s._didAppend = true;\r
+ \r
+ // safety check for legacy (change to Flash 9 URL)\r
+ _s._setVersionInfo();\r
+ var remoteURL = (smURL?smURL:_s.url);\r
+ var localURL = (_s.altURL?_s.altURL:remoteURL);\r
+ _s.url = _s._normalizeMovieURL(_s._overHTTP?remoteURL:localURL);\r
+ smURL = _s.url;\r
+\r
+ var htmlEmbed = '<embed name="'+smID+'" id="'+smID+'" src="'+smURL+'" width="100%" height="100%" quality="high" allowScriptAccess="always" quality="high" '+(_s.useHighPerformance && !_s.useMovieStar?'wmode="transparent" ':'')+'bgcolor="'+_s.bgColor+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed>';\r
+ var htmlObject = '<object id="'+smID+'" data="'+smURL+'" type="application/x-shockwave-flash" width="100%" height="100%"><param name="movie" value="'+smURL+'" /><param name="AllowScriptAccess" value="always" /><param name="quality" value="high" />'+(_s.useHighPerformance && !_s.useMovieStar?'<param name="wmode" value="transparent" /> ':'')+'<param name="bgcolor" value="'+_s.bgColor+'" /><!-- --></object>';\r
+ var html = (!_s.isIE?htmlEmbed:htmlObject);\r
+\r
+ var toggleElement = '<div id="'+_s.debugID+'-toggle" style="position:fixed;_position:absolute;right:0px;bottom:0px;_top:0px;width:1.2em;height:1.2em;line-height:1.2em;margin:2px;padding:0px;text-align:center;border:1px solid #999;cursor:pointer;background:#fff;color:#333;z-index:10001" title="Toggle SM2 debug console" onclick="soundManager._toggleDebug()">-</div>';\r
+ var debugHTML = '<div id="'+_s.debugID+'" style="display:'+(_s.debugMode && ((!_s._hasConsole||!_s.useConsole)||(_s.useConsole && _s._hasConsole && !_s.consoleOnly))?'block':'none')+';opacity:0.85"></div>';\r
+ var appXHTML = 'soundManager._createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.';\r
+\r
+ var oTarget = _s._getDocument();\r
+ if (oTarget) {\r
+ \r
+ _s.oMC = document.getElementById('sm2-container')?document.getElementById('sm2-container'):document.createElement('div');\r
+ if (!_s.oMC.id) {\r
+ _s.oMC.id = 'sm2-container';\r
+ _s.oMC.className = 'movieContainer';\r
+ // "hide" flash movie\r
+ var s = null;\r
+ if (_s.useHighPerformance) {\r
+ s = {\r
+ position: 'fixed',\r
+ width: '8px',\r
+ height: '8px', // must be at least 6px for flash to run fast. odd? yes.\r
+ bottom: '0px',\r
+ left: '0px',\r
+ zIndex:-1 // sit behind everything else\r
+ }\r
+ } else {\r
+ s = {\r
+ position: 'absolute',\r
+ width: '1px',\r
+ height: '1px',\r
+ bottom: '0px',\r
+ left: '0px'\r
+ }\r
+ }\r
+ var x = null;\r
+ for (x in s) {\r
+ _s.oMC.style[x] = s[x];\r
+ }\r
+ try {\r
+ oTarget.appendChild(_s.oMC);\r
+ _s.oMC.innerHTML = html;\r
+ _s._appendSuccess = true;\r
+ } catch(e) {\r
+ throw new Error(appXHTML);\r
+ }\r
+ } else {\r
+ // it's already in the document.\r
+ _s.oMC.innerHTML = html;\r
+ _s._appendSuccess = true;\r
+ }\r
+ if (!document.getElementById(_s.debugID) && ((!_s._hasConsole||!_s.useConsole)||(_s.useConsole && _s._hasConsole && !_s.consoleOnly))) {\r
+ var oDebug = document.createElement('div');\r
+ oDebug.id = _s.debugID;\r
+ oDebug.style.display = (_s.debugMode?'block':'none');\r
+ if (_s.debugMode) {\r
+ try {\r
+ var oD = document.createElement('div');\r
+ oTarget.appendChild(oD);\r
+ oD.innerHTML = toggleElement;\r
+ } catch(e) {\r
+ throw new Error(appXHTML);\r
+ };\r
+ };\r
+ oTarget.appendChild(oDebug);\r
+ };\r
+ oTarget = null;\r
+ };\r
+ _s._wD('-- SoundManager 2 '+_s.version+(_s.useMovieStar?', MovieStar mode':'')+(_s._wD?', high performance mode':'')+' --',1);\r
+ _s._wD('soundManager._createMovie(): Trying to load '+smURL+(!_s._overHTTP && _s.altURL?'(alternate URL)':''),1);\r
+ };\r
+\r
+ // aliased to this._wD()\r
+ this._writeDebug = function(sText,sType,bTimestamp) {\r
+ if (!_s.debugMode) return false;\r
+ if (typeof bTimestamp != 'undefined' && bTimestamp) {\r
+ sText = sText + ' | '+new Date().getTime();\r
+ };\r
+ if (_s._hasConsole && _s.useConsole) {\r
+ var sMethod = _s._debugLevels[sType];\r
+ if (typeof console[sMethod] != 'undefined') {\r
+ console[sMethod](sText);\r
+ } else {\r
+ console.log(sText);\r
+ };\r
+ if (_s.useConsoleOnly) return true;\r
+ };\r
+ var sDID = 'soundmanager-debug';\r
+ try {\r
+ var o = document.getElementById(sDID);\r
+ if (!o) return false;\r
+ var oItem = document.createElement('div');\r
+ sText = sText.replace(/\n/g,'<br />');\r
+ if (typeof sType == 'undefined') {\r
+ var sType = 0;\r
+ } else {\r
+ sType = parseInt(sType);\r
+ };\r
+ oItem.innerHTML = sText;\r
+ if (sType) {\r
+ if (sType >= 2) oItem.style.fontWeight = 'bold';\r
+ if (sType == 3) oItem.style.color = '#ff3333';\r
+ };\r
+ // o.appendChild(oItem); // top-to-bottom\r
+ o.insertBefore(oItem,o.firstChild); // bottom-to-top\r
+ } catch(e) {\r
+ // oh well\r
+ };\r
+ o = null;\r
+ };\r
+ this._writeDebug._protected = true;\r
+ this._wD = this._writeDebug;\r
+\r
+ this._wDAlert = function(sText) { alert(sText); };\r
+\r
+ if (window.location.href.indexOf('debug=alert')+1 && _s.debugMode) {\r
+ _s._wD = _s._wDAlert;\r
+ };\r
+\r
+ this._toggleDebug = function() {\r
+ var o = document.getElementById(_s.debugID);\r
+ var oT = document.getElementById(_s.debugID+'-toggle');\r
+ if (!o) return false;\r
+ if (_s._debugOpen) {\r
+ // minimize\r
+ oT.innerHTML = '+';\r
+ o.style.display = 'none';\r
+ } else {\r
+ oT.innerHTML = '-';\r
+ o.style.display = 'block';\r
+ };\r
+ _s._debugOpen = !_s._debugOpen;\r
+ };\r
+\r
+ this._toggleDebug._protected = true;\r
+\r
+ this._debug = function() {\r
+ _s._wD('--- soundManager._debug(): Current sound objects ---',1);\r
+ for (var i=0,j=_s.soundIDs.length; i<j; i++) {\r
+ _s.sounds[_s.soundIDs[i]]._debug();\r
+ };\r
+ };\r
+\r
+ this._mergeObjects = function(oMain,oAdd) {\r
+ // non-destructive merge\r
+ var o1 = {}; // clone o1\r
+ for (var i in oMain) {\r
+ o1[i] = oMain[i];\r
+ }\r
+ var o2 = (typeof oAdd == 'undefined'?_s.defaultOptions:oAdd);\r
+ for (var o in o2) {\r
+ if (typeof o1[o] == 'undefined') o1[o] = o2[o];\r
+ };\r
+ return o1;\r
+ };\r
+\r
+ this.createMovie = function(sURL) {\r
+ if (sURL) _s.url = sURL;\r
+ _s._initMovie();\r
+ };\r
+\r
+ this.go = this.createMovie; // nice alias\r
+\r
+ this._initMovie = function() {\r
+ // attempt to get, or create, movie\r
+ if (_s.o) return false; // pre-init may have fired this function before window.onload(), may already exist\r
+ _s.o = _s.getMovie(_s.id); // try to get flash movie (inline markup)\r
+ if (!_s.o) {\r
+ // try to create\r
+ _s._createMovie(_s.id,_s.url);\r
+ _s.o = _s.getMovie(_s.id);\r
+ };\r
+ if (_s.o) {\r
+ _s._wD('soundManager._initMovie(): Got '+_s.o.nodeName+' element ('+(_s._didAppend?'created via JS':'static HTML')+')',1);\r
+ _s._wD('soundManager._initMovie(): Waiting for ExternalInterface call from Flash..');\r
+ };\r
+ };\r
+\r
+ this.waitForExternalInterface = function() {\r
+ if (_s._waitingForEI) return false;\r
+ _s._waitingForEI = true;\r
+ if (_s._tryInitOnFocus && !_s._isFocused) {\r
+ _s._wD('soundManager: Special case: Flash may not have started due to non-focused tab (Safari is lame), and/or focus cannot be detected. Waiting for focus-related event..');\r
+ return false;\r
+ };\r
+ if (!_s._didInit) {\r
+ _s._wD('soundManager: Getting impatient, still waiting for Flash.. ;)');\r
+ };\r
+ setTimeout(function() {\r
+ if (!_s._didInit) {\r
+ _s._wD('soundManager: No Flash response within reasonable time after document load.\nPossible causes: Flash version under 8, no support, or Flash security denying JS-Flash communication.',2);\r
+ if (!_s._overHTTP) {\r
+ _s._wD('soundManager: Loading this page from local/network file system (not over HTTP?) Flash security likely restricting JS-Flash access. Consider adding current URL to "trusted locations" in the Flash player security settings manager at '+flashCPLink+', or simply serve this content over HTTP.',2);\r
+ };\r
+ };\r
+ // if still not initialized and no other options, give up\r
+ if (!_s._didInit && _s._okToDisable) _s._failSafely();\r
+ },750);\r
+ };\r
+\r
+ this.handleFocus = function() {\r
+ if (_s._isFocused || !_s._tryInitOnFocus) return true;\r
+ _s._okToDisable = true;\r
+ _s._isFocused = true;\r
+ _s._wD('soundManager.handleFocus()');\r
+ if (_s._tryInitOnFocus) {\r
+ // giant Safari 3.1 hack - assume window in focus if mouse is moving, since document.hasFocus() not currently implemented.\r
+ window.removeEventListener('mousemove',_s.handleFocus,false);\r
+ };\r
+ // allow init to restart\r
+ _s._waitingForEI = false;\r
+ setTimeout(_s.waitForExternalInterface,500);\r
+ // detach event\r
+ if (window.removeEventListener) {\r
+ window.removeEventListener('focus',_s.handleFocus,false);\r
+ } else if (window.detachEvent) {\r
+ window.detachEvent('onfocus',_s.handleFocus);\r
+ };\r
+ };\r
+\r
+ this.initComplete = function() {\r
+ if (_s._didInit) return false;\r
+ _s._didInit = true;\r
+ _s._wD('-- SoundManager 2 '+(_s._disabled?'failed to load':'loaded')+' ('+(_s._disabled?'security/load error':'OK')+') --',1);\r
+ if (_s._disabled) {\r
+ _s._wD('soundManager.initComplete(): calling soundManager.onerror()',1);\r
+ _s.onerror.apply(window);\r
+ return false;\r
+ };\r
+ if (_s.waitForWindowLoad && !_s._windowLoaded) {\r
+ _s._wD('soundManager: Waiting for window.onload()');\r
+ if (window.addEventListener) {\r
+ window.addEventListener('load',_s.initUserOnload,false);\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('onload',_s.initUserOnload);\r
+ };\r
+ return false;\r
+ } else {\r
+ if (_s.waitForWindowLoad && _s._windowLoaded) {\r
+ _s._wD('soundManager: Document already loaded');\r
+ };\r
+ _s.initUserOnload();\r
+ };\r
+ };\r
+\r
+ this.initUserOnload = function() {\r
+ _s._wD('soundManager.initComplete(): calling soundManager.onload()',1);\r
+ // call user-defined "onload", scoped to window\r
+ //try {\r
+ _s.onload.apply(window);\r
+ /*\r
+ } catch(e) {\r
+ // something broke (likely JS error in user function)\r
+ _s._wD('soundManager.onload() threw an exception: '+e.message,2);\r
+ setTimeout(function(){throw new Error(e)},20);\r
+ return false;\r
+ };\r
+ */\r
+ _s._wD('soundManager.onload() complete',1);\r
+ };\r
+\r
+ this.init = function() {\r
+ _s._wD('-- soundManager.init() --');\r
+ // called after onload()\r
+ _s._initMovie();\r
+ if (_s._didInit) {\r
+ _s._wD('soundManager.init(): Already called?');\r
+ return false;\r
+ };\r
+ // event cleanup\r
+ if (window.removeEventListener) {\r
+ window.removeEventListener('load',_s.beginDelayedInit,false);\r
+ } else if (window.detachEvent) {\r
+ window.detachEvent('onload',_s.beginDelayedInit);\r
+ };\r
+ try {\r
+ _s._wD('Attempting to call JS -> Flash..');\r
+ _s.o._externalInterfaceTest(false); // attempt to talk to Flash\r
+ // _s._wD('Flash ExternalInterface call (JS-Flash) OK',1);\r
+ if (!_s.allowPolling) {\r
+ _s._wD('Polling (whileloading/whileplaying support) is disabled.',1);\r
+ }\r
+ _s.setPolling(true);\r
+ if (!_s.debugMode) _s.o._disableDebug();\r
+ _s.enabled = true;\r
+ } catch(e) {\r
+ _s._failSafely();\r
+ _s.initComplete();\r
+ return false;\r
+ };\r
+ _s.initComplete();\r
+ };\r
+\r
+ this.beginDelayedInit = function() {\r
+ _s._wD('soundManager.beginDelayedInit(): Document loaded');\r
+ _s._windowLoaded = true;\r
+ setTimeout(_s.waitForExternalInterface,500);\r
+ setTimeout(_s.beginInit,20);\r
+ };\r
+\r
+ this.beginInit = function() {\r
+ if (_s._initPending) return false;\r
+ _s.createMovie(); // ensure creation if not already done\r
+ _s._initMovie();\r
+ _s._initPending = true;\r
+ return true;\r
+ };\r
+\r
+ this.domContentLoaded = function() {\r
+ _s._wD('soundManager.domContentLoaded()');\r
+ if (document.removeEventListener) document.removeEventListener('DOMContentLoaded',_s.domContentLoaded,false);\r
+ _s.go();\r
+ };\r
+\r
+ this._externalInterfaceOK = function() {\r
+ // callback from flash for confirming that movie loaded, EI is working etc.\r
+ if (_s.swfLoaded) return false;\r
+ _s._wD('soundManager._externalInterfaceOK()');\r
+ _s.swfLoaded = true;\r
+ _s._tryInitOnFocus = false;\r
+ if (_s.isIE) {\r
+ // IE needs a timeout OR delay until window.onload - may need TODO: investigating\r
+ setTimeout(_s.init,100);\r
+ } else {\r
+ _s.init();\r
+ };\r
+ };\r
+\r
+ this._setSandboxType = function(sandboxType) {\r
+ var sb = _s.sandbox;\r
+ sb.type = sandboxType;\r
+ sb.description = sb.types[(typeof sb.types[sandboxType] != 'undefined'?sandboxType:'unknown')];\r
+ _s._wD('Flash security sandbox type: '+sb.type);\r
+ if (sb.type == 'localWithFile') {\r
+ sb.noRemote = true;\r
+ sb.noLocal = false;\r
+ _s._wD('Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',2);\r
+ } else if (sb.type == 'localWithNetwork') {\r
+ sb.noRemote = false;\r
+ sb.noLocal = true;\r
+ } else if (sb.type == 'localTrusted') {\r
+ sb.noRemote = false;\r
+ sb.noLocal = false;\r
+ };\r
+ };\r
+\r
+ this.destruct = function() {\r
+ _s._wD('soundManager.destruct()');\r
+ _s.disable(true);\r
+ };\r
+ \r
+ // SMSound (sound object)\r
+ \r
+ function SMSound(oOptions) {\r
+ var _t = this;\r
+ this.sID = oOptions.id;\r
+ this.url = oOptions.url;\r
+ this.options = _s._mergeObjects(oOptions);\r
+ this.instanceOptions = this.options; // per-play-instance-specific options\r
+ this._iO = this.instanceOptions; // short alias\r
+\r
+ this._debug = function() {\r
+ if (_s.debugMode) {\r
+ var stuff = null;\r
+ var msg = [];\r
+ var sF = null;\r
+ var sfBracket = null;\r
+ var maxLength = 64; // # of characters of function code to show before truncating\r
+ for (stuff in _t.options) {\r
+ if (_t.options[stuff] != null) {\r
+ if (_t.options[stuff] instanceof Function) {\r
+ // handle functions specially\r
+ sF = _t.options[stuff].toString();\r
+ sF = sF.replace(/\s\s+/g,' '); // normalize spaces\r
+ sfBracket = sF.indexOf('{');\r
+ msg[msg.length] = ' '+stuff+': {'+sF.substr(sfBracket+1,(Math.min(Math.max(sF.indexOf('\n')-1,maxLength),maxLength))).replace(/\n/g,'')+'... }';\r
+ } else {\r
+ msg[msg.length] = ' '+stuff+': '+_t.options[stuff];\r
+ };\r
+ };\r
+ };\r
+ _s._wD('SMSound() merged options: {\n'+msg.join(', \n')+'\n}');\r
+ };\r
+ };\r
+\r
+ this._debug();\r
+\r
+ this.id3 = {\r
+ /* \r
+ Name/value pairs set via Flash when available - see reference for names:\r
+ http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001567.html\r
+ (eg., this.id3.songname or this.id3['songname'])\r
+ */\r
+ };\r
+\r
+ this.resetProperties = function(bLoaded) {\r
+ _t.bytesLoaded = null;\r
+ _t.bytesTotal = null;\r
+ _t.position = null;\r
+ _t.duration = null;\r
+ _t.durationEstimate = null;\r
+ _t.loaded = false;\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r
+ _t.muted = false;\r
+ _t.didBeforeFinish = false;\r
+ _t.didJustBeforeFinish = false;\r
+ _t.instanceOptions = {};\r
+ _t.instanceCount = 0;\r
+ _t.peakData = {\r
+ left: 0,\r
+ right: 0\r
+ };\r
+ _t.waveformData = [];\r
+ _t.eqData = [];\r
+ };\r
+\r
+ _t.resetProperties();\r
+\r
+ // --- public methods ---\r
+\r
+ this.load = function(oOptions) {\r
+ if (typeof oOptions != 'undefined') {\r
+ _t._iO = _s._mergeObjects(oOptions);\r
+ _t.instanceOptions = _t._iO;\r
+ } else {\r
+ var oOptions = _t.options;\r
+ _t._iO = oOptions;\r
+ _t.instanceOptions = _t._iO;\r
+ } \r
+ if (typeof _t._iO.url == 'undefined') _t._iO.url = _t.url;\r
+ _s._wD('soundManager.load(): '+_t._iO.url,1);\r
+ if (_t._iO.url == _t.url && _t.readyState != 0 && _t.readyState != 2) {\r
+ _s._wD('soundManager.load(): current URL already assigned.',1);\r
+ return false;\r
+ }\r
+ _t.loaded = false;\r
+ _t.readyState = 1;\r
+ _t.playState = (oOptions.autoPlay?1:0); // if autoPlay, assume "playing" is true (no way to detect when it actually starts in Flash unless onPlay is watched?)\r
+ try {\r
+ if (_s.flashVersion==8) {\r
+ _s.o._load(_t.sID,_t._iO.url,_t._iO.stream,_t._iO.autoPlay,(_t._iO.whileloading?1:0));\r
+ } else {\r
+ _s.o._load(_t.sID,_t._iO.url,_t._iO.stream?true:false,_t._iO.autoPlay?true:false); // ,(_tO.whileloading?true:false)\r
+ if (_t._iO.isMovieStar && _t._iO.autoLoad && !_t._iO.autoPlay) {\r
+ // special case: MPEG4 content must start playing to load, then pause to prevent playing.\r
+ _t.pause();\r
+ }\r
+ };\r
+ } catch(e) {\r
+ _s._wD('SMSound.load(): Exception: JS-Flash communication failed, or JS error.',2);\r
+ _s.onerror();\r
+ _s.disable();\r
+ };\r
+ };\r
+\r
+ this.unload = function() {\r
+ // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3\r
+ // Flash 9/AS3: Close stream, preventing further load\r
+ if (_t.readyState != 0) {\r
+ _s._wD('SMSound.unload(): "'+_t.sID+'"');\r
+ if (_t.readyState != 2) { // reset if not error\r
+ _t.setPosition(0); // reset current sound positioning\r
+ }\r
+ _s.o._unload(_t.sID,_s.nullURL);\r
+ // reset load/status flags\r
+ _t.resetProperties();\r
+ }\r
+ };\r
+\r
+ this.destruct = function() {\r
+ // kill sound within Flash\r
+ _s._wD('SMSound.destruct(): "'+_t.sID+'"');\r
+ _s.o._destroySound(_t.sID);\r
+ _s.destroySound(_t.sID,true); // ensure deletion from controller\r
+ }\r
+\r
+ this.play = function(oOptions) {\r
+ if (!oOptions) oOptions = {};\r
+ _t._iO = _s._mergeObjects(oOptions,_t._iO);\r
+ _t._iO = _s._mergeObjects(_t._iO,_t.options);\r
+ _t.instanceOptions = _t._iO;\r
+ if (_t.playState == 1) {\r
+ var allowMulti = _t._iO.multiShot;\r
+ if (!allowMulti) {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" already playing (one-shot)',1);\r
+ return false;\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" already playing (multi-shot)',1);\r
+ };\r
+ };\r
+ if (!_t.loaded) {\r
+ if (_t.readyState == 0) {\r
+ _s._wD('SMSound.play(): Attempting to load "'+_t.sID+'"',1);\r
+ // try to get this sound playing ASAP\r
+ _t._iO.stream = true;\r
+ _t._iO.autoPlay = true;\r
+ // TODO: need to investigate when false, double-playing\r
+ // if (typeof oOptions.autoPlay=='undefined') _tO.autoPlay = true; // only set autoPlay if unspecified here\r
+ _t.load(_t._iO); // try to get this sound playing ASAP\r
+ } else if (_t.readyState == 2) {\r
+ _s._wD('SMSound.play(): Could not load "'+_t.sID+'" - exiting',2);\r
+ return false;\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" is loading - attempting to play..',1);\r
+ };\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'"');\r
+ };\r
+ if (_t.paused) {\r
+ _t.resume();\r
+ } else {\r
+ _t.playState = 1;\r
+ if (!_t.instanceCount || _s.flashVersion == 9) _t.instanceCount++;\r
+ _t.position = (typeof _t._iO.position != 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0);\r
+ if (_t._iO.onplay) _t._iO.onplay.apply(_t);\r
+ _t.setVolume(_t._iO.volume);\r
+ _t.setPan(_t._iO.pan);\r
+ _s.o._start(_t.sID,_t._iO.loop||1,(_s.flashVersion==9?_t.position:_t.position/1000));\r
+ };\r
+ };\r
+\r
+ this.start = this.play; // just for convenience\r
+\r
+ this.stop = function(bAll) {\r
+ if (_t.playState == 1) {\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ // if (_s.defaultOptions.onstop) _s.defaultOptions.onstop.apply(_s);\r
+ if (_t._iO.onstop) _t._iO.onstop.apply(_t);\r
+ _s.o._stop(_t.sID,bAll);\r
+ _t.instanceCount = 0;\r
+ _t._iO = {};\r
+ // _t.instanceOptions = _t._iO;\r
+ };\r
+ };\r
+\r
+ this.setPosition = function(nMsecOffset) {\r
+ _t._iO.position = nMsecOffset;\r
+ _s._wD('SMSound.setPosition('+nMsecOffset+')');\r
+ _s.o._setPosition(_t.sID,(_s.flashVersion==9?_t._iO.position:_t._iO.position/1000),(_t.paused||!_t.playState)); // if paused or not playing, will not resume (by playing)\r
+ };\r
+\r
+ this.pause = function() {\r
+ if (_t.paused || _t.playState == 0) return false;\r
+ _s._wD('SMSound.pause()');\r
+ _t.paused = true;\r
+ _s.o._pause(_t.sID);\r
+ if (_t._iO.onpause) _t._iO.onpause.apply(_t);\r
+ };\r
+\r
+ this.resume = function() {\r
+ if (!_t.paused || _t.playState == 0) return false;\r
+ _s._wD('SMSound.resume()');\r
+ _t.paused = false;\r
+ _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume)\r
+ if (_t._iO.onresume) _t._iO.onresume.apply(_t);\r
+ };\r
+\r
+ this.togglePause = function() {\r
+ _s._wD('SMSound.togglePause()');\r
+ if (!_t.playState) {\r
+ _t.play({position:(_s.flashVersion==9?_t.position:_t.position/1000)});\r
+ return false;\r
+ };\r
+ if (_t.paused) {\r
+ _t.resume();\r
+ } else {\r
+ _t.pause();\r
+ };\r
+ };\r
+\r
+ this.setPan = function(nPan) {\r
+ if (typeof nPan == 'undefined') nPan = 0;\r
+ _s.o._setPan(_t.sID,nPan);\r
+ _t._iO.pan = nPan;\r
+ };\r
+\r
+ this.setVolume = function(nVol) {\r
+ if (typeof nVol == 'undefined') nVol = 100;\r
+ _s.o._setVolume(_t.sID,(_s.muted&&!_t.muted)||_t.muted?0:nVol);\r
+ _t._iO.volume = nVol;\r
+ };\r
+\r
+ this.mute = function() {\r
+ _t.muted = true;\r
+ _s.o._setVolume(_t.sID,0);\r
+ };\r
+\r
+ this.unmute = function() {\r
+ _t.muted = false;\r
+ _s.o._setVolume(_t.sID,typeof _t._iO.volume != 'undefined'?_t._iO.volume:_t.options.volume);\r
+ };\r
+\r
+ // --- "private" methods called by Flash ---\r
+\r
+ this._whileloading = function(nBytesLoaded,nBytesTotal,nDuration) {\r
+ if (!_t._iO.isMovieStar) {\r
+ _t.bytesLoaded = nBytesLoaded;\r
+ _t.bytesTotal = nBytesTotal;\r
+ _t.duration = Math.floor(nDuration);\r
+ _t.durationEstimate = parseInt((_t.bytesTotal/_t.bytesLoaded)*_t.duration); // estimate total time (will only be accurate with CBR MP3s.)\r
+ if (_t.readyState != 3 && _t._iO.whileloading) _t._iO.whileloading.apply(_t);\r
+ } else {\r
+ _t.bytesLoaded = nBytesLoaded;\r
+ _t.bytesTotal = nBytesTotal;\r
+ _t.duration = Math.floor(nDuration);\r
+ _t.durationEstimate = _t.duration;\r
+ if (_t.readyState != 3 && _t._iO.whileloading) _t._iO.whileloading.apply(_t);\r
+ }\r
+ };\r
+\r
+ this._onid3 = function(oID3PropNames,oID3Data) {\r
+ // oID3PropNames: string array (names)\r
+ // ID3Data: string array (data)\r
+ _s._wD('SMSound._onid3(): "'+this.sID+'" ID3 data received.');\r
+ var oData = [];\r
+ for (var i=0,j=oID3PropNames.length; i<j; i++) {\r
+ oData[oID3PropNames[i]] = oID3Data[i];\r
+ // _s._wD(oID3PropNames[i]+': '+oID3Data[i]);\r
+ };\r
+ _t.id3 = _s._mergeObjects(_t.id3,oData);\r
+ if (_t._iO.onid3) _t._iO.onid3.apply(_t);\r
+ };\r
+\r
+ this._whileplaying = function(nPosition,oPeakData,oWaveformData,oEQData) {\r
+ if (isNaN(nPosition) || nPosition == null) return false; // Flash may return NaN at times\r
+ _t.position = nPosition;\r
+ if (_t._iO.usePeakData && typeof oPeakData != 'undefined' && oPeakData) {\r
+ _t.peakData = {\r
+ left: oPeakData.leftPeak,\r
+ right: oPeakData.rightPeak\r
+ };\r
+ };\r
+ if (_t._iO.useWaveformData && typeof oWaveformData != 'undefined' && oWaveformData) {\r
+ _t.waveformData = oWaveformData;\r
+ /*\r
+ _t.spectrumData = {\r
+ left: oSpectrumData.left.split(','),\r
+ right: oSpectrumData.right.split(',')\r
+ }\r
+ */\r
+ };\r
+ if (_t._iO.useEQData && typeof oEQData != 'undefined' && oEQData) {\r
+ _t.eqData = oEQData;\r
+ };\r
+ if (_t.playState == 1) {\r
+ if (_t._iO.whileplaying) {\r
+ _t._iO.whileplaying.apply(_t); // flash may call after actual finish\r
+ };\r
+ if (_t.loaded && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration-_t.position <= _t._iO.onbeforefinishtime) {\r
+ _s._wD('duration-position <= onbeforefinishtime: '+_t.duration+' - '+_t.position+' <= '+_t._iO.onbeforefinishtime+' ('+(_t.duration-_t.position)+')');\r
+ _t._onbeforefinish();\r
+ };\r
+ };\r
+ };\r
+\r
+ this._onload = function(bSuccess) {\r
+ bSuccess = (bSuccess==1?true:false);\r
+ _s._wD('SMSound._onload(): "'+_t.sID+'"'+(bSuccess?' loaded.':' failed to load? - '+_t.url));\r
+ if (!bSuccess) {\r
+ if (_s.sandbox.noRemote == true) {\r
+ _s._wD('SMSound._onload(): Reminder: Flash security is denying network/internet access',1);\r
+ };\r
+ if (_s.sandbox.noLocal == true) {\r
+ _s._wD('SMSound._onload(): Reminder: Flash security is denying local access',1);\r
+ };\r
+ };\r
+ _t.loaded = bSuccess;\r
+ _t.readyState = bSuccess?3:2;\r
+ if (_t._iO.onload) {\r
+ _t._iO.onload.apply(_t);\r
+ };\r
+ };\r
+\r
+ this._onbeforefinish = function() {\r
+ if (!_t.didBeforeFinish) {\r
+ _t.didBeforeFinish = true;\r
+ if (_t._iO.onbeforefinish) {\r
+ _s._wD('SMSound._onbeforefinish(): "'+_t.sID+'"');\r
+ _t._iO.onbeforefinish.apply(_t);\r
+ }\r
+ };\r
+ };\r
+\r
+ this._onjustbeforefinish = function(msOffset) {\r
+ // msOffset: "end of sound" delay actual value (eg. 200 msec, value at event fire time was 187)\r
+ if (!_t.didJustBeforeFinish) {\r
+ _t.didJustBeforeFinish = true;\r
+ if (_t._iO.onjustbeforefinish) {\r
+ _s._wD('SMSound._onjustbeforefinish(): "'+_t.sID+'"');\r
+ _t._iO.onjustbeforefinish.apply(_t);\r
+ }\r
+ };\r
+ };\r
+\r
+ this._onfinish = function() {\r
+ // sound has finished playing\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ if (_t._iO.onfinish) {\r
+ _s._wD('SMSound._onfinish(): "'+_t.sID+'"');\r
+ _t._iO.onfinish.apply(_t);\r
+ }\r
+ if (_t._iO.onbeforefinishcomplete) _t._iO.onbeforefinishcomplete.apply(_t);\r
+ // reset some state items\r
+ _t.setPosition(0);\r
+ _t.didBeforeFinish = false;\r
+ _t.didJustBeforeFinish = false;\r
+ if (_t.instanceCount) {\r
+ _t.instanceCount--;\r
+ if (!_t.instanceCount) {\r
+ // reset instance options\r
+ _t.instanceCount = 0;\r
+ _t.instanceOptions = {};\r
+ }\r
+ }\r
+ };\r
+\r
+ this._onmetadata = function(oMetaData) {\r
+ // movieStar mode only\r
+ _s._wD('SMSound.onmetadata()');\r
+ // Contains a subset of metadata. Note that files may have their own unique metadata.\r
+ // http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000267.html\r
+ if (!oMetaData.width && !oMetaData.height) {\r
+ _s._wD('No width/height given, assuming defaults');\r
+ oMetaData.width = 320;\r
+ oMetaData.height = 240;\r
+ };\r
+ _t.metadata = oMetaData; // potentially-large object from flash\r
+ _t.width = oMetaData.width;\r
+ _t.height = oMetaData.height;\r
+ if (_t._iO.onmetadata) {\r
+ _s._wD('SMSound._onmetadata(): "'+_t.sID+'"');\r
+ _t._iO.onmetadata.apply(_t);\r
+ }\r
+ _s.wD('SMSound.onmetadata() complete');\r
+ };\r
+\r
+ }; // SMSound()\r
+\r
+ // register a few event handlers\r
+ if (window.addEventListener) {\r
+ window.addEventListener('focus',_s.handleFocus,false);\r
+ window.addEventListener('load',_s.beginDelayedInit,false);\r
+ window.addEventListener('unload',_s.destruct,false);\r
+ if (_s._tryInitOnFocus) window.addEventListener('mousemove',_s.handleFocus,false); // massive Safari focus hack\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('onfocus',_s.handleFocus);\r
+ window.attachEvent('onload',_s.beginDelayedInit);\r
+ window.attachEvent('unload',_s.destruct);\r
+ } else {\r
+ // no add/attachevent support - safe to assume no JS -> Flash either.\r
+ soundManager.onerror();\r
+ soundManager.disable();\r
+ };\r
+\r
+ if (document.addEventListener) document.addEventListener('DOMContentLoaded',_s.domContentLoaded,false);\r
+\r
+}; // SoundManager()\r
+\r
+var soundManager = new SoundManager();\r
--- /dev/null
+/**
+ * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
+ *
+ * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ */
+if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
\ No newline at end of file
--- /dev/null
+/* This notice must be untouched at all times.\r
+\r
+wz_jsgraphics.js v. 3.03\r
+The latest version is available at\r
+http://www.walterzorn.com\r
+or http://www.devira.com\r
+or http://www.walterzorn.de\r
+\r
+Copyright (c) 2002-2004 Walter Zorn. All rights reserved.\r
+Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )\r
+Last modified: 28. 1. 2008\r
+\r
+Performance optimizations for Internet Explorer\r
+by Thomas Frank and John Holdsworth.\r
+fillPolygon method implemented by Matthieu Haller.\r
+\r
+High Performance JavaScript Graphics Library.\r
+Provides methods\r
+- to draw lines, rectangles, ellipses, polygons\r
+ with specifiable line thickness,\r
+- to fill rectangles, polygons, ellipses and arcs\r
+- to draw text.\r
+NOTE: Operations, functions and branching have rather been optimized\r
+to efficiency and speed than to shortness of source code.\r
+\r
+LICENSE: LGPL\r
+\r
+This library is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU Lesser General Public\r
+License (LGPL) as published by the Free Software Foundation; either\r
+version 2.1 of the License, or (at your option) any later version.\r
+\r
+This library is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+Lesser General Public License for more details.\r
+\r
+You should have received a copy of the GNU Lesser General Public\r
+License along with this library; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA,\r
+or see http://www.gnu.org/copyleft/lesser.html\r
+*/\r
+\r
+\r
+var jg_ok, jg_ie, jg_fast, jg_dom, jg_moz;\r
+\r
+\r
+function _chkDHTM(x, i)\r
+{\r
+ x = document.body || null;\r
+ jg_ie = x && typeof x.insertAdjacentHTML != "undefined" && document.createElement;\r
+ jg_dom = (x && !jg_ie &&\r
+ typeof x.appendChild != "undefined" &&\r
+ typeof document.createRange != "undefined" &&\r
+ typeof (i = document.createRange()).setStartBefore != "undefined" &&\r
+ typeof i.createContextualFragment != "undefined");\r
+ jg_fast = jg_ie && document.all && !window.opera;\r
+ jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";\r
+ jg_ok = !!(jg_ie || jg_dom);\r
+}\r
+\r
+function _pntCnvDom()\r
+{\r
+ var x = this.wnd.document.createRange();\r
+ x.setStartBefore(this.cnv);\r
+ x = x.createContextualFragment(jg_fast? this._htmRpc() : this.htm);\r
+ if(this.cnv) this.cnv.appendChild(x);\r
+ this.htm = "";\r
+}\r
+\r
+function _pntCnvIe()\r
+{\r
+ if(this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this._htmRpc() : this.htm);\r
+ this.htm = "";\r
+}\r
+\r
+function _pntDoc()\r
+{\r
+ this.wnd.document.write(jg_fast? this._htmRpc() : this.htm);\r
+ this.htm = '';\r
+}\r
+\r
+function _pntN()\r
+{\r
+ ;\r
+}\r
+\r
+function _mkDiv(x, y, w, h)\r
+{\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:' + w + 'px;'+\r
+ 'height:' + h + 'px;'+\r
+ 'clip:rect(0,'+w+'px,'+h+'px,0);'+\r
+ 'background-color:' + this.color +\r
+ (!jg_moz? ';overflow:hidden' : '')+\r
+ ';"><\/div>';\r
+}\r
+\r
+function _mkDivIe(x, y, w, h)\r
+{\r
+ this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';\r
+}\r
+\r
+function _mkDivPrt(x, y, w, h)\r
+{\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'border-left:' + w + 'px solid ' + this.color + ';'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:0px;'+\r
+ 'height:' + h + 'px;'+\r
+ 'clip:rect(0,'+w+'px,'+h+'px,0);'+\r
+ 'background-color:' + this.color +\r
+ (!jg_moz? ';overflow:hidden' : '')+\r
+ ';"><\/div>';\r
+}\r
+\r
+var _regex = /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;\r
+function _htmRpc()\r
+{\r
+ return this.htm.replace(\r
+ _regex,\r
+ '<div style="overflow:hidden;position:absolute;background-color:'+\r
+ '$1;left:$2;top:$3;width:$4;height:$5"></div>\n');\r
+}\r
+\r
+function _htmPrtRpc()\r
+{\r
+ return this.htm.replace(\r
+ _regex,\r
+ '<div style="overflow:hidden;position:absolute;background-color:'+\r
+ '$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n');\r
+}\r
+\r
+function _mkLin(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1;\r
+\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx,\r
+ ox = x;\r
+ while(dx > 0)\r
+ {--dx;\r
+ ++x;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(ox, y, x-ox, 1);\r
+ y += yIncr;\r
+ p += pru;\r
+ ox = x;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(ox, y, x2-ox+1, 1);\r
+ }\r
+\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy,\r
+ oy = y;\r
+ if(y2 <= y1)\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, y, 1, oy-y+1);\r
+ y += yIncr;\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ y += yIncr;\r
+ p += pr;\r
+ }\r
+ }\r
+ this._mkDiv(x2, y2, 1, oy-y2+1);\r
+ }\r
+ else\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, oy, 1, y-oy);\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(x2, oy, 1, y2-oy+1);\r
+ }\r
+ }\r
+}\r
+\r
+function _mkLin2D(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1;\r
+\r
+ var s = this.stroke;\r
+ if(dx >= dy)\r
+ {\r
+ if(dx > 0 && s-3 > 0)\r
+ {\r
+ var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;\r
+ _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;\r
+ }\r
+ else var _s = s;\r
+ var ad = Math.ceil(s/2);\r
+\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx,\r
+ ox = x;\r
+ while(dx > 0)\r
+ {--dx;\r
+ ++x;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(ox, y, x-ox+ad, _s);\r
+ y += yIncr;\r
+ p += pru;\r
+ ox = x;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(ox, y, x2-ox+ad+1, _s);\r
+ }\r
+\r
+ else\r
+ {\r
+ if(s-3 > 0)\r
+ {\r
+ var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;\r
+ _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;\r
+ }\r
+ else var _s = s;\r
+ var ad = Math.round(s/2);\r
+\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy,\r
+ oy = y;\r
+ if(y2 <= y1)\r
+ {\r
+ ++ad;\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, y, _s, oy-y+ad);\r
+ y += yIncr;\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ y += yIncr;\r
+ p += pr;\r
+ }\r
+ }\r
+ this._mkDiv(x2, y2, _s, oy-y2+ad);\r
+ }\r
+ else\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, oy, _s, y-oy+ad);\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(x2, oy, _s, y2-oy+ad+1);\r
+ }\r
+ }\r
+}\r
+\r
+function _mkLinDott(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1,\r
+ drw = true;\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx;\r
+ while(dx > 0)\r
+ {--dx;\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+ drw = !drw;\r
+ if(p > 0)\r
+ {\r
+ y += yIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ ++x;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy;\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+ drw = !drw;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ ++x;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ }\r
+ }\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+}\r
+\r
+function _mkOv(left, top, width, height)\r
+{\r
+ var a = (++width)>>1, b = (++height)>>1,\r
+ wod = width&1, hod = height&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ ox = 0, oy = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ w, h;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ w = x-ox;\r
+ h = oy-y;\r
+ if((w&2) && (h&2))\r
+ {\r
+ this._mkOvQds(cx, cy, x-2, y+2, 1, 1, wod, hod);\r
+ this._mkOvQds(cx, cy, x-1, y+1, 1, 1, wod, hod);\r
+ }\r
+ else this._mkOvQds(cx, cy, x-1, oy, w, h, wod, hod);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ w = a-ox+1;\r
+ h = (oy<<1)+hod;\r
+ y = cy-oy;\r
+ this._mkDiv(cx-a, y, w, h);\r
+ this._mkDiv(cx+ox+wod-1, y, w, h);\r
+}\r
+\r
+function _mkOv2D(left, top, width, height)\r
+{\r
+ var s = this.stroke;\r
+ width += s+1;\r
+ height += s+1;\r
+ var a = width>>1, b = height>>1,\r
+ wod = width&1, hod = height&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1);\r
+\r
+ if(s-4 < 0 && (!(s-2) || width-51 > 0 && height-51 > 0))\r
+ {\r
+ var ox = 0, oy = b,\r
+ w, h,\r
+ pxw;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ w = x-ox;\r
+ h = oy-y;\r
+\r
+ if(w-1)\r
+ {\r
+ pxw = w+1+(s&1);\r
+ h = s;\r
+ }\r
+ else if(h-1)\r
+ {\r
+ pxw = s;\r
+ h += 1+(s&1);\r
+ }\r
+ else pxw = h = s;\r
+ this._mkOvQds(cx, cy, x-1, oy, pxw, h, wod, hod);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);\r
+ this._mkDiv(cx+a+wod-s, cy-oy, s, (oy<<1)+hod);\r
+ }\r
+\r
+ else\r
+ {\r
+ var _a = (width-(s<<1))>>1,\r
+ _b = (height-(s<<1))>>1,\r
+ _x = 0, _y = _b,\r
+ _aa2 = (_a*_a)<<1, _aa4 = _aa2<<1, _bb2 = (_b*_b)<<1, _bb4 = _bb2<<1,\r
+ _st = (_aa2>>1)*(1-(_b<<1)) + _bb2,\r
+ _tt = (_bb2>>1) - _aa2*((_b<<1)-1),\r
+\r
+ pxl = new Array(),\r
+ pxt = new Array(),\r
+ _pxb = new Array();\r
+ pxl[0] = 0;\r
+ pxt[0] = b;\r
+ _pxb[0] = _b-1;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ pxl[pxl.length] = x;\r
+ pxt[pxt.length] = y;\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ pxl[pxl.length] = x;\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ pxt[pxt.length] = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+\r
+ if(_y > 0)\r
+ {\r
+ if(_st < 0)\r
+ {\r
+ _st += _bb2*((_x<<1)+3);\r
+ _tt += _bb4*(++_x);\r
+ _pxb[_pxb.length] = _y-1;\r
+ }\r
+ else if(_tt < 0)\r
+ {\r
+ _st += _bb2*((_x<<1)+3) - _aa4*(_y-1);\r
+ _tt += _bb4*(++_x) - _aa2*(((_y--)<<1)-3);\r
+ _pxb[_pxb.length] = _y-1;\r
+ }\r
+ else\r
+ {\r
+ _tt -= _aa2*((_y<<1)-3);\r
+ _st -= _aa4*(--_y);\r
+ _pxb[_pxb.length-1]--;\r
+ }\r
+ }\r
+ }\r
+\r
+ var ox = -wod, oy = b,\r
+ _oy = _pxb[0],\r
+ l = pxl.length,\r
+ w, h;\r
+ for(var i = 0; i < l; i++)\r
+ {\r
+ if(typeof _pxb[i] != "undefined")\r
+ {\r
+ if(_pxb[i] < _oy || pxt[i] < oy)\r
+ {\r
+ x = pxl[i];\r
+ this._mkOvQds(cx, cy, x, oy, x-ox, oy-_oy, wod, hod);\r
+ ox = x;\r
+ oy = pxt[i];\r
+ _oy = _pxb[i];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ x = pxl[i];\r
+ this._mkDiv(cx-x, cy-oy, 1, (oy<<1)+hod);\r
+ this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);\r
+ ox = x;\r
+ oy = pxt[i];\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);\r
+ this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);\r
+ }\r
+}\r
+\r
+function _mkOvDott(left, top, width, height)\r
+{\r
+ var a = (++width)>>1, b = (++height)>>1,\r
+ wod = width&1, hod = height&1, hodu = hod^1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ drw = true;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ if(drw && y >= hodu) this._mkOvQds(cx, cy, x, y, 1, 1, wod, hod);\r
+ drw = !drw;\r
+ }\r
+}\r
+\r
+function _mkRect(x, y, w, h)\r
+{\r
+ var s = this.stroke;\r
+ this._mkDiv(x, y, w, s);\r
+ this._mkDiv(x+w, y, s, h);\r
+ this._mkDiv(x, y+h, w+s, s);\r
+ this._mkDiv(x, y+s, s, h-s);\r
+}\r
+\r
+function _mkRectDott(x, y, w, h)\r
+{\r
+ this.drawLine(x, y, x+w, y);\r
+ this.drawLine(x+w, y, x+w, y+h);\r
+ this.drawLine(x, y+h, x+w, y+h);\r
+ this.drawLine(x, y, x, y+h);\r
+}\r
+\r
+function jsgFont()\r
+{\r
+ this.PLAIN = 'font-weight:normal;';\r
+ this.BOLD = 'font-weight:bold;';\r
+ this.ITALIC = 'font-style:italic;';\r
+ this.ITALIC_BOLD = this.ITALIC + this.BOLD;\r
+ this.BOLD_ITALIC = this.ITALIC_BOLD;\r
+}\r
+var Font = new jsgFont();\r
+\r
+function jsgStroke()\r
+{\r
+ this.DOTTED = -1;\r
+}\r
+var Stroke = new jsgStroke();\r
+\r
+function jsGraphics(cnv, wnd)\r
+{\r
+ this.setColor = function(x)\r
+ {\r
+ this.color = x.toLowerCase();\r
+ };\r
+\r
+ this.setStroke = function(x)\r
+ {\r
+ this.stroke = x;\r
+ if(!(x+1))\r
+ {\r
+ this.drawLine = _mkLinDott;\r
+ this._mkOv = _mkOvDott;\r
+ this.drawRect = _mkRectDott;\r
+ }\r
+ else if(x-1 > 0)\r
+ {\r
+ this.drawLine = _mkLin2D;\r
+ this._mkOv = _mkOv2D;\r
+ this.drawRect = _mkRect;\r
+ }\r
+ else\r
+ {\r
+ this.drawLine = _mkLin;\r
+ this._mkOv = _mkOv;\r
+ this.drawRect = _mkRect;\r
+ }\r
+ };\r
+\r
+ this.setPrintable = function(arg)\r
+ {\r
+ this.printable = arg;\r
+ if(jg_fast)\r
+ {\r
+ this._mkDiv = _mkDivIe;\r
+ this._htmRpc = arg? _htmPrtRpc : _htmRpc;\r
+ }\r
+ else this._mkDiv = arg? _mkDivPrt : _mkDiv;\r
+ };\r
+\r
+ this.setFont = function(fam, sz, sty)\r
+ {\r
+ this.ftFam = fam;\r
+ this.ftSz = sz;\r
+ this.ftSty = sty || Font.PLAIN;\r
+ };\r
+\r
+ this.drawPolyline = this.drawPolyLine = function(x, y)\r
+ {\r
+ for (var i=x.length - 1; i;)\r
+ {--i;\r
+ this.drawLine(x[i], y[i], x[i+1], y[i+1]);\r
+ }\r
+ };\r
+\r
+ this.fillRect = function(x, y, w, h)\r
+ {\r
+ this._mkDiv(x, y, w, h);\r
+ };\r
+\r
+ this.drawPolygon = function(x, y)\r
+ {\r
+ this.drawPolyline(x, y);\r
+ this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);\r
+ };\r
+\r
+ this.drawEllipse = this.drawOval = function(x, y, w, h)\r
+ {\r
+ this._mkOv(x, y, w, h);\r
+ };\r
+\r
+ this.fillEllipse = this.fillOval = function(left, top, w, h)\r
+ {\r
+ var a = w>>1, b = h>>1,\r
+ wod = w&1, hod = h&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b, oy = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ xl, dw, dh;\r
+ if(w) while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ xl = cx-x;\r
+ dw = (x<<1)+wod;\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ dh = oy-y;\r
+ this._mkDiv(xl, cy-oy, dw, dh);\r
+ this._mkDiv(xl, cy+y+hod, dw, dh);\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, w, (oy<<1)+hod);\r
+ };\r
+\r
+ this.fillArc = function(iL, iT, iW, iH, fAngA, fAngZ)\r
+ {\r
+ var a = iW>>1, b = iH>>1,\r
+ iOdds = (iW&1) | ((iH&1) << 16),\r
+ cx = iL+a, cy = iT+b,\r
+ x = 0, y = b, ox = x, oy = y,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ // Vars for radial boundary lines\r
+ xEndA, yEndA, xEndZ, yEndZ,\r
+ iSects = (1 << (Math.floor((fAngA %= 360.0)/180.0) << 3))\r
+ | (2 << (Math.floor((fAngZ %= 360.0)/180.0) << 3))\r
+ | ((fAngA >= fAngZ) << 16),\r
+ aBndA = new Array(b+1), aBndZ = new Array(b+1);\r
+ \r
+ // Set up radial boundary lines\r
+ fAngA *= Math.PI/180.0;\r
+ fAngZ *= Math.PI/180.0;\r
+ xEndA = cx+Math.round(a*Math.cos(fAngA));\r
+ yEndA = cy+Math.round(-b*Math.sin(fAngA));\r
+ _mkLinVirt(aBndA, cx, cy, xEndA, yEndA);\r
+ xEndZ = cx+Math.round(a*Math.cos(fAngZ));\r
+ yEndZ = cy+Math.round(-b*Math.sin(fAngZ));\r
+ _mkLinVirt(aBndZ, cx, cy, xEndZ, yEndZ);\r
+\r
+ while(y > 0)\r
+ {\r
+ if(st < 0) // Advance x\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0) // Advance x and y\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ ox = x;\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ this._mkArcDiv(ox, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ oy = y;\r
+ }\r
+ else // Advance y\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ if(y && (aBndA[y] != aBndA[y-1] || aBndZ[y] != aBndZ[y-1]))\r
+ {\r
+ this._mkArcDiv(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ }\r
+ }\r
+ this._mkArcDiv(x, 0, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ if(iOdds >> 16) // Odd height\r
+ {\r
+ if(iSects >> 16) // Start-angle > end-angle\r
+ {\r
+ var xl = (yEndA <= cy || yEndZ > cy)? (cx - x) : cx;\r
+ this._mkDiv(xl, cy, x + cx - xl + (iOdds & 0xffff), 1);\r
+ }\r
+ else if((iSects & 0x01) && yEndZ > cy)\r
+ this._mkDiv(cx - x, cy, x, 1);\r
+ }\r
+ };\r
+\r
+/* fillPolygon method, implemented by Matthieu Haller.\r
+This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.\r
+C source of GD 1.8.4 found at http://www.boutell.com/gd/\r
+\r
+THANKS to Kirsten Schulz for the polygon fixes!\r
+\r
+The intersection finding technique of this code could be improved\r
+by remembering the previous intertersection, and by using the slope.\r
+That could help to adjust intersections to produce a nice\r
+interior_extrema. */\r
+ this.fillPolygon = function(array_x, array_y)\r
+ {\r
+ var i;\r
+ var y;\r
+ var miny, maxy;\r
+ var x1, y1;\r
+ var x2, y2;\r
+ var ind1, ind2;\r
+ var ints;\r
+\r
+ var n = array_x.length;\r
+ if(!n) return;\r
+\r
+ miny = array_y[0];\r
+ maxy = array_y[0];\r
+ for(i = 1; i < n; i++)\r
+ {\r
+ if(array_y[i] < miny)\r
+ miny = array_y[i];\r
+\r
+ if(array_y[i] > maxy)\r
+ maxy = array_y[i];\r
+ }\r
+ for(y = miny; y <= maxy; y++)\r
+ {\r
+ var polyInts = new Array();\r
+ ints = 0;\r
+ for(i = 0; i < n; i++)\r
+ {\r
+ if(!i)\r
+ {\r
+ ind1 = n-1;\r
+ ind2 = 0;\r
+ }\r
+ else\r
+ {\r
+ ind1 = i-1;\r
+ ind2 = i;\r
+ }\r
+ y1 = array_y[ind1];\r
+ y2 = array_y[ind2];\r
+ if(y1 < y2)\r
+ {\r
+ x1 = array_x[ind1];\r
+ x2 = array_x[ind2];\r
+ }\r
+ else if(y1 > y2)\r
+ {\r
+ y2 = array_y[ind1];\r
+ y1 = array_y[ind2];\r
+ x2 = array_x[ind1];\r
+ x1 = array_x[ind2];\r
+ }\r
+ else continue;\r
+\r
+ // Modified 11. 2. 2004 Walter Zorn\r
+ if((y >= y1) && (y < y2))\r
+ polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);\r
+\r
+ else if((y == maxy) && (y > y1) && (y <= y2))\r
+ polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);\r
+ }\r
+ polyInts.sort(_CompInt);\r
+ for(i = 0; i < ints; i+=2)\r
+ this._mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);\r
+ }\r
+ };\r
+\r
+ this.drawString = function(txt, x, y)\r
+ {\r
+ this.htm += '<div style="position:absolute;white-space:nowrap;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'font-family:' + this.ftFam + ';'+\r
+ 'font-size:' + this.ftSz + ';'+\r
+ 'color:' + this.color + ';' + this.ftSty + '">'+\r
+ txt +\r
+ '<\/div>';\r
+ };\r
+\r
+/* drawStringRect() added by Rick Blommers.\r
+Allows to specify the size of the text rectangle and to align the\r
+text both horizontally (e.g. right) and vertically within that rectangle */\r
+ this.drawStringRect = function(txt, x, y, width, halign)\r
+ {\r
+ this.htm += '<div style="position:absolute;overflow:hidden;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:'+width +'px;'+\r
+ 'text-align:'+halign+';'+\r
+ 'font-family:' + this.ftFam + ';'+\r
+ 'font-size:' + this.ftSz + ';'+\r
+ 'color:' + this.color + ';' + this.ftSty + '">'+\r
+ txt +\r
+ '<\/div>';\r
+ };\r
+\r
+ this.drawImage = function(imgSrc, x, y, w, h, a)\r
+ {\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ // w (width) and h (height) arguments are now optional.\r
+ // Added by Mahmut Keygubatli, 14.1.2008\r
+ (w? ('width:' + w + 'px;') : '') +\r
+ (h? ('height:' + h + 'px;'):'')+'">'+\r
+ '<img src="' + imgSrc +'"'+ (w ? (' width="' + w + '"'):'')+ (h ? (' height="' + h + '"'):'') + (a? (' '+a) : '') + '>'+\r
+ '<\/div>';\r
+ };\r
+\r
+ this.clear = function()\r
+ {\r
+ this.htm = "";\r
+ if(this.cnv) this.cnv.innerHTML = "";\r
+ };\r
+\r
+ this._mkOvQds = function(cx, cy, x, y, w, h, wod, hod)\r
+ {\r
+ var xl = cx - x, xr = cx + x + wod - w, yt = cy - y, yb = cy + y + hod - h;\r
+ if(xr > xl+w)\r
+ {\r
+ this._mkDiv(xr, yt, w, h);\r
+ this._mkDiv(xr, yb, w, h);\r
+ }\r
+ else\r
+ w = xr - xl + w;\r
+ this._mkDiv(xl, yt, w, h);\r
+ this._mkDiv(xl, yb, w, h);\r
+ };\r
+ \r
+ this._mkArcDiv = function(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects)\r
+ {\r
+ var xrDef = cx + x + (iOdds & 0xffff), y2, h = oy - y, xl, xr, w;\r
+\r
+ if(!h) h = 1;\r
+ x = cx - x;\r
+\r
+ if(iSects & 0xff0000) // Start-angle > end-angle\r
+ {\r
+ y2 = cy - y - h;\r
+ if(iSects & 0x00ff)\r
+ {\r
+ if(iSects & 0x02)\r
+ {\r
+ xl = Math.max(x, aBndZ[y]);\r
+ w = xrDef - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0x01)\r
+ {\r
+ xr = Math.min(xrDef, aBndA[y]);\r
+ w = xr - x;\r
+ if(w > 0) this._mkDiv(x, y2, w, h);\r
+ }\r
+ }\r
+ else\r
+ this._mkDiv(x, y2, xrDef - x, h);\r
+ y2 = cy + y + (iOdds >> 16);\r
+ if(iSects & 0xff00)\r
+ {\r
+ if(iSects & 0x0100)\r
+ {\r
+ xl = Math.max(x, aBndA[y]);\r
+ w = xrDef - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0x0200)\r
+ {\r
+ xr = Math.min(xrDef, aBndZ[y]);\r
+ w = xr - x;\r
+ if(w > 0) this._mkDiv(x, y2, w, h);\r
+ }\r
+ }\r
+ else\r
+ this._mkDiv(x, y2, xrDef - x, h);\r
+ }\r
+ else\r
+ {\r
+ if(iSects & 0x00ff)\r
+ {\r
+ if(iSects & 0x02)\r
+ xl = Math.max(x, aBndZ[y]);\r
+ else\r
+ xl = x;\r
+ if(iSects & 0x01)\r
+ xr = Math.min(xrDef, aBndA[y]);\r
+ else\r
+ xr = xrDef;\r
+ y2 = cy - y - h;\r
+ w = xr - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0xff00)\r
+ {\r
+ if(iSects & 0x0100)\r
+ xl = Math.max(x, aBndA[y]);\r
+ else\r
+ xl = x;\r
+ if(iSects & 0x0200)\r
+ xr = Math.min(xrDef, aBndZ[y]);\r
+ else\r
+ xr = xrDef;\r
+ y2 = cy + y + (iOdds >> 16);\r
+ w = xr - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ }\r
+ };\r
+\r
+ this.setStroke(1);\r
+ this.setFont("verdana,geneva,helvetica,sans-serif", "12px", Font.PLAIN);\r
+ this.color = "#000000";\r
+ this.htm = "";\r
+ this.wnd = wnd || window;\r
+\r
+ if(!jg_ok) _chkDHTM();\r
+ if(jg_ok)\r
+ {\r
+ if(cnv)\r
+ {\r
+ if(typeof(cnv) == "string")\r
+ this.cont = document.all? (this.wnd.document.all[cnv] || null)\r
+ : document.getElementById? (this.wnd.document.getElementById(cnv) || null)\r
+ : null;\r
+ else if(cnv == window.document)\r
+ this.cont = document.getElementsByTagName("body")[0];\r
+ // If cnv is a direct reference to a canvas DOM node\r
+ // (option suggested by Andreas Luleich)\r
+ else this.cont = cnv;\r
+ // Create new canvas inside container DIV. Thus the drawing and clearing\r
+ // methods won't interfere with the container's inner html.\r
+ // Solution suggested by Vladimir.\r
+ this.cnv = this.wnd.document.createElement("div");\r
+ this.cnv.style.fontSize=0;\r
+ this.cont.appendChild(this.cnv);\r
+ this.paint = jg_dom? _pntCnvDom : _pntCnvIe;\r
+ }\r
+ else\r
+ this.paint = _pntDoc;\r
+ }\r
+ else\r
+ this.paint = _pntN;\r
+\r
+ this.setPrintable(false);\r
+}\r
+\r
+function _mkLinVirt(aLin, x1, y1, x2, y2)\r
+{\r
+ var dx = Math.abs(x2-x1), dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ xIncr = (x1 > x2)? -1 : 1,\r
+ yIncr = (y1 > y2)? -1 : 1,\r
+ p,\r
+ i = 0;\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1);\r
+ p = pr-dx;\r
+ while(dx > 0)\r
+ {--dx;\r
+ if(p > 0) // Increment y\r
+ {\r
+ aLin[i++] = x;\r
+ y += yIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ x += xIncr;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1);\r
+ p = pr-dy;\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ aLin[i++] = x;\r
+ if(p > 0) // Increment x\r
+ {\r
+ x += xIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ }\r
+ }\r
+ for(var len = aLin.length, i = len-i; i;)\r
+ aLin[len-(i--)] = x;\r
+};\r
+\r
+function _CompInt(x, y)\r
+{\r
+ return(x - y);\r
+}\r
+\r
--- /dev/null
+===============================
+TimeSide - Web Audio Components
+===============================
+
+TimeSide UI Dependencies
+========================
+
+* SoundManager 2 >= 2.91 : http://www.schillmania.com/projects/soundmanager2
+* jQuery => 1.2.6 : http://www.jquery.com
+* jsGraphics => 3.03 http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm
+
+Licensing
+=========
+
+Copyright (c) 2008-2009 Samalyse
+Author: Olivier Guilyardi <olivier samalyse com>
+
+TimeSide is released under the terms of the GNU General Public License
+version 2. Please see the LICENSE file for details.
+
--- /dev/null
+/* FIXME: These CSS styles are essential and non intrusive. They should be
+ * dynamically assigned in javascript, and this file removed. */
+
+.ts-player .ts-ruler .ts-section .ts-canvas {
+ position: relative;
+}
+
+.ts-player .ts-wave {
+ position: relative;
+ clear: both;
+ overflow: hidden;
+}
+
+.ts-player .ts-wave .ts-image-container {
+ position: relative;
+}
+
+.ts-player .ts-wave .ts-image {
+ position: absolute;
+ left: 0;
+ clear: both;
+}
+
+.ts-player .ts-wave .ts-image-canvas {
+ position: absolute;
+ z-index: 100;
+ overflow: hidden;
+}
+
--- /dev/null
+<html>
+
+<head>
+<link type="text/css" href="../css/timeside.css" rel="stylesheet" media="screen" />
+<link type="text/css" href="../skins/lab/style.css" rel="stylesheet" media="screen" />
+<style type="text/css">
+.ts-player { width: 360px; }
+</style>
+<!--
+<script type="text/javascript" src="../lib/firebug-lite-compressed.js"></script>
+-->
+<script type="text/javascript">
+function get_globals() {
+ var g = [];
+ for (var v in window)
+ g = g.concat([v]);
+ return g;
+}
+function diff_array(a1, a2) {
+ var diff = [];
+ var i, ii = a2.length;
+ for (i = 0; i < ii; i++) {
+ if (a1.indexOf(a2[i]) == -1) {
+ diff = diff.concat([a2[i]]);
+ }
+ }
+ return diff;
+}
+
+function log_globals(label) {
+ var g = get_globals();
+ if (log_globals.cache && label && typeof console != 'undefined') {
+ console.log(label + ':');
+ console.log(diff_array(log_globals.cache, g));
+ }
+ log_globals.cache = g;
+}
+</script>
+<script>log_globals(false);</script>
+<script type="text/javascript" src="../lib/jquery.js"></script>
+<script type="text/javascript">
+jQuery.noConflict();
+jQuery(window).bind('load', function() {if (jQuery.browser.mozilla) jQuery('#Firebug').hide()});
+log_globals('jquery globals');
+</script>
+
+<!--
+<script type="text/javascript" src="jquery-ui.js"></script>
+-->
+<script>log_globals('jquery ui globals');</script>
+<script type="text/javascript" src="../lib/wz_jsgraphics.js"></script>
+<script>log_globals('jsgraphics globals');</script>
+<script type="text/javascript" src="../lib/soundmanager2.js"></script>
+<script>log_globals('soundmanager globals');</script>
+<script type="text/javascript" src="../src/timeside.js"></script>
+
+<script type="text/javascript">
+var sound = null;
+var map;
+var provider = null;
+var player = null;
+
+function shiftSize(delta) {
+ jQuery('#player').width(jQuery('#player').width() + delta);
+ player.resize();
+}
+
+function fullSize() {
+ jQuery('#player').css({width: 'auto'});
+ player.resize();
+}
+
+TimeSide.debug(true);
+TimeSide.load(function() {
+ map = new TimeSide.MarkerMap();
+ provider = new TimeSide.SoundProvider({source: sound});
+ player = new TimeSide.Player('#player', {
+ image: 'waveform.png'
+ });
+ controller = new TimeSide.Controller({
+ player: player,
+ soundProvider: provider,
+ map: map
+ });
+
+ jQuery('#skinner').get(0).className=jQuery('#skin').get(0).value; player.resize();
+});
+if (typeof soundManager != 'undefined') {
+ soundManager.url = '../lib/';
+ soundManager.flashVersion = 9;
+ soundManager.consoleOnly = true;
+ if (typeof console == 'undefined') {
+ soundManager.debugMode = false;
+ }
+
+ soundManager.onload = function() {
+ sound = soundManager.createSound({
+ id: 'test',
+ url: 'http://ns22997.ovh.net/tmp/crem.mp3'
+ //autoLoad: true
+ });
+
+ if (provider) {
+ provider.setSource(sound);
+ } else {
+ TimeSide.load(function () {
+ provider.setSource(sound);
+ });
+ }
+ }
+}
+
+</script>
+
+</head>
+
+<body>
+
+<h2>TimeSide Player</h2>
+
+<div id="skinner" class="">
+ <div id="player" class="ts-player">
+ </div>
+</div>
+
+<p>
+<!--
+ <button onclick="setup()">Setup</button>
+-->
+ <button onclick="shiftSize(-10)">Smaller</button>
+ <button onclick="shiftSize(10)">Bigger</button>
+ <button onclick="fullSize()">Full size</button>
+ <br />
+ Skin:
+ <select id="skin" onchange="jQuery('#skinner').get(0).className=this.value; player.resize(); ">
+ <option selected value="">None</option>
+ <option value="ts-skin-lab">Lab</option>
+ </select>
+</p>
+</body>
+</html>
--- /dev/null
+(function(_scope){_scope.pi=Object(3.14159265358979323846);var pi=_scope.pi;pi.version=1.0;pi.env={ie:/MSIE/i.test(navigator.userAgent),ie6:/MSIE 6/i.test(navigator.userAgent),ie7:/MSIE 7/i.test(navigator.userAgent),ie8:/MSIE 8/i.test(navigator.userAgent),firefox:/Firefox/i.test(navigator.userAgent),opera:/Opera/i.test(navigator.userAgent),webkit:/Webkit/i.test(navigator.userAgent)};pi.util={IsArray:function(_object){return _object&&_object!=window&&(_object instanceof Array||(typeof _object.length=="number"&&typeof _object.item=="function"))},IsHash:function(_object){return _object&&typeof _object=="object"&&(_object==window||_object instanceof Object)&&!_object.nodeName&&!pi.util.IsArray(_object)},DOMContentLoaded:[],AddEvent:function(_element,_eventName,_fn,_useCapture){_element[pi.env.ie.toggle("attachEvent","addEventListener")](pi.env.ie.toggle("on","")+_eventName,_fn,_useCapture||false);return pi.util.AddEvent.curry(this,_element)},RemoveEvent:function(_element,_eventName,_fn,_useCapture){return _element[pi.env.ie.toggle("detachEvent","removeEventListener")](pi.env.ie.toggle("on","")+_eventName,_fn,_useCapture||false)},GetWindowSize:function(){return{height:pi.env.ie?Math.max(document.documentElement.clientHeight,document.body.clientHeight):window.innerHeight,width:pi.env.ie?Math.max(document.documentElement.clientWidth,document.body.clientWidth):window.innerWidth}},Include:function(_url,_callback){var script=new pi.element("script").attribute.set("src",_url),callback=_callback||new Function,done=false,head=pi.get.byTag("head")[0];script.environment.getElement().onload=script.environment.getElement().onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){callback.call(this);done=true;head.removeChild(script.environment.getElement())}};script.insert(head)},Element:{addClass:function(_element,_class){if(!pi.util.Element.hasClass(_element,_class))pi.util.Element.setClass(_element,pi.util.Element.getClass(_element)+" "+_class)},getClass:function(_element){return _element.getAttribute(pi.env.ie.toggle("className","class"))||""},hasClass:function(_element,_class){return pi.util.Element.getClass(_element).split(" ").indexOf(_class)>-1},removeClass:function(_element,_class){if(pi.util.Element.hasClass(_element,_class))pi.util.Element.setClass(_element,pi.util.Element.getClass(_element,_class).split(" ").removeValue(_class).join(" "))},setClass:function(_element,_value){_element.setAttribute(pi.env.ie.toggle("className","class"),_value)},toggleClass:function(){if(pi.util.Element.hasClass.apply(this,arguments))pi.util.Element.removeClass.apply(this,arguments);else pi.util.Element.addClass.apply(this,arguments)},getOpacity:function(_styleObject){var styleObject=_styleObject;if(!pi.env.ie)return styleObject["opacity"];var alpha=styleObject["filter"].match(/opacity\=(\d+)/i);return alpha?alpha[1]/100:1},setOpacity:function(_element,_value){if(!pi.env.ie)return pi.util.Element.addStyle(_element,{"opacity":_value});_value*=100;pi.util.Element.addStyle(_element,{"filter":"alpha(opacity="+_value+")"});return this._parent_},getPosition:function(_element){var parent=_element,offsetLeft=0,offsetTop=0,view=pi.util.Element.getView(_element);while(parent&&parent!=document.body&&parent!=document.firstChild){offsetLeft+=parseInt(parent.offsetLeft);offsetTop+=parseInt(parent.offsetTop);parent=parent.offsetParent};return{"bottom":view["bottom"],"left":view["left"],"marginTop":view["marginTop"],"marginLeft":view["marginLeft"],"offsetLeft":offsetLeft,"offsetTop":offsetTop,"position":view["position"],"right":view["right"],"top":view["top"],"z-index":view["zIndex"]}},getSize:function(_element){var view=pi.util.Element.getView(_element);return{"height":view["height"],"offsetHeight":_element.offsetHeight,"offsetWidth":_element.offsetWidth,"width":view["width"]}},addStyle:function(_element,_style){for(var key in _style){key=key=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):key;if(key=="opacity"&&pi.env.ie){pi.util.Element.setOpacity(_element,_style[key]);continue}_element.style[key]=_style[key]}},getStyle:function(_element,_property){_property=_property=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):_property;if(_property=="opacity"&&pi.env.ie)return pi.util.Element.getOpacity(_element.style);return typeof _property=="string"?_element.style[_property]:_element.style},getView:function(_element,_property){var view=document.defaultView?document.defaultView.getComputedStyle(_element,null):_element.currentStyle;_property=_property=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):_property;if(_property=="opacity"&&pi.env.ie)return pi.util.Element.getOpacity(_element,view);return typeof _property=="string"?view[_property]:view}},CloneObject:function(_object,_fn){var tmp={};for(var key in _object){if(pi.util.IsArray(_object[key])){tmp[key]=Array.prototype.clone.apply(_object[key])}else if(pi.util.IsHash(_object[key])){tmp[key]=pi.util.CloneObject(_object[key]);if(_fn)_fn.call(tmp,key,_object)}else tmp[key]=_object[key]}return tmp},MergeObjects:function(_object,_source){for(var key in _source){var value=_source[key];if(pi.util.IsArray(_source[key])){if(pi.util.IsArray(_object[key])){Array.prototype.push.apply(_source[key],_object[key])}else value=_source[key].clone()}else if(pi.util.IsHash(_source[key])){if(pi.util.IsHash(_object[key])){value=pi.util.MergeObjects(_object[key],_source[key])}else{value=pi.util.CloneObject(_source[key])}}_object[key]=value};return _object}};pi.get=function(){return document.getElementById(arguments[0])};pi.get.byTag=function(){return document.getElementsByTagName(arguments[0])};pi.get.byClass=function(){return document.getElementsByClassName.apply(document,arguments)};pi.base=function(){this.body={};this.constructor=null;this.build=function(_skipClonning){var base=this,skipClonning=_skipClonning||false,_private={},fn=function(){var _p=pi.util.CloneObject(_private);if(!skipClonning){for(var key in this){if(pi.util.IsArray(this[key])){this[key]=Array.prototype.clone.apply(this[key])}else if(pi.util.IsHash(this[key])){this[key]=pi.util.CloneObject(this[key],function(_key,_object){this[_key]._parent_=this});this[key]._parent_=this}}};base.createAccessors(_p,this);if(base.constructor)return base.constructor.apply(this,arguments);return this};this.movePrivateMembers(this.body,_private);if(this.constructor){fn["$Constructor"]=this.constructor}fn.prototype=this.body;return fn};this.createAccessors=function(_p,_branch){var getter=function(_property){return this[_property]},setter=function(_property,_value){this[_property]=_value;return _branch._parent_||_branch};for(var name in _p){var isPrivate=name.substring(0,1)=="_",title=name.substring(1,2).toUpperCase()+name.substring(2);if(isPrivate){_branch["get"+title]=getter.curry(_p,name);_branch["set"+title]=setter.curry(_p,name)}else if(pi.util.IsHash(_p[name])){if(!_branch[name])_branch[name]={};this.createAccessors(_p[name],_branch[name])}}};this.movePrivateMembers=function(_object,_branch){for(var name in _object){var isPrivate=name.substring(0,1)=="_";if(isPrivate){_branch[name]=_object[name];delete _object[name]}else if(pi.util.IsHash(_object[name])){_branch[name]={};this.movePrivateMembers(_object[name],_branch[name])}}}};Function.prototype.extend=function(_prototype,_skipClonning){var object=new pi.base,superClass=this;if(_prototype["$Constructor"]){object.constructor=_prototype["$Constructor"];delete _prototype["$Constructor"]};object.body=superClass==pi.base?_prototype:pi.util.MergeObjects(_prototype,superClass.prototype,2);object.constructor=object.constructor||function(){if(superClass!=pi.base)superClass.apply(this,arguments)};return object.build(_skipClonning)};Function.prototype.curry=function(_scope){var fn=this,scope=_scope||window,args=Array.prototype.slice.call(arguments,1);return function(){return fn.apply(scope,args.concat(Array.prototype.slice.call(arguments,0)))}};pi.element=pi.base.extend({"$Constructor":function(_tag){this.environment.setElement(document.createElement(_tag||"DIV"));this.environment.getElement().pi=this;return this},"clean":function(){var childs=this.child.get();while(childs.length){childs[0].parentNode.removeChild(childs[0])}},"clone":function(_deep){return this.environment.getElement().cloneNode(_deep)},"insert":function(_element){_element=_element.environment?_element.environment.getElement():_element;_element.appendChild(this.environment.getElement());return this},"insertAfter":function(_referenceElement){_referenceElement=_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement;_referenceElement.nextSibling?this.insertBefore(_referenceElement.nextSibling):this.insert(_referenceElement.parentNode);return this},"insertBefore":function(_referenceElement){_referenceElement=_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement;_referenceElement.parentNode.insertBefore(this.environment.getElement(),_referenceElement);return this},"query":function(_expression,_resultType,namespaceResolver,_result){return pi.xpath(_expression,_resultType||"ORDERED_NODE_SNAPSHOT_TYPE",this.environment.getElement(),_namespaceResolver,_result)},"remove":function(){this.environment.getParent().removeChild(this.environment.getElement())},"update":function(_value){["TEXTAREA","INPUT"].indexOf(this.environment.getName())>-1?(this.environment.getElement().value=_value):(this.environment.getElement().innerHTML=_value);return this},"attribute":{"getAll":function(_name){return this._parent_.environment.getElement().attributes},"clear":function(_name){this.set(_name,"");return this._parent_},"get":function(_name){return this._parent_.environment.getElement().getAttribute(_name)},"has":function(_name){return pi.env.ie?(this.get(_name)!=null):this._parent_.environment.getElement().hasAttribute(_name)},"remove":function(_name){this._parent_.environment.getElement().removeAttribute(_name);return this._parent_},"set":function(_name,_value){this._parent_.environment.getElement().setAttribute(_name,_value);return this._parent_},"addClass":function(_classes){for(var i=0;i<arguments.length;i++){pi.util.Element.addClass(this._parent_.environment.getElement(),arguments[i])};return this._parent_},"clearClass":function(){this.setClass("");this._parent_},"getClass":function(){return pi.util.Element.getClass(this._parent_.environment.getElement())},"hasClass":function(_class){return pi.util.Element.hasClass(this._parent_.environment.getElement(),_class)},"setClass":function(_value){return pi.util.Element.setClass(this._parent_.environment.getElement(),_value)},"removeClass":function(_class){pi.util.Element.removeClass(this._parent_.environment.getElement(),_class);return this._parent_},"toggleClass":function(_class){pi.util.Element.toggleClass(this._parent_.environment.getElement(),_class)}},"child":{"get":function(){return this._parent_.environment.getElement().childNodes},"add":function(_elements){for(var i=0;i<arguments.length;i++){var el=arguments[i];this._parent_.environment.getElement().appendChild(el.environment?el.environment.getElement():el)}return this._parent_},"addAfter":function(_element,_referenceElement){this.addBefore(_element.environment?_element.environment.getElement():_element,(_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement).nextSibling);return this._parent_},"addBefore":function(_element,_referenceElement){this._parent_.environment.getElement().insertBefore(_element.environment?_element.environment.getElement():_element,_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement);return this._parent_},"query":function(_tag,_attributeName,_attributeValue){return this._parent_.query("{0}{1}".format((_tag?"{0}".format(_tag):"/*"),_attributeName||_attributeValue?"[contains(concat(' ', @{0}, ' '),' {1} ')]".format(_attributeName||"",_attributeValue||""):""))},"remove":function(_element){this._parent_.environment.getElement().removeChild(_element.environment?_element.environment.getElement():_element)}},"environment":{"_element":null,"getParent":function(){return this.getElement().parentNode},"getPosition":function(){return pi.util.Element.getPosition(this.getElement())},"getSize":function(){return pi.util.Element.getSize(this.getElement())},"addStyle":function(_styleObject){pi.util.Element.addStyle(this.getElement(),_styleObject);return this._parent_},"getStyle":function(_property){return pi.util.Element.getStyle(_property)},"getName":function(){return this.getElement().nodeName},"getType":function(){return this.getElement().nodeType},"getView":function(_property){return pi.util.Element.getView(this.getElement(),_property)}},"event":{"addListener":function(_event,_fn,_useCapture){pi.util.AddEvent(this._parent_.environment.getElement(),_event,_fn,_useCapture);return this._parent_},"removeListener":function(_event,_fn,_useCapture){pi.util.RemoveEvent(this._parent_.environment.getElement(),_event,_fn,_useCapture);return this._parent_}}});pi.xhr=new pi.base;pi.xhr.constructor=function(){var api;if(!window.XMLHttpRequest){var names=["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];for(var i=0;i<names.length;i++){try{this.environment.setApi(new ActiveXObject(names[i]));break}catch(e){continue}}}else this.environment.setApi(new XMLHttpRequest());this.environment.getApi().onreadystatechange=this.event.readystatechange.curry(this);return this};pi.xhr.body={"abort":function(){this.environment.getApi().abort()},"send":function(){var url=this.environment.getUrl(),data=this.environment.getData(),dataUrl="";for(var key in data)dataUrl+="{0}={1}&".format(key,data[key]);if(this.environment.getType()=="GET")url+=(url.search("\\?")==-1?"?":"&")+"{0}".format(dataUrl);this.environment.getApi().open(this.environment.getType(),url,this.environment.getAsync());for(var key in this.environment.getHeader())this.environment.getApi().setRequestHeader(key,this.environment.getHeader()[key]);this.environment.getApi().send(this.environment.getType()=="GET"?"":dataUrl)}};pi.xhr.body.environment={"_async":true,"_api":null,"_cache":true,"_callback":[],"_channel":null,"_data":{},"_header":{},"_mimeType":null,"_multipart":false,"_type":"GET","_timeout":0,"_url":"","addCallback":function(_options,_fn){this.getCallback().push({"fn":_fn,"options":_options})},"addHeader":function(_key,_value){this.getHeader()[_key]=_value},"addData":function(_key,_value){this.getData()[_key]=_value},"changeCache":function(_value){if(_value==false){this.addData("forceCache",Math.round(Math.random()*10000))}this.setCache(_value)},"changeType":function(_value){if(_value=="POST"){this.addHeader("Content-Type","application/x-www-form-urlencoded")}this.setType(_value)}};pi.xhr.body.event={"readystatechange":function(){var readyState=this.environment.getApi().readyState;var callback=this.environment.getCallback();for(var i=0;i<callback.length;i++){if(callback[i].options.readyState.indexOf(readyState)>-1)callback[i].fn.apply(this)}}};pi.xhr=pi.xhr.build();pi.xhr.get=function(_url,_returnPiObject){var request=new pi.xhr();request.environment.setAsync(false);request.environment.setUrl(_url);request.send();return _returnPiObject?request:request.environment.getApi()};pi.xpath=function(_expression,_resultType,_contextNode,_namespaceResolver,_result){var contextNode=_contextNode||document,expression=_expression||"",namespaceResolver=_namespaceResolver||null,result=_result||null,resultType=_resultType||"ANY_TYPE";return document.evaluate(expression,contextNode,namespaceResolver,XPathResult[resultType],result)};Array.prototype.clone=function(){var tmp=[];Array.prototype.push.apply(tmp,this);tmp.forEach(function(item,index,object){if(item instanceof Array)object[index]=object[index].clone()});return tmp};Array.prototype.count=function(_value){var count=0;this.forEach(function(){count+=Number(arguments[0]==_value)});return count};Array.prototype.forEach=Array.prototype.forEach||function(_function){for(var i=0;i<this.length;i++)_function.apply(this,[this[i],i,this])};Array.prototype.getLastItem=function(){return this[this.length-1]};Array.prototype.indexOf=Array.prototype.indexOf||function(_value){var index=-1;for(var i=0;i<this.length;i++)if(this[i]==_value){index=i;break}return index};Array.prototype.remove=function(_index){var array=this.slice(0,_index);Array.prototype.push.apply(array,this.slice(_index+1));return array};Array.prototype.removeValue=function(_value){return this.remove(this.indexOf(_value))};Boolean.prototype.toggle=function(){return this==true?arguments[0]:arguments[1]};Number.prototype.base=function(_system){var remain=this%_system;if(this==remain)return String.fromCharCode(this+(this>9?87:48));return((this-remain)/_system).base(_system)+String.fromCharCode(remain+(remain>9?87:48))};Number.prototype.decimal=function(_system){var result=0,digit=String(this).split("");for(var i=0;i<digit.length;i++){digit[i]=parseInt((digit[i].charCodeAt(0)>58)?digit[i].charCodeAt(0)-87:digit[i]);result+=digit[i]*(Math.pow(_system,digit.length-1-i))}return result};Number.prototype.range=function(_pattern){for(var value=String(this),isFloat=/\./i.test(value),i=isFloat.toggle(parseInt(value.split(".")[0]),0),end=parseInt(value.split(".")[isFloat.toggle(1,0)]),array=[];i<end;i++){array.push(Boolean(_pattern)==false?i:(typeof _pattern=="function"?_pattern(i):_pattern[i]))}return array};String.prototype.escape=function(){return escape(this)};String.prototype.format=function(){var values=arguments;return this.replace(/\{(\d)\}/g,function(){return values[arguments[1]]})};String.prototype.leftpad=function(_len,_ch){var str=this;var ch=Boolean(_ch)==false?" ":_ch;while(str.length<_len)str=ch+str;return str};String.prototype.toggle=function(_value,_other){return this==_value?_value:_other};String.prototype.unicode=function(){var str="",obj=this.split("");for(var i=obj.length-1;i>=0;i--)str="\\u{0}{1}".format(String(obj[i].charCodeAt(0).base(16)).leftpad(4,"0"),str);return str};pi.util.AddEvent(pi.env.ie?window:document,pi.env.ie?"load":"DOMContentLoaded",function(){for(var i=0;i<pi.util.DOMContentLoaded.length;i++){pi.util.DOMContentLoaded[i]()}})})(window);
+var firebug={env:{"cache":{},"ctmp":[],"dIndex":"console","init":false,"ml":false,"objCn":[]},init:function(){firebug.el={};firebug.el.content={};with(firebug){document.documentElement.childNodes[0].appendChild(new pi.element("link").attribute.set("rel","stylesheet").attribute.set("href","http://firebuglite.appspot.com/firebug-lite.css").environment.getElement());el.main=new pi.element("DIV").attribute.set("id","Firebug").environment.addStyle({"width":pi.util.GetWindowSize().width+"px"}).insert(document.body);el.header=new pi.element("DIV").attribute.addClass("Header").insert(el.main);el.left={};el.left.container=new pi.element("DIV").attribute.addClass("Left").insert(el.main);el.right={};el.right.container=new pi.element("DIV").attribute.addClass("Right").insert(el.main);el.main.child.add(new pi.element("DIV").environment.addStyle({"clear":"both"}));el.button={};el.button.container=new pi.element("DIV").attribute.addClass("ButtonContainer").insert(el.header);el.button.logo=new pi.element("A").attribute.set("title","Firebug Lite").attribute.set("target","_blank").attribute.set("href","http://getfirebug.com/lite.html").update(" ").attribute.addClass("Button Logo").insert(el.button.container);el.button.inspect=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.inspector.toggle).update("Inspect").insert(el.button.container);el.button.maximize=new pi.element("A").attribute.addClass("Button Maximize").event.addListener("click",win.maximize).insert(el.button.container);el.button.minimize=new pi.element("A").attribute.addClass("Button Minimize").event.addListener("click",win.minimize).insert(el.button.container);el.button.close=new pi.element("A").attribute.addClass("Button Close").event.addListener("click",win.close).insert(el.button.container);if(pi.env.ie||pi.env.webkit){el.button.container.environment.addStyle({"paddingTop":"12px"})}el.nav={};el.nav.container=new pi.element("DIV").attribute.addClass("Nav").insert(el.left.container);el.nav.console=new pi.element("A").attribute.addClass("Tab Selected").event.addListener("click",d.navigate.curry(window,"console")).update("Console").insert(el.nav.container);el.nav.html=new pi.element("A").attribute.addClass("Tab").update("HTML").event.addListener("click",d.navigate.curry(window,"html")).insert(el.nav.container);el.nav.css=new pi.element("A").attribute.addClass("Tab").update("CSS").event.addListener("click",d.navigate.curry(window,"css")).insert(el.nav.container);el.nav.scripts=new pi.element("A").attribute.addClass("Tab").update("Script").event.addListener("click",d.navigate.curry(window,"scripts")).insert(el.nav.container);el.nav.dom=new pi.element("A").attribute.addClass("Tab").update("DOM").event.addListener("click",d.navigate.curry(window,"dom")).insert(el.nav.container);el.nav.xhr=new pi.element("A").attribute.addClass("Tab").update("XHR").event.addListener("click",d.navigate.curry(window,"xhr")).insert(el.nav.container);el.borderInspector=new pi.element("DIV").attribute.set("id","FirebugBorderInspector").event.addListener("click",listen.inspector).insert(document.body);el.bgInspector=new pi.element("DIV").attribute.set("id","FirebugBGInspector").insert(document.body);el.left.console={};el.left.console.container=new pi.element("DIV").attribute.addClass("Console").insert(el.left.container);el.left.console.mlButton=new pi.element("A").attribute.addClass("MLButton").event.addListener("click",d.console.toggleML).insert(el.left.console.container);el.left.console.monitor=new pi.element("DIV").insert(new pi.element("DIV").attribute.addClass("Monitor").insert(el.left.console.container));el.left.console.container.child.add(new pi.element("DIV").attribute.addClass("InputArrow").update(">>>"));el.left.console.input=new pi.element("INPUT").attribute.set("type","text").attribute.addClass("Input").event.addListener("keydown",listen.consoleTextbox).insert(new pi.element("DIV").attribute.addClass("InputContainer").insert(el.left.console.container));el.right.console={};el.right.console.container=new pi.element("DIV").attribute.addClass("Console Container").insert(el.right.container);el.right.console.mlButton=new pi.element("A").attribute.addClass("MLButton CloseML").event.addListener("click",d.console.toggleML).insert(el.right.console.container);el.right.console.input=new pi.element("TEXTAREA").attribute.addClass("Input").insert(el.right.console.container);el.right.console.run=new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.runMultiline).update("Run").insert(el.right.console.container);el.right.console.clear=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.right.console.input)).update("Clear").insert(el.right.console.container);el.button.console={};el.button.console.container=new pi.element("DIV").attribute.addClass("ButtonSet").insert(el.button.container);el.button.console.clear=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.left.console.monitor)).update("Clear").insert(el.button.console.container);el.left.html={};el.left.html.container=new pi.element("DIV").attribute.addClass("HTML").insert(el.left.container);el.right.html={};el.right.html.container=new pi.element("DIV").attribute.addClass("HTML Container").insert(el.right.container);el.right.html.nav={};el.right.html.nav.container=new pi.element("DIV").attribute.addClass("Nav").insert(el.right.html.container);el.right.html.nav.computedStyle=new pi.element("A").attribute.addClass("Tab Selected").event.addListener("click",d.html.navigate.curry(firebug,"computedStyle")).update("Computed Style").insert(el.right.html.nav.container);if(!pi.env.ie6)el.right.html.nav.dom=new pi.element("A").attribute.addClass("Tab").event.addListener("click",d.html.navigate.curry(firebug,"dom")).update("DOM").insert(el.right.html.nav.container);el.right.html.content=new pi.element("DIV").attribute.addClass("Content").insert(el.right.html.container);el.button.html={};el.button.html.container=new pi.element("DIV").attribute.addClass("ButtonSet HTML").insert(el.button.container);el.left.css={};el.left.css.container=new pi.element("DIV").attribute.addClass("CSS").insert(el.left.container);el.right.css={};el.right.css.container=new pi.element("DIV").attribute.addClass("CSS Container").insert(el.right.container);el.right.css.nav={};el.right.css.nav.container=new pi.element("DIV").attribute.addClass("Nav").insert(el.right.css.container);el.right.css.nav.runCSS=new pi.element("A").attribute.addClass("Tab Selected").update("Run CSS").insert(el.right.css.nav.container);el.right.css.mlButton=new pi.element("A").attribute.addClass("MLButton CloseML").event.addListener("click",d.console.toggleML).insert(el.right.css.container);el.right.css.input=new pi.element("TEXTAREA").attribute.addClass("Input").insert(el.right.css.container);el.right.css.run=new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.runCSS).update("Run").insert(el.right.css.container);el.right.css.clear=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.right.css.input)).update("Clear").insert(el.right.css.container);el.button.css={};el.button.css.container=new pi.element("DIV").attribute.addClass("ButtonSet CSS").insert(el.button.container);el.button.css.selectbox=new pi.element("SELECT").event.addListener("change",listen.cssSelectbox).insert(el.button.css.container);el.left.scripts={};el.left.scripts.container=new pi.element("DIV").attribute.addClass("Scripts").insert(el.left.container);el.right.scripts={};el.right.scripts.container=new pi.element("DIV").attribute.addClass("Scripts Container").insert(el.right.container);el.button.scripts={};el.button.scripts.container=new pi.element("DIV").attribute.addClass("ButtonSet Scripts").insert(el.button.container);el.button.scripts.selectbox=new pi.element("SELECT").event.addListener("change",listen.scriptsSelectbox).insert(el.button.scripts.container);el.button.scripts.lineNumbers=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.scripts.toggleLineNumbers).update("Show Line Numbers").insert(el.button.scripts.container);el.left.dom={};el.left.dom.container=new pi.element("DIV").attribute.addClass("DOM").insert(el.left.container);el.right.dom={};el.right.dom.container=new pi.element("DIV").attribute.addClass("DOM Container").insert(el.right.container);el.button.dom={};el.button.dom.container=new pi.element("DIV").attribute.addClass("ButtonSet DOM").insert(el.button.container);el.button.dom.label=new pi.element("LABEL").update("Object Path:").insert(el.button.dom.container);el.button.dom.textbox=new pi.element("INPUT").event.addListener("keydown",listen.domTextbox).update("window").insert(el.button.dom.container);el.left.str={};el.left.str.container=new pi.element("DIV").attribute.addClass("STR").insert(el.left.container);el.right.str={};el.right.str.container=new pi.element("DIV").attribute.addClass("STR").insert(el.left.container);el.button.str={};el.button.str.container=new pi.element("DIV").attribute.addClass("ButtonSet XHR").insert(el.button.container);el.button.str.watch=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.navigate.curry(window,"xhr")).update("Back").insert(el.button.str.container);el.left.xhr={};el.left.xhr.container=new pi.element("DIV").attribute.addClass("XHR").insert(el.left.container);el.right.xhr={};el.right.xhr.container=new pi.element("DIV").attribute.addClass("XHR").insert(el.left.container);el.button.xhr={};el.button.xhr.container=new pi.element("DIV").attribute.addClass("ButtonSet XHR").insert(el.button.container);el.button.xhr.label=new pi.element("LABEL").update("XHR Path:").insert(el.button.xhr.container);el.button.xhr.textbox=new pi.element("INPUT").event.addListener("keydown",listen.xhrTextbox).insert(el.button.xhr.container);el.button.xhr.watch=new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.addXhrObject).update("Watch").insert(el.button.xhr.container);if(pi.env.ie6){var buttons=[el.button.inspect,el.button.close,el.button.inspect,el.button.console.clear,el.right.console.run,el.right.console.clear,el.right.css.run,el.right.css.clear];for(var i=0;i<buttons.length;i++)buttons[i].attribute.set("href","#")}env.init=true;for(var i=0;i<env.ctmp.length;i++){d.console.log.apply(window,env.ctmp[i])}}},win:{close:function(){with(firebug){el.main.update("");el.main.remove()}},minimize:function(){with(firebug){el.main.environment.addStyle({"height":"35px"});el.button.maximize.environment.addStyle({"display":"block"});el.button.minimize.environment.addStyle({"display":"none"});d.refreshSize()}},maximize:function(){with(firebug){el.main.environment.addStyle({"height":"295px"});el.button.minimize.environment.addStyle({"display":"block"});el.button.maximize.environment.addStyle({"display":"none"});d.refreshSize()}}},watchXHR:function(){with(firebug){d.xhr.addObject.apply(window,arguments);if(env.dIndex!="xhr"){d.navigate("xhr")}}},d:{clean:function(_element){with(firebug){_element.update("")}},console:{dir:function(_value){with(firebug){d.console.addLine().attribute.addClass("Arrow").update(">>> console.dir("+_value+")");d.dom.open(_value,d.console.addLine())}},addLine:function(){with(firebug){return new pi.element("DIV").attribute.addClass("Row").insert(el.left.console.monitor)}},openObject:function(_index){with(firebug){d.dom.open(env.objCn[_index],el.left.dom.container,pi.env.ie);d.navigate("dom")}},historyIndex:0,history:[],log:function(_values){with(firebug){if(env.init==false){env.ctmp.push(arguments);return}var value="";for(var i=0;i<arguments.length;i++){value+=(i>0?" ":"")+d.highlight(arguments[i],false,false,true)}d.console.addLine().update(value);d.console.scroll()}},print:function(_cmd,_text){with(firebug){d.console.addLine().attribute.addClass("Arrow").update(">>> "+_cmd);d.console.addLine().update(d.highlight(_text,false,false,true));d.console.scroll();d.console.historyIndex=d.console.history.push(_cmd)}},run:function(cmd){with(firebug){if(cmd.length==0)return;el.left.console.input.environment.getElement().value="";try{var result=eval.call(window,cmd);d.console.print(cmd,result)}catch(e){d.console.addLine().attribute.addClass("Arrow").update(">>> "+cmd);if(!pi.env.ff){d.console.scroll();return d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+(e.description||e),true)}if(e.fileName==null){d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+e.message,true)}var fileName=e.fileName.split("\/").getLastItem();d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+e.message+" (<em>"+fileName+"</em>,"+e.lineNumber+")",true);d.console.scroll()}d.console.scroll()}},scroll:function(){with(firebug){el.left.console.monitor.environment.getElement().parentNode.scrollTop=Math.abs(el.left.console.monitor.environment.getSize().offsetHeight-200)}},toggleML:function(){with(firebug){var open=!env.ml;env.ml=!env.ml;d.navigateRightColumn("console",open);el[open?"left":"right"].console.mlButton.environment.addStyle({display:"none"});el[!open?"left":"right"].console.mlButton.environment.addStyle({display:"block"});el.left.console.monitor.environment.addStyle({"height":(open?233:210)+"px"});el.left.console.mlButton.attribute[(open?"add":"remove")+"Class"]("CloseML")}}},css:{index:-1,open:function(_index){with(firebug){var item=document.styleSheets[_index];var uri=item.href;if(uri.indexOf("http:\/\/")>-1&&getDomain(uri)!=document.domain){el.left.css.container.update("<em>Access to restricted URI denied</em>");return}var rules=item[pi.env.ie?"rules":"cssRules"];var str="";for(var i=0;i<rules.length;i++){var item=rules[i];var selector=item.selectorText;var cssText=pi.env.ie?item.style.cssText:item.cssText.match(/\{(.*)\}/)[1];str+=d.css.printRule(selector,cssText.split(";"),el.left.css.container)}el.left.css.container.update(str)}},printRule:function(_selector,_css,_layer){with(firebug){var str="<div class='Selector'>"+_selector+" {</div>";for(var i=0;i<_css.length;i++){var item=_css[i];str+="<div class='CSSText'>"+item.replace(/(.+\:)(.+)/,"<span class='CSSProperty'>$1</span><span class='CSSValue'>$2;</span>")+"</div>"}str+="<div class='Selector'>}</div>";return str}},refresh:function(){with(firebug){el.button.css.selectbox.update("");var collection=document.styleSheets;for(var i=0;i<collection.length;i++){var uri=collection[i].href;d.css.index=d.css.index<0?i:d.css.index;el.button.css.selectbox.child.add(new pi.element("OPTION").attribute.set("value",i).update(uri))};d.css.open(d.css.index)}}},dom:{open:function(_object,_layer){with(firebug){_layer.clean();var container=new pi.element("DIV").attribute.addClass("DOMContent").insert(_layer);d.dom.print(_object,container)}},print:function(_object,_parent,_inTree){with(firebug){var obj=_object||window,parentElement=_parent;parentElement.update("");if(parentElement.opened&&parentElement!=el.left.dom.container){parentElement.environment.getParent().pi.child.get()[0].pi.child.get()[0].pi.attribute.removeClass("Opened");parentElement.opened=false;parentElement.environment.addStyle({"display":"none"});return}if(_inTree)parentElement.environment.getParent().pi.child.get()[0].pi.child.get()[0].pi.attribute.addClass("Opened");parentElement.opened=true;for(var key in obj){try{var value=obj[key],property=key,container=new pi.element("DIV").attribute.addClass("DOMRow").insert(parentElement),left=new pi.element("DIV").attribute.addClass("DOMRowLeft").insert(container),right=new pi.element("DIV").attribute.addClass("DOMRowRight").insert(container);container.child.add(new pi.element("DIV").environment.addStyle({"clear":"both"}));var link=new pi.element("A").attribute.addClass(typeof value=="object"&&Boolean(value)?"Property Object":"Property").update(property).insert(left);right.update(d.highlight(value,false,true));var subContainer=new pi.element("DIV").attribute.addClass("DOMRowSubContainer").insert(container);if(typeof value!="object"||Boolean(value)==false)continue;link.event.addListener("click",d.dom.print.curry(window,value,subContainer,true))}catch(e){}}parentElement.environment.addStyle({"display":"block"})}}},highlight:function(_value,_inObject,_inArray,_link){with(firebug){var isArray=false,isElement=false;try{isArray=pi.util.IsArray(_value);isElement=_value!=undefined&&Boolean(_value.nodeName)&&Boolean(_value.nodeType)}catch(e){};if(_value==null||["boolean","function","number","string"].indexOf(typeof _value)>-1){if(_value==null){return"<span class='Null'>null</span>"}if(["boolean","number"].indexOf(typeof _value)>-1){return"<span class='DarkBlue'>"+_value+"</span>"}if(typeof _value=="function"){return"<span class='"+(_inObject?"Italic Gray":"Green")+"'>function()</span>"}return"<span class='Red'>\""+(!_inObject&&!_inArray?_value:_value.substring(0,35)).replace(/\n/g,"\\n").replace(/\s/g," ").replace(/>/g,">").replace(/</g,"<")+"\"</span>"}else if(isElement){if(_value.nodeType==3)return d.highlight(_value.nodeValue);if(_inArray||_inObject){var result="<span class='Blue'>"+_value.nodeName.toLowerCase();if(_value.getAttribute&&_value.getAttribute("id"))result+="<span class='DarkBlue'>#"+_value.getAttribute("id")+"</span>";var elClass=_value.getAttribute?_value.getAttribute(pi.env.ie?"className":"class"):"";if(elClass)result+="<span class='Red'>."+elClass.split(" ")[0]+"</span>";return result+"</span>"}var result="<span class='Blue'><"+_value.nodeName.toLowerCase()+"";if(_value.attributes)for(var i=0;i<_value.attributes.length;i++){var item=_value.attributes[i];if(pi.env.ie&&Boolean(item.nodeValue)==false)continue;result+=" <span class='DarkBlue'>"+item.nodeName+"=\"<span class='Red'>"+item.nodeValue+"</span>\"</span>"}result+="></span>";return result}else if(isArray||["object","array"].indexOf(typeof _value)>-1){var result="";if(isArray||_value instanceof Array){if(_inObject)return"<span class='Gray Italic'>["+_value.length+"]</span>";result+="<span class='Strong'>[ ";for(var i=0;i<_value.length;i++){if((_inObject||_inArray)&&pi.env.ie&&i>3)break;result+=(i>0?", ":"")+d.highlight(_value[i],false,true,true)}result+=" ]</span>";return result}if(_inObject)return"<span class='Gray Italic'>Object</span>";result+="<span class='Strong Green"+(!_link?"'":" ObjectLink' onmouseover='this.className=this.className.replace(\"ObjectLink\",\"ObjectLinkHover\")' onmouseout='this.className=this.className.replace(\"ObjectLinkHover\",\"ObjectLink\")' onclick='firebug.d.console.openObject("+(env.objCn.push(_value)-1)+")'")+">Object";var i=0;for(var key in _value){var value=_value[key];if((_inObject||_inArray)&&pi.env.ie&&i>3)break;result+=" "+key+"="+d.highlight(value,true);i++};result+="</span>";return result}else{if(_inObject)return"<span class='Gray Italic'>"+_value+"</span>";return _value}}},html:{nIndex:"computedStyle",current:null,highlight:function(_element,_clear,_event){with(firebug){if(_clear){el.bgInspector.environment.addStyle({"display":"none"});return}d.inspector.inspect(_element,true)}},inspect:function(_element){var el=_element,map=[],parent=_element;while(parent){map.push(parent);if(parent==document.body)break;parent=parent.parentNode}map=map.reverse();with(firebug){d.inspector.toggle();var parentLayer=el.left.html.container.child.get()[1].childNodes[1].pi;for(var t=0;map[t];){if(t==map.length-1){var link=parentLayer.environment.getElement().previousSibling.pi;link.attribute.addClass("Selected");if(d.html.current)d.html.current[1].attribute.removeClass("Selected");d.html.current=[_element,link];return;t}parentLayer=d.html.openHtmlTree(map[t],parentLayer,map[t+1]);t++}}},navigate:function(_index,_element){with(firebug){el.right.html.nav[d.html.nIndex].attribute.removeClass("Selected");el.right.html.nav[_index].attribute.addClass("Selected");d.html.nIndex=_index;d.html.openProperties()}},openHtmlTree:function(_element,_parent,_returnParentElementByElement,_event){with(firebug){var element=_element||document.documentElement,parent=_parent||el.left.html.container,returnParentEl=_returnParentElementByElement||null,returnParentVal=null;if(parent!=el.left.html.container){var nodeLink=parent.environment.getParent().pi.child.get()[0].pi;if(d.html.current)d.html.current[1].attribute.removeClass("Selected");nodeLink.attribute.addClass("Selected");d.html.current=[_element,nodeLink];d.html.openProperties()}if(element.childNodes&&(element.childNodes.length==0||(element.childNodes.length==1&&element.childNodes[0].nodeType==3)))return;parent.clean();if(parent.opened&&Boolean(_returnParentElementByElement)==false){parent.opened=false;parent.environment.getParent().pi.child.get()[0].pi.attribute.removeClass("Open");return}if(parent!=el.left.html.container){parent.environment.getParent().pi.child.get()[0].pi.attribute.addClass("Open");parent.opened=true}for(var i=0;i<element.childNodes.length;i++){var item=element.childNodes[i];if(item.nodeType==3)continue;var container=new pi.element().attribute.addClass("Block").insert(parent);var link=new pi.element("A").attribute.addClass("Link").update(d.highlight(item)).insert(container);var subContainer=new pi.element("DIV").attribute.addClass("SubContainer").insert(container);link.event.addListener("click",d.html.openHtmlTree.curry(window,item,subContainer,false));link.event.addListener("mouseover",d.html.highlight.curry(window,item,false));link.event.addListener("mouseout",d.html.highlight.curry(window,item,true));returnParentVal=returnParentEl==item?subContainer:returnParentVal;if(d.html.current==null&&item==document.body){link.attribute.addClass("Selected");d.html.current=[item,link];d.html.openHtmlTree(item,subContainer)}if(item.childNodes&&item.childNodes.length==1&&item.childNodes[0].nodeType==3){link.child.get()[0].appendChild(document.createTextNode(item.childNodes[0].nodeValue.substring(0,100)));link.child.get()[0].appendChild(document.createTextNode("</"));link.child.get()[0].appendChild(new pi.element("span").attribute.addClass("Blue").update(item.nodeName.toLowerCase()).environment.getElement());link.child.get()[0].appendChild(document.createTextNode(">"));continue}else if(item.childNodes&&item.childNodes.length==0)continue;link.attribute.addClass("ParentLink")}return returnParentVal}},openProperties:function(){with(firebug){var index=d.html.nIndex;var node=d.html.current[0];d.clean(el.right.html.content);var str="";switch(index){case"computedStyle":var property=["opacity","filter","azimuth","background","backgroundAttachment","backgroundColor","backgroundImage","backgroundPosition","backgroundRepeat","border","borderCollapse","borderColor","borderSpacing","borderStyle","borderTop","borderRight","borderBottom","borderLeft","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderWidth","bottom","captionSide","clear","clip","color","content","counterIncrement","counterReset","cue","cueAfter","cueBefore","cursor","direction","display","elevation","emptyCells","cssFloat","font","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","height","left","letterSpacing","lineHeight","listStyle","listStyleImage","listStylePosition","listStyleType","margin","marginTop","marginRight","marginBottom","marginLeft","markerOffset","marks","maxHeight","maxWidth","minHeight","minWidth","orphans","outline","outlineColor","outlineStyle","outlineWidth","overflow","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","page","pageBreakAfter","pageBreakBefore","pageBreakInside","pause","pauseAfter","pauseBefore","pitch","pitchRange","playDuring","position","quotes","richness","right","size","speak","speakHeader","speakNumeral","speakPunctuation","speechRate","stress","tableLayout","textAlign","textDecoration","textIndent","textShadow","textTransform","top","unicodeBidi","verticalAlign","visibility","voiceFamily","volume","whiteSpace","widows","width","wordSpacing","zIndex"].sort();var view=document.defaultView?document.defaultView.getComputedStyle(node,null):node.currentStyle;for(var i=0;i<property.length;i++){var item=property[i];if(!view[item])continue;str+="<div class='CSSItem'><div class='CSSProperty'>"+item+"</div><div class='CSSValue'>"+d.highlight(view[item])+"</div></div>"}el.right.html.content.update(str);break;case"dom":d.dom.open(node,el.right.html.content,pi.env.ie);break}}}},inspector:{enabled:false,el:null,inspect:function(_element,_bgInspector){var el=_element,top=el.offsetTop,left=el.offsetLeft,parent=_element.offsetParent;while(Boolean(parent)&&parent!=document.firstChild){top+=parent.offsetTop;left+=parent.offsetLeft;parent=parent.offsetParent;if(parent==document.body)break};with(firebug){el[_bgInspector?"bgInspector":"borderInspector"].environment.addStyle({"width":_element.offsetWidth+"px","height":_element.offsetHeight+"px","top":top-(_bgInspector?0:2)+"px","left":left-(_bgInspector?0:2)+"px","display":"block"});if(!_bgInspector){d.inspector.el=_element}}},toggle:function(){with(firebug){d.inspector.enabled=!d.inspector.enabled;el.button.inspect.attribute[(d.inspector.enabled?"add":"remove")+"Class"]("Enabled");if(d.inspector.enabled==false){el.borderInspector.environment.addStyle({"display":"none"});d.inspector.el=null}else if(pi.env.dIndex!="html"){d.navigate("html")}}}},scripts:{index:-1,lineNumbers:false,open:function(_index){with(firebug){d.scripts.index=_index;el.left.scripts.container.update("");var script=document.getElementsByTagName("script")[_index],uri=script.src||document.location.href,source;if(uri.indexOf("http:\/\/")>-1&&getDomain(uri)!=document.domain){el.left.scripts.container.update("<em>Access to restricted URI denied</em>");return}if(uri!=document.location.href){source=env.cache[uri]||pi.xhr.get(uri).responseText;env.cache[uri]=source}else source=script.innerHTML;source=source.replace(/\n|\t|<|>/g,function(_ch){return({"<":"<",">":">","\t":" ","\n":"<br />"})[_ch]});if(!d.scripts.lineNumbers)el.left.scripts.container.child.add(new pi.element("DIV").attribute.addClass("CodeContainer").update(source));else{source=source.split("<br />");for(var i=0;i<source.length;i++){el.left.scripts.container.child.add(new pi.element("DIV").child.add(new pi.element("DIV").attribute.addClass("LineNumber").update(i+1),new pi.element("DIV").attribute.addClass("Code").update(" "+source[i]),new pi.element("DIV").environment.addStyle({"clear":"both"})))}}}},toggleLineNumbers:function(){with(firebug){d.scripts.lineNumbers=!d.scripts.lineNumbers;el.button.scripts.lineNumbers.attribute[(d.scripts.lineNumbers?"add":"remove")+"Class"]("Enabled");d.scripts.open(d.scripts.index)}},refresh:function(){with(firebug){el.button.scripts.selectbox.clean();var collection=document.getElementsByTagName("script");for(var i=0;i<collection.length;i++){var item=collection[i];d.scripts.index=d.scripts.index<0?i:d.scripts.index;el.button.scripts.selectbox.child.add(new pi.element("OPTION").attribute.set("value",i).update(item.src||item.baseURI||".."))}d.scripts.open(d.scripts.index)}}},str:{open:function(_str){with(firebug){d.navigate("str");el.left.str.container.update(_str.replace(/\n/g,"<br />"))}}},xhr:{objects:[],addObject:function(){with(firebug){for(var i=0;i<arguments.length;i++){try{var item=arguments[i];var val=eval(item);d.xhr.objects.push([item,val])}catch(e){continue}}}},open:function(){with(firebug){el.left.xhr.container.update("");el.left.xhr.name=new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").attribute.addClass("Block").environment.addStyle({"width":"20%"}).insert(el.left.xhr.container));el.left.xhr.nameTitle=new pi.element("STRONG").update("Object Name:").insert(el.left.xhr.name);el.left.xhr.nameContent=new pi.element("DIV").insert(el.left.xhr.name);el.left.xhr.status=new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").attribute.addClass("Block").environment.addStyle({"width":"10%"}).insert(el.left.xhr.container));el.left.xhr.statusTitle=new pi.element("STRONG").update("Status:").insert(el.left.xhr.status);el.left.xhr.statusContent=new pi.element("DIV").insert(el.left.xhr.status);el.left.xhr.readystate=new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").environment.addStyle({"width":"15%"}).attribute.addClass("Block").insert(el.left.xhr.container));el.left.xhr.readystateTitle=el.left.xhr.nameTitle=new pi.element("STRONG").update("Ready State:").insert(el.left.xhr.readystate);el.left.xhr.readystateContent=new pi.element("DIV").insert(el.left.xhr.readystate);el.left.xhr.response=new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").environment.addStyle({"width":(pi.env.ie?"50":"55")+"%"}).attribute.addClass("Block").insert(el.left.xhr.container));el.left.xhr.responseTitle=new pi.element("STRONG").update("Response:").insert(el.left.xhr.response);el.left.xhr.responseContent=new pi.element("DIV").insert(el.left.xhr.response);setTimeout(d.xhr.refresh,500)}},refresh:function(){with(firebug){el.left.xhr.nameContent.update("");el.left.xhr.statusContent.update("");el.left.xhr.readystateContent.update("");el.left.xhr.responseContent.update("");for(var i=0;i<d.xhr.objects.length;i++){var item=d.xhr.objects[i];var response=item[1].responseText;if(Boolean(item[1])==false)continue;el.left.xhr.nameContent.child.add(new pi.element("span").update(item[0]));try{el.left.xhr.statusContent.child.add(new pi.element("span").update(item[1].status))}catch(e){el.left.xhr.statusContent.child.add(new pi.element("span").update(" "))}el.left.xhr.readystateContent.child.add(new pi.element("span").update(item[1].readyState));el.left.xhr.responseContent.child.add(new pi.element("span").child.add(new pi.element("A").event.addListener("click",d.str.open.curry(window,response)).update(" "+response.substring(0,50))))};if(env.dIndex=="xhr")setTimeout(d.xhr.refresh,500)}}},navigateRightColumn:function(_index,_open){with(firebug){el.left.container.environment.addStyle({"width":_open?"70%":"100%"});el.right.container.environment.addStyle({"display":_open?"block":"none"})}},navigate:function(_index){with(firebug){var open=_index,close=env.dIndex;env.dIndex=open;el.button[close].container.environment.addStyle({"display":"none"});el.left[close].container.environment.addStyle({"display":"none"});el.right[close].container.environment.addStyle({"display":"none"});el.button[open].container.environment.addStyle({"display":"inline"});el.left[open].container.environment.addStyle({"display":"block"});el.right[open].container.environment.addStyle({"display":"block"});if(el.nav[close])el.nav[close].attribute.removeClass("Selected");if(el.nav[open])el.nav[open].attribute.addClass("Selected");switch(open){case"console":d.navigateRightColumn(_index);break;case"html":d.navigateRightColumn(_index,true);d.html.openHtmlTree();break;case"css":d.navigateRightColumn(_index,true);d.css.refresh();break;case"scripts":d.navigateRightColumn(_index);d.scripts.refresh();break;case"dom":d.navigateRightColumn(_index);if(el.left.dom.container.environment.getElement().innerHTML=="")d.dom.open(eval(el.button.dom.textbox.environment.getElement().value),el.left.dom.container);break;case"xhr":d.navigateRightColumn(_index);d.xhr.open();break}}},refreshSize:function(){with(firebug){el.main.environment.addStyle({"width":pi.util.GetWindowSize().width+"px"});if(pi.env.ie6)el.main.environment.addStyle({"top":pi.util.GetWindowSize().height-el.main.environment.getSize().offsetHeight+"px"})}}},getDomain:function(_url){return _url.match(/http:\/\/(www.)?([\.\w]+)/)[2]},listen:{addXhrObject:function(){with(firebug){d.xhr.addObject.apply(window,el.button.xhr.textbox.environment.getElement().value.split(","))}},consoleTextbox:function(_event){with(firebug){if(_event.keyCode==13&&(env.multilinemode==false||_event.shiftKey==false)){d.console.historyIndex=d.console.history.length;d.console.run(el.left.console.input.environment.getElement().value);return false}if([13,38,40].indexOf(_event.keyCode)==-1)return;d.console.historyIndex+=_event.keyCode!=40?0:d.console.historyIndex==d.console.history.length?0:1;d.console.historyIndex-=_event.keyCode!=38?0:d.console.historyIndex==0?0:1;el.left.console.input.update(d.console.history.length>d.console.historyIndex?d.console.history[d.console.historyIndex]:"")}},cssSelectbox:function(){with(firebug){d.css.open(el.button.css.selectbox.environment.getElement().selectedIndex)}},domTextbox:function(_event){with(firebug){if(_event.keyCode==13){d.dom.open(eval(el.button.dom.textbox.environment.getElement().value),el.left.dom.container)}}},inspector:function(){with(firebug){d.html.inspect(d.inspector.el)}},keyboard:function(_event){with(firebug){if(_event.keyCode==27&&d.inspector.enabled)d.inspector.toggle()}},mouse:function(_event){with(firebug){var target=_event[pi.env.ie?"srcElement":"target"];if(d.inspector.enabled&&target!=document.body&&target!=document.firstChild&&target!=document.childNodes[1]&&target!=el.borderInspector.environment.getElement()&&target!=el.main.environment.getElement()&&target.offsetParent!=el.main.environment.getElement())d.inspector.inspect(target)}},runMultiline:function(){with(firebug){d.console.run.call(window,el.right.console.input.environment.getElement().value)}},runCSS:function(){with(firebug){var source=el.right.css.input.environment.getElement().value.replace(/\n|\t/g,"").split("}");for(var i=0;i<source.length;i++){var item=source[i]+"}",rule=!pi.env.ie?item:item.split(/{|}/),collection=document.getElementsByTagName("style"),style=collection.length>0?collection[0]:document.body.appendChild(document.createElement("style"));if(!item.match(/.+\{.+\}/))continue;if(pi.env.ie)style.styleSheet.addRule(rule[0],rule[1]);else style.sheet.insertRule(rule,style.sheet.cssRules.length)}}},scriptsSelectbox:function(){with(firebug){d.scripts.open(parseInt(el.button.scripts.selectbox.environment.getElement().value))}},xhrTextbox:function(_event){with(firebug){if(_event.keyCode==13){d.xhr.addObject.apply(window,el.button.xhr.textbox.environment.getElement().value.split(","))}}}}};window.console=firebug.d.console;pi.util.AddEvent(window,"resize",firebug.d.refreshSize);pi.util.AddEvent(document,"mousemove",firebug.listen.mouse);pi.util.AddEvent(document,"keydown",firebug.listen.keyboard);pi.util.DOMContentLoaded.push(firebug.init);
\ No newline at end of file
--- /dev/null
+(function(){
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+
+// Map over jQuery in case of overwrite
+var _jQuery = window.jQuery,
+// Map over the $ in case of overwrite
+ _$ = window.$;
+
+var jQuery = window.jQuery = window.$ = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context );
+};
+
+// A simple way to check for HTML strings or ID strings
+// (both of which we optimize for)
+var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
+
+// Is it a simple selector
+ isSimple = /^.[^:#\[\.]*$/,
+
+// Will speed up references to undefined, and allows munging its name.
+ undefined;
+
+jQuery.fn = jQuery.prototype = {
+ init: function( selector, context ) {
+ // Make sure that a selection was provided
+ selector = selector || document;
+
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this[0] = selector;
+ this.length = 1;
+ return this;
+ }
+ // Handle HTML strings
+ if ( typeof selector == "string" ) {
+ // Are we dealing with HTML string or an ID?
+ var match = quickExpr.exec( selector );
+
+ // Verify a match, and that no context was specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] )
+ selector = jQuery.clean( [ match[1] ], context );
+
+ // HANDLE: $("#id")
+ else {
+ var elem = document.getElementById( match[3] );
+
+ // Make sure an element was located
+ if ( elem ){
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id != match[3] )
+ return jQuery().find( selector );
+
+ // Otherwise, we inject the element directly into the jQuery object
+ return jQuery( elem );
+ }
+ selector = [];
+ }
+
+ // HANDLE: $(expr, [context])
+ // (which is just equivalent to: $(content).find(expr)
+ } else
+ return jQuery( context ).find( selector );
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) )
+ return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
+
+ return this.setArray(jQuery.makeArray(selector));
+ },
+
+ // The current version of jQuery being used
+ jquery: "1.2.6",
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ // The number of elements contained in the matched element set
+ length: 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 == undefined ?
+
+ // Return a 'clean' array
+ jQuery.makeArray( this ) :
+
+ // Return just the object
+ this[ num ];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+ // Build a new jQuery matched element set
+ var ret = jQuery( elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Force the current matched set of elements to become
+ // the specified array of elements (destroying the stack in the process)
+ // You should use pushStack() in order to do this, but maintain the stack
+ setArray: function( elems ) {
+ // Resetting the length to 0, then using the native Array push
+ // is a super-fast way to populate an object with array-like properties
+ this.length = 0;
+ Array.prototype.push.apply( this, elems );
+
+ return this;
+ },
+
+ // 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 );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+ var ret = -1;
+
+ // Locate the position of the desired element
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem && elem.jquery ? elem[0] : elem
+ , this );
+ },
+
+ attr: function( name, value, type ) {
+ var options = name;
+
+ // Look for the case where we're accessing a style value
+ if ( name.constructor == String )
+ if ( value === undefined )
+ return this[0] && jQuery[ type || "attr" ]( this[0], name );
+
+ else {
+ options = {};
+ options[ name ] = value;
+ }
+
+ // Check to see if we're setting style values
+ return this.each(function(i){
+ // Set all the styles
+ for ( name in options )
+ jQuery.attr(
+ type ?
+ this.style :
+ this,
+ name, jQuery.prop( this, options[ name ], type, i, name )
+ );
+ });
+ },
+
+ css: function( key, value ) {
+ // ignore negative width and height values
+ if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
+ value = undefined;
+ return this.attr( key, value, "curCSS" );
+ },
+
+ text: function( text ) {
+ if ( typeof text != "object" && text != null )
+ return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+
+ var ret = "";
+
+ jQuery.each( text || this, function(){
+ jQuery.each( this.childNodes, function(){
+ if ( this.nodeType != 8 )
+ ret += this.nodeType != 1 ?
+ this.nodeValue :
+ jQuery.fn.text( [ this ] );
+ });
+ });
+
+ return ret;
+ },
+
+ wrapAll: function( html ) {
+ if ( this[0] )
+ // The elements to wrap the target around
+ jQuery( html, this[0].ownerDocument )
+ .clone()
+ .insertBefore( this[0] )
+ .map(function(){
+ var elem = this;
+
+ while ( elem.firstChild )
+ elem = elem.firstChild;
+
+ return elem;
+ })
+ .append(this);
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ return this.each(function(){
+ jQuery( this ).contents().wrapAll( html );
+ });
+ },
+
+ wrap: function( html ) {
+ return this.each(function(){
+ jQuery( this ).wrapAll( html );
+ });
+ },
+
+ append: function() {
+ return this.domManip(arguments, true, false, function(elem){
+ if (this.nodeType == 1)
+ this.appendChild( elem );
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, true, function(elem){
+ if (this.nodeType == 1)
+ this.insertBefore( elem, this.firstChild );
+ });
+ },
+
+ before: function() {
+ return this.domManip(arguments, false, false, function(elem){
+ this.parentNode.insertBefore( elem, this );
+ });
+ },
+
+ after: function() {
+ return this.domManip(arguments, false, true, function(elem){
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ });
+ },
+
+ end: function() {
+ return this.prevObject || jQuery( [] );
+ },
+
+ find: function( selector ) {
+ var elems = jQuery.map(this, function(elem){
+ return jQuery.find( selector, elem );
+ });
+
+ return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
+ jQuery.unique( elems ) :
+ elems );
+ },
+
+ clone: function( events ) {
+ // Do the clone
+ var ret = this.map(function(){
+ if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
+ // IE copies events bound via attachEvent when
+ // using cloneNode. Calling detachEvent on the
+ // clone will also remove the events from the orignal
+ // In order to get around this, we use innerHTML.
+ // Unfortunately, this means some modifications to
+ // attributes in IE that are actually only stored
+ // as properties will not be copied (such as the
+ // the name attribute on an input).
+ var clone = this.cloneNode(true),
+ container = document.createElement("div");
+ container.appendChild(clone);
+ return jQuery.clean([container.innerHTML])[0];
+ } else
+ return this.cloneNode(true);
+ });
+
+ // Need to set the expando to null on the cloned set if it exists
+ // removeData doesn't work here, IE removes it from the original as well
+ // this is primarily for IE but the data expando shouldn't be copied over in any browser
+ var clone = ret.find("*").andSelf().each(function(){
+ if ( this[ expando ] != undefined )
+ this[ expando ] = null;
+ });
+
+ // Copy the events from the original to the clone
+ if ( events === true )
+ this.find("*").andSelf().each(function(i){
+ if (this.nodeType == 3)
+ return;
+ var events = jQuery.data( this, "events" );
+
+ for ( var type in events )
+ for ( var handler in events[ type ] )
+ jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
+ });
+
+ // Return the cloned set
+ return ret;
+ },
+
+ filter: function( selector ) {
+ return this.pushStack(
+ jQuery.isFunction( selector ) &&
+ jQuery.grep(this, function(elem, i){
+ return selector.call( elem, i );
+ }) ||
+
+ jQuery.multiFilter( selector, this ) );
+ },
+
+ not: function( selector ) {
+ if ( selector.constructor == String )
+ // test special case where just one selector is passed in
+ if ( isSimple.test( selector ) )
+ return this.pushStack( jQuery.multiFilter( selector, this, true ) );
+ else
+ selector = jQuery.multiFilter( selector, this );
+
+ var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
+ return this.filter(function() {
+ return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
+ });
+ },
+
+ add: function( selector ) {
+ return this.pushStack( jQuery.unique( jQuery.merge(
+ this.get(),
+ typeof selector == 'string' ?
+ jQuery( selector ) :
+ jQuery.makeArray( selector )
+ )));
+ },
+
+ is: function( selector ) {
+ return !!selector && jQuery.multiFilter( selector, this ).length > 0;
+ },
+
+ hasClass: function( selector ) {
+ return this.is( "." + selector );
+ },
+
+ val: function( value ) {
+ if ( value == undefined ) {
+
+ if ( this.length ) {
+ var elem = this[0];
+
+ // We need to handle select boxes special
+ if ( jQuery.nodeName( elem, "select" ) ) {
+ var 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
+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+ var option = options[ i ];
+
+ if ( option.selected ) {
+ // Get the specifc value for the option
+ value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
+
+ // We don't need an array for one selects
+ if ( one )
+ return value;
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+
+ // Everything else, we just grab the value
+ } else
+ return (this[0].value || "").replace(/\r/g, "");
+
+ }
+
+ return undefined;
+ }
+
+ if( value.constructor == Number )
+ value += '';
+
+ return this.each(function(){
+ if ( this.nodeType != 1 )
+ return;
+
+ if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
+ this.checked = (jQuery.inArray(this.value, value) >= 0 ||
+ jQuery.inArray(this.name, value) >= 0);
+
+ else if ( jQuery.nodeName( this, "select" ) ) {
+ var values = jQuery.makeArray(value);
+
+ jQuery( "option", this ).each(function(){
+ this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
+ jQuery.inArray( this.text, values ) >= 0);
+ });
+
+ if ( !values.length )
+ this.selectedIndex = -1;
+
+ } else
+ this.value = value;
+ });
+ },
+
+ html: function( value ) {
+ return value == undefined ?
+ (this[0] ?
+ this[0].innerHTML :
+ null) :
+ this.empty().append( value );
+ },
+
+ replaceWith: function( value ) {
+ return this.after( value ).remove();
+ },
+
+ eq: function( i ) {
+ return this.slice( i, i + 1 );
+ },
+
+ slice: function() {
+ return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function(elem, i){
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ andSelf: function() {
+ return this.add( this.prevObject );
+ },
+
+ data: function( key, value ){
+ var parts = key.split(".");
+ parts[1] = parts[1] ? "." + parts[1] : "";
+
+ if ( value === undefined ) {
+ var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+ if ( data === undefined && this.length )
+ data = jQuery.data( this[0], key );
+
+ return data === undefined && parts[1] ?
+ this.data( parts[0] ) :
+ data;
+ } else
+ return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
+ jQuery.data( this, key, value );
+ });
+ },
+
+ removeData: function( key ){
+ return this.each(function(){
+ jQuery.removeData( this, key );
+ });
+ },
+
+ domManip: function( args, table, reverse, callback ) {
+ var clone = this.length > 1, elems;
+
+ return this.each(function(){
+ if ( !elems ) {
+ elems = jQuery.clean( args, this.ownerDocument );
+
+ if ( reverse )
+ elems.reverse();
+ }
+
+ var obj = this;
+
+ if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
+ obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
+
+ var scripts = jQuery( [] );
+
+ jQuery.each(elems, function(){
+ var elem = clone ?
+ jQuery( this ).clone( true )[0] :
+ this;
+
+ // execute all scripts after the elements have been injected
+ if ( jQuery.nodeName( elem, "script" ) )
+ scripts = scripts.add( elem );
+ else {
+ // Remove any inner scripts for later evaluation
+ if ( elem.nodeType == 1 )
+ scripts = scripts.add( jQuery( "script", elem ).remove() );
+
+ // Inject the elements into the document
+ callback.call( obj, elem );
+ }
+ });
+
+ scripts.each( evalScript );
+ });
+ }
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+function evalScript( i, elem ) {
+ if ( elem.src )
+ jQuery.ajax({
+ url: elem.src,
+ async: false,
+ dataType: "script"
+ });
+
+ else
+ jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+
+ if ( elem.parentNode )
+ elem.parentNode.removeChild( elem );
+}
+
+function now(){
+ return +new Date;
+}
+
+jQuery.extend = jQuery.fn.extend = function() {
+ // copy reference to target object
+ var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
+
+ // Handle a deep copy situation
+ if ( target.constructor == 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 copy)
+ if ( typeof target != "object" && typeof target != "function" )
+ 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 ( var name in options ) {
+ var src = target[ name ], copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy )
+ continue;
+
+ // Recurse if we're merging object values
+ if ( deep && copy && typeof copy == "object" && !copy.nodeType )
+ target[ name ] = jQuery.extend( deep,
+ // Never move original objects, clone them
+ src || ( copy.length != null ? [ ] : { } )
+ , copy );
+
+ // Don't bring in undefined values
+ else if ( copy !== undefined )
+ target[ name ] = copy;
+
+ }
+
+ // Return the modified object
+ return target;
+};
+
+var expando = "jQuery" + now(), uuid = 0, windowData = {},
+ // exclude the following css properties to add px
+ exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+ // cache defaultView
+ defaultView = document.defaultView || {};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ window.$ = _$;
+
+ if ( deep )
+ window.jQuery = _jQuery;
+
+ return jQuery;
+ },
+
+ // See test/unit/core.js for details concerning this function.
+ isFunction: function( fn ) {
+ return !!fn && typeof fn != "string" && !fn.nodeName &&
+ fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
+ },
+
+ // check if an element is in a (or is an) XML document
+ isXMLDoc: function( elem ) {
+ return elem.documentElement && !elem.body ||
+ elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
+ },
+
+ // Evalulates a script in a global context
+ globalEval: function( data ) {
+ data = jQuery.trim( data );
+
+ if ( data ) {
+ // Inspired by code by Andrea Giammarchi
+ // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+ var head = document.getElementsByTagName("head")[0] || document.documentElement,
+ script = document.createElement("script");
+
+ script.type = "text/javascript";
+ if ( jQuery.browser.msie )
+ script.text = data;
+ else
+ script.appendChild( document.createTextNode( data ) );
+
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709).
+ head.insertBefore( script, head.firstChild );
+ head.removeChild( script );
+ }
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
+ },
+
+ cache: {},
+
+ data: function( elem, name, data ) {
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var id = elem[ expando ];
+
+ // Compute a unique ID for the element
+ if ( !id )
+ id = elem[ expando ] = ++uuid;
+
+ // Only generate the data cache if we're
+ // trying to access or manipulate it
+ if ( name && !jQuery.cache[ id ] )
+ jQuery.cache[ id ] = {};
+
+ // Prevent overriding the named cache with undefined values
+ if ( data !== undefined )
+ jQuery.cache[ id ][ name ] = data;
+
+ // Return the named cache data, or the ID for the element
+ return name ?
+ jQuery.cache[ id ][ name ] :
+ id;
+ },
+
+ removeData: function( elem, name ) {
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var id = elem[ expando ];
+
+ // If we want to remove a specific section of the element's data
+ if ( name ) {
+ if ( jQuery.cache[ id ] ) {
+ // Remove the section of cache data
+ delete jQuery.cache[ id ][ name ];
+
+ // If we've removed all the data, remove the element's cache
+ name = "";
+
+ for ( name in jQuery.cache[ id ] )
+ break;
+
+ if ( !name )
+ jQuery.removeData( elem );
+ }
+
+ // Otherwise, we want to remove all of the element's data
+ } else {
+ // Clean up the element expando
+ try {
+ delete elem[ expando ];
+ } catch(e){
+ // IE has trouble directly removing the expando
+ // but it's ok with using removeAttribute
+ if ( elem.removeAttribute )
+ elem.removeAttribute( expando );
+ }
+
+ // Completely remove the data cache
+ delete jQuery.cache[ id ];
+ }
+ },
+
+ // args is for internal usage only
+ each: function( object, callback, args ) {
+ var name, i = 0, length = object.length;
+
+ if ( args ) {
+ if ( length == undefined ) {
+ for ( name in object )
+ if ( callback.apply( object[ name ], args ) === false )
+ break;
+ } else
+ for ( ; i < length; )
+ if ( callback.apply( object[ i++ ], args ) === false )
+ break;
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( length == undefined ) {
+ for ( name in object )
+ if ( callback.call( object[ name ], name, object[ name ] ) === false )
+ break;
+ } else
+ for ( var value = object[0];
+ i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
+ }
+
+ return object;
+ },
+
+ prop: function( elem, value, type, i, name ) {
+ // Handle executable functions
+ if ( jQuery.isFunction( value ) )
+ value = value.call( elem, i );
+
+ // Handle passing in a number to a CSS property
+ return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
+ value + "px" :
+ value;
+ },
+
+ className: {
+ // internal only, use addClass("class")
+ add: function( elem, classNames ) {
+ jQuery.each((classNames || "").split(/\s+/), function(i, className){
+ if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
+ elem.className += (elem.className ? " " : "") + className;
+ });
+ },
+
+ // internal only, use removeClass("class")
+ remove: function( elem, classNames ) {
+ if (elem.nodeType == 1)
+ elem.className = classNames != undefined ?
+ jQuery.grep(elem.className.split(/\s+/), function(className){
+ return !jQuery.className.has( classNames, className );
+ }).join(" ") :
+ "";
+ },
+
+ // internal only, use hasClass("class")
+ has: function( elem, className ) {
+ return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
+ }
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations
+ swap: function( elem, options, callback ) {
+ var old = {};
+ // Remember the old values, and insert the new ones
+ for ( var name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ callback.call( elem );
+
+ // Revert the old values
+ for ( var name in options )
+ elem.style[ name ] = old[ name ];
+ },
+
+ css: function( elem, name, force ) {
+ if ( name == "width" || name == "height" ) {
+ var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
+
+ function getWH() {
+ val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
+ var padding = 0, border = 0;
+ jQuery.each( which, function() {
+ padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+ border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+ });
+ val -= Math.round(padding + border);
+ }
+
+ if ( jQuery(elem).is(":visible") )
+ getWH();
+ else
+ jQuery.swap( elem, props, getWH );
+
+ return Math.max(0, val);
+ }
+
+ return jQuery.curCSS( elem, name, force );
+ },
+
+ curCSS: function( elem, name, force ) {
+ var ret, style = elem.style;
+
+ // A helper method for determining if an element's values are broken
+ function color( elem ) {
+ if ( !jQuery.browser.safari )
+ return false;
+
+ // defaultView is cached
+ var ret = defaultView.getComputedStyle( elem, null );
+ return !ret || ret.getPropertyValue("color") == "";
+ }
+
+ // We need to handle opacity special in IE
+ if ( name == "opacity" && jQuery.browser.msie ) {
+ ret = jQuery.attr( style, "opacity" );
+
+ return ret == "" ?
+ "1" :
+ ret;
+ }
+ // Opera sometimes will give the wrong display answer, this fixes it, see #2037
+ if ( jQuery.browser.opera && name == "display" ) {
+ var save = style.outline;
+ style.outline = "0 solid black";
+ style.outline = save;
+ }
+
+ // Make sure we're using the right name for getting the float value
+ if ( name.match( /float/i ) )
+ name = styleFloat;
+
+ if ( !force && style && style[ name ] )
+ ret = style[ name ];
+
+ else if ( defaultView.getComputedStyle ) {
+
+ // Only "float" is needed here
+ if ( name.match( /float/i ) )
+ name = "float";
+
+ name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
+
+ var computedStyle = defaultView.getComputedStyle( elem, null );
+
+ if ( computedStyle && !color( elem ) )
+ ret = computedStyle.getPropertyValue( name );
+
+ // If the element isn't reporting its values properly in Safari
+ // then some display: none elements are involved
+ else {
+ var swap = [], stack = [], a = elem, i = 0;
+
+ // Locate all of the parent display: none elements
+ for ( ; a && color(a); a = a.parentNode )
+ stack.unshift(a);
+
+ // Go through and make them visible, but in reverse
+ // (It would be better if we knew the exact display type that they had)
+ for ( ; i < stack.length; i++ )
+ if ( color( stack[ i ] ) ) {
+ swap[ i ] = stack[ i ].style.display;
+ stack[ i ].style.display = "block";
+ }
+
+ // Since we flip the display style, we have to handle that
+ // one special, otherwise get the value
+ ret = name == "display" && swap[ stack.length - 1 ] != null ?
+ "none" :
+ ( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
+
+ // Finally, revert the display styles back
+ for ( i = 0; i < swap.length; i++ )
+ if ( swap[ i ] != null )
+ stack[ i ].style.display = swap[ i ];
+ }
+
+ // We should always get a number back from opacity
+ if ( name == "opacity" && ret == "" )
+ ret = "1";
+
+ } else if ( elem.currentStyle ) {
+ var camelCase = name.replace(/\-(\w)/g, function(all, letter){
+ return letter.toUpperCase();
+ });
+
+ ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
+
+ // From the awesome hack by Dean Edwards
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+ // If we're not dealing with a regular pixel number
+ // but a number that has a weird ending, we need to convert it to pixels
+ if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
+ // Remember the original values
+ var left = style.left, rsLeft = elem.runtimeStyle.left;
+
+ // Put in the new values to get a computed value out
+ elem.runtimeStyle.left = elem.currentStyle.left;
+ style.left = ret || 0;
+ ret = style.pixelLeft + "px";
+
+ // Revert the changed values
+ style.left = left;
+ elem.runtimeStyle.left = rsLeft;
+ }
+ }
+
+ return ret;
+ },
+
+ clean: function( elems, context ) {
+ var ret = [];
+ context = context || document;
+ // !context.createElement fails in IE with an error but returns typeof 'object'
+ if (typeof context.createElement == 'undefined')
+ context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+
+ jQuery.each(elems, function(i, elem){
+ if ( !elem )
+ return;
+
+ if ( elem.constructor == Number )
+ elem += '';
+
+ // Convert html string into DOM nodes
+ if ( typeof elem == "string" ) {
+ // Fix "XHTML"-style tags in all browsers
+ elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
+ return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
+ all :
+ front + "></" + tag + ">";
+ });
+
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
+
+ var wrap =
+ // option or optgroup
+ !tags.indexOf("<opt") &&
+ [ 1, "<select multiple='multiple'>", "</select>" ] ||
+
+ !tags.indexOf("<leg") &&
+ [ 1, "<fieldset>", "</fieldset>" ] ||
+
+ tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
+ [ 1, "<table>", "</table>" ] ||
+
+ !tags.indexOf("<tr") &&
+ [ 2, "<table><tbody>", "</tbody></table>" ] ||
+
+ // <thead> matched above
+ (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
+ [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
+
+ !tags.indexOf("<col") &&
+ [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
+
+ // IE can't serialize <link> and <script> tags normally
+ jQuery.browser.msie &&
+ [ 1, "div<div>", "</div>" ] ||
+
+ [ 0, "", "" ];
+
+ // Go to html and back, then peel off extra wrappers
+ div.innerHTML = wrap[1] + elem + wrap[2];
+
+ // Move to the right depth
+ while ( wrap[0]-- )
+ div = div.lastChild;
+
+ // Remove IE's autoinserted <tbody> from table fragments
+ if ( jQuery.browser.msie ) {
+
+ // String was a <table>, *may* have spurious <tbody>
+ var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
+ div.firstChild && div.firstChild.childNodes :
+
+ // String was a bare <thead> or <tfoot>
+ wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
+ div.childNodes :
+ [];
+
+ for ( var j = tbody.length - 1; j >= 0 ; --j )
+ if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
+ tbody[ j ].parentNode.removeChild( tbody[ j ] );
+
+ // IE completely kills leading whitespace when innerHTML is used
+ if ( /^\s/.test( elem ) )
+ div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
+
+ }
+
+ elem = jQuery.makeArray( div.childNodes );
+ }
+
+ if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
+ return;
+
+ if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
+ ret.push( elem );
+
+ else
+ ret = jQuery.merge( ret, elem );
+
+ });
+
+ return ret;
+ },
+
+ attr: function( elem, name, value ) {
+ // don't set attributes on text and comment nodes
+ if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
+ return undefined;
+
+ var notxml = !jQuery.isXMLDoc( elem ),
+ // Whether we are setting (or getting)
+ set = value !== undefined,
+ msie = jQuery.browser.msie;
+
+ // Try to normalize/fix the name
+ name = notxml && jQuery.props[ name ] || name;
+
+ // Only do all the following if this is a node (faster for style)
+ // IE elem.getAttribute passes even for style
+ if ( elem.tagName ) {
+
+ // These attributes require special treatment
+ var special = /href|src|style/.test( name );
+
+ // Safari mis-reports the default selected property of a hidden option
+ // Accessing the parent's selectedIndex property fixes it
+ if ( name == "selected" && jQuery.browser.safari )
+ elem.parentNode.selectedIndex;
+
+ // If applicable, access the attribute via the DOM 0 way
+ if ( name in elem && notxml && !special ) {
+ if ( set ){
+ // We can't allow the type property to be changed (since it causes problems in IE)
+ if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
+ throw "type property can't be changed";
+
+ elem[ name ] = value;
+ }
+
+ // browsers index elements by id/name on forms, give priority to attributes.
+ if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
+ return elem.getAttributeNode( name ).nodeValue;
+
+ return elem[ name ];
+ }
+
+ if ( msie && notxml && name == "style" )
+ return jQuery.attr( elem.style, "cssText", value );
+
+ if ( set )
+ // convert the value to a string (all browsers do this but IE) see #1070
+ elem.setAttribute( name, "" + value );
+
+ var attr = msie && notxml && special
+ // Some attributes require a special call on IE
+ ? elem.getAttribute( name, 2 )
+ : elem.getAttribute( name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return attr === null ? undefined : attr;
+ }
+
+ // elem is actually elem.style ... set the style
+
+ // IE uses filters for opacity
+ if ( msie && name == "opacity" ) {
+ if ( set ) {
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ elem.zoom = 1;
+
+ // Set the alpha filter to set the opacity
+ elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
+ (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+ }
+
+ return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
+ (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
+ "";
+ }
+
+ name = name.replace(/-([a-z])/ig, function(all, letter){
+ return letter.toUpperCase();
+ });
+
+ if ( set )
+ elem[ name ] = value;
+
+ return elem[ name ];
+ },
+
+ trim: function( text ) {
+ return (text || "").replace( /^\s+|\s+$/g, "" );
+ },
+
+ makeArray: function( array ) {
+ var ret = [];
+
+ if( array != null ){
+ var i = array.length;
+ //the window, strings and functions also have 'length'
+ if( i == null || array.split || array.setInterval || array.call )
+ ret[0] = array;
+ else
+ while( i )
+ ret[--i] = array[i];
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, array ) {
+ for ( var i = 0, length = array.length; i < length; i++ )
+ // Use === because on IE, window == document
+ if ( array[ i ] === elem )
+ return i;
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ // We have to loop this way because IE & Opera overwrite the length
+ // expando of getElementsByTagName
+ var i = 0, elem, pos = first.length;
+ // Also, we need to make sure that the correct elements are being returned
+ // (IE returns comment nodes in a '*' query)
+ if ( jQuery.browser.msie ) {
+ while ( elem = second[ i++ ] )
+ if ( elem.nodeType != 8 )
+ first[ pos++ ] = elem;
+
+ } else
+ while ( elem = second[ i++ ] )
+ first[ pos++ ] = elem;
+
+ return first;
+ },
+
+ unique: function( array ) {
+ var ret = [], done = {};
+
+ try {
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ var id = jQuery.data( array[ i ] );
+
+ if ( !done[ id ] ) {
+ done[ id ] = true;
+ ret.push( array[ i ] );
+ }
+ }
+
+ } catch( e ) {
+ ret = array;
+ }
+
+ return ret;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var ret = [];
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( var i = 0, length = elems.length; i < length; i++ )
+ if ( !inv != !callback( elems[ i ], i ) )
+ ret.push( elems[ i ] );
+
+ return ret;
+ },
+
+ map: function( elems, callback ) {
+ var ret = [];
+
+ // Go through the array, translating each of the items to their
+ // new value (or values).
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ var value = callback( elems[ i ], i );
+
+ if ( value != null )
+ ret[ ret.length ] = value;
+ }
+
+ return ret.concat.apply( [], ret );
+ }
+});
+
+var userAgent = navigator.userAgent.toLowerCase();
+
+// Figure out what browser is being used
+jQuery.browser = {
+ version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
+ safari: /webkit/.test( userAgent ),
+ opera: /opera/.test( userAgent ),
+ msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
+ mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
+};
+
+var styleFloat = jQuery.browser.msie ?
+ "styleFloat" :
+ "cssFloat";
+
+jQuery.extend({
+ // Check to see if the W3C box model is being used
+ boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
+
+ props: {
+ "for": "htmlFor",
+ "class": "className",
+ "float": styleFloat,
+ cssFloat: styleFloat,
+ styleFloat: styleFloat,
+ readonly: "readOnly",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing"
+ }
+});
+
+jQuery.each({
+ parent: function(elem){return elem.parentNode;},
+ parents: function(elem){return jQuery.dir(elem,"parentNode");},
+ 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");},
+ siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
+ 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( selector ) {
+ var ret = jQuery.map( this, fn );
+
+ if ( selector && typeof selector == "string" )
+ ret = jQuery.multiFilter( selector, ret );
+
+ return this.pushStack( jQuery.unique( ret ) );
+ };
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function(name, original){
+ jQuery.fn[ name ] = function() {
+ var args = arguments;
+
+ return this.each(function(){
+ for ( var i = 0, length = args.length; i < length; i++ )
+ jQuery( args[ i ] )[ original ]( this );
+ });
+ };
+});
+
+jQuery.each({
+ removeAttr: function( name ) {
+ jQuery.attr( this, name, "" );
+ if (this.nodeType == 1)
+ this.removeAttribute( name );
+ },
+
+ addClass: function( classNames ) {
+ jQuery.className.add( this, classNames );
+ },
+
+ removeClass: function( classNames ) {
+ jQuery.className.remove( this, classNames );
+ },
+
+ toggleClass: function( classNames ) {
+ jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );
+ },
+
+ remove: function( selector ) {
+ if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
+ // Prevent memory leaks
+ jQuery( "*", this ).add(this).each(function(){
+ jQuery.event.remove(this);
+ jQuery.removeData(this);
+ });
+ if (this.parentNode)
+ this.parentNode.removeChild( this );
+ }
+ },
+
+ empty: function() {
+ // Remove element nodes and prevent memory leaks
+ jQuery( ">*", this ).remove();
+
+ // Remove any remaining nodes
+ while ( this.firstChild )
+ this.removeChild( this.firstChild );
+ }
+}, function(name, fn){
+ jQuery.fn[ name ] = function(){
+ return this.each( fn, arguments );
+ };
+});
+
+jQuery.each([ "Height", "Width" ], function(i, name){
+ var type = name.toLowerCase();
+
+ jQuery.fn[ type ] = function( size ) {
+ // Get window width or height
+ return this[0] == window ?
+ // Opera reports document.body.client[Width/Height] properly in both quirks and standards
+ jQuery.browser.opera && document.body[ "client" + name ] ||
+
+ // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
+ jQuery.browser.safari && window[ "inner" + name ] ||
+
+ // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+ document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
+
+ // Get document width or height
+ this[0] == document ?
+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+ Math.max(
+ Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
+ Math.max(document.body["offset" + name], document.documentElement["offset" + name])
+ ) :
+
+ // Get or set width or height on the element
+ size == undefined ?
+ // Get width or height on the element
+ (this.length ? jQuery.css( this[0], type ) : null) :
+
+ // Set the width or height on the element (default to pixels if value is unitless)
+ this.css( type, size.constructor == String ? size : size + "px" );
+ };
+});
+
+// Helper function used by the dimensions and offset modules
+function num(elem, prop) {
+ return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
+ "(?:[\\w*_-]|\\\\.)" :
+ "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
+ quickChild = new RegExp("^>\\s*(" + chars + "+)"),
+ quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
+ quickClass = new RegExp("^([#.]?)(" + chars + "*)");
+
+jQuery.extend({
+ expr: {
+ "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},
+ "#": function(a,i,m){return a.getAttribute("id")==m[2];},
+ ":": {
+ // Position Checks
+ lt: function(a,i,m){return i<m[3]-0;},
+ gt: function(a,i,m){return i>m[3]-0;},
+ nth: function(a,i,m){return m[3]-0==i;},
+ eq: function(a,i,m){return m[3]-0==i;},
+ first: function(a,i){return i==0;},
+ last: function(a,i,m,r){return i==r.length-1;},
+ even: function(a,i){return i%2==0;},
+ odd: function(a,i){return i%2;},
+
+ // Child Checks
+ "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},
+ "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},
+ "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},
+
+ // Parent Checks
+ parent: function(a){return a.firstChild;},
+ empty: function(a){return !a.firstChild;},
+
+ // Text Check
+ contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},
+
+ // Visibility
+ visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},
+ hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},
+
+ // Form attributes
+ enabled: function(a){return !a.disabled;},
+ disabled: function(a){return a.disabled;},
+ checked: function(a){return a.checked;},
+ selected: function(a){return a.selected||jQuery.attr(a,"selected");},
+
+ // Form elements
+ text: function(a){return "text"==a.type;},
+ radio: function(a){return "radio"==a.type;},
+ checkbox: function(a){return "checkbox"==a.type;},
+ file: function(a){return "file"==a.type;},
+ password: function(a){return "password"==a.type;},
+ submit: function(a){return "submit"==a.type;},
+ image: function(a){return "image"==a.type;},
+ reset: function(a){return "reset"==a.type;},
+ button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},
+ input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},
+
+ // :has()
+ has: function(a,i,m){return jQuery.find(m[3],a).length;},
+
+ // :header
+ header: function(a){return /h\d/i.test(a.nodeName);},
+
+ // :animated
+ animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}
+ }
+ },
+
+ // The regular expressions that power the parsing engine
+ parse: [
+ // Match: [@value='test'], [@foo]
+ /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
+
+ // Match: :contains('foo')
+ /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
+
+ // Match: :even, :last-child, #id, .class
+ new RegExp("^([:.#]*)(" + chars + "+)")
+ ],
+
+ multiFilter: function( expr, elems, not ) {
+ var old, cur = [];
+
+ while ( expr && expr != old ) {
+ old = expr;
+ var f = jQuery.filter( expr, elems, not );
+ expr = f.t.replace(/^\s*,\s*/, "" );
+ cur = not ? elems = f.r : jQuery.merge( cur, f.r );
+ }
+
+ return cur;
+ },
+
+ find: function( t, context ) {
+ // Quickly handle non-string expressions
+ if ( typeof t != "string" )
+ return [ t ];
+
+ // check to make sure context is a DOM element or a document
+ if ( context && context.nodeType != 1 && context.nodeType != 9)
+ return [ ];
+
+ // Set the correct context (if none is provided)
+ context = context || document;
+
+ // Initialize the search
+ var ret = [context], done = [], last, nodeName;
+
+ // Continue while a selector expression exists, and while
+ // we're no longer looping upon ourselves
+ while ( t && last != t ) {
+ var r = [];
+ last = t;
+
+ t = jQuery.trim(t);
+
+ var foundToken = false,
+
+ // An attempt at speeding up child selectors that
+ // point to a specific element tag
+ re = quickChild,
+
+ m = re.exec(t);
+
+ if ( m ) {
+ nodeName = m[1].toUpperCase();
+
+ // Perform our own iteration and filter
+ for ( var i = 0; ret[i]; i++ )
+ for ( var c = ret[i].firstChild; c; c = c.nextSibling )
+ if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
+ r.push( c );
+
+ ret = r;
+ t = t.replace( re, "" );
+ if ( t.indexOf(" ") == 0 ) continue;
+ foundToken = true;
+ } else {
+ re = /^([>+~])\s*(\w*)/i;
+
+ if ( (m = re.exec(t)) != null ) {
+ r = [];
+
+ var merge = {};
+ nodeName = m[2].toUpperCase();
+ m = m[1];
+
+ for ( var j = 0, rl = ret.length; j < rl; j++ ) {
+ var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
+ for ( ; n; n = n.nextSibling )
+ if ( n.nodeType == 1 ) {
+ var id = jQuery.data(n);
+
+ if ( m == "~" && merge[id] ) break;
+
+ if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
+ if ( m == "~" ) merge[id] = true;
+ r.push( n );
+ }
+
+ if ( m == "+" ) break;
+ }
+ }
+
+ ret = r;
+
+ // And remove the token
+ t = jQuery.trim( t.replace( re, "" ) );
+ foundToken = true;
+ }
+ }
+
+ // See if there's still an expression, and that we haven't already
+ // matched a token
+ if ( t && !foundToken ) {
+ // Handle multiple expressions
+ if ( !t.indexOf(",") ) {
+ // Clean the result set
+ if ( context == ret[0] ) ret.shift();
+
+ // Merge the result sets
+ done = jQuery.merge( done, ret );
+
+ // Reset the context
+ r = ret = [context];
+
+ // Touch up the selector string
+ t = " " + t.substr(1,t.length);
+
+ } else {
+ // Optimize for the case nodeName#idName
+ var re2 = quickID;
+ var m = re2.exec(t);
+
+ // Re-organize the results, so that they're consistent
+ if ( m ) {
+ m = [ 0, m[2], m[3], m[1] ];
+
+ } else {
+ // Otherwise, do a traditional filter check for
+ // ID, class, and element selectors
+ re2 = quickClass;
+ m = re2.exec(t);
+ }
+
+ m[2] = m[2].replace(/\\/g, "");
+
+ var elem = ret[ret.length-1];
+
+ // Try to do a global search by ID, where we can
+ if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
+ // Optimization for HTML document case
+ var oid = elem.getElementById(m[2]);
+
+ // Do a quick check for the existence of the actual ID attribute
+ // to avoid selecting by the name attribute in IE
+ // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
+ if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
+ oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
+
+ // Do a quick check for node name (where applicable) so
+ // that div#foo searches will be really fast
+ ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
+ } else {
+ // We need to find all descendant elements
+ for ( var i = 0; ret[i]; i++ ) {
+ // Grab the tag name being searched for
+ var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
+
+ // Handle IE7 being really dumb about <object>s
+ if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
+ tag = "param";
+
+ r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
+ }
+
+ // It's faster to filter by class and be done with it
+ if ( m[1] == "." )
+ r = jQuery.classFilter( r, m[2] );
+
+ // Same with ID filtering
+ if ( m[1] == "#" ) {
+ var tmp = [];
+
+ // Try to find the element with the ID
+ for ( var i = 0; r[i]; i++ )
+ if ( r[i].getAttribute("id") == m[2] ) {
+ tmp = [ r[i] ];
+ break;
+ }
+
+ r = tmp;
+ }
+
+ ret = r;
+ }
+
+ t = t.replace( re2, "" );
+ }
+
+ }
+
+ // If a selector string still exists
+ if ( t ) {
+ // Attempt to filter it
+ var val = jQuery.filter(t,r);
+ ret = r = val.r;
+ t = jQuery.trim(val.t);
+ }
+ }
+
+ // An error occurred with the selector;
+ // just return an empty set instead
+ if ( t )
+ ret = [];
+
+ // Remove the root context
+ if ( ret && context == ret[0] )
+ ret.shift();
+
+ // And combine the results
+ done = jQuery.merge( done, ret );
+
+ return done;
+ },
+
+ classFilter: function(r,m,not){
+ m = " " + m + " ";
+ var tmp = [];
+ for ( var i = 0; r[i]; i++ ) {
+ var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
+ if ( !not && pass || not && !pass )
+ tmp.push( r[i] );
+ }
+ return tmp;
+ },
+
+ filter: function(t,r,not) {
+ var last;
+
+ // Look for common filter expressions
+ while ( t && t != last ) {
+ last = t;
+
+ var p = jQuery.parse, m;
+
+ for ( var i = 0; p[i]; i++ ) {
+ m = p[i].exec( t );
+
+ if ( m ) {
+ // Remove what we just matched
+ t = t.substring( m[0].length );
+
+ m[2] = m[2].replace(/\\/g, "");
+ break;
+ }
+ }
+
+ if ( !m )
+ break;
+
+ // :not() is a special case that can be optimized by
+ // keeping it out of the expression list
+ if ( m[1] == ":" && m[2] == "not" )
+ // optimize if only one selector found (most common case)
+ r = isSimple.test( m[3] ) ?
+ jQuery.filter(m[3], r, true).r :
+ jQuery( r ).not( m[3] );
+
+ // We can get a big speed boost by filtering by class here
+ else if ( m[1] == "." )
+ r = jQuery.classFilter(r, m[2], not);
+
+ else if ( m[1] == "[" ) {
+ var tmp = [], type = m[3];
+
+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
+ var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
+
+ if ( z == null || /href|src|selected/.test(m[2]) )
+ z = jQuery.attr(a,m[2]) || '';
+
+ if ( (type == "" && !!z ||
+ type == "=" && z == m[5] ||
+ type == "!=" && z != m[5] ||
+ type == "^=" && z && !z.indexOf(m[5]) ||
+ type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
+ (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
+ tmp.push( a );
+ }
+
+ r = tmp;
+
+ // We can get a speed boost by handling nth-child here
+ } else if ( m[1] == ":" && m[2] == "nth-child" ) {
+ var merge = {}, tmp = [],
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+ test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+ m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
+ !/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
+ // calculate the numbers (first)n+(last) including if they are negative
+ first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
+
+ // loop through all the elements left in the jQuery object
+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
+ var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
+
+ if ( !merge[id] ) {
+ var c = 1;
+
+ for ( var n = parentNode.firstChild; n; n = n.nextSibling )
+ if ( n.nodeType == 1 )
+ n.nodeIndex = c++;
+
+ merge[id] = true;
+ }
+
+ var add = false;
+
+ if ( first == 0 ) {
+ if ( node.nodeIndex == last )
+ add = true;
+ } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
+ add = true;
+
+ if ( add ^ not )
+ tmp.push( node );
+ }
+
+ r = tmp;
+
+ // Otherwise, find the expression to execute
+ } else {
+ var fn = jQuery.expr[ m[1] ];
+ if ( typeof fn == "object" )
+ fn = fn[ m[2] ];
+
+ if ( typeof fn == "string" )
+ fn = eval("false||function(a,i){return " + fn + ";}");
+
+ // Execute it against the current filter
+ r = jQuery.grep( r, function(elem, i){
+ return fn(elem, i, m, r);
+ }, not );
+ }
+ }
+
+ // Return an array of filtered elements (r)
+ // and the modified expression string (t)
+ return { r: r, t: t };
+ },
+
+ dir: function( elem, dir ){
+ var matched = [],
+ cur = elem[dir];
+ while ( cur && cur != document ) {
+ 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;
+ }
+});
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code orignated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+ // Bind an event to an element
+ // Original by Dean Edwards
+ add: function(elem, types, handler, data) {
+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
+ return;
+
+ // For whatever reason, IE has trouble passing the window object
+ // around, causing it to be cloned in the process
+ if ( jQuery.browser.msie && elem.setInterval )
+ elem = window;
+
+ // Make sure that the function being executed has a unique ID
+ if ( !handler.guid )
+ handler.guid = this.guid++;
+
+ // if data is passed, bind to handler
+ if( data != undefined ) {
+ // Create temporary function pointer to original handler
+ var fn = handler;
+
+ // Create unique handler function, wrapped around original handler
+ handler = this.proxy( fn, function() {
+ // Pass arguments and context to original handler
+ return fn.apply(this, arguments);
+ });
+
+ // Store data in unique handler
+ handler.data = data;
+ }
+
+ // Init the element's event structure
+ var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
+ handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
+ // Handle the second event of a trigger and when
+ // an event is called after a page has unloaded
+ if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
+ return jQuery.event.handle.apply(arguments.callee.elem, arguments);
+ });
+ // Add elem as a property of the handle function
+ // This is to prevent a memory leak with non-native
+ // event in IE.
+ handle.elem = elem;
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ jQuery.each(types.split(/\s+/), function(index, type) {
+ // Namespaced event handlers
+ var parts = type.split(".");
+ type = parts[0];
+ handler.type = parts[1];
+
+ // Get the current list of functions bound to this event
+ var handlers = events[type];
+
+ // Init the event handler queue
+ if (!handlers) {
+ handlers = events[type] = {};
+
+ // Check for a special event handler
+ // Only use addEventListener/attachEvent if the special
+ // events handler returns false
+ if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
+ // Bind the global event handler to the element
+ if (elem.addEventListener)
+ elem.addEventListener(type, handle, false);
+ else if (elem.attachEvent)
+ elem.attachEvent("on" + type, handle);
+ }
+ }
+
+ // Add the function to the element's handler list
+ handlers[handler.guid] = handler;
+
+ // Keep track of which events have been used, for global triggering
+ jQuery.event.global[type] = true;
+ });
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ guid: 1,
+ global: {},
+
+ // Detach an event or set of events from an element
+ remove: function(elem, types, handler) {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
+ return;
+
+ var events = jQuery.data(elem, "events"), ret, index;
+
+ if ( events ) {
+ // Unbind all events for the element
+ if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
+ for ( var type in events )
+ this.remove( elem, type + (types || "") );
+ else {
+ // types is actually an event object here
+ if ( types.type ) {
+ handler = types.handler;
+ types = types.type;
+ }
+
+ // Handle multiple events seperated by a space
+ // jQuery(...).unbind("mouseover mouseout", fn);
+ jQuery.each(types.split(/\s+/), function(index, type){
+ // Namespaced event handlers
+ var parts = type.split(".");
+ type = parts[0];
+
+ if ( events[type] ) {
+ // remove the given handler for the given type
+ if ( handler )
+ delete events[type][handler.guid];
+
+ // remove all handlers for the given type
+ else
+ for ( handler in events[type] )
+ // Handle the removal of namespaced events
+ if ( !parts[1] || events[type][handler].type == parts[1] )
+ delete events[type][handler];
+
+ // remove generic event handler if no more handlers exist
+ for ( ret in events[type] ) break;
+ if ( !ret ) {
+ if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
+ if (elem.removeEventListener)
+ elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
+ else if (elem.detachEvent)
+ elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
+ }
+ ret = null;
+ delete events[type];
+ }
+ }
+ });
+ }
+
+ // Remove the expando if it's no longer used
+ for ( ret in events ) break;
+ if ( !ret ) {
+ var handle = jQuery.data( elem, "handle" );
+ if ( handle ) handle.elem = null;
+ jQuery.removeData( elem, "events" );
+ jQuery.removeData( elem, "handle" );
+ }
+ }
+ },
+
+ trigger: function(type, data, elem, donative, extra) {
+ // Clone the incoming data, if any
+ data = jQuery.makeArray(data);
+
+ if ( type.indexOf("!") >= 0 ) {
+ type = type.slice(0, -1);
+ var exclusive = true;
+ }
+
+ // Handle a global trigger
+ if ( !elem ) {
+ // Only trigger if we've ever bound an event for it
+ if ( this.global[type] )
+ jQuery("*").add([window, document]).trigger(type, data);
+
+ // Handle triggering a single element
+ } else {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
+ return undefined;
+
+ var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
+ // Check to see if we need to provide a fake event, or not
+ event = !data[0] || !data[0].preventDefault;
+
+ // Pass along a fake event
+ if ( event ) {
+ data.unshift({
+ type: type,
+ target: elem,
+ preventDefault: function(){},
+ stopPropagation: function(){},
+ timeStamp: now()
+ });
+ data[0][expando] = true; // no need to fix fake event
+ }
+
+ // Enforce the right trigger type
+ data[0].type = type;
+ if ( exclusive )
+ data[0].exclusive = true;
+
+ // Trigger the event, it is assumed that "handle" is a function
+ var handle = jQuery.data(elem, "handle");
+ if ( handle )
+ val = handle.apply( elem, data );
+
+ // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
+ if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
+ val = false;
+
+ // Extra functions don't get the custom event object
+ if ( event )
+ data.shift();
+
+ // Handle triggering of extra function
+ if ( extra && jQuery.isFunction( extra ) ) {
+ // call the extra function and tack the current return value on the end for possible inspection
+ ret = extra.apply( elem, val == null ? data : data.concat( val ) );
+ // if anything is returned, give it precedence and have it overwrite the previous value
+ if (ret !== undefined)
+ val = ret;
+ }
+
+ // Trigger the native events (except for clicks on links)
+ if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
+ this.triggered = true;
+ try {
+ elem[ type ]();
+ // prevent IE from throwing an error for some hidden elements
+ } catch (e) {}
+ }
+
+ this.triggered = false;
+ }
+
+ return val;
+ },
+
+ handle: function(event) {
+ // returned undefined or false
+ var val, ret, namespace, all, handlers;
+
+ event = arguments[0] = jQuery.event.fix( event || window.event );
+
+ // Namespaced event handlers
+ namespace = event.type.split(".");
+ event.type = namespace[0];
+ namespace = namespace[1];
+ // Cache this now, all = true means, any handler
+ all = !namespace && !event.exclusive;
+
+ handlers = ( jQuery.data(this, "events") || {} )[event.type];
+
+ for ( var j in handlers ) {
+ var handler = handlers[j];
+
+ // Filter the functions by class
+ if ( all || handler.type == namespace ) {
+ // Pass in a reference to the handler function itself
+ // So that we can later remove it
+ event.handler = handler;
+ event.data = handler.data;
+
+ ret = handler.apply( this, arguments );
+
+ if ( val !== false )
+ val = ret;
+
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+
+ return val;
+ },
+
+ fix: function(event) {
+ if ( event[expando] == true )
+ return event;
+
+ // store a copy of the original event object
+ // and "clone" to set read-only properties
+ var originalEvent = event;
+ event = { originalEvent: originalEvent };
+ var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");
+ for ( var i=props.length; i; i-- )
+ event[ props[i] ] = originalEvent[ props[i] ];
+
+ // Mark it as fixed
+ event[expando] = true;
+
+ // add preventDefault and stopPropagation since
+ // they will not work on the clone
+ event.preventDefault = function() {
+ // if preventDefault exists run it on the original event
+ if (originalEvent.preventDefault)
+ originalEvent.preventDefault();
+ // otherwise set the returnValue property of the original event to false (IE)
+ originalEvent.returnValue = false;
+ };
+ event.stopPropagation = function() {
+ // if stopPropagation exists run it on the original event
+ if (originalEvent.stopPropagation)
+ originalEvent.stopPropagation();
+ // otherwise set the cancelBubble property of the original event to true (IE)
+ originalEvent.cancelBubble = true;
+ };
+
+ // Fix timeStamp
+ event.timeStamp = event.timeStamp || now();
+
+ // Fix target property, if necessary
+ if ( !event.target )
+ event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
+
+ // check if target is a textnode (safari)
+ if ( event.target.nodeType == 3 )
+ event.target = event.target.parentNode;
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement )
+ event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var doc = document.documentElement, body = document.body;
+ event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
+ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
+ }
+
+ // Add which for key events
+ if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
+ event.which = event.charCode || event.keyCode;
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey )
+ event.metaKey = event.ctrlKey;
+
+ // Add which for click: 1 == left; 2 == middle; 3 == right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button )
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+
+ return event;
+ },
+
+ proxy: function( fn, proxy ){
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
+ // So proxy can be declared as an argument
+ return proxy;
+ },
+
+ special: {
+ ready: {
+ setup: function() {
+ // Make sure the ready event is setup
+ bindReady();
+ return;
+ },
+
+ teardown: function() { return; }
+ },
+
+ mouseenter: {
+ setup: function() {
+ if ( jQuery.browser.msie ) return false;
+ jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
+ return true;
+ },
+
+ teardown: function() {
+ if ( jQuery.browser.msie ) return false;
+ jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
+ return true;
+ },
+
+ handler: function(event) {
+ // If we actually just moused on to a sub-element, ignore it
+ if ( withinElement(event, this) ) return true;
+ // Execute the right handlers by setting the event type to mouseenter
+ event.type = "mouseenter";
+ return jQuery.event.handle.apply(this, arguments);
+ }
+ },
+
+ mouseleave: {
+ setup: function() {
+ if ( jQuery.browser.msie ) return false;
+ jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
+ return true;
+ },
+
+ teardown: function() {
+ if ( jQuery.browser.msie ) return false;
+ jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
+ return true;
+ },
+
+ handler: function(event) {
+ // If we actually just moused on to a sub-element, ignore it
+ if ( withinElement(event, this) ) return true;
+ // Execute the right handlers by setting the event type to mouseleave
+ event.type = "mouseleave";
+ return jQuery.event.handle.apply(this, arguments);
+ }
+ }
+ }
+};
+
+jQuery.fn.extend({
+ bind: function( type, data, fn ) {
+ return type == "unload" ? this.one(type, data, fn) : this.each(function(){
+ jQuery.event.add( this, type, fn || data, fn && data );
+ });
+ },
+
+ one: function( type, data, fn ) {
+ var one = jQuery.event.proxy( fn || data, function(event) {
+ jQuery(this).unbind(event, one);
+ return (fn || data).apply( this, arguments );
+ });
+ return this.each(function(){
+ jQuery.event.add( this, type, one, fn && data);
+ });
+ },
+
+ unbind: function( type, fn ) {
+ return this.each(function(){
+ jQuery.event.remove( this, type, fn );
+ });
+ },
+
+ trigger: function( type, data, fn ) {
+ return this.each(function(){
+ jQuery.event.trigger( type, data, this, true, fn );
+ });
+ },
+
+ triggerHandler: function( type, data, fn ) {
+ return this[0] && jQuery.event.trigger( type, data, this[0], false, fn );
+ },
+
+ toggle: function( fn ) {
+ // Save reference to arguments for access in closure
+ var args = arguments, i = 1;
+
+ // link all the functions, so any of them can unbind this click handler
+ while( i < args.length )
+ jQuery.event.proxy( fn, args[i++] );
+
+ return this.click( jQuery.event.proxy( fn, function(event) {
+ // Figure out which function to execute
+ this.lastToggle = ( this.lastToggle || 0 ) % i;
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ this.lastToggle++ ].apply( this, arguments ) || false;
+ }));
+ },
+
+ hover: function(fnOver, fnOut) {
+ return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
+ },
+
+ ready: function(fn) {
+ // Attach the listeners
+ bindReady();
+
+ // If the DOM is already ready
+ if ( jQuery.isReady )
+ // Execute the function immediately
+ fn.call( document, jQuery );
+
+ // Otherwise, remember the function for later
+ else
+ // Add the function to the wait list
+ jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
+
+ return this;
+ }
+});
+
+jQuery.extend({
+ isReady: false,
+ readyList: [],
+ // Handle when the DOM is ready
+ ready: function() {
+ // Make sure that the DOM is not already loaded
+ if ( !jQuery.isReady ) {
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If there are functions bound, to execute
+ if ( jQuery.readyList ) {
+ // Execute all of them
+ jQuery.each( jQuery.readyList, function(){
+ this.call( document );
+ });
+
+ // Reset the list of functions
+ jQuery.readyList = null;
+ }
+
+ // Trigger any bound ready events
+ jQuery(document).triggerHandler("ready");
+ }
+ }
+});
+
+var readyBound = false;
+
+function bindReady(){
+ if ( readyBound ) return;
+ readyBound = true;
+
+ // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
+ if ( document.addEventListener && !jQuery.browser.opera)
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
+
+ // If IE is used and is not in a frame
+ // Continually check to see if the document is ready
+ if ( jQuery.browser.msie && window == top ) (function(){
+ 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( error ) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ // and execute any waiting functions
+ jQuery.ready();
+ })();
+
+ if ( jQuery.browser.opera )
+ document.addEventListener( "DOMContentLoaded", function () {
+ if (jQuery.isReady) return;
+ for (var i = 0; i < document.styleSheets.length; i++)
+ if (document.styleSheets[i].disabled) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ // and execute any waiting functions
+ jQuery.ready();
+ }, false);
+
+ if ( jQuery.browser.safari ) {
+ var numStyles;
+ (function(){
+ if (jQuery.isReady) return;
+ if ( document.readyState != "loaded" && document.readyState != "complete" ) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ if ( numStyles === undefined )
+ numStyles = jQuery("style, link[rel=stylesheet]").length;
+ if ( document.styleSheets.length != numStyles ) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ // and execute any waiting functions
+ jQuery.ready();
+ })();
+ }
+
+ // A fallback to window.onload, that will always work
+ jQuery.event.add( window, "load", jQuery.ready );
+}
+
+jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
+ "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
+ "submit,keydown,keypress,keyup,error").split(","), function(i, name){
+
+ // Handle event binding
+ jQuery.fn[name] = function(fn){
+ return fn ? this.bind(name, fn) : this.trigger(name);
+ };
+});
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function(event, elem) {
+ // Check if mouse(over|out) are still within the same parent element
+ var parent = event.relatedTarget;
+ // Traverse up the tree
+ while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }
+ // Return true if we actually just moused on to a sub-element
+ return parent == elem;
+};
+
+// Prevent memory leaks in IE
+// And prevent errors on refresh with events like mouseover in other browsers
+// Window isn't included so as not to unbind existing unload events
+jQuery(window).bind("unload", function() {
+ jQuery("*").add(document).unbind();
+});
+jQuery.fn.extend({
+ // Keep a copy of the old load
+ _load: jQuery.fn.load,
+
+ load: function( url, params, callback ) {
+ if ( typeof url != 'string' )
+ return this._load( url );
+
+ var off = url.indexOf(" ");
+ if ( off >= 0 ) {
+ var selector = url.slice(off, url.length);
+ url = url.slice(0, off);
+ }
+
+ callback = callback || function(){};
+
+ // 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 = null;
+
+ // Otherwise, build a param string
+ } else {
+ params = jQuery.param( params );
+ type = "POST";
+ }
+
+ var self = this;
+
+ // Request the remote document
+ jQuery.ajax({
+ url: url,
+ type: type,
+ dataType: "html",
+ data: params,
+ complete: function(res, status){
+ // If successful, inject the HTML into all the matched elements
+ if ( status == "success" || status == "notmodified" )
+ // See if a selector was specified
+ self.html( selector ?
+ // Create a dummy div to hold the results
+ jQuery("<div/>")
+ // inject the contents of the document in, removing the scripts
+ // to avoid any 'Permission Denied' errors in IE
+ .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
+
+ // Locate the specified elements
+ .find(selector) :
+
+ // If not, just inject the full result
+ res.responseText );
+
+ self.each( callback, [res.responseText, status, res] );
+ }
+ });
+ return this;
+ },
+
+ serialize: function() {
+ return jQuery.param(this.serializeArray());
+ },
+ serializeArray: function() {
+ return this.map(function(){
+ return jQuery.nodeName(this, "form") ?
+ jQuery.makeArray(this.elements) : this;
+ })
+ .filter(function(){
+ return this.name && !this.disabled &&
+ (this.checked || /select|textarea/i.test(this.nodeName) ||
+ /text|hidden|password/i.test(this.type));
+ })
+ .map(function(i, elem){
+ var val = jQuery(this).val();
+ return val == null ? null :
+ val.constructor == Array ?
+ jQuery.map( val, function(val, i){
+ return {name: elem.name, value: val};
+ }) :
+ {name: elem.name, value: val};
+ }).get();
+ }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
+ jQuery.fn[o] = function(f){
+ return this.bind(o, f);
+ };
+});
+
+var jsc = now();
+
+jQuery.extend({
+ get: function( url, data, callback, type ) {
+ // shift arguments if data argument was ommited
+ if ( jQuery.isFunction( data ) ) {
+ callback = data;
+ data = null;
+ }
+
+ return jQuery.ajax({
+ type: "GET",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get(url, null, callback, "script");
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get(url, data, callback, "json");
+ },
+
+ post: function( url, data, callback, type ) {
+ if ( jQuery.isFunction( data ) ) {
+ callback = data;
+ data = {};
+ }
+
+ return jQuery.ajax({
+ type: "POST",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ ajaxSetup: function( settings ) {
+ jQuery.extend( jQuery.ajaxSettings, settings );
+ },
+
+ ajaxSettings: {
+ url: location.href,
+ global: true,
+ type: "GET",
+ timeout: 0,
+ contentType: "application/x-www-form-urlencoded",
+ processData: true,
+ async: true,
+ data: null,
+ username: null,
+ password: null,
+ accepts: {
+ xml: "application/xml, text/xml",
+ html: "text/html",
+ script: "text/javascript, application/javascript",
+ json: "application/json, text/javascript",
+ text: "text/plain",
+ _default: "*/*"
+ }
+ },
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+
+ ajax: function( s ) {
+ // Extend the settings, but re-extend 's' so that it can be
+ // checked again later (in the test suite, specifically)
+ s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
+
+ var jsonp, jsre = /=\?(&|$)/g, status, data,
+ type = s.type.toUpperCase();
+
+ // convert data if not already a string
+ if ( s.data && s.processData && typeof s.data != "string" )
+ s.data = jQuery.param(s.data);
+
+ // Handle JSONP Parameter Callbacks
+ if ( s.dataType == "jsonp" ) {
+ if ( type == "GET" ) {
+ if ( !s.url.match(jsre) )
+ s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+ } else if ( !s.data || !s.data.match(jsre) )
+ s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+ s.dataType = "json";
+ }
+
+ // Build temporary JSONP function
+ if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
+ jsonp = "jsonp" + jsc++;
+
+ // Replace the =? sequence both in the query string and the data
+ if ( s.data )
+ s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+ s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+ // We need to make sure
+ // that a JSONP style response is executed properly
+ s.dataType = "script";
+
+ // Handle JSONP-style loading
+ window[ jsonp ] = function(tmp){
+ data = tmp;
+ success();
+ complete();
+ // Garbage collect
+ window[ jsonp ] = undefined;
+ try{ delete window[ jsonp ]; } catch(e){}
+ if ( head )
+ head.removeChild( script );
+ };
+ }
+
+ if ( s.dataType == "script" && s.cache == null )
+ s.cache = false;
+
+ if ( s.cache === false && type == "GET" ) {
+ var ts = now();
+ // try replacing _= if it is there
+ var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
+ // if nothing was replaced, add timestamp to the end
+ s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
+ }
+
+ // If data is available, append data to url for get requests
+ if ( s.data && type == "GET" ) {
+ s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
+
+ // IE likes to send both get and post data, prevent this
+ s.data = null;
+ }
+
+ // Watch for a new set of requests
+ if ( s.global && ! jQuery.active++ )
+ jQuery.event.trigger( "ajaxStart" );
+
+ // Matches an absolute URL, and saves the domain
+ var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;
+
+ // If we're requesting a remote document
+ // and trying to load JSON or Script with a GET
+ if ( s.dataType == "script" && type == "GET"
+ && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
+ var head = document.getElementsByTagName("head")[0];
+ var script = document.createElement("script");
+ script.src = s.url;
+ if (s.scriptCharset)
+ script.charset = s.scriptCharset;
+
+ // Handle Script loading
+ if ( !jsonp ) {
+ var done = false;
+
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function(){
+ if ( !done && (!this.readyState ||
+ this.readyState == "loaded" || this.readyState == "complete") ) {
+ done = true;
+ success();
+ complete();
+ head.removeChild( script );
+ }
+ };
+ }
+
+ head.appendChild(script);
+
+ // We handle everything using the script element injection
+ return undefined;
+ }
+
+ var requestDone = false;
+
+ // Create the request object; Microsoft failed to properly
+ // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
+ var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
+
+ // Open the socket
+ // Passing null username, generates a login popup on Opera (#2865)
+ if( s.username )
+ xhr.open(type, s.url, s.async, s.username, s.password);
+ else
+ xhr.open(type, s.url, s.async);
+
+ // Need an extra try/catch for cross domain requests in Firefox 3
+ try {
+ // Set the correct header, if data is being sent
+ if ( s.data )
+ xhr.setRequestHeader("Content-Type", s.contentType);
+
+ // Set the If-Modified-Since header, if ifModified mode.
+ if ( s.ifModified )
+ xhr.setRequestHeader("If-Modified-Since",
+ jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
+
+ // Set header so the called script knows that it's an XMLHttpRequest
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+
+ // Set the Accepts header for the server, depending on the dataType
+ xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
+ s.accepts[ s.dataType ] + ", */*" :
+ s.accepts._default );
+ } catch(e){}
+
+ // Allow custom headers/mimetypes
+ if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
+ // cleanup active request counter
+ s.global && jQuery.active--;
+ // close opended socket
+ xhr.abort();
+ return false;
+ }
+
+ if ( s.global )
+ jQuery.event.trigger("ajaxSend", [xhr, s]);
+
+ // Wait for a response to come back
+ var onreadystatechange = function(isTimeout){
+ // The transfer is complete and the data is available, or the request timed out
+ if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
+ requestDone = true;
+
+ // clear poll interval
+ if (ival) {
+ clearInterval(ival);
+ ival = null;
+ }
+
+ status = isTimeout == "timeout" && "timeout" ||
+ !jQuery.httpSuccess( xhr ) && "error" ||
+ s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" ||
+ "success";
+
+ if ( status == "success" ) {
+ // Watch for, and catch, XML document parse errors
+ try {
+ // process the data (runs the xml through httpData regardless of callback)
+ data = jQuery.httpData( xhr, s.dataType, s.dataFilter );
+ } catch(e) {
+ status = "parsererror";
+ }
+ }
+
+ // Make sure that the request was successful or notmodified
+ if ( status == "success" ) {
+ // Cache Last-Modified header, if ifModified mode.
+ var modRes;
+ try {
+ modRes = xhr.getResponseHeader("Last-Modified");
+ } catch(e) {} // swallow exception thrown by FF if header is not available
+
+ if ( s.ifModified && modRes )
+ jQuery.lastModified[s.url] = modRes;
+
+ // JSONP handles its own success callback
+ if ( !jsonp )
+ success();
+ } else
+ jQuery.handleError(s, xhr, status);
+
+ // Fire the complete handlers
+ complete();
+
+ // Stop memory leaks
+ if ( s.async )
+ xhr = null;
+ }
+ };
+
+ if ( s.async ) {
+ // don't attach the handler to the request, just poll it instead
+ var ival = setInterval(onreadystatechange, 13);
+
+ // Timeout checker
+ if ( s.timeout > 0 )
+ setTimeout(function(){
+ // Check to see if the request is still happening
+ if ( xhr ) {
+ // Cancel the request
+ xhr.abort();
+
+ if( !requestDone )
+ onreadystatechange( "timeout" );
+ }
+ }, s.timeout);
+ }
+
+ // Send the data
+ try {
+ xhr.send(s.data);
+ } catch(e) {
+ jQuery.handleError(s, xhr, null, e);
+ }
+
+ // firefox 1.5 doesn't fire statechange for sync requests
+ if ( !s.async )
+ onreadystatechange();
+
+ function success(){
+ // If a local callback was specified, fire it and pass it the data
+ if ( s.success )
+ s.success( data, status );
+
+ // Fire the global callback
+ if ( s.global )
+ jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
+ }
+
+ function complete(){
+ // Process result
+ if ( s.complete )
+ s.complete(xhr, status);
+
+ // The request was completed
+ if ( s.global )
+ jQuery.event.trigger( "ajaxComplete", [xhr, s] );
+
+ // Handle the global AJAX counter
+ if ( s.global && ! --jQuery.active )
+ jQuery.event.trigger( "ajaxStop" );
+ }
+
+ // return XMLHttpRequest to allow aborting the request etc.
+ return xhr;
+ },
+
+ handleError: function( s, xhr, status, e ) {
+ // If a local callback was specified, fire it
+ if ( s.error ) s.error( xhr, status, e );
+
+ // Fire the global callback
+ if ( s.global )
+ jQuery.event.trigger( "ajaxError", [xhr, s, e] );
+ },
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Determines if an XMLHttpRequest was successful or not
+ httpSuccess: function( xhr ) {
+ try {
+ // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
+ return !xhr.status && location.protocol == "file:" ||
+ ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
+ jQuery.browser.safari && xhr.status == undefined;
+ } catch(e){}
+ return false;
+ },
+
+ // Determines if an XMLHttpRequest returns NotModified
+ httpNotModified: function( xhr, url ) {
+ try {
+ var xhrRes = xhr.getResponseHeader("Last-Modified");
+
+ // Firefox always returns 200. check Last-Modified date
+ return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
+ jQuery.browser.safari && xhr.status == undefined;
+ } catch(e){}
+ return false;
+ },
+
+ httpData: function( xhr, type, filter ) {
+ var ct = xhr.getResponseHeader("content-type"),
+ xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
+ data = xml ? xhr.responseXML : xhr.responseText;
+
+ if ( xml && data.documentElement.tagName == "parsererror" )
+ throw "parsererror";
+
+ // Allow a pre-filtering function to sanitize the response
+ if( filter )
+ data = filter( data, type );
+
+ // If the type is "script", eval it in global context
+ if ( type == "script" )
+ jQuery.globalEval( data );
+
+ // Get the JavaScript object, if JSON is used.
+ if ( type == "json" )
+ data = eval("(" + data + ")");
+
+ return data;
+ },
+
+ // Serialize an array of form elements or a set of
+ // key/values into a query string
+ param: function( a ) {
+ var s = [];
+
+ // If an array was passed in, assume that it is an array
+ // of form elements
+ if ( a.constructor == Array || a.jquery )
+ // Serialize the form elements
+ jQuery.each( a, function(){
+ s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
+ });
+
+ // Otherwise, assume that it's an object of key/value pairs
+ else
+ // Serialize the key/values
+ for ( var j in a )
+ // If the value is an array then the key names need to be repeated
+ if ( a[j] && a[j].constructor == Array )
+ jQuery.each( a[j], function(){
+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
+ });
+ else
+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) );
+
+ // Return the resulting serialization
+ return s.join("&").replace(/%20/g, "+");
+ }
+
+});
+jQuery.fn.extend({
+ show: function(speed,callback){
+ return speed ?
+ this.animate({
+ height: "show", width: "show", opacity: "show"
+ }, speed, callback) :
+
+ this.filter(":hidden").each(function(){
+ this.style.display = this.oldblock || "";
+ if ( jQuery.css(this,"display") == "none" ) {
+ var elem = jQuery("<" + this.tagName + " />").appendTo("body");
+ this.style.display = elem.css("display");
+ // handle an edge condition where css is - div { display:none; } or similar
+ if (this.style.display == "none")
+ this.style.display = "block";
+ elem.remove();
+ }
+ }).end();
+ },
+
+ hide: function(speed,callback){
+ return speed ?
+ this.animate({
+ height: "hide", width: "hide", opacity: "hide"
+ }, speed, callback) :
+
+ this.filter(":visible").each(function(){
+ this.oldblock = this.oldblock || jQuery.css(this,"display");
+ this.style.display = "none";
+ }).end();
+ },
+
+ // Save the old toggle function
+ _toggle: jQuery.fn.toggle,
+
+ toggle: function( fn, fn2 ){
+ return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
+ this._toggle.apply( this, arguments ) :
+ fn ?
+ this.animate({
+ height: "toggle", width: "toggle", opacity: "toggle"
+ }, fn, fn2) :
+ this.each(function(){
+ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
+ });
+ },
+
+ slideDown: function(speed,callback){
+ return this.animate({height: "show"}, speed, callback);
+ },
+
+ slideUp: function(speed,callback){
+ return this.animate({height: "hide"}, speed, callback);
+ },
+
+ slideToggle: function(speed, callback){
+ return this.animate({height: "toggle"}, speed, callback);
+ },
+
+ fadeIn: function(speed, callback){
+ return this.animate({opacity: "show"}, speed, callback);
+ },
+
+ fadeOut: function(speed, callback){
+ return this.animate({opacity: "hide"}, speed, callback);
+ },
+
+ fadeTo: function(speed,to,callback){
+ return this.animate({opacity: to}, speed, callback);
+ },
+
+ animate: function( prop, speed, easing, callback ) {
+ var optall = jQuery.speed(speed, easing, callback);
+
+ return this[ optall.queue === false ? "each" : "queue" ](function(){
+ if ( this.nodeType != 1)
+ return false;
+
+ var opt = jQuery.extend({}, optall), p,
+ hidden = jQuery(this).is(":hidden"), self = this;
+
+ for ( p in prop ) {
+ if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
+ return opt.complete.call(this);
+
+ if ( p == "height" || p == "width" ) {
+ // Store display property
+ opt.display = jQuery.css(this, "display");
+
+ // Make sure that nothing sneaks out
+ opt.overflow = this.style.overflow;
+ }
+ }
+
+ if ( opt.overflow != null )
+ this.style.overflow = "hidden";
+
+ opt.curAnim = jQuery.extend({}, prop);
+
+ jQuery.each( prop, function(name, val){
+ var e = new jQuery.fx( self, opt, name );
+
+ if ( /toggle|show|hide/.test(val) )
+ e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+ else {
+ var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
+ start = e.cur(true) || 0;
+
+ if ( parts ) {
+ var end = parseFloat(parts[2]),
+ unit = parts[3] || "px";
+
+ // We need to compute starting value
+ if ( unit != "px" ) {
+ self.style[ name ] = (end || 1) + unit;
+ start = ((end || 1) / e.cur(true)) * start;
+ self.style[ name ] = start + unit;
+ }
+
+ // If a +=/-= token was provided, we're doing a relative animation
+ if ( parts[1] )
+ end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
+
+ e.custom( start, end, unit );
+ } else
+ e.custom( start, val, "" );
+ }
+ });
+
+ // For JS strict compliance
+ return true;
+ });
+ },
+
+ queue: function(type, fn){
+ if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
+ fn = type;
+ type = "fx";
+ }
+
+ if ( !type || (typeof type == "string" && !fn) )
+ return queue( this[0], type );
+
+ return this.each(function(){
+ if ( fn.constructor == Array )
+ queue(this, type, fn);
+ else {
+ queue(this, type).push( fn );
+
+ if ( queue(this, type).length == 1 )
+ fn.call(this);
+ }
+ });
+ },
+
+ stop: function(clearQueue, gotoEnd){
+ var timers = jQuery.timers;
+
+ if (clearQueue)
+ this.queue([]);
+
+ this.each(function(){
+ // go in reverse order so anything added to the queue during the loop is ignored
+ for ( var i = timers.length - 1; i >= 0; i-- )
+ if ( timers[i].elem == this ) {
+ if (gotoEnd)
+ // force the next step to be the last
+ timers[i](true);
+ timers.splice(i, 1);
+ }
+ });
+
+ // start the next in the queue if the last step wasn't forced
+ if (!gotoEnd)
+ this.dequeue();
+
+ return this;
+ }
+
+});
+
+var queue = function( elem, type, array ) {
+ if ( elem ){
+
+ type = type || "fx";
+
+ var q = jQuery.data( elem, type + "queue" );
+
+ if ( !q || array )
+ q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
+
+ }
+ return q;
+};
+
+jQuery.fn.dequeue = function(type){
+ type = type || "fx";
+
+ return this.each(function(){
+ var q = queue(this, type);
+
+ q.shift();
+
+ if ( q.length )
+ q[0].call( this );
+ });
+};
+
+jQuery.extend({
+
+ speed: function(speed, easing, fn) {
+ var opt = speed && speed.constructor == Object ? speed : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && easing.constructor != Function && easing
+ };
+
+ opt.duration = (opt.duration && opt.duration.constructor == Number ?
+ opt.duration :
+ jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
+
+ // Queueing
+ opt.old = opt.complete;
+ opt.complete = function(){
+ if ( opt.queue !== false )
+ jQuery(this).dequeue();
+ if ( jQuery.isFunction( opt.old ) )
+ opt.old.call( this );
+ };
+
+ return opt;
+ },
+
+ easing: {
+ linear: function( p, n, firstNum, diff ) {
+ return firstNum + diff * p;
+ },
+ swing: function( p, n, firstNum, diff ) {
+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+ }
+ },
+
+ timers: [],
+ timerId: null,
+
+ fx: function( elem, options, prop ){
+ this.options = options;
+ this.elem = elem;
+ this.prop = prop;
+
+ if ( !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)( this );
+
+ // Set display property to block for height/width animations
+ if ( this.prop == "height" || this.prop == "width" )
+ this.elem.style.display = "block";
+ },
+
+ // Get the current size
+ cur: function(force){
+ if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
+ return this.elem[ this.prop ];
+
+ var r = parseFloat(jQuery.css(this.elem, this.prop, force));
+ return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
+ },
+
+ // Start an animation from one number to another
+ custom: function(from, to, unit){
+ this.startTime = now();
+ this.start = from;
+ this.end = to;
+ this.unit = unit || this.unit || "px";
+ this.now = this.start;
+ this.pos = this.state = 0;
+ this.update();
+
+ var self = this;
+ function t(gotoEnd){
+ return self.step(gotoEnd);
+ }
+
+ t.elem = this.elem;
+
+ jQuery.timers.push(t);
+
+ if ( jQuery.timerId == null ) {
+ jQuery.timerId = setInterval(function(){
+ var timers = jQuery.timers;
+
+ for ( var i = 0; i < timers.length; i++ )
+ if ( !timers[i]() )
+ timers.splice(i--, 1);
+
+ if ( !timers.length ) {
+ clearInterval( jQuery.timerId );
+ jQuery.timerId = null;
+ }
+ }, 13);
+ }
+ },
+
+ // Simple 'show' function
+ show: function(){
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+ this.options.show = true;
+
+ // Begin the animation
+ this.custom(0, this.cur());
+
+ // Make sure that we start at a small width/height to avoid any
+ // flash of content
+ if ( this.prop == "width" || this.prop == "height" )
+ this.elem.style[this.prop] = "1px";
+
+ // 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 later
+ this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+ this.options.hide = true;
+
+ // Begin the animation
+ this.custom(this.cur(), 0);
+ },
+
+ // Each step of an animation
+ step: function(gotoEnd){
+ var t = now();
+
+ if ( gotoEnd || t > this.options.duration + this.startTime ) {
+ this.now = this.end;
+ this.pos = this.state = 1;
+ this.update();
+
+ this.options.curAnim[ this.prop ] = true;
+
+ var done = true;
+ for ( var i in this.options.curAnim )
+ if ( this.options.curAnim[i] !== true )
+ done = false;
+
+ if ( done ) {
+ if ( this.options.display != null ) {
+ // Reset the overflow
+ this.elem.style.overflow = this.options.overflow;
+
+ // Reset the display
+ this.elem.style.display = this.options.display;
+ if ( jQuery.css(this.elem, "display") == "none" )
+ this.elem.style.display = "block";
+ }
+
+ // Hide the element if the "hide" operation was done
+ if ( this.options.hide )
+ this.elem.style.display = "none";
+
+ // Reset the properties, if the item has been hidden or shown
+ if ( this.options.hide || this.options.show )
+ for ( var p in this.options.curAnim )
+ jQuery.attr(this.elem.style, p, this.options.orig[p]);
+ }
+
+ if ( done )
+ // Execute the complete function
+ this.options.complete.call( this.elem );
+
+ return false;
+ } else {
+ var n = t - this.startTime;
+ this.state = n / this.options.duration;
+
+ // Perform the easing function, defaults to swing
+ this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
+ this.now = this.start + ((this.end - this.start) * this.pos);
+
+ // Perform the next step of the animation
+ this.update();
+ }
+
+ return true;
+ }
+
+};
+
+jQuery.extend( jQuery.fx, {
+ speeds:{
+ slow: 600,
+ fast: 200,
+ // Default speed
+ def: 400
+ },
+ step: {
+ scrollLeft: function(fx){
+ fx.elem.scrollLeft = fx.now;
+ },
+
+ scrollTop: function(fx){
+ fx.elem.scrollTop = fx.now;
+ },
+
+ opacity: function(fx){
+ jQuery.attr(fx.elem.style, "opacity", fx.now);
+ },
+
+ _default: function(fx){
+ fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+ }
+ }
+});
+// The Offset Method
+// Originally By Brandon Aaron, part of the Dimension Plugin
+// http://jquery.com/plugins/project/dimensions
+jQuery.fn.offset = function() {
+ var left = 0, top = 0, elem = this[0], results;
+
+ if ( elem ) with ( jQuery.browser ) {
+ var parent = elem.parentNode,
+ offsetChild = elem,
+ offsetParent = elem.offsetParent,
+ doc = elem.ownerDocument,
+ safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
+ css = jQuery.curCSS,
+ fixed = css(elem, "position") == "fixed";
+
+ // Use getBoundingClientRect if available
+ if ( elem.getBoundingClientRect ) {
+ var box = elem.getBoundingClientRect();
+
+ // Add the document scroll offsets
+ add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
+ box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
+
+ // IE adds the HTML element's border, by default it is medium which is 2px
+ // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }
+ // IE 7 standards mode, the border is always 2px
+ // This border/offset is typically represented by the clientLeft and clientTop properties
+ // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS
+ // Therefore this method will be off by 2px in IE while in quirksmode
+ add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
+
+ // Otherwise loop through the offsetParents and parentNodes
+ } else {
+
+ // Initial element offsets
+ add( elem.offsetLeft, elem.offsetTop );
+
+ // Get parent offsets
+ while ( offsetParent ) {
+ // Add offsetParent offsets
+ add( offsetParent.offsetLeft, offsetParent.offsetTop );
+
+ // Mozilla and Safari > 2 does not include the border on offset parents
+ // However Mozilla adds the border for table or table cells
+ if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
+ border( offsetParent );
+
+ // Add the document scroll offsets if position is fixed on any offsetParent
+ if ( !fixed && css(offsetParent, "position") == "fixed" )
+ fixed = true;
+
+ // Set offsetChild to previous offsetParent unless it is the body element
+ offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
+ // Get next offsetParent
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ // Get parent scroll offsets
+ while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
+ // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug
+ if ( !/^inline|table.*$/i.test(css(parent, "display")) )
+ // Subtract parent scroll offsets
+ add( -parent.scrollLeft, -parent.scrollTop );
+
+ // Mozilla does not add the border for a parent that has overflow != visible
+ if ( mozilla && css(parent, "overflow") != "visible" )
+ border( parent );
+
+ // Get next parent
+ parent = parent.parentNode;
+ }
+
+ // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild
+ // Mozilla doubles body offsets with a non-absolutely positioned offsetChild
+ if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
+ (mozilla && css(offsetChild, "position") != "absolute") )
+ add( -doc.body.offsetLeft, -doc.body.offsetTop );
+
+ // Add the document scroll offsets if position is fixed
+ if ( fixed )
+ add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
+ Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
+ }
+
+ // Return an object with top and left properties
+ results = { top: top, left: left };
+ }
+
+ function border(elem) {
+ add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );
+ }
+
+ function add(l, t) {
+ left += parseInt(l, 10) || 0;
+ top += parseInt(t, 10) || 0;
+ }
+
+ return results;
+};
+
+
+jQuery.fn.extend({
+ position: function() {
+ var left = 0, top = 0, results;
+
+ if ( this[0] ) {
+ // Get *real* offsetParent
+ var offsetParent = this.offsetParent(),
+
+ // Get correct offsets
+ offset = this.offset(),
+ parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+ // Subtract element margins
+ // note: when an element has margin: auto the offsetLeft and marginLeft
+ // are the same in Safari causing offset.left to incorrectly be 0
+ offset.top -= num( this, 'marginTop' );
+ offset.left -= num( this, 'marginLeft' );
+
+ // Add offsetParent borders
+ parentOffset.top += num( offsetParent, 'borderTopWidth' );
+ parentOffset.left += num( offsetParent, 'borderLeftWidth' );
+
+ // Subtract the two offsets
+ results = {
+ top: offset.top - parentOffset.top,
+ left: offset.left - parentOffset.left
+ };
+ }
+
+ return results;
+ },
+
+ offsetParent: function() {
+ var offsetParent = this[0].offsetParent;
+ while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
+ offsetParent = offsetParent.offsetParent;
+ return jQuery(offsetParent);
+ }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ['Left', 'Top'], function(i, name) {
+ var method = 'scroll' + name;
+
+ jQuery.fn[ method ] = function(val) {
+ if (!this[0]) return;
+
+ return val != undefined ?
+
+ // Set the scroll offset
+ this.each(function() {
+ this == window || this == document ?
+ window.scrollTo(
+ !i ? val : jQuery(window).scrollLeft(),
+ i ? val : jQuery(window).scrollTop()
+ ) :
+ this[ method ] = val;
+ }) :
+
+ // Return the scroll offset
+ this[0] == window || this[0] == document ?
+ self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
+ jQuery.boxModel && document.documentElement[ method ] ||
+ document.body[ method ] :
+ this[0][ method ];
+ };
+});
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function(i, name){
+
+ var tl = i ? "Left" : "Top", // top or left
+ br = i ? "Right" : "Bottom"; // bottom or right
+
+ // innerHeight and innerWidth
+ jQuery.fn["inner" + name] = function(){
+ return this[ name.toLowerCase() ]() +
+ num(this, "padding" + tl) +
+ num(this, "padding" + br);
+ };
+
+ // outerHeight and outerWidth
+ jQuery.fn["outer" + name] = function(margin) {
+ return this["inner" + name]() +
+ num(this, "border" + tl + "Width") +
+ num(this, "border" + br + "Width") +
+ (margin ?
+ num(this, "margin" + tl) + num(this, "margin" + br) : 0);
+ };
+
+});})();
--- /dev/null
+/*!\r
+ SoundManager 2: Javascript Sound for the Web\r
+ --------------------------------------------\r
+ http://schillmania.com/projects/soundmanager2/\r
+\r
+ Copyright (c) 2008, Scott Schiller. All rights reserved.\r
+ Code licensed under the BSD License:\r
+ http://schillmania.com/projects/soundmanager2/license.txt\r
+\r
+ V2.90a.20081028\r
+*/\r
+\r
+function SoundManager(smURL,smID) {\r
+ \r
+ this.flashVersion = 8; // version of flash to require, either 8 or 9. Some API features require Flash 9.\r
+ this.debugMode = true; // enable debugging output (div#soundmanager-debug, OR console if available + configured)\r
+ this.useConsole = true; // use firebug/safari console.log()-type debug console if available\r
+ this.consoleOnly = false; // if console is being used, do not create/write to #soundmanager-debug\r
+ this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r
+ this.nullURL = 'null.mp3'; // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only)\r
+ this.allowPolling = true; // allow flash to poll for status update (required for "while playing", peak, sound spectrum functions to work.)\r
+ this.useMovieStar = false; // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio + video formats (AAC, M4V, FLV, MOV etc.)\r
+ this.useHighPerformance = true; // flash positioning trick, improves JS/flash callback speed, minimizes delay\r
+ this.bgColor = '#ffffff'; // movie (.swf) background color, useful if showing on-screen for video etc.\r
+\r
+ this.defaultOptions = {\r
+ 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r
+ 'stream': true, // allows playing before entire file has loaded (recommended)\r
+ 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true)\r
+ 'onid3': null, // callback function for "ID3 data is added/available"\r
+ 'onload': null, // callback function for "load finished"\r
+ 'whileloading': null, // callback function for "download progress update" (X of Y bytes received)\r
+ 'onplay': null, // callback for "play" start\r
+ 'onpause': null, // callback for "pause"\r
+ 'onresume': null, // callback for "resume" (pause toggle)\r
+ 'whileplaying': null, // callback during play (position update)\r
+ 'onstop': null, // callback for "user stop"\r
+ 'onfinish': null, // callback function for "sound finished playing"\r
+ 'onbeforefinish': null, // callback for "before sound finished playing (at [time])"\r
+ 'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second)\r
+ 'onbeforefinishcomplete':null, // function to call when said sound finishes playing\r
+ 'onjustbeforefinish':null, // callback for [n] msec before end of current sound\r
+ 'onjustbeforefinishtime':200, // [n] - if not using, set to 0 (or null handler) and event will not fire.\r
+ 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r
+ 'position': null, // offset (milliseconds) to seek to within loaded sound data.\r
+ 'pan': 0, // "pan" settings, left-to-right, -100 to 100\r
+ 'volume': 100 // self-explanatory. 0-100, the latter being the max.\r
+ };\r
+\r
+ this.flash9Options = { // flash 9-only options, merged into defaultOptions if flash 9 is being used\r
+ 'isMovieStar': null, // "MovieStar" MPEG4 audio/video mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r
+ 'usePeakData': false, // enable left/right channel peak (level) data\r
+ 'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire.\r
+ 'useEQData': false // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.\r
+ };\r
+\r
+ this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio/video options, merged into defaultOptions if flash 9 + movieStar mode is enabled\r
+ 'onmetadata': null, // callback for when video width/height etc. are received\r
+ 'useVideo': false // if loading movieStar content, whether to show video\r
+ }\r
+\r
+ this.flashBlockHelper = {\r
+ 'enabled': false, // experimental, removed with >v2.80\r
+ 'message': [] // "nag bar" to show when messaging the user, if SM2 fails on firefox etc.\r
+ };\r
+\r
+ var _s = this; \r
+ this.version = null;\r
+ this.versionNumber = 'V2.90a.20081028';\r
+ this.movieURL = null;\r
+ this.url = null;\r
+ this.altURL = null;\r
+ this.swfLoaded = false;\r
+ this.enabled = false;\r
+ this.o = null;\r
+ this.id = (smID||'sm2movie');\r
+ this.oMC = null;\r
+ this.sounds = [];\r
+ this.soundIDs = [];\r
+ this.muted = false;\r
+ this.isIE = (navigator.userAgent.match(/MSIE/i));\r
+ this.isSafari = (navigator.userAgent.match(/safari/i));\r
+ this.isGecko = (navigator.userAgent.match(/gecko/i));\r
+ this.debugID = 'soundmanager-debug';\r
+ this._debugOpen = true;\r
+ this._didAppend = false;\r
+ this._appendSuccess = false;\r
+ this._didInit = false;\r
+ this._disabled = false;\r
+ this._windowLoaded = false;\r
+ this._hasConsole = (typeof console != 'undefined' && typeof console.log != 'undefined');\r
+ this._debugLevels = ['log','info','warn','error'];\r
+ this._defaultFlashVersion = 8;\r
+ this.filePatterns = {\r
+ flash8: /\.(mp3)/i,\r
+ flash9: /\.(mp3)/i\r
+ };\r
+ this.netStreamTypes = ['aac','flv','mov','mp4','m4v','f4v','m4a','mp4v','3gp','3g2']; // Flash v9.0r115+ "moviestar" formats\r
+ this.netStreamPattern = new RegExp('.('+this.netStreamTypes.join('|')+')','i');\r
+ this.filePattern = null;\r
+ this.features = {\r
+ peakData: false,\r
+ waveformData: false,\r
+ eqData: false\r
+ };\r
+\r
+ this.sandbox = {\r
+ 'type': null,\r
+ 'types': {\r
+ 'remote': 'remote (domain-based) rules',\r
+ 'localWithFile': 'local with file access (no internet access)',\r
+ 'localWithNetwork': 'local with network (internet access only, no local access)',\r
+ 'localTrusted': 'local, trusted (local + internet access)'\r
+ },\r
+ 'description': null,\r
+ 'noRemote': null,\r
+ 'noLocal': null\r
+ };\r
+\r
+ this._setVersionInfo = function() {\r
+ if (_s.flashVersion != 8 && _s.flashVersion != 9) {\r
+ alert('soundManager.flashVersion must be 8 or 9. "'+_s.flashVersion+'" is invalid. Reverting to '+_s._defaultFlashVersion+'.');\r
+ _s.flashVersion = _s._defaultFlashVersion;\r
+ }\r
+ _s.version = _s.versionNumber+(_s.flashVersion==9?' (AS3/Flash 9)':' (AS2/Flash 8)');\r
+ // set up default options\r
+ if (_s.flashVersion > 8) {\r
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.flash9Options);\r
+ }\r
+ if (_s.flashVersion > 8 && _s.useMovieStar) {\r
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.movieStarOptions);\r
+ _s.filePatterns.flash9 = new RegExp('.(mp3|'+_s.netStreamTypes.join('|')+')','i');\r
+ } else {\r
+ _s.useMovieStar = false;\r
+ }\r
+ _s.filePattern = _s.filePatterns[(_s.flashVersion!=8?'flash9':'flash8')];\r
+ _s.movieURL = (_s.flashVersion==8?'soundmanager2.swf':'soundmanager2_flash9.swf');\r
+ _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_s.flashVersion==9);\r
+ }\r
+\r
+ this._overHTTP = (document.location?document.location.protocol.match(/http/i):null);\r
+ this._waitingforEI = false;\r
+ this._initPending = false;\r
+ this._tryInitOnFocus = (this.isSafari && typeof document.hasFocus == 'undefined');\r
+ this._isFocused = (typeof document.hasFocus != 'undefined'?document.hasFocus():null);\r
+ this._okToDisable = !this._tryInitOnFocus;\r
+\r
+ this.useAltURL = !this._overHTTP; // use altURL if not "online"\r
+\r
+ var flashCPLink = 'http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html';\r
+\r
+ // --- public methods ---\r
+ \r
+ this.supported = function() {\r
+ return (_s._didInit && !_s._disabled);\r
+ };\r
+\r
+ this.getMovie = function(smID) {\r
+ return _s.isIE?window[smID]:(_s.isSafari?document.getElementById(smID)||document[smID]:document.getElementById(smID));\r
+ };\r
+\r
+ this.loadFromXML = function(sXmlUrl) {\r
+ try {\r
+ _s.o._loadFromXML(sXmlUrl);\r
+ } catch(e) {\r
+ _s._failSafely();\r
+ return true;\r
+ };\r
+ };\r
+\r
+ this.createSound = function(oOptions) {\r
+ if (!_s._didInit) throw new Error('soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods');\r
+ if (arguments.length==2) {\r
+ // function overloading in JS! :) ..assume simple createSound(id,url) use case\r
+ var oOptions = {'id':arguments[0],'url':arguments[1]};\r
+ };\r
+ var thisOptions = _s._mergeObjects(oOptions); // inherit SM2 defaults\r
+ var _tO = thisOptions; // alias\r
+ _s._wD('soundManager.createSound(): '+_tO.id+' ('+_tO.url+')',1);\r
+ if (_s._idCheck(_tO.id,true)) {\r
+ _s._wD('soundManager.createSound(): '+_tO.id+' exists',1);\r
+ return _s.sounds[_tO.id];\r
+ };\r
+ if (_s.flashVersion > 8 && _s.useMovieStar) {\r
+ if (_tO.isMovieStar == null) {\r
+ _tO.isMovieStar = (_tO.url.match(_s.netStreamPattern)?true:false);\r
+ }\r
+ if (_tO.isMovieStar) {\r
+ _s._wD('soundManager.createSound(): using MovieStar handling');\r
+ }\r
+ if (_tO.isMovieStar && (_tO.usePeakData || _tO.useWaveformData || _tO.useEQData)) {\r
+ _s._wD('Warning: peak/waveform/eqData features unsupported for non-MP3 formats');\r
+ _tO.usePeakData = false;\r
+ _tO.useWaveformData = false;\r
+ _tO.useEQData = false;\r
+ }\r
+ };\r
+ _s.sounds[_tO.id] = new SMSound(_tO);\r
+ _s.soundIDs[_s.soundIDs.length] = _tO.id;\r
+ // AS2:\r
+ if (_s.flashVersion == 8) {\r
+ _s.o._createSound(_tO.id,_tO.onjustbeforefinishtime);\r
+ } else {\r
+ _s.o._createSound(_tO.id,_tO.url,_tO.onjustbeforefinishtime,_tO.usePeakData,_tO.useWaveformData,_tO.useEQData,_tO.isMovieStar,(_tO.isMovieStar?_tO.useVideo:false));\r
+ };\r
+ if (_tO.autoLoad || _tO.autoPlay) {\r
+ window.setTimeout(function() {\r
+ if (_s.sounds[_tO.id]) {\r
+ _s.sounds[_tO.id].load(_tO);\r
+ }\r
+ },20);\r
+ }\r
+ if (_tO.autoPlay) {\r
+ if (_s.flashVersion == 8) {\r
+ _s.sounds[_tO.id].playState = 1; // we can only assume this sound will be playing soon.\r
+ } else {\r
+ _s.sounds[_tO.id].play(); \r
+ }\r
+ }\r
+ return _s.sounds[_tO.id];\r
+ };\r
+\r
+ this.createVideo = function(oOptions) {\r
+ if (arguments.length==2) {\r
+ var oOptions = {'id':arguments[0],'url':arguments[1]};\r
+ };\r
+ if (_s.flashVersion >= 9) {\r
+ oOptions.isMovieStar = true;\r
+ oOptions.useVideo = true;\r
+ } else {\r
+ _s._wD('soundManager.createVideo(): flash 9 required for video. Exiting.',2);\r
+ return false;\r
+ }\r
+ if (!_s.useMovieStar) {\r
+ _s._wD('soundManager.createVideo(): MovieStar mode not enabled. Exiting.',2);\r
+ }\r
+ return _s.createSound(oOptions);\r
+ }\r
+\r
+ this.destroySound = function(sID,bFromSound) {\r
+ // explicitly destroy a sound before normal page unload, etc.\r
+ if (!_s._idCheck(sID)) return false;\r
+ for (var i=0; i<_s.soundIDs.length; i++) {\r
+ if (_s.soundIDs[i] == sID) {\r
+ _s.soundIDs.splice(i,1);\r
+ continue;\r
+ };\r
+ };\r
+ // conservative option: avoid crash with ze flash 8\r
+ // calling destroySound() within a sound onload() might crash firefox, certain flavours of winXP + flash 8??\r
+ // if (_s.flashVersion != 8) {\r
+ _s.sounds[sID].unload();\r
+ // }\r
+ if (!bFromSound) {\r
+ // ignore if being called from SMSound instance\r
+ _s.sounds[sID].destruct();\r
+ };\r
+ delete _s.sounds[sID];\r
+ };\r
+\r
+ this.destroyVideo = this.destroySound;\r
+\r
+ this.load = function(sID,oOptions) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].load(oOptions);\r
+ };\r
+\r
+ this.unload = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].unload();\r
+ };\r
+\r
+ this.play = function(sID,oOptions) {\r
+ if (!_s._idCheck(sID)) {\r
+ if (typeof oOptions != 'Object') oOptions = {url:oOptions}; // overloading use case: play('mySound','/path/to/some.mp3');\r
+ if (oOptions && oOptions.url) {\r
+ // overloading use case, creation + playing of sound: .play('someID',{url:'/path/to.mp3'});\r
+ _s._wD('soundController.play(): attempting to create "'+sID+'"',1);\r
+ oOptions.id = sID;\r
+ _s.createSound(oOptions);\r
+ } else {\r
+ return false;\r
+ };\r
+ };\r
+ _s.sounds[sID].play(oOptions);\r
+ };\r
+\r
+ this.start = this.play; // just for convenience\r
+\r
+ this.setPosition = function(sID,nMsecOffset) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ nMsecOffset = Math.min((nMsecOffset||0),_s.duration); // don't allow seek past loaded duration\r
+ _s.sounds[sID].setPosition(nMsecOffset);\r
+ };\r
+\r
+ this.stop = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.stop('+sID+')',1);\r
+ _s.sounds[sID].stop(); \r
+ };\r
+\r
+ this.stopAll = function() {\r
+ _s._wD('soundManager.stopAll()',1);\r
+ for (var oSound in _s.sounds) {\r
+ if (_s.sounds[oSound] instanceof SMSound) _s.sounds[oSound].stop(); // apply only to sound objects\r
+ };\r
+ };\r
+\r
+ this.pause = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].pause();\r
+ };\r
+\r
+ this.pauseAll = function() {\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].pause();\r
+ }\r
+ };\r
+\r
+ this.resume = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].resume();\r
+ };\r
+\r
+ this.resumeAll = function() {\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].resume();\r
+ }\r
+ };\r
+\r
+ this.togglePause = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].togglePause();\r
+ };\r
+\r
+ this.setPan = function(sID,nPan) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].setPan(nPan);\r
+ };\r
+\r
+ this.setVolume = function(sID,nVol) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].setVolume(nVol);\r
+ };\r
+\r
+ this.mute = function(sID) {\r
+ if (typeof sID != 'string') sID = null;\r
+ if (!sID) {\r
+ var o = null;\r
+ _s._wD('soundManager.mute(): Muting all sounds');\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].mute();\r
+ }\r
+ _s.muted = true;\r
+ } else {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.mute(): Muting "'+sID+'"');\r
+ _s.sounds[sID].mute();\r
+ }\r
+ };\r
+\r
+ this.muteAll = function() {\r
+ _s.mute();\r
+ };\r
+\r
+ this.unmute = function(sID) {\r
+ if (typeof sID != 'string') sID = null;\r
+ if (!sID) {\r
+ var o = null;\r
+ _s._wD('soundManager.unmute(): Unmuting all sounds');\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].unmute();\r
+ }\r
+ _s.muted = false;\r
+ } else {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.unmute(): Unmuting "'+sID+'"');\r
+ _s.sounds[sID].unmute();\r
+ }\r
+ };\r
+\r
+ this.unmuteAll = function() {\r
+ _s.unmute();\r
+ };\r
+\r
+ this.setPolling = function(bPolling) {\r
+ if (!_s.o || !_s.allowPolling) return false;\r
+ // _s._wD('soundManager.setPolling('+bPolling+')');\r
+ _s.o._setPolling(bPolling);\r
+ };\r
+\r
+ this.disable = function(bUnload) {\r
+ // destroy all functions\r
+ if (_s._disabled) return false;\r
+ _s._disabled = true;\r
+ _s._wD('soundManager.disable(): Disabling all functions - future calls will return false.',1);\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s._disableObject(_s.sounds[_s.soundIDs[i]]);\r
+ };\r
+ _s.initComplete(); // fire "complete", despite fail\r
+ _s._disableObject(_s);\r
+ };\r
+\r
+ this.handleFlashBlock = function(bForce) {\r
+ // experimental, removed with >v2.80.\r
+ return false;\r
+ };\r
+\r
+ this.canPlayURL = function(sURL) {\r
+ return (sURL?(sURL.match(_s.filePattern)?true:false):null); \r
+ };\r
+\r
+ this.getSoundById = function(sID,suppressDebug) {\r
+ if (!sID) throw new Error('SoundManager.getSoundById(): sID is null/undefined');\r
+ var result = _s.sounds[sID];\r
+ if (!result && !suppressDebug) {\r
+ _s._wD('"'+sID+'" is an invalid sound ID.',2);\r
+ // soundManager._wD('trace: '+arguments.callee.caller);\r
+ };\r
+ return result;\r
+ };\r
+\r
+ this.onload = function() {\r
+ // window.onload() equivalent for SM2, ready to create sounds etc.\r
+ // this is a stub - you can override this in your own external script, eg. soundManager.onload = function() {}\r
+ soundManager._wD('<em>Warning</em>: soundManager.onload() is undefined.',2);\r
+ };\r
+\r
+ this.onerror = function() {\r
+ // stub for user handler, called when SM2 fails to load/init\r
+ };\r
+\r
+ // --- "private" methods ---\r
+\r
+ this._idCheck = this.getSoundById;\r
+\r
+ this._disableObject = function(o) {\r
+ for (var oProp in o) {\r
+ if (typeof o[oProp] == 'function' && typeof o[oProp]._protected == 'undefined') o[oProp] = function(){return false;};\r
+ };\r
+ oProp = null;\r
+ };\r
+\r
+ this._failSafely = function() {\r
+ // exception handler for "object doesn't support this property or method" or general failure\r
+ var fpgssTitle = 'You may need to whitelist this location/domain eg. file:///C:/ or C:/ or mysite.com, or set ALWAYS ALLOW under the Flash Player Global Security Settings page. The latter is probably less-secure.';\r
+ var flashCPL = '<a href="'+flashCPLink+'" title="'+fpgssTitle+'">view/edit</a>';\r
+ var FPGSS = '<a href="'+flashCPLink+'" title="Flash Player Global Security Settings">FPGSS</a>';\r
+ if (!_s._disabled) {\r
+ _s._wD('soundManager: Failed to initialise.',2);\r
+ _s.disable();\r
+ };\r
+ };\r
+ \r
+ this._normalizeMovieURL = function(smURL) {\r
+ if (smURL) {\r
+ if (smURL.match(/\.swf/)) {\r
+ smURL = smURL.substr(0,smURL.lastIndexOf('.swf'));\r
+ }\r
+ if (smURL.lastIndexOf('/') != smURL.length-1) {\r
+ smURL = smURL+'/';\r
+ }\r
+ }\r
+ return(smURL && smURL.lastIndexOf('/')!=-1?smURL.substr(0,smURL.lastIndexOf('/')+1):'./')+_s.movieURL;\r
+ };\r
+\r
+ this._getDocument = function() {\r
+ return (document.body?document.body:(document.documentElement?document.documentElement:document.getElementsByTagName('div')[0]));\r
+ };\r
+\r
+ this._getDocument._protected = true;\r
+\r
+ this._createMovie = function(smID,smURL) {\r
+ if (_s._didAppend && _s._appendSuccess) return false; // ignore if already succeeded\r
+ if (window.location.href.indexOf('debug=1')+1) _s.debugMode = true; // allow force of debug mode via URL\r
+ _s._didAppend = true;\r
+ \r
+ // safety check for legacy (change to Flash 9 URL)\r
+ _s._setVersionInfo();\r
+ var remoteURL = (smURL?smURL:_s.url);\r
+ var localURL = (_s.altURL?_s.altURL:remoteURL);\r
+ _s.url = _s._normalizeMovieURL(_s._overHTTP?remoteURL:localURL);\r
+ smURL = _s.url;\r
+\r
+ var htmlEmbed = '<embed name="'+smID+'" id="'+smID+'" src="'+smURL+'" width="100%" height="100%" quality="high" allowScriptAccess="always" quality="high" '+(_s.useHighPerformance && !_s.useMovieStar?'wmode="transparent" ':'')+'bgcolor="'+_s.bgColor+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed>';\r
+ var htmlObject = '<object id="'+smID+'" data="'+smURL+'" type="application/x-shockwave-flash" width="100%" height="100%"><param name="movie" value="'+smURL+'" /><param name="AllowScriptAccess" value="always" /><param name="quality" value="high" />'+(_s.useHighPerformance && !_s.useMovieStar?'<param name="wmode" value="transparent" /> ':'')+'<param name="bgcolor" value="'+_s.bgColor+'" /><!-- --></object>';\r
+ var html = (!_s.isIE?htmlEmbed:htmlObject);\r
+\r
+ var toggleElement = '<div id="'+_s.debugID+'-toggle" style="position:fixed;_position:absolute;right:0px;bottom:0px;_top:0px;width:1.2em;height:1.2em;line-height:1.2em;margin:2px;padding:0px;text-align:center;border:1px solid #999;cursor:pointer;background:#fff;color:#333;z-index:10001" title="Toggle SM2 debug console" onclick="soundManager._toggleDebug()">-</div>';\r
+ var debugHTML = '<div id="'+_s.debugID+'" style="display:'+(_s.debugMode && ((!_s._hasConsole||!_s.useConsole)||(_s.useConsole && _s._hasConsole && !_s.consoleOnly))?'block':'none')+';opacity:0.85"></div>';\r
+ var appXHTML = 'soundManager._createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.';\r
+\r
+ var oTarget = _s._getDocument();\r
+ if (oTarget) {\r
+ \r
+ _s.oMC = document.getElementById('sm2-container')?document.getElementById('sm2-container'):document.createElement('div');\r
+ if (!_s.oMC.id) {\r
+ _s.oMC.id = 'sm2-container';\r
+ _s.oMC.className = 'movieContainer';\r
+ // "hide" flash movie\r
+ var s = null;\r
+ if (_s.useHighPerformance) {\r
+ s = {\r
+ position: 'fixed',\r
+ width: '8px',\r
+ height: '8px', // must be at least 6px for flash to run fast. odd? yes.\r
+ bottom: '0px',\r
+ left: '0px',\r
+ zIndex:-1 // sit behind everything else\r
+ }\r
+ } else {\r
+ s = {\r
+ position: 'absolute',\r
+ width: '1px',\r
+ height: '1px',\r
+ bottom: '0px',\r
+ left: '0px'\r
+ }\r
+ }\r
+ var x = null;\r
+ for (x in s) {\r
+ _s.oMC.style[x] = s[x];\r
+ }\r
+ try {\r
+ oTarget.appendChild(_s.oMC);\r
+ _s.oMC.innerHTML = html;\r
+ _s._appendSuccess = true;\r
+ } catch(e) {\r
+ throw new Error(appXHTML);\r
+ }\r
+ } else {\r
+ // it's already in the document.\r
+ _s.oMC.innerHTML = html;\r
+ _s._appendSuccess = true;\r
+ }\r
+ if (!document.getElementById(_s.debugID) && ((!_s._hasConsole||!_s.useConsole)||(_s.useConsole && _s._hasConsole && !_s.consoleOnly))) {\r
+ var oDebug = document.createElement('div');\r
+ oDebug.id = _s.debugID;\r
+ oDebug.style.display = (_s.debugMode?'block':'none');\r
+ if (_s.debugMode) {\r
+ try {\r
+ var oD = document.createElement('div');\r
+ oTarget.appendChild(oD);\r
+ oD.innerHTML = toggleElement;\r
+ } catch(e) {\r
+ throw new Error(appXHTML);\r
+ };\r
+ };\r
+ oTarget.appendChild(oDebug);\r
+ };\r
+ oTarget = null;\r
+ };\r
+ _s._wD('-- SoundManager 2 '+_s.version+(_s.useMovieStar?', MovieStar mode':'')+(_s._wD?', high performance mode':'')+' --',1);\r
+ _s._wD('soundManager._createMovie(): Trying to load '+smURL+(!_s._overHTTP && _s.altURL?'(alternate URL)':''),1);\r
+ };\r
+\r
+ // aliased to this._wD()\r
+ this._writeDebug = function(sText,sType,bTimestamp) {\r
+ if (!_s.debugMode) return false;\r
+ if (typeof bTimestamp != 'undefined' && bTimestamp) {\r
+ sText = sText + ' | '+new Date().getTime();\r
+ };\r
+ if (_s._hasConsole && _s.useConsole) {\r
+ var sMethod = _s._debugLevels[sType];\r
+ if (typeof console[sMethod] != 'undefined') {\r
+ console[sMethod](sText);\r
+ } else {\r
+ console.log(sText);\r
+ };\r
+ if (_s.useConsoleOnly) return true;\r
+ };\r
+ var sDID = 'soundmanager-debug';\r
+ try {\r
+ var o = document.getElementById(sDID);\r
+ if (!o) return false;\r
+ var oItem = document.createElement('div');\r
+ sText = sText.replace(/\n/g,'<br />');\r
+ if (typeof sType == 'undefined') {\r
+ var sType = 0;\r
+ } else {\r
+ sType = parseInt(sType);\r
+ };\r
+ oItem.innerHTML = sText;\r
+ if (sType) {\r
+ if (sType >= 2) oItem.style.fontWeight = 'bold';\r
+ if (sType == 3) oItem.style.color = '#ff3333';\r
+ };\r
+ // o.appendChild(oItem); // top-to-bottom\r
+ o.insertBefore(oItem,o.firstChild); // bottom-to-top\r
+ } catch(e) {\r
+ // oh well\r
+ };\r
+ o = null;\r
+ };\r
+ this._writeDebug._protected = true;\r
+ this._wD = this._writeDebug;\r
+\r
+ this._wDAlert = function(sText) { alert(sText); };\r
+\r
+ if (window.location.href.indexOf('debug=alert')+1 && _s.debugMode) {\r
+ _s._wD = _s._wDAlert;\r
+ };\r
+\r
+ this._toggleDebug = function() {\r
+ var o = document.getElementById(_s.debugID);\r
+ var oT = document.getElementById(_s.debugID+'-toggle');\r
+ if (!o) return false;\r
+ if (_s._debugOpen) {\r
+ // minimize\r
+ oT.innerHTML = '+';\r
+ o.style.display = 'none';\r
+ } else {\r
+ oT.innerHTML = '-';\r
+ o.style.display = 'block';\r
+ };\r
+ _s._debugOpen = !_s._debugOpen;\r
+ };\r
+\r
+ this._toggleDebug._protected = true;\r
+\r
+ this._debug = function() {\r
+ _s._wD('--- soundManager._debug(): Current sound objects ---',1);\r
+ for (var i=0,j=_s.soundIDs.length; i<j; i++) {\r
+ _s.sounds[_s.soundIDs[i]]._debug();\r
+ };\r
+ };\r
+\r
+ this._mergeObjects = function(oMain,oAdd) {\r
+ // non-destructive merge\r
+ var o1 = {}; // clone o1\r
+ for (var i in oMain) {\r
+ o1[i] = oMain[i];\r
+ }\r
+ var o2 = (typeof oAdd == 'undefined'?_s.defaultOptions:oAdd);\r
+ for (var o in o2) {\r
+ if (typeof o1[o] == 'undefined') o1[o] = o2[o];\r
+ };\r
+ return o1;\r
+ };\r
+\r
+ this.createMovie = function(sURL) {\r
+ if (sURL) _s.url = sURL;\r
+ _s._initMovie();\r
+ };\r
+\r
+ this.go = this.createMovie; // nice alias\r
+\r
+ this._initMovie = function() {\r
+ // attempt to get, or create, movie\r
+ if (_s.o) return false; // pre-init may have fired this function before window.onload(), may already exist\r
+ _s.o = _s.getMovie(_s.id); // try to get flash movie (inline markup)\r
+ if (!_s.o) {\r
+ // try to create\r
+ _s._createMovie(_s.id,_s.url);\r
+ _s.o = _s.getMovie(_s.id);\r
+ };\r
+ if (_s.o) {\r
+ _s._wD('soundManager._initMovie(): Got '+_s.o.nodeName+' element ('+(_s._didAppend?'created via JS':'static HTML')+')',1);\r
+ _s._wD('soundManager._initMovie(): Waiting for ExternalInterface call from Flash..');\r
+ };\r
+ };\r
+\r
+ this.waitForExternalInterface = function() {\r
+ if (_s._waitingForEI) return false;\r
+ _s._waitingForEI = true;\r
+ if (_s._tryInitOnFocus && !_s._isFocused) {\r
+ _s._wD('soundManager: Special case: Flash may not have started due to non-focused tab (Safari is lame), and/or focus cannot be detected. Waiting for focus-related event..');\r
+ return false;\r
+ };\r
+ if (!_s._didInit) {\r
+ _s._wD('soundManager: Getting impatient, still waiting for Flash.. ;)');\r
+ };\r
+ setTimeout(function() {\r
+ if (!_s._didInit) {\r
+ _s._wD('soundManager: No Flash response within reasonable time after document load.\nPossible causes: Flash version under 8, no support, or Flash security denying JS-Flash communication.',2);\r
+ if (!_s._overHTTP) {\r
+ _s._wD('soundManager: Loading this page from local/network file system (not over HTTP?) Flash security likely restricting JS-Flash access. Consider adding current URL to "trusted locations" in the Flash player security settings manager at '+flashCPLink+', or simply serve this content over HTTP.',2);\r
+ };\r
+ };\r
+ // if still not initialized and no other options, give up\r
+ if (!_s._didInit && _s._okToDisable) _s._failSafely();\r
+ },750);\r
+ };\r
+\r
+ this.handleFocus = function() {\r
+ if (_s._isFocused || !_s._tryInitOnFocus) return true;\r
+ _s._okToDisable = true;\r
+ _s._isFocused = true;\r
+ _s._wD('soundManager.handleFocus()');\r
+ if (_s._tryInitOnFocus) {\r
+ // giant Safari 3.1 hack - assume window in focus if mouse is moving, since document.hasFocus() not currently implemented.\r
+ window.removeEventListener('mousemove',_s.handleFocus,false);\r
+ };\r
+ // allow init to restart\r
+ _s._waitingForEI = false;\r
+ setTimeout(_s.waitForExternalInterface,500);\r
+ // detach event\r
+ if (window.removeEventListener) {\r
+ window.removeEventListener('focus',_s.handleFocus,false);\r
+ } else if (window.detachEvent) {\r
+ window.detachEvent('onfocus',_s.handleFocus);\r
+ };\r
+ };\r
+\r
+ this.initComplete = function() {\r
+ if (_s._didInit) return false;\r
+ _s._didInit = true;\r
+ _s._wD('-- SoundManager 2 '+(_s._disabled?'failed to load':'loaded')+' ('+(_s._disabled?'security/load error':'OK')+') --',1);\r
+ if (_s._disabled) {\r
+ _s._wD('soundManager.initComplete(): calling soundManager.onerror()',1);\r
+ _s.onerror.apply(window);\r
+ return false;\r
+ };\r
+ if (_s.waitForWindowLoad && !_s._windowLoaded) {\r
+ _s._wD('soundManager: Waiting for window.onload()');\r
+ if (window.addEventListener) {\r
+ window.addEventListener('load',_s.initUserOnload,false);\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('onload',_s.initUserOnload);\r
+ };\r
+ return false;\r
+ } else {\r
+ if (_s.waitForWindowLoad && _s._windowLoaded) {\r
+ _s._wD('soundManager: Document already loaded');\r
+ };\r
+ _s.initUserOnload();\r
+ };\r
+ };\r
+\r
+ this.initUserOnload = function() {\r
+ _s._wD('soundManager.initComplete(): calling soundManager.onload()',1);\r
+ // call user-defined "onload", scoped to window\r
+ //try {\r
+ _s.onload.apply(window);\r
+ /*\r
+ } catch(e) {\r
+ // something broke (likely JS error in user function)\r
+ _s._wD('soundManager.onload() threw an exception: '+e.message,2);\r
+ setTimeout(function(){throw new Error(e)},20);\r
+ return false;\r
+ };\r
+ */\r
+ _s._wD('soundManager.onload() complete',1);\r
+ };\r
+\r
+ this.init = function() {\r
+ _s._wD('-- soundManager.init() --');\r
+ // called after onload()\r
+ _s._initMovie();\r
+ if (_s._didInit) {\r
+ _s._wD('soundManager.init(): Already called?');\r
+ return false;\r
+ };\r
+ // event cleanup\r
+ if (window.removeEventListener) {\r
+ window.removeEventListener('load',_s.beginDelayedInit,false);\r
+ } else if (window.detachEvent) {\r
+ window.detachEvent('onload',_s.beginDelayedInit);\r
+ };\r
+ try {\r
+ _s._wD('Attempting to call JS -> Flash..');\r
+ _s.o._externalInterfaceTest(false); // attempt to talk to Flash\r
+ // _s._wD('Flash ExternalInterface call (JS-Flash) OK',1);\r
+ if (!_s.allowPolling) {\r
+ _s._wD('Polling (whileloading/whileplaying support) is disabled.',1);\r
+ }\r
+ _s.setPolling(true);\r
+ if (!_s.debugMode) _s.o._disableDebug();\r
+ _s.enabled = true;\r
+ } catch(e) {\r
+ _s._failSafely();\r
+ _s.initComplete();\r
+ return false;\r
+ };\r
+ _s.initComplete();\r
+ };\r
+\r
+ this.beginDelayedInit = function() {\r
+ _s._wD('soundManager.beginDelayedInit(): Document loaded');\r
+ _s._windowLoaded = true;\r
+ setTimeout(_s.waitForExternalInterface,500);\r
+ setTimeout(_s.beginInit,20);\r
+ };\r
+\r
+ this.beginInit = function() {\r
+ if (_s._initPending) return false;\r
+ _s.createMovie(); // ensure creation if not already done\r
+ _s._initMovie();\r
+ _s._initPending = true;\r
+ return true;\r
+ };\r
+\r
+ this.domContentLoaded = function() {\r
+ _s._wD('soundManager.domContentLoaded()');\r
+ if (document.removeEventListener) document.removeEventListener('DOMContentLoaded',_s.domContentLoaded,false);\r
+ _s.go();\r
+ };\r
+\r
+ this._externalInterfaceOK = function() {\r
+ // callback from flash for confirming that movie loaded, EI is working etc.\r
+ if (_s.swfLoaded) return false;\r
+ _s._wD('soundManager._externalInterfaceOK()');\r
+ _s.swfLoaded = true;\r
+ _s._tryInitOnFocus = false;\r
+ if (_s.isIE) {\r
+ // IE needs a timeout OR delay until window.onload - may need TODO: investigating\r
+ setTimeout(_s.init,100);\r
+ } else {\r
+ _s.init();\r
+ };\r
+ };\r
+\r
+ this._setSandboxType = function(sandboxType) {\r
+ var sb = _s.sandbox;\r
+ sb.type = sandboxType;\r
+ sb.description = sb.types[(typeof sb.types[sandboxType] != 'undefined'?sandboxType:'unknown')];\r
+ _s._wD('Flash security sandbox type: '+sb.type);\r
+ if (sb.type == 'localWithFile') {\r
+ sb.noRemote = true;\r
+ sb.noLocal = false;\r
+ _s._wD('Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',2);\r
+ } else if (sb.type == 'localWithNetwork') {\r
+ sb.noRemote = false;\r
+ sb.noLocal = true;\r
+ } else if (sb.type == 'localTrusted') {\r
+ sb.noRemote = false;\r
+ sb.noLocal = false;\r
+ };\r
+ };\r
+\r
+ this.destruct = function() {\r
+ _s._wD('soundManager.destruct()');\r
+ _s.disable(true);\r
+ };\r
+ \r
+ // SMSound (sound object)\r
+ \r
+ function SMSound(oOptions) {\r
+ var _t = this;\r
+ this.sID = oOptions.id;\r
+ this.url = oOptions.url;\r
+ this.options = _s._mergeObjects(oOptions);\r
+ this.instanceOptions = this.options; // per-play-instance-specific options\r
+ this._iO = this.instanceOptions; // short alias\r
+\r
+ this._debug = function() {\r
+ if (_s.debugMode) {\r
+ var stuff = null;\r
+ var msg = [];\r
+ var sF = null;\r
+ var sfBracket = null;\r
+ var maxLength = 64; // # of characters of function code to show before truncating\r
+ for (stuff in _t.options) {\r
+ if (_t.options[stuff] != null) {\r
+ if (_t.options[stuff] instanceof Function) {\r
+ // handle functions specially\r
+ sF = _t.options[stuff].toString();\r
+ sF = sF.replace(/\s\s+/g,' '); // normalize spaces\r
+ sfBracket = sF.indexOf('{');\r
+ msg[msg.length] = ' '+stuff+': {'+sF.substr(sfBracket+1,(Math.min(Math.max(sF.indexOf('\n')-1,maxLength),maxLength))).replace(/\n/g,'')+'... }';\r
+ } else {\r
+ msg[msg.length] = ' '+stuff+': '+_t.options[stuff];\r
+ };\r
+ };\r
+ };\r
+ _s._wD('SMSound() merged options: {\n'+msg.join(', \n')+'\n}');\r
+ };\r
+ };\r
+\r
+ this._debug();\r
+\r
+ this.id3 = {\r
+ /* \r
+ Name/value pairs set via Flash when available - see reference for names:\r
+ http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001567.html\r
+ (eg., this.id3.songname or this.id3['songname'])\r
+ */\r
+ };\r
+\r
+ this.resetProperties = function(bLoaded) {\r
+ _t.bytesLoaded = null;\r
+ _t.bytesTotal = null;\r
+ _t.position = null;\r
+ _t.duration = null;\r
+ _t.durationEstimate = null;\r
+ _t.loaded = false;\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r
+ _t.muted = false;\r
+ _t.didBeforeFinish = false;\r
+ _t.didJustBeforeFinish = false;\r
+ _t.instanceOptions = {};\r
+ _t.instanceCount = 0;\r
+ _t.peakData = {\r
+ left: 0,\r
+ right: 0\r
+ };\r
+ _t.waveformData = [];\r
+ _t.eqData = [];\r
+ };\r
+\r
+ _t.resetProperties();\r
+\r
+ // --- public methods ---\r
+\r
+ this.load = function(oOptions) {\r
+ if (typeof oOptions != 'undefined') {\r
+ _t._iO = _s._mergeObjects(oOptions);\r
+ _t.instanceOptions = _t._iO;\r
+ } else {\r
+ var oOptions = _t.options;\r
+ _t._iO = oOptions;\r
+ _t.instanceOptions = _t._iO;\r
+ } \r
+ if (typeof _t._iO.url == 'undefined') _t._iO.url = _t.url;\r
+ _s._wD('soundManager.load(): '+_t._iO.url,1);\r
+ if (_t._iO.url == _t.url && _t.readyState != 0 && _t.readyState != 2) {\r
+ _s._wD('soundManager.load(): current URL already assigned.',1);\r
+ return false;\r
+ }\r
+ _t.loaded = false;\r
+ _t.readyState = 1;\r
+ _t.playState = (oOptions.autoPlay?1:0); // if autoPlay, assume "playing" is true (no way to detect when it actually starts in Flash unless onPlay is watched?)\r
+ try {\r
+ if (_s.flashVersion==8) {\r
+ _s.o._load(_t.sID,_t._iO.url,_t._iO.stream,_t._iO.autoPlay,(_t._iO.whileloading?1:0));\r
+ } else {\r
+ _s.o._load(_t.sID,_t._iO.url,_t._iO.stream?true:false,_t._iO.autoPlay?true:false); // ,(_tO.whileloading?true:false)\r
+ if (_t._iO.isMovieStar && _t._iO.autoLoad && !_t._iO.autoPlay) {\r
+ // special case: MPEG4 content must start playing to load, then pause to prevent playing.\r
+ _t.pause();\r
+ }\r
+ };\r
+ } catch(e) {\r
+ _s._wD('SMSound.load(): Exception: JS-Flash communication failed, or JS error.',2);\r
+ _s.onerror();\r
+ _s.disable();\r
+ };\r
+ };\r
+\r
+ this.unload = function() {\r
+ // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3\r
+ // Flash 9/AS3: Close stream, preventing further load\r
+ if (_t.readyState != 0) {\r
+ _s._wD('SMSound.unload(): "'+_t.sID+'"');\r
+ if (_t.readyState != 2) { // reset if not error\r
+ _t.setPosition(0); // reset current sound positioning\r
+ }\r
+ _s.o._unload(_t.sID,_s.nullURL);\r
+ // reset load/status flags\r
+ _t.resetProperties();\r
+ }\r
+ };\r
+\r
+ this.destruct = function() {\r
+ // kill sound within Flash\r
+ _s._wD('SMSound.destruct(): "'+_t.sID+'"');\r
+ _s.o._destroySound(_t.sID);\r
+ _s.destroySound(_t.sID,true); // ensure deletion from controller\r
+ }\r
+\r
+ this.play = function(oOptions) {\r
+ if (!oOptions) oOptions = {};\r
+ _t._iO = _s._mergeObjects(oOptions,_t._iO);\r
+ _t._iO = _s._mergeObjects(_t._iO,_t.options);\r
+ _t.instanceOptions = _t._iO;\r
+ if (_t.playState == 1) {\r
+ var allowMulti = _t._iO.multiShot;\r
+ if (!allowMulti) {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" already playing (one-shot)',1);\r
+ return false;\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" already playing (multi-shot)',1);\r
+ };\r
+ };\r
+ if (!_t.loaded) {\r
+ if (_t.readyState == 0) {\r
+ _s._wD('SMSound.play(): Attempting to load "'+_t.sID+'"',1);\r
+ // try to get this sound playing ASAP\r
+ _t._iO.stream = true;\r
+ _t._iO.autoPlay = true;\r
+ // TODO: need to investigate when false, double-playing\r
+ // if (typeof oOptions.autoPlay=='undefined') _tO.autoPlay = true; // only set autoPlay if unspecified here\r
+ _t.load(_t._iO); // try to get this sound playing ASAP\r
+ } else if (_t.readyState == 2) {\r
+ _s._wD('SMSound.play(): Could not load "'+_t.sID+'" - exiting',2);\r
+ return false;\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" is loading - attempting to play..',1);\r
+ };\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'"');\r
+ };\r
+ if (_t.paused) {\r
+ _t.resume();\r
+ } else {\r
+ _t.playState = 1;\r
+ if (!_t.instanceCount || _s.flashVersion == 9) _t.instanceCount++;\r
+ _t.position = (typeof _t._iO.position != 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0);\r
+ if (_t._iO.onplay) _t._iO.onplay.apply(_t);\r
+ _t.setVolume(_t._iO.volume);\r
+ _t.setPan(_t._iO.pan);\r
+ _s.o._start(_t.sID,_t._iO.loop||1,(_s.flashVersion==9?_t.position:_t.position/1000));\r
+ };\r
+ };\r
+\r
+ this.start = this.play; // just for convenience\r
+\r
+ this.stop = function(bAll) {\r
+ if (_t.playState == 1) {\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ // if (_s.defaultOptions.onstop) _s.defaultOptions.onstop.apply(_s);\r
+ if (_t._iO.onstop) _t._iO.onstop.apply(_t);\r
+ _s.o._stop(_t.sID,bAll);\r
+ _t.instanceCount = 0;\r
+ _t._iO = {};\r
+ // _t.instanceOptions = _t._iO;\r
+ };\r
+ };\r
+\r
+ this.setPosition = function(nMsecOffset) {\r
+ _t._iO.position = nMsecOffset;\r
+ _s._wD('SMSound.setPosition('+nMsecOffset+')');\r
+ _s.o._setPosition(_t.sID,(_s.flashVersion==9?_t._iO.position:_t._iO.position/1000),(_t.paused||!_t.playState)); // if paused or not playing, will not resume (by playing)\r
+ };\r
+\r
+ this.pause = function() {\r
+ if (_t.paused || _t.playState == 0) return false;\r
+ _s._wD('SMSound.pause()');\r
+ _t.paused = true;\r
+ _s.o._pause(_t.sID);\r
+ if (_t._iO.onpause) _t._iO.onpause.apply(_t);\r
+ };\r
+\r
+ this.resume = function() {\r
+ if (!_t.paused || _t.playState == 0) return false;\r
+ _s._wD('SMSound.resume()');\r
+ _t.paused = false;\r
+ _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume)\r
+ if (_t._iO.onresume) _t._iO.onresume.apply(_t);\r
+ };\r
+\r
+ this.togglePause = function() {\r
+ _s._wD('SMSound.togglePause()');\r
+ if (!_t.playState) {\r
+ _t.play({position:(_s.flashVersion==9?_t.position:_t.position/1000)});\r
+ return false;\r
+ };\r
+ if (_t.paused) {\r
+ _t.resume();\r
+ } else {\r
+ _t.pause();\r
+ };\r
+ };\r
+\r
+ this.setPan = function(nPan) {\r
+ if (typeof nPan == 'undefined') nPan = 0;\r
+ _s.o._setPan(_t.sID,nPan);\r
+ _t._iO.pan = nPan;\r
+ };\r
+\r
+ this.setVolume = function(nVol) {\r
+ if (typeof nVol == 'undefined') nVol = 100;\r
+ _s.o._setVolume(_t.sID,(_s.muted&&!_t.muted)||_t.muted?0:nVol);\r
+ _t._iO.volume = nVol;\r
+ };\r
+\r
+ this.mute = function() {\r
+ _t.muted = true;\r
+ _s.o._setVolume(_t.sID,0);\r
+ };\r
+\r
+ this.unmute = function() {\r
+ _t.muted = false;\r
+ _s.o._setVolume(_t.sID,typeof _t._iO.volume != 'undefined'?_t._iO.volume:_t.options.volume);\r
+ };\r
+\r
+ // --- "private" methods called by Flash ---\r
+\r
+ this._whileloading = function(nBytesLoaded,nBytesTotal,nDuration) {\r
+ if (!_t._iO.isMovieStar) {\r
+ _t.bytesLoaded = nBytesLoaded;\r
+ _t.bytesTotal = nBytesTotal;\r
+ _t.duration = Math.floor(nDuration);\r
+ _t.durationEstimate = parseInt((_t.bytesTotal/_t.bytesLoaded)*_t.duration); // estimate total time (will only be accurate with CBR MP3s.)\r
+ if (_t.readyState != 3 && _t._iO.whileloading) _t._iO.whileloading.apply(_t);\r
+ } else {\r
+ _t.bytesLoaded = nBytesLoaded;\r
+ _t.bytesTotal = nBytesTotal;\r
+ _t.duration = Math.floor(nDuration);\r
+ _t.durationEstimate = _t.duration;\r
+ if (_t.readyState != 3 && _t._iO.whileloading) _t._iO.whileloading.apply(_t);\r
+ }\r
+ };\r
+\r
+ this._onid3 = function(oID3PropNames,oID3Data) {\r
+ // oID3PropNames: string array (names)\r
+ // ID3Data: string array (data)\r
+ _s._wD('SMSound._onid3(): "'+this.sID+'" ID3 data received.');\r
+ var oData = [];\r
+ for (var i=0,j=oID3PropNames.length; i<j; i++) {\r
+ oData[oID3PropNames[i]] = oID3Data[i];\r
+ // _s._wD(oID3PropNames[i]+': '+oID3Data[i]);\r
+ };\r
+ _t.id3 = _s._mergeObjects(_t.id3,oData);\r
+ if (_t._iO.onid3) _t._iO.onid3.apply(_t);\r
+ };\r
+\r
+ this._whileplaying = function(nPosition,oPeakData,oWaveformData,oEQData) {\r
+ if (isNaN(nPosition) || nPosition == null) return false; // Flash may return NaN at times\r
+ _t.position = nPosition;\r
+ if (_t._iO.usePeakData && typeof oPeakData != 'undefined' && oPeakData) {\r
+ _t.peakData = {\r
+ left: oPeakData.leftPeak,\r
+ right: oPeakData.rightPeak\r
+ };\r
+ };\r
+ if (_t._iO.useWaveformData && typeof oWaveformData != 'undefined' && oWaveformData) {\r
+ _t.waveformData = oWaveformData;\r
+ /*\r
+ _t.spectrumData = {\r
+ left: oSpectrumData.left.split(','),\r
+ right: oSpectrumData.right.split(',')\r
+ }\r
+ */\r
+ };\r
+ if (_t._iO.useEQData && typeof oEQData != 'undefined' && oEQData) {\r
+ _t.eqData = oEQData;\r
+ };\r
+ if (_t.playState == 1) {\r
+ if (_t._iO.whileplaying) {\r
+ _t._iO.whileplaying.apply(_t); // flash may call after actual finish\r
+ };\r
+ if (_t.loaded && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration-_t.position <= _t._iO.onbeforefinishtime) {\r
+ _s._wD('duration-position <= onbeforefinishtime: '+_t.duration+' - '+_t.position+' <= '+_t._iO.onbeforefinishtime+' ('+(_t.duration-_t.position)+')');\r
+ _t._onbeforefinish();\r
+ };\r
+ };\r
+ };\r
+\r
+ this._onload = function(bSuccess) {\r
+ bSuccess = (bSuccess==1?true:false);\r
+ _s._wD('SMSound._onload(): "'+_t.sID+'"'+(bSuccess?' loaded.':' failed to load? - '+_t.url));\r
+ if (!bSuccess) {\r
+ if (_s.sandbox.noRemote == true) {\r
+ _s._wD('SMSound._onload(): Reminder: Flash security is denying network/internet access',1);\r
+ };\r
+ if (_s.sandbox.noLocal == true) {\r
+ _s._wD('SMSound._onload(): Reminder: Flash security is denying local access',1);\r
+ };\r
+ };\r
+ _t.loaded = bSuccess;\r
+ _t.readyState = bSuccess?3:2;\r
+ if (_t._iO.onload) {\r
+ _t._iO.onload.apply(_t);\r
+ };\r
+ };\r
+\r
+ this._onbeforefinish = function() {\r
+ if (!_t.didBeforeFinish) {\r
+ _t.didBeforeFinish = true;\r
+ if (_t._iO.onbeforefinish) {\r
+ _s._wD('SMSound._onbeforefinish(): "'+_t.sID+'"');\r
+ _t._iO.onbeforefinish.apply(_t);\r
+ }\r
+ };\r
+ };\r
+\r
+ this._onjustbeforefinish = function(msOffset) {\r
+ // msOffset: "end of sound" delay actual value (eg. 200 msec, value at event fire time was 187)\r
+ if (!_t.didJustBeforeFinish) {\r
+ _t.didJustBeforeFinish = true;\r
+ if (_t._iO.onjustbeforefinish) {\r
+ _s._wD('SMSound._onjustbeforefinish(): "'+_t.sID+'"');\r
+ _t._iO.onjustbeforefinish.apply(_t);\r
+ }\r
+ };\r
+ };\r
+\r
+ this._onfinish = function() {\r
+ // sound has finished playing\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ if (_t._iO.onfinish) {\r
+ _s._wD('SMSound._onfinish(): "'+_t.sID+'"');\r
+ _t._iO.onfinish.apply(_t);\r
+ }\r
+ if (_t._iO.onbeforefinishcomplete) _t._iO.onbeforefinishcomplete.apply(_t);\r
+ // reset some state items\r
+ _t.setPosition(0);\r
+ _t.didBeforeFinish = false;\r
+ _t.didJustBeforeFinish = false;\r
+ if (_t.instanceCount) {\r
+ _t.instanceCount--;\r
+ if (!_t.instanceCount) {\r
+ // reset instance options\r
+ _t.instanceCount = 0;\r
+ _t.instanceOptions = {};\r
+ }\r
+ }\r
+ };\r
+\r
+ this._onmetadata = function(oMetaData) {\r
+ // movieStar mode only\r
+ _s._wD('SMSound.onmetadata()');\r
+ // Contains a subset of metadata. Note that files may have their own unique metadata.\r
+ // http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000267.html\r
+ if (!oMetaData.width && !oMetaData.height) {\r
+ _s._wD('No width/height given, assuming defaults');\r
+ oMetaData.width = 320;\r
+ oMetaData.height = 240;\r
+ };\r
+ _t.metadata = oMetaData; // potentially-large object from flash\r
+ _t.width = oMetaData.width;\r
+ _t.height = oMetaData.height;\r
+ if (_t._iO.onmetadata) {\r
+ _s._wD('SMSound._onmetadata(): "'+_t.sID+'"');\r
+ _t._iO.onmetadata.apply(_t);\r
+ }\r
+ _s.wD('SMSound.onmetadata() complete');\r
+ };\r
+\r
+ }; // SMSound()\r
+\r
+ // register a few event handlers\r
+ if (window.addEventListener) {\r
+ window.addEventListener('focus',_s.handleFocus,false);\r
+ window.addEventListener('load',_s.beginDelayedInit,false);\r
+ window.addEventListener('unload',_s.destruct,false);\r
+ if (_s._tryInitOnFocus) window.addEventListener('mousemove',_s.handleFocus,false); // massive Safari focus hack\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('onfocus',_s.handleFocus);\r
+ window.attachEvent('onload',_s.beginDelayedInit);\r
+ window.attachEvent('unload',_s.destruct);\r
+ } else {\r
+ // no add/attachevent support - safe to assume no JS -> Flash either.\r
+ soundManager.onerror();\r
+ soundManager.disable();\r
+ };\r
+\r
+ if (document.addEventListener) document.addEventListener('DOMContentLoaded',_s.domContentLoaded,false);\r
+\r
+}; // SoundManager()\r
+\r
+var soundManager = new SoundManager();\r
--- /dev/null
+/* This notice must be untouched at all times.\r
+\r
+wz_jsgraphics.js v. 3.03\r
+The latest version is available at\r
+http://www.walterzorn.com\r
+or http://www.devira.com\r
+or http://www.walterzorn.de\r
+\r
+Copyright (c) 2002-2004 Walter Zorn. All rights reserved.\r
+Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )\r
+Last modified: 28. 1. 2008\r
+\r
+Performance optimizations for Internet Explorer\r
+by Thomas Frank and John Holdsworth.\r
+fillPolygon method implemented by Matthieu Haller.\r
+\r
+High Performance JavaScript Graphics Library.\r
+Provides methods\r
+- to draw lines, rectangles, ellipses, polygons\r
+ with specifiable line thickness,\r
+- to fill rectangles, polygons, ellipses and arcs\r
+- to draw text.\r
+NOTE: Operations, functions and branching have rather been optimized\r
+to efficiency and speed than to shortness of source code.\r
+\r
+LICENSE: LGPL\r
+\r
+This library is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU Lesser General Public\r
+License (LGPL) as published by the Free Software Foundation; either\r
+version 2.1 of the License, or (at your option) any later version.\r
+\r
+This library is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+Lesser General Public License for more details.\r
+\r
+You should have received a copy of the GNU Lesser General Public\r
+License along with this library; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA,\r
+or see http://www.gnu.org/copyleft/lesser.html\r
+*/\r
+\r
+\r
+var jg_ok, jg_ie, jg_fast, jg_dom, jg_moz;\r
+\r
+\r
+function _chkDHTM(x, i)\r
+{\r
+ x = document.body || null;\r
+ jg_ie = x && typeof x.insertAdjacentHTML != "undefined" && document.createElement;\r
+ jg_dom = (x && !jg_ie &&\r
+ typeof x.appendChild != "undefined" &&\r
+ typeof document.createRange != "undefined" &&\r
+ typeof (i = document.createRange()).setStartBefore != "undefined" &&\r
+ typeof i.createContextualFragment != "undefined");\r
+ jg_fast = jg_ie && document.all && !window.opera;\r
+ jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";\r
+ jg_ok = !!(jg_ie || jg_dom);\r
+}\r
+\r
+function _pntCnvDom()\r
+{\r
+ var x = this.wnd.document.createRange();\r
+ x.setStartBefore(this.cnv);\r
+ x = x.createContextualFragment(jg_fast? this._htmRpc() : this.htm);\r
+ if(this.cnv) this.cnv.appendChild(x);\r
+ this.htm = "";\r
+}\r
+\r
+function _pntCnvIe()\r
+{\r
+ if(this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this._htmRpc() : this.htm);\r
+ this.htm = "";\r
+}\r
+\r
+function _pntDoc()\r
+{\r
+ this.wnd.document.write(jg_fast? this._htmRpc() : this.htm);\r
+ this.htm = '';\r
+}\r
+\r
+function _pntN()\r
+{\r
+ ;\r
+}\r
+\r
+function _mkDiv(x, y, w, h)\r
+{\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:' + w + 'px;'+\r
+ 'height:' + h + 'px;'+\r
+ 'clip:rect(0,'+w+'px,'+h+'px,0);'+\r
+ 'background-color:' + this.color +\r
+ (!jg_moz? ';overflow:hidden' : '')+\r
+ ';"><\/div>';\r
+}\r
+\r
+function _mkDivIe(x, y, w, h)\r
+{\r
+ this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';\r
+}\r
+\r
+function _mkDivPrt(x, y, w, h)\r
+{\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'border-left:' + w + 'px solid ' + this.color + ';'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:0px;'+\r
+ 'height:' + h + 'px;'+\r
+ 'clip:rect(0,'+w+'px,'+h+'px,0);'+\r
+ 'background-color:' + this.color +\r
+ (!jg_moz? ';overflow:hidden' : '')+\r
+ ';"><\/div>';\r
+}\r
+\r
+var _regex = /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;\r
+function _htmRpc()\r
+{\r
+ return this.htm.replace(\r
+ _regex,\r
+ '<div style="overflow:hidden;position:absolute;background-color:'+\r
+ '$1;left:$2;top:$3;width:$4;height:$5"></div>\n');\r
+}\r
+\r
+function _htmPrtRpc()\r
+{\r
+ return this.htm.replace(\r
+ _regex,\r
+ '<div style="overflow:hidden;position:absolute;background-color:'+\r
+ '$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n');\r
+}\r
+\r
+function _mkLin(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1;\r
+\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx,\r
+ ox = x;\r
+ while(dx > 0)\r
+ {--dx;\r
+ ++x;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(ox, y, x-ox, 1);\r
+ y += yIncr;\r
+ p += pru;\r
+ ox = x;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(ox, y, x2-ox+1, 1);\r
+ }\r
+\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy,\r
+ oy = y;\r
+ if(y2 <= y1)\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, y, 1, oy-y+1);\r
+ y += yIncr;\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ y += yIncr;\r
+ p += pr;\r
+ }\r
+ }\r
+ this._mkDiv(x2, y2, 1, oy-y2+1);\r
+ }\r
+ else\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, oy, 1, y-oy);\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(x2, oy, 1, y2-oy+1);\r
+ }\r
+ }\r
+}\r
+\r
+function _mkLin2D(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1;\r
+\r
+ var s = this.stroke;\r
+ if(dx >= dy)\r
+ {\r
+ if(dx > 0 && s-3 > 0)\r
+ {\r
+ var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;\r
+ _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;\r
+ }\r
+ else var _s = s;\r
+ var ad = Math.ceil(s/2);\r
+\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx,\r
+ ox = x;\r
+ while(dx > 0)\r
+ {--dx;\r
+ ++x;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(ox, y, x-ox+ad, _s);\r
+ y += yIncr;\r
+ p += pru;\r
+ ox = x;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(ox, y, x2-ox+ad+1, _s);\r
+ }\r
+\r
+ else\r
+ {\r
+ if(s-3 > 0)\r
+ {\r
+ var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;\r
+ _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;\r
+ }\r
+ else var _s = s;\r
+ var ad = Math.round(s/2);\r
+\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy,\r
+ oy = y;\r
+ if(y2 <= y1)\r
+ {\r
+ ++ad;\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, y, _s, oy-y+ad);\r
+ y += yIncr;\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ y += yIncr;\r
+ p += pr;\r
+ }\r
+ }\r
+ this._mkDiv(x2, y2, _s, oy-y2+ad);\r
+ }\r
+ else\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, oy, _s, y-oy+ad);\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(x2, oy, _s, y2-oy+ad+1);\r
+ }\r
+ }\r
+}\r
+\r
+function _mkLinDott(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1,\r
+ drw = true;\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx;\r
+ while(dx > 0)\r
+ {--dx;\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+ drw = !drw;\r
+ if(p > 0)\r
+ {\r
+ y += yIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ ++x;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy;\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+ drw = !drw;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ ++x;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ }\r
+ }\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+}\r
+\r
+function _mkOv(left, top, width, height)\r
+{\r
+ var a = (++width)>>1, b = (++height)>>1,\r
+ wod = width&1, hod = height&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ ox = 0, oy = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ w, h;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ w = x-ox;\r
+ h = oy-y;\r
+ if((w&2) && (h&2))\r
+ {\r
+ this._mkOvQds(cx, cy, x-2, y+2, 1, 1, wod, hod);\r
+ this._mkOvQds(cx, cy, x-1, y+1, 1, 1, wod, hod);\r
+ }\r
+ else this._mkOvQds(cx, cy, x-1, oy, w, h, wod, hod);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ w = a-ox+1;\r
+ h = (oy<<1)+hod;\r
+ y = cy-oy;\r
+ this._mkDiv(cx-a, y, w, h);\r
+ this._mkDiv(cx+ox+wod-1, y, w, h);\r
+}\r
+\r
+function _mkOv2D(left, top, width, height)\r
+{\r
+ var s = this.stroke;\r
+ width += s+1;\r
+ height += s+1;\r
+ var a = width>>1, b = height>>1,\r
+ wod = width&1, hod = height&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1);\r
+\r
+ if(s-4 < 0 && (!(s-2) || width-51 > 0 && height-51 > 0))\r
+ {\r
+ var ox = 0, oy = b,\r
+ w, h,\r
+ pxw;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ w = x-ox;\r
+ h = oy-y;\r
+\r
+ if(w-1)\r
+ {\r
+ pxw = w+1+(s&1);\r
+ h = s;\r
+ }\r
+ else if(h-1)\r
+ {\r
+ pxw = s;\r
+ h += 1+(s&1);\r
+ }\r
+ else pxw = h = s;\r
+ this._mkOvQds(cx, cy, x-1, oy, pxw, h, wod, hod);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);\r
+ this._mkDiv(cx+a+wod-s, cy-oy, s, (oy<<1)+hod);\r
+ }\r
+\r
+ else\r
+ {\r
+ var _a = (width-(s<<1))>>1,\r
+ _b = (height-(s<<1))>>1,\r
+ _x = 0, _y = _b,\r
+ _aa2 = (_a*_a)<<1, _aa4 = _aa2<<1, _bb2 = (_b*_b)<<1, _bb4 = _bb2<<1,\r
+ _st = (_aa2>>1)*(1-(_b<<1)) + _bb2,\r
+ _tt = (_bb2>>1) - _aa2*((_b<<1)-1),\r
+\r
+ pxl = new Array(),\r
+ pxt = new Array(),\r
+ _pxb = new Array();\r
+ pxl[0] = 0;\r
+ pxt[0] = b;\r
+ _pxb[0] = _b-1;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ pxl[pxl.length] = x;\r
+ pxt[pxt.length] = y;\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ pxl[pxl.length] = x;\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ pxt[pxt.length] = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+\r
+ if(_y > 0)\r
+ {\r
+ if(_st < 0)\r
+ {\r
+ _st += _bb2*((_x<<1)+3);\r
+ _tt += _bb4*(++_x);\r
+ _pxb[_pxb.length] = _y-1;\r
+ }\r
+ else if(_tt < 0)\r
+ {\r
+ _st += _bb2*((_x<<1)+3) - _aa4*(_y-1);\r
+ _tt += _bb4*(++_x) - _aa2*(((_y--)<<1)-3);\r
+ _pxb[_pxb.length] = _y-1;\r
+ }\r
+ else\r
+ {\r
+ _tt -= _aa2*((_y<<1)-3);\r
+ _st -= _aa4*(--_y);\r
+ _pxb[_pxb.length-1]--;\r
+ }\r
+ }\r
+ }\r
+\r
+ var ox = -wod, oy = b,\r
+ _oy = _pxb[0],\r
+ l = pxl.length,\r
+ w, h;\r
+ for(var i = 0; i < l; i++)\r
+ {\r
+ if(typeof _pxb[i] != "undefined")\r
+ {\r
+ if(_pxb[i] < _oy || pxt[i] < oy)\r
+ {\r
+ x = pxl[i];\r
+ this._mkOvQds(cx, cy, x, oy, x-ox, oy-_oy, wod, hod);\r
+ ox = x;\r
+ oy = pxt[i];\r
+ _oy = _pxb[i];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ x = pxl[i];\r
+ this._mkDiv(cx-x, cy-oy, 1, (oy<<1)+hod);\r
+ this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);\r
+ ox = x;\r
+ oy = pxt[i];\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);\r
+ this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);\r
+ }\r
+}\r
+\r
+function _mkOvDott(left, top, width, height)\r
+{\r
+ var a = (++width)>>1, b = (++height)>>1,\r
+ wod = width&1, hod = height&1, hodu = hod^1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ drw = true;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ if(drw && y >= hodu) this._mkOvQds(cx, cy, x, y, 1, 1, wod, hod);\r
+ drw = !drw;\r
+ }\r
+}\r
+\r
+function _mkRect(x, y, w, h)\r
+{\r
+ var s = this.stroke;\r
+ this._mkDiv(x, y, w, s);\r
+ this._mkDiv(x+w, y, s, h);\r
+ this._mkDiv(x, y+h, w+s, s);\r
+ this._mkDiv(x, y+s, s, h-s);\r
+}\r
+\r
+function _mkRectDott(x, y, w, h)\r
+{\r
+ this.drawLine(x, y, x+w, y);\r
+ this.drawLine(x+w, y, x+w, y+h);\r
+ this.drawLine(x, y+h, x+w, y+h);\r
+ this.drawLine(x, y, x, y+h);\r
+}\r
+\r
+function jsgFont()\r
+{\r
+ this.PLAIN = 'font-weight:normal;';\r
+ this.BOLD = 'font-weight:bold;';\r
+ this.ITALIC = 'font-style:italic;';\r
+ this.ITALIC_BOLD = this.ITALIC + this.BOLD;\r
+ this.BOLD_ITALIC = this.ITALIC_BOLD;\r
+}\r
+var Font = new jsgFont();\r
+\r
+function jsgStroke()\r
+{\r
+ this.DOTTED = -1;\r
+}\r
+var Stroke = new jsgStroke();\r
+\r
+function jsGraphics(cnv, wnd)\r
+{\r
+ this.setColor = function(x)\r
+ {\r
+ this.color = x.toLowerCase();\r
+ };\r
+\r
+ this.setStroke = function(x)\r
+ {\r
+ this.stroke = x;\r
+ if(!(x+1))\r
+ {\r
+ this.drawLine = _mkLinDott;\r
+ this._mkOv = _mkOvDott;\r
+ this.drawRect = _mkRectDott;\r
+ }\r
+ else if(x-1 > 0)\r
+ {\r
+ this.drawLine = _mkLin2D;\r
+ this._mkOv = _mkOv2D;\r
+ this.drawRect = _mkRect;\r
+ }\r
+ else\r
+ {\r
+ this.drawLine = _mkLin;\r
+ this._mkOv = _mkOv;\r
+ this.drawRect = _mkRect;\r
+ }\r
+ };\r
+\r
+ this.setPrintable = function(arg)\r
+ {\r
+ this.printable = arg;\r
+ if(jg_fast)\r
+ {\r
+ this._mkDiv = _mkDivIe;\r
+ this._htmRpc = arg? _htmPrtRpc : _htmRpc;\r
+ }\r
+ else this._mkDiv = arg? _mkDivPrt : _mkDiv;\r
+ };\r
+\r
+ this.setFont = function(fam, sz, sty)\r
+ {\r
+ this.ftFam = fam;\r
+ this.ftSz = sz;\r
+ this.ftSty = sty || Font.PLAIN;\r
+ };\r
+\r
+ this.drawPolyline = this.drawPolyLine = function(x, y)\r
+ {\r
+ for (var i=x.length - 1; i;)\r
+ {--i;\r
+ this.drawLine(x[i], y[i], x[i+1], y[i+1]);\r
+ }\r
+ };\r
+\r
+ this.fillRect = function(x, y, w, h)\r
+ {\r
+ this._mkDiv(x, y, w, h);\r
+ };\r
+\r
+ this.drawPolygon = function(x, y)\r
+ {\r
+ this.drawPolyline(x, y);\r
+ this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);\r
+ };\r
+\r
+ this.drawEllipse = this.drawOval = function(x, y, w, h)\r
+ {\r
+ this._mkOv(x, y, w, h);\r
+ };\r
+\r
+ this.fillEllipse = this.fillOval = function(left, top, w, h)\r
+ {\r
+ var a = w>>1, b = h>>1,\r
+ wod = w&1, hod = h&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b, oy = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ xl, dw, dh;\r
+ if(w) while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ xl = cx-x;\r
+ dw = (x<<1)+wod;\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ dh = oy-y;\r
+ this._mkDiv(xl, cy-oy, dw, dh);\r
+ this._mkDiv(xl, cy+y+hod, dw, dh);\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, w, (oy<<1)+hod);\r
+ };\r
+\r
+ this.fillArc = function(iL, iT, iW, iH, fAngA, fAngZ)\r
+ {\r
+ var a = iW>>1, b = iH>>1,\r
+ iOdds = (iW&1) | ((iH&1) << 16),\r
+ cx = iL+a, cy = iT+b,\r
+ x = 0, y = b, ox = x, oy = y,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ // Vars for radial boundary lines\r
+ xEndA, yEndA, xEndZ, yEndZ,\r
+ iSects = (1 << (Math.floor((fAngA %= 360.0)/180.0) << 3))\r
+ | (2 << (Math.floor((fAngZ %= 360.0)/180.0) << 3))\r
+ | ((fAngA >= fAngZ) << 16),\r
+ aBndA = new Array(b+1), aBndZ = new Array(b+1);\r
+ \r
+ // Set up radial boundary lines\r
+ fAngA *= Math.PI/180.0;\r
+ fAngZ *= Math.PI/180.0;\r
+ xEndA = cx+Math.round(a*Math.cos(fAngA));\r
+ yEndA = cy+Math.round(-b*Math.sin(fAngA));\r
+ _mkLinVirt(aBndA, cx, cy, xEndA, yEndA);\r
+ xEndZ = cx+Math.round(a*Math.cos(fAngZ));\r
+ yEndZ = cy+Math.round(-b*Math.sin(fAngZ));\r
+ _mkLinVirt(aBndZ, cx, cy, xEndZ, yEndZ);\r
+\r
+ while(y > 0)\r
+ {\r
+ if(st < 0) // Advance x\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0) // Advance x and y\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ ox = x;\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ this._mkArcDiv(ox, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ oy = y;\r
+ }\r
+ else // Advance y\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ if(y && (aBndA[y] != aBndA[y-1] || aBndZ[y] != aBndZ[y-1]))\r
+ {\r
+ this._mkArcDiv(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ }\r
+ }\r
+ this._mkArcDiv(x, 0, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ if(iOdds >> 16) // Odd height\r
+ {\r
+ if(iSects >> 16) // Start-angle > end-angle\r
+ {\r
+ var xl = (yEndA <= cy || yEndZ > cy)? (cx - x) : cx;\r
+ this._mkDiv(xl, cy, x + cx - xl + (iOdds & 0xffff), 1);\r
+ }\r
+ else if((iSects & 0x01) && yEndZ > cy)\r
+ this._mkDiv(cx - x, cy, x, 1);\r
+ }\r
+ };\r
+\r
+/* fillPolygon method, implemented by Matthieu Haller.\r
+This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.\r
+C source of GD 1.8.4 found at http://www.boutell.com/gd/\r
+\r
+THANKS to Kirsten Schulz for the polygon fixes!\r
+\r
+The intersection finding technique of this code could be improved\r
+by remembering the previous intertersection, and by using the slope.\r
+That could help to adjust intersections to produce a nice\r
+interior_extrema. */\r
+ this.fillPolygon = function(array_x, array_y)\r
+ {\r
+ var i;\r
+ var y;\r
+ var miny, maxy;\r
+ var x1, y1;\r
+ var x2, y2;\r
+ var ind1, ind2;\r
+ var ints;\r
+\r
+ var n = array_x.length;\r
+ if(!n) return;\r
+\r
+ miny = array_y[0];\r
+ maxy = array_y[0];\r
+ for(i = 1; i < n; i++)\r
+ {\r
+ if(array_y[i] < miny)\r
+ miny = array_y[i];\r
+\r
+ if(array_y[i] > maxy)\r
+ maxy = array_y[i];\r
+ }\r
+ for(y = miny; y <= maxy; y++)\r
+ {\r
+ var polyInts = new Array();\r
+ ints = 0;\r
+ for(i = 0; i < n; i++)\r
+ {\r
+ if(!i)\r
+ {\r
+ ind1 = n-1;\r
+ ind2 = 0;\r
+ }\r
+ else\r
+ {\r
+ ind1 = i-1;\r
+ ind2 = i;\r
+ }\r
+ y1 = array_y[ind1];\r
+ y2 = array_y[ind2];\r
+ if(y1 < y2)\r
+ {\r
+ x1 = array_x[ind1];\r
+ x2 = array_x[ind2];\r
+ }\r
+ else if(y1 > y2)\r
+ {\r
+ y2 = array_y[ind1];\r
+ y1 = array_y[ind2];\r
+ x2 = array_x[ind1];\r
+ x1 = array_x[ind2];\r
+ }\r
+ else continue;\r
+\r
+ // Modified 11. 2. 2004 Walter Zorn\r
+ if((y >= y1) && (y < y2))\r
+ polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);\r
+\r
+ else if((y == maxy) && (y > y1) && (y <= y2))\r
+ polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);\r
+ }\r
+ polyInts.sort(_CompInt);\r
+ for(i = 0; i < ints; i+=2)\r
+ this._mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);\r
+ }\r
+ };\r
+\r
+ this.drawString = function(txt, x, y)\r
+ {\r
+ this.htm += '<div style="position:absolute;white-space:nowrap;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'font-family:' + this.ftFam + ';'+\r
+ 'font-size:' + this.ftSz + ';'+\r
+ 'color:' + this.color + ';' + this.ftSty + '">'+\r
+ txt +\r
+ '<\/div>';\r
+ };\r
+\r
+/* drawStringRect() added by Rick Blommers.\r
+Allows to specify the size of the text rectangle and to align the\r
+text both horizontally (e.g. right) and vertically within that rectangle */\r
+ this.drawStringRect = function(txt, x, y, width, halign)\r
+ {\r
+ this.htm += '<div style="position:absolute;overflow:hidden;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:'+width +'px;'+\r
+ 'text-align:'+halign+';'+\r
+ 'font-family:' + this.ftFam + ';'+\r
+ 'font-size:' + this.ftSz + ';'+\r
+ 'color:' + this.color + ';' + this.ftSty + '">'+\r
+ txt +\r
+ '<\/div>';\r
+ };\r
+\r
+ this.drawImage = function(imgSrc, x, y, w, h, a)\r
+ {\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ // w (width) and h (height) arguments are now optional.\r
+ // Added by Mahmut Keygubatli, 14.1.2008\r
+ (w? ('width:' + w + 'px;') : '') +\r
+ (h? ('height:' + h + 'px;'):'')+'">'+\r
+ '<img src="' + imgSrc +'"'+ (w ? (' width="' + w + '"'):'')+ (h ? (' height="' + h + '"'):'') + (a? (' '+a) : '') + '>'+\r
+ '<\/div>';\r
+ };\r
+\r
+ this.clear = function()\r
+ {\r
+ this.htm = "";\r
+ if(this.cnv) this.cnv.innerHTML = "";\r
+ };\r
+\r
+ this._mkOvQds = function(cx, cy, x, y, w, h, wod, hod)\r
+ {\r
+ var xl = cx - x, xr = cx + x + wod - w, yt = cy - y, yb = cy + y + hod - h;\r
+ if(xr > xl+w)\r
+ {\r
+ this._mkDiv(xr, yt, w, h);\r
+ this._mkDiv(xr, yb, w, h);\r
+ }\r
+ else\r
+ w = xr - xl + w;\r
+ this._mkDiv(xl, yt, w, h);\r
+ this._mkDiv(xl, yb, w, h);\r
+ };\r
+ \r
+ this._mkArcDiv = function(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects)\r
+ {\r
+ var xrDef = cx + x + (iOdds & 0xffff), y2, h = oy - y, xl, xr, w;\r
+\r
+ if(!h) h = 1;\r
+ x = cx - x;\r
+\r
+ if(iSects & 0xff0000) // Start-angle > end-angle\r
+ {\r
+ y2 = cy - y - h;\r
+ if(iSects & 0x00ff)\r
+ {\r
+ if(iSects & 0x02)\r
+ {\r
+ xl = Math.max(x, aBndZ[y]);\r
+ w = xrDef - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0x01)\r
+ {\r
+ xr = Math.min(xrDef, aBndA[y]);\r
+ w = xr - x;\r
+ if(w > 0) this._mkDiv(x, y2, w, h);\r
+ }\r
+ }\r
+ else\r
+ this._mkDiv(x, y2, xrDef - x, h);\r
+ y2 = cy + y + (iOdds >> 16);\r
+ if(iSects & 0xff00)\r
+ {\r
+ if(iSects & 0x0100)\r
+ {\r
+ xl = Math.max(x, aBndA[y]);\r
+ w = xrDef - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0x0200)\r
+ {\r
+ xr = Math.min(xrDef, aBndZ[y]);\r
+ w = xr - x;\r
+ if(w > 0) this._mkDiv(x, y2, w, h);\r
+ }\r
+ }\r
+ else\r
+ this._mkDiv(x, y2, xrDef - x, h);\r
+ }\r
+ else\r
+ {\r
+ if(iSects & 0x00ff)\r
+ {\r
+ if(iSects & 0x02)\r
+ xl = Math.max(x, aBndZ[y]);\r
+ else\r
+ xl = x;\r
+ if(iSects & 0x01)\r
+ xr = Math.min(xrDef, aBndA[y]);\r
+ else\r
+ xr = xrDef;\r
+ y2 = cy - y - h;\r
+ w = xr - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0xff00)\r
+ {\r
+ if(iSects & 0x0100)\r
+ xl = Math.max(x, aBndA[y]);\r
+ else\r
+ xl = x;\r
+ if(iSects & 0x0200)\r
+ xr = Math.min(xrDef, aBndZ[y]);\r
+ else\r
+ xr = xrDef;\r
+ y2 = cy + y + (iOdds >> 16);\r
+ w = xr - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ }\r
+ };\r
+\r
+ this.setStroke(1);\r
+ this.setFont("verdana,geneva,helvetica,sans-serif", "12px", Font.PLAIN);\r
+ this.color = "#000000";\r
+ this.htm = "";\r
+ this.wnd = wnd || window;\r
+\r
+ if(!jg_ok) _chkDHTM();\r
+ if(jg_ok)\r
+ {\r
+ if(cnv)\r
+ {\r
+ if(typeof(cnv) == "string")\r
+ this.cont = document.all? (this.wnd.document.all[cnv] || null)\r
+ : document.getElementById? (this.wnd.document.getElementById(cnv) || null)\r
+ : null;\r
+ else if(cnv == window.document)\r
+ this.cont = document.getElementsByTagName("body")[0];\r
+ // If cnv is a direct reference to a canvas DOM node\r
+ // (option suggested by Andreas Luleich)\r
+ else this.cont = cnv;\r
+ // Create new canvas inside container DIV. Thus the drawing and clearing\r
+ // methods won't interfere with the container's inner html.\r
+ // Solution suggested by Vladimir.\r
+ this.cnv = this.wnd.document.createElement("div");\r
+ this.cnv.style.fontSize=0;\r
+ this.cont.appendChild(this.cnv);\r
+ this.paint = jg_dom? _pntCnvDom : _pntCnvIe;\r
+ }\r
+ else\r
+ this.paint = _pntDoc;\r
+ }\r
+ else\r
+ this.paint = _pntN;\r
+\r
+ this.setPrintable(false);\r
+}\r
+\r
+function _mkLinVirt(aLin, x1, y1, x2, y2)\r
+{\r
+ var dx = Math.abs(x2-x1), dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ xIncr = (x1 > x2)? -1 : 1,\r
+ yIncr = (y1 > y2)? -1 : 1,\r
+ p,\r
+ i = 0;\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1);\r
+ p = pr-dx;\r
+ while(dx > 0)\r
+ {--dx;\r
+ if(p > 0) // Increment y\r
+ {\r
+ aLin[i++] = x;\r
+ y += yIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ x += xIncr;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1);\r
+ p = pr-dy;\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ aLin[i++] = x;\r
+ if(p > 0) // Increment x\r
+ {\r
+ x += xIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ }\r
+ }\r
+ for(var len = aLin.length, i = len-i; i;)\r
+ aLin[len-(i--)] = x;\r
+};\r
+\r
+function _CompInt(x, y)\r
+{\r
+ return(x - y);\r
+}\r
+\r
--- /dev/null
+.ts-skin-lab .ts-player {
+ background: #3c4251;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border: dotted #b2b2b2 1px;
+}
+
+.ts-skin-lab .ts-player .ts-viewer {
+ margin: 0 12px 10px 12px;
+ border: solid 1px white;
+}
+
+.ts-skin-lab .ts-player .ts-viewer .ts-marker {
+ color: white;
+ background: #7290bc;
+}
+
+.ts-skin-lab .ts-player .ts-viewer a.ts-marker, .ts-skin-lab .ts-player .ts-viewer a.ts-pointer {
+ text-decoration: none;
+ line-height: 13px;
+}
+
+.ts-skin-lab .ts-player .ts-viewer .ts-pointer {
+ color: #3c4251;
+ background: #e7e7e7;
+}
+
+.ts-skin-lab .ts-player .ts-ruler .ts-section .ts-label {
+ color: #c3c2cc;
+ background: #2a3242;
+ padding-bottom: 1px;
+ padding-left: 2px;
+ line-height: 13px;
+}
+
+.ts-skin-lab .ts-player .ts-ruler .ts-section .ts-lines {
+ background: #384051;
+ color: #9498a1;
+ border-bottom: solid 1px white;
+ line-height: 13px;
+}
+
+.ts-skin-lab .ts-player .ts-wave .ts-image {
+ background: #090e0d ;
+}
+
+.ts-skin-lab .ts-player .ts-control {
+ background: url('img/controlbg.png');
+ height: 28px;
+ border-top: dotted #b2b2b2 1px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-layout {
+ margin-left: 12px;
+ margin-right: 12px;
+ padding-top: 4px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback a {
+ display: block;
+ float: left;
+ width: 21px;
+ padding: 21px 0 0 0;
+ overflow: hidden;
+ height: 0px !important;
+ height /**/:21px; /* for IE5/Win only */
+ margin-right: 1px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback a:hover {
+ background-position: 0 -21px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-play {
+ background-image: url('img/play.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-pause {
+ background-image: url('img/pause.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-rewind {
+ background-image: url('img/rewind.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-forward {
+ background-image: url('img/forward.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-set-marker {
+ background-image: url('img/setmarker.png');
+}
+
+/* unused */
+.ts-skin-lab .ts-player .ts-marker-control .ts-set-marker {
+ display: block;
+ width: 89px;
+ padding: 21px 0 0 0;
+ overflow: hidden;
+ height: 0px !important;
+ height /**/:21px; /* for IE5/Win only */
+ background-image: url('img/setmarker.gif');
+ margin: 5px auto 0 auto;
+}
+
+/* unused */
+.ts-skin-lab .ts-player .ts-marker-control .ts-set-marker:hover {
+ background-position: 0 -21px;
+}
+
+.ts-skin-lab .ts-player .ts-marker-control {
+ border-top: dotted #b2b2b2 1px;
+ border-bottom: dotted #b2b2b2 1px;
+ height: 30px;
+}
+
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N) {
+
+$N.Class.create("Controller", $N.Core, {
+
+ initialize: function($super, cfg) {
+ $super();
+ this.configure(cfg, {
+ player: null,
+ soundProvider: null,
+ map: null
+ });
+ if (this.cfg.player && !$N.isInstanceOf(this.cfg.player, 'Player')) {
+ this.cfg.player = new $N.Player(this.cfg.player);
+ }
+ this._setupPlayer();
+ },
+
+ _setupPlayer: function() {
+ this.cfg.player
+ .setSoundProvider(this.cfg.soundProvider)
+ .setMarkerMap(this.cfg.map)
+ .observe('play', $N.attachFunction(this.cfg.soundProvider, this.cfg.soundProvider.play))
+ .observe('pause', $N.attachFunction(this.cfg.soundProvider, this.cfg.soundProvider.pause))
+ .observe('move', this.attach(this._onMove))
+ .observe('markeradd', this.attach(this._onMarkerAdd))
+ .observe('markermove', this.attach(this._onMarkerMove))
+ .draw();
+ },
+
+ _onMove: function(e, data) {
+ this.cfg.soundProvider.seek(data.offset);
+ },
+
+ _onMarkerMove: function(e, data) {
+ if (this.cfg.map) {
+ this.cfg.map.move(this.cfg.map.byId(data.id), data.offset);
+ }
+ },
+
+ _onMarkerAdd: function(e, data) {
+ if (this.cfg.map) {
+ this.cfg.map.add(data.offset, 'marker at ' + data.offset);
+ }
+ }
+
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.extend = function(destination, source) {
+ for (var property in source)
+ destination[property] = source[property];
+ return destination;
+};
+
+$N.objectKeys = function(object) {
+ var keys = [];
+ for (var property in object)
+ keys.push(property);
+ return keys;
+};
+
+$N.argumentNames = function(method) {
+ var names = method.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
+ .replace(/\s+/g, '').split(',');
+ return names.length == 1 && !names[0] ? [] : names;
+};
+
+$N.argsToArray = function(args) {
+ var length = args.length || 0, result = new Array(length);
+ while (length--) result[length] = args[length];
+ return result;
+};
+
+$N.wrapFunction = function(wrapper, method) {
+ return function() {
+ var args = $N.argsToArray(arguments);
+ return wrapper.apply(this, [$N.attachFunction(this, method)].concat(args));
+ }
+};
+
+$N.attachFunction = function() {
+ if (arguments.length < 3 && (typeof arguments[1] == 'undefined')) return arguments[0];
+ var args = $N.argsToArray(arguments);
+ var object = args.shift();
+ var method = args.shift();
+ return function() {
+ var _args = $N.argsToArray(arguments);
+ return method.apply(object, args.concat(_args));
+ }
+};
+
+$N.attachAsEventListener = function() {
+ var args = $N.argsToArray(arguments), object = args.shift();
+ var method = args.shift();
+ return function(event) {
+ return method.apply(object, [event || window.event].concat(args));
+ }
+};
+
+$N.isInstanceOf = function(obj, className) {
+ if (typeof obj == 'object' && obj.__class__) {
+ var c = obj.__class__;
+ if (c.__name__ == className) {
+ return true;
+ }
+ while (c = c.__super__) {
+ if (c.__name__ == className) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+$N.Class = {
+ create: function() {
+ var parent = null, className = null;
+ var properties = $N.argsToArray(arguments)
+ if (typeof properties[0] == "string")
+ className = properties.shift();
+ if (typeof properties[0] == "function")
+ parent = properties.shift();
+
+ function klass() {
+ this.initialize.apply(this, arguments);
+ }
+
+ $N.extend(klass, $N.Class.Methods);
+ klass.__name__ = className;
+ klass.__super__ = parent;
+ klass.__subclasses__ = [];
+
+ if (parent) {
+ var subclass = function() { };
+ subclass.prototype = parent.prototype;
+ klass.prototype = new subclass;
+ parent.__subclasses__.push(klass);
+ }
+
+ klass.prototype.__class__ = klass;
+ for (var i = 0; i < properties.length; i++)
+ klass.addMethods(properties[i]);
+
+ if (!klass.prototype.initialize)
+ klass.prototype.initialize = function () {};
+
+ klass.prototype.constructor = klass;
+
+ if (className) {
+ $N[className] = klass;
+ }
+ return klass;
+ }
+};
+
+$N.Class.Methods = {
+ addMethods: function(source) {
+ var ancestor = this.__super__ && this.__super__.prototype;
+ var properties = $N.objectKeys(source);
+
+ if (!$N.objectKeys({ toString: true }).length)
+ properties.push("toString", "valueOf");
+
+ for (var i = 0, length = properties.length; i < length; i++) {
+ var property = properties[i], value = source[property];
+ if (ancestor && (typeof value == 'function') &&
+ $N.argumentNames(value)[0] == "$super") {
+ var method = value;
+ value = $N.wrapFunction(method, (function(m) {
+ return function() { return ancestor[m].apply(this, arguments) };
+ })(property));
+
+ value.valueOf = $N.attachFunction(method, method.valueOf);
+ value.toString = $N.attachFunction(method, method.toString);
+ }
+ this.prototype[property] = value;
+ }
+
+ return this;
+ }
+};
+
+$N.Core = $N.Class.create("Core", {
+ eventContainer: null,
+ eventPrefix: '',
+ cfg: {},
+
+ initialize: function() {
+ this.debug("new instance");
+ $N.registerInstance(this);
+ this.eventContainer = $J('<div/>');
+ this.forwardEvent = this.attach(this._forwardEvent);
+ },
+
+ free: function() {
+ this.eventContainer = null;
+ },
+
+ configure: function(config, defaults) {
+ if (!config)
+ config = {};
+ for (k in defaults) {
+ var value = null, flags = [];
+
+ if (defaults[k] && typeof defaults[k][0] !== 'undefined') {
+ value = defaults[k][0];
+ if (defaults[k][1]) {
+ flags = defaults[k][1].split(",");
+ }
+ } else {
+ value = defaults[k];
+ }
+
+ if (typeof config[k] !== 'undefined')
+ value = config[k];
+
+ var source = this;
+ $J(flags).each(function(i, flag) {
+ switch (flag) {
+ case 'required':
+ if (value === null)
+ throw new $N.RequiredOptionError(source, k);
+ break;
+ /*
+ case 'element':
+ value = $J(value);
+ break;
+ */
+
+ }
+ });
+
+ this.cfg[k] = value;
+ }
+ return this;
+ },
+
+ observe: function(eventName, handler) {
+ this.eventContainer.bind(this.eventPrefix + eventName, handler);
+ return this;
+ },
+
+ fire: function(eventName, data) {
+ if (!data)
+ data = {};
+ this.eventContainer.trigger(this.eventPrefix + eventName, data);
+ return this;
+ },
+
+ _forwardEvent: function(e, data) {
+ if (!data)
+ data = {};
+ this.eventContainer.trigger(e.type, data);
+ return this;
+ },
+
+ _textWidth: function(text, fontSize) {
+ var ratio = 3/5;
+ return text.length * ratio * fontSize;
+ },
+
+ debug: function(message) {
+ if ($N.debugging && typeof console != 'undefined' && console.log) {
+ console.log('TimeSide.' + this.__class__.__name__ + ': ' + message);
+ }
+ },
+
+ attach: function(method) {
+ return $N.attachFunction(this, method);
+ },
+
+ attachWithEvent: function(method) {
+ return $N.attachAsEventListener(this, method);
+ },
+
+ uniqid: function() {
+ d = new Date();
+ return new String(d.getTime() + '' + Math.floor(Math.random() * 1000000)).substr(0, 18);
+ }
+});
+
+$N.Class.create("Exception", {
+ _source: null,
+ _message: null,
+
+ initialize: function(source, message) {
+ this._source = source;
+ this._message = message;
+ },
+ toString: function() {
+ return this.__class__.__name__ + " from TimeSide." + this._source.__class__.__name__
+ + ": " + this._message;
+ }
+});
+
+$N.Class.create("RequiredOptionError", $N.Exception, {
+ initialize: function($super, source, optionName) {
+ $super(source, "missing '" + optionName + "' required option");
+ }
+});
+
+$N.Class.create("RequiredArgumentError", $N.Exception, {
+ initialize: function($super, source, optionName) {
+ $super(source, "missing '" + optionName + "' required argument");
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Class.create("Marker", $N.Core, {
+ id: null,
+ painter: null,
+ visible: false,
+ position: 0,
+ label: null,
+ blinking: false,
+ nodes: null,
+ mouseDown: false,
+ blinkAnimation: null,
+
+ initialize: function($super, cfg) {
+ $super();
+ this.configure(cfg, {
+ rulerLayout: [null, 'required'],
+ viewer: [null, 'required'],
+ fontSize: 10,
+ zIndex: null,
+ className: [null, 'required'],
+ id: null,
+ tooltip: null
+ });
+ this.cfg.rulerLayout = $J(this.cfg.rulerLayout);
+ this.cfg.viewer = $J(this.cfg.viewer);
+
+ this.id = cfg.id;
+ this.width = this.cfg.viewer.width();
+ this.painter = new jsGraphics(this.cfg.viewer.get(0));
+ this._create();
+ this._observeMouseEvents();
+ },
+
+ free: function($super) {
+ this.cfg.rulerLayout = null;
+ this.cfg.viewer = null;
+ $super();
+ },
+
+ clear: function() {
+ this.painter.clear();
+ $J(this.painter.cnv).remove();
+ this.label.remove();
+ return this;
+ },
+
+ _create: function() {
+ this.debug('create marker');
+ var y = this.cfg.rulerLayout.find('.' + $N.cssPrefix + 'label').outerHeight();
+ this.label = $J('<a/>')
+ .css({
+ display: 'block',
+ width: '10px',
+ textAlign: 'center',
+ position: 'absolute',
+ fontSize: this.cfg.fontSize + 'px',
+ fontFamily: 'monospace',
+ top: y + 'px'
+ })
+ .attr('href', '#')
+ .addClass($N.cssPrefix + this.cfg.className)
+ .append('<span />')
+ .hide();
+
+ if (this.cfg.tooltip)
+ this.label.attr('title', this.cfg.tooltip);
+
+ this.cfg.rulerLayout.append(this.label);
+
+ var height = this.cfg.viewer.height();
+ var x = 0;
+ this.painter.drawLine(x, 0, x, height);
+ x = [-4, 4, 0];
+ var y = [0, 0, 4];
+ this.painter.fillPolygon(x, y);
+ this.painter.paint();
+ this.nodes = $J(this.painter.cnv).children();
+
+ var style = {};
+ if (this.cfg.zIndex) {
+ style.zIndex = this.cfg.zIndex;
+ this.label.css(style);
+ }
+ style.backgroundColor = '';
+
+ this.nodes.hide().css(style).addClass($N.cssPrefix + this.cfg.className)
+ .each(function(i, node) {
+ node.originalPosition = parseInt($J(node).css('left'));
+ });
+ },
+
+ setText: function(text) {
+ if (this.label) {
+ text += '';
+ var labelWidth = this._textWidth(text, this.cfg.fontSize) + 10;
+ labelWidth += 'px';
+ if (this.label.css('width') != labelWidth) {
+ this.label.css({ width: labelWidth });
+ }
+ this.label.find('span').html(text);
+ }
+ return this;
+ },
+
+ move: function(pixelOffset) {
+ if (this.position != pixelOffset) {
+ if (pixelOffset < 0) {
+ pixelOffset = 0;
+ } else if (pixelOffset >= this.width) {
+ pixelOffset = this.width - 1;
+ }
+ this.nodes.each(function(i, node) {
+ $J(node).css('left', Math.round(node.originalPosition + pixelOffset) + 'px');
+ });
+ var labelWidth = this.label.width();
+ var labelPixelOffset = pixelOffset - labelWidth / 2;
+ if (labelPixelOffset < 0)
+ labelPixelOffset = 0;
+ else if (labelPixelOffset + labelWidth > this.width)
+ labelPixelOffset = this.width - labelWidth;
+ this.label.css({left: Math.round(labelPixelOffset) + 'px'});
+ this.position = pixelOffset;
+ }
+ return this;
+ },
+
+ show: function(offset) {
+ if (!this.visible) {
+ this.nodes.show();
+ this.label.show();
+ this.visible = true;
+ }
+ return this;
+ },
+
+ hide: function() {
+ this.nodes.hide();
+ this.label.hide();
+ this.visible = false;
+ return this;
+ },
+
+ isVisible: function() {
+ return this.visible;
+ },
+
+ blink: function(state) {
+ var speed = 200;
+ if (this.label && this.blinking != state) {
+ var span = this.label.find('span');
+
+ span.stop();
+
+ function fade(on) {
+ if (on) {
+ span.animate({opacity: 1}, speed, null,
+ function() { fade(false) });
+ } else {
+ span.animate({opacity: 0.4}, speed, null,
+ function() { fade(true) })
+ }
+ }
+
+ if (state) {
+ fade();
+ } else {
+ span.animate({opacity: 1}, speed);
+ }
+
+ this.blinking = state;
+ }
+ return this;
+ },
+
+ _onMouseDown: function(evt) {
+ this.mouseDown = true;
+ this._onMouseMove(evt);
+ return false;
+ },
+
+ _onMouseMove: function(evt) {
+ if (this.mouseDown) {
+ var offset = (evt.pageX - this.cfg.rulerLayout.offset().left);
+ this.move(offset);
+ this.fire('move', {offset: this.position, finish: false});
+ return false;
+ }
+ },
+
+ _onMouseUp: function(evt) {
+ if (this.mouseDown) {
+ this.mouseDown = false;
+ this.fire('move', {id: this.id, offset: this.position, finish: true});
+ return false;
+ }
+ },
+
+ _observeMouseEvents: function() {
+ this.label.mousedown(this.attachWithEvent(this._onMouseDown))
+ .bind('click dragstart', function() {return false;});
+ this.cfg.rulerLayout.mousemove(this.attachWithEvent(this._onMouseMove));
+ this.cfg.rulerLayout.mouseup(this.attachWithEvent(this._onMouseUp));
+ $J(document).mouseup(this.attachWithEvent(this._onMouseUp));
+ }
+
+
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N) {
+
+$N.Class.create("MarkerList", $N.Core, {
+ initialize: function($super, cfg) {
+ $super();
+ this.cfg = this.configure(cfg, {
+ container: null,
+ map: null
+ });
+ },
+
+ _buildItem: function(marker) {
+ var dt = new Element('dt');
+ var time = $N.Util.makeTimeLabel(marker.offset);
+
+
+ },
+
+ _setupInterface: function() {
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Class.create("MarkerMap", $N.Core, {
+ markers: null,
+
+ initialize: function($super, markers) {
+ $super();
+ if (!markers)
+ markers = [];
+ this.markers = markers;
+ },
+
+ toArray: function() {
+ return [].concat(this.markers);
+ },
+
+ byIndex: function(index) {
+ return this.markers[index];
+ },
+
+ byId: function(id) {
+ var marker = null;
+ for (var i in this.markers) {
+ if (this.markers[i].id == id) {
+ marker = this.markers[i];
+ break;
+ }
+ }
+ return marker;
+ },
+
+ indexOf: function(marker) {
+ var index = null;
+ for (var i in this.markers) {
+ if (this.markers[i].id == marker.id) {
+ index = parseInt(i);
+ break;
+ }
+ }
+ return index;
+ },
+
+ _reorder: function() {
+ this.markers.sort(this.compare);
+ for (var i in this.markers) {
+ this.fire('indexchange', {marker: this.markers[i], index: parseInt(i)});
+ }
+ },
+
+ add: function(offset, desc) {
+ var id = this.uniqid();
+ var marker = {id: id, offset: offset, desc: desc};
+ var i = this.markers.push(marker) - 1;
+ this.fire('add', {marker: marker, index: i});
+ this._reorder();
+ return marker;
+ },
+
+ remove: function(marker) {
+ if (marker) {
+ var i = this.indexOf(marker);
+ this.markers.splice(i, 1);
+ this.fire('remove', {marker: marker});
+ this._reorder();
+ }
+ return marker;
+ },
+
+ compare: function(marker1, marker2) {
+ if (marker1.offset > marker2.offset)
+ return 1;
+ if (marker1.offset < marker2.offset)
+ return -1;
+ return 0;
+ },
+
+ move: function(marker, offset) {
+ oldMarkers = [].concat(this.markers);
+ marker.offset = offset;
+ this._reorder();
+ },
+
+ getPrevious: function(offset, skip) {
+ var marker = null;
+ if (!skip) skip = 0;
+ markers = [].concat(this.markers).reverse();
+ $J(markers).each(function(i, m) {
+ if (offset > m.offset && !(skip--)) {
+ marker = m;
+ return false;
+ }
+ });
+ return marker;
+ },
+
+ getNext: function(offset, skip) {
+ var marker = null;
+ if (!skip) skip = 0;
+ $J(this.markers).each(function(i, m) {
+ if (offset < m.offset && !(skip--)) {
+ marker = m;
+ return false;
+ }
+ });
+ return marker;
+ },
+
+ each: function(callback) {
+ $J(this.markers).each(callback);
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Class.create("Player", $N.Core, {
+ skeleton: {
+ 'div.viewer': {
+ 'div.ruler': {},
+ 'div.wave': {
+ 'div.image-canvas': {},
+ 'div.image-container': ['img.image']
+ }
+ },
+ 'div.control': {
+ 'div.layout': {
+ 'div.playback': ['a.play', 'a.pause', 'a.rewind', 'a.forward', 'a.set-marker']
+ }
+ }/*,
+ 'div.marker-control': ['a.set-marker']*/
+ },
+ defaultContents: {
+ play: 'Play',
+ pause: 'Pause',
+ rewind: 'Rewind',
+ forward: 'Forward',
+ 'set-marker': 'Set marker'
+ },
+ elements: {},
+ ruler: null,
+ soundProvider: null,
+ map: null,
+ container: null,
+ imageWidth: null,
+ imageHeight: null,
+
+ initialize: function($super, container, cfg) {
+ $super();
+ if (!container)
+ throw new $N.RequiredArgumentError(this, 'container');
+ this.container = $J(container);
+ this.configure(cfg, {
+ image: null
+ });
+ },
+
+ free: function($super) {
+ this.elements = null;
+ this.container = null;
+ $super();
+ },
+
+ setSoundProvider: function(soundProvider) {
+ this.soundProvider = soundProvider;
+ return this;
+ },
+
+ setMarkerMap: function(map) {
+ this.map = map;
+ return this;
+ },
+
+ setImage: function(expr) {
+ this.cfg.image = expr;
+ this.refreshImage();
+ },
+
+ refreshImage: function() {
+ var src = null;
+ if (typeof this.cfg.image == 'function') {
+ src = this.cfg.image(this.imageWidth, this.imageHeight);
+ } else if (typeof this.cfg.image == 'string') {
+ src = this.cfg.image;
+ }
+
+ if (src)
+ this.elements.image.attr('src', src);
+ },
+
+ draw: function() {
+ this.debug('drawing');
+ $N.domReady(this.attach(this._setupInterface));
+ return this;
+ },
+
+ _setupInterface: function() {
+ this.elements = $N.Util.loadUI(this.container, this.skeleton, this.defaultContents);
+
+ // IE apparently doesn't send the second mousedown on double click:
+ var jump = $J.browser.msie ? 'mousedown dblclick' : 'mousedown';
+ this.elements.rewind.attr('href', '#').bind(jump, this.attach(this._onRewind))
+ .click(function() {return false; });
+ this.elements.forward.attr('href', '#').bind(jump, this.attach(this._onForward))
+ .click(function() {return false; });
+ this.elements.pause.attr('href', '#').bind('click', this.attach(this._onPause));
+ this.elements.play.attr('href', '#').bind('click', this.attach(this._onPlay));
+ this.elements.control.find('a').add(this.elements.setMarker)
+ .attr('href', '#')
+ .each(function(i, a){
+ a = $J(a);
+ if (!a.attr('title'))
+ a.attr('title', a.text());
+ });
+
+ //this.elements.markerControl.find('a').attr('href', '#');
+ if (this.map) {
+ this.elements.setMarker.bind('click', this.attach(this._onSetMarker));
+ } else {
+ this.elements.setMarker.remove();
+ }
+ this.ruler = new $N.Ruler({
+ viewer: this.elements.viewer,
+ map: this.map,
+ soundProvider: this.soundProvider
+ });
+ this.ruler
+ .observe('markermove', this.forwardEvent)
+ .observe('markeradd', this.forwardEvent)
+ .observe('move', this.forwardEvent)
+ .draw();
+ this.refreshImage();
+ this.resize();
+ var resizeTimer = null;
+ $J(window).resize(this.attach(function() {
+ if (resizeTimer)
+ clearTimeout(resizeTimer);
+ resizeTimer = setTimeout(this.attach(this.resize), 100);
+ }));
+ //this.container.resize(this.attach(this.resize)); // Can loop ?
+ },
+
+ resize: function(overrideHeight) {
+ this.debug("resizing");
+ var height;
+ if (overrideHeight === true) {
+ this.debug("override height");
+ height = this.elements.image.css('height', 'auto').height();
+ } else {
+ height = this.elements.wave.height();
+ this.debug("wave height:" + height);
+ if (!height) {
+ this.elements.image.one('load', this.attach(function() {
+ this.resize(true);
+ this.debug("image loaded");
+ }));
+ height = this.elements.image.height();
+ }
+ }
+
+ var elements = this.elements.image
+ .add(this.elements.imageContainer)
+ .add(this.elements.imageCanvas);
+
+ elements.css('width', 'auto'); // for IE6
+
+ if (!height)
+ height = 200;
+ var style = {
+ width: this.elements.wave.width(),
+ height: height
+ }
+ elements.css(style);
+ this.imageWidth = style.width;
+ this.imageHeight = style.height;
+ this.refreshImage();
+ this.ruler.resize();
+ return this;
+ },
+
+ _onRewind: function() {
+ var offset = 0;
+ if (this.map) {
+ var position = this.soundProvider.getPosition();
+ var marker = this.map.getPrevious(position);
+ if (marker && this.soundProvider.isPlaying()
+ && position - marker.offset < this.ruler.getUnitDuration())
+ marker = this.map.getPrevious(marker.offset)
+ if (marker) {
+ offset = marker.offset;
+ }
+ }
+ this.fire('move', {offset: offset});
+ return false;
+ },
+
+ _onForward: function() {
+ var offset = this.soundProvider.getDuration();
+ if (this.map) {
+ var marker = this.map.getNext(this.soundProvider.getPosition());
+ if (marker) {
+ offset = marker.offset;
+ }
+ }
+ this.fire('move', {offset: offset});
+ return false;
+ },
+
+ _onPlay: function() {
+ this.fire('play');
+ return false;
+ },
+
+ _onPause: function() {
+ this.fire('pause');
+ return false;
+ },
+
+ _onSetMarker: function() {
+ if (this.map) {
+ this.fire('markeradd', {offset: this.soundProvider.getPosition()});
+ }
+ return false;
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Class.create("Ruler", $N.Core, {
+
+ fullSectionDuration: 60,
+ sectionSubDivision: 10,
+ sectionSteps: [[5, 1], [10, 1], [20, 2], [30, 5], [60, 10], [120, 20], [300, 30],
+ [600, 60], [1800, 300], [3600, 600]],
+ sectionsNum: 0,
+ timeLabelWidth: 0,
+ pointerPos: 0,
+ layout: null,
+ width: null,
+ mouseDown: false,
+ pointer: null,
+ markers: new Array(),
+ duration: 0,
+ container: null,
+ waveContainer: null,
+
+ initialize: function($super, cfg) {
+ $super();
+ this.configure(cfg, {
+ viewer: [null, 'required'],
+ fontSize: 10,
+ map: null,
+ soundProvider: [null, 'required']
+ });
+ this.cfg.viewer = $J(this.cfg.viewer);
+ this.container = this.cfg.viewer.find('.' + $N.cssPrefix + 'ruler');
+ this.waveContainer = this.cfg.viewer.find('.' + $N.cssPrefix + 'image-canvas');
+ this._setDuration(this.cfg.soundProvider.getDuration());
+ var imgContainer = this.cfg.viewer.find('.' + $N.cssPrefix + 'image-container'); // for IE
+ this._observeMouseEvents(this.waveContainer.add(imgContainer));
+ if (this.cfg.map) {
+ this.cfg.map
+ .observe('add', this.attach(this._onMapAdd))
+ .observe('remove', this.attach(this._onMapRemove))
+ .observe('indexchange', this.attach(this._onMapIndexChange));
+ }
+ this.cfg.soundProvider.observe('update', this.attach(this._onSoundProviderUpdate));
+ },
+
+ free: function($super) {
+ this.layout = null;
+ this.container = null;
+ this.waveContainer = null;
+ this.cfg.viewer = null;
+ $super();
+ },
+
+ _computeLayout: function() {
+ this.width = this.waveContainer.width();
+
+ this.debug('container width: ' + this.width);
+ var i, ii = this.sectionSteps.length;
+ this.timeLabelWidth = this._textWidth('00:00', this.cfg.fontSize);
+ for (i = 0; i < ii; i++) {
+ var duration = this.sectionSteps[i][0];
+ var subDivision = this.sectionSteps[i][1];
+ var labelsNum = Math.floor(this.duration / duration);
+ if ((i == ii - 1) || (this.width / labelsNum > this.timeLabelWidth * 2)) {
+ this.fullSectionDuration = duration;
+ this.sectionSubDivision = subDivision;
+ this.sectionsNum = Math.floor(this.duration / this.fullSectionDuration);
+ break;
+ }
+ }
+ },
+
+ getUnitDuration: function() {
+ return this.sectionSubDivision;
+ },
+
+ resize: function() {
+ var pointerVisible = this.pointer && this.pointer.isVisible();
+ this._computeLayout();
+ this.draw();
+ if (pointerVisible) {
+ this.setPosition(this.cfg.soundProvider.getPosition());
+ this.setBuffering(this.cfg.soundProvider.isBuffering() && this.cfg.soundProvider.isPlaying());
+ this.pointer.show();
+ }
+ },
+
+ _setDuration: function(duration) {
+ this.duration = duration;
+ this._computeLayout();
+ },
+
+ setDuration: function(duration) {
+ if (duration == 0)
+ duration = 60;
+ if (this.duration != duration) {
+ this._setDuration(duration);
+ this.draw();
+ }
+ },
+
+ _createSection: function(timeOffset, pixelWidth) {
+ var section = $J('<div/>')
+ .addClass($N.cssPrefix + 'section')
+ .css({
+ fontSize: this.cfg.fontSize + 'px',
+ fontFamily: 'monospace',
+ width: pixelWidth,
+ overflow: 'hidden'
+ })
+ .append($J('<div />').addClass($N.cssPrefix + 'canvas'));
+
+ var topDiv = $J('<div/>')
+ .addClass($N.cssPrefix + 'label')
+ .appendTo(section);
+ var bottomDiv = $J('<div/>')
+ .addClass($N.cssPrefix + 'lines')
+ .appendTo(section);
+ var empty = $J('<span/>').css({visibility: 'hidden'}).text(' ');
+ if (pixelWidth > this.timeLabelWidth) {
+ var text = $J('<span/>')
+ .text($N.Util.makeTimeLabel(timeOffset))
+ .bind('mousedown selectstart', function() {return false;});
+ } else {
+ var text = empty.clone();
+ }
+ topDiv.append(text);
+ bottomDiv.append(empty);
+ return section;
+ },
+
+ _drawSectionRuler: function(section, drawFirstMark) {
+ var j;
+ var jg = new jsGraphics(section.find('.' + $N.cssPrefix + 'canvas').get(0));
+ jg.setColor(this.layout.find('.' + $N.cssPrefix + 'lines').css('color'));
+ var height = section.height();
+ var ypos;
+ for (j = 0; j < section.duration; j += this.sectionSubDivision) {
+ if (j == 0) {
+ if (drawFirstMark) {
+ ypos = 0;
+ } else {
+ continue;
+ }
+ } else {
+ ypos = (j == section.duration / 2) ? 1/2 + 1/8 : 3/4;
+ }
+ var x = j / this.duration * this.width;
+ jg.drawLine(x, height * ypos, x, height - 1);
+ }
+ jg.paint();
+ },
+
+ getHeight: function() {
+ return this.container.find('' + $N.cssPrefix + '.section').height();
+ },
+
+ draw: function() {
+ if (!this.duration) {
+ this.debug("Can't draw ruler with a duration of 0");
+ return;
+ }
+ this.debug("draw ruler, duration: " + this.duration);
+ if (this.layout)
+ this.layout.remove();
+ this.layout = $J('<div/>')
+ .addClass($N.cssPrefix + 'layout')
+ .css({position: 'relative'}) // bugs on IE when resizing
+ .bind('dblclick', this.attachWithEvent(this._onDoubleClick))
+ //.bind('resize', this.attachWithEvent(this.resize)) // Can loop ?
+ .appendTo(this.container);
+
+ //this.container.html(this.layout);
+
+ var sections = new Array();
+ var currentWidth = 0;
+ var i;
+ for (i = 0; i <= this.sectionsNum; i++) {
+ if (i < this.sectionsNum) {
+ var duration = this.fullSectionDuration;
+ var width = Math.floor(duration / this.duration * this.width);
+ } else {
+ var duration = this.duration - i * this.fullSectionDuration;
+ var width = this.width - currentWidth;
+
+ }
+ var section = this._createSection(i * this.fullSectionDuration, width);
+ if (i > 0) {
+ section.css({left: currentWidth, top: 0, position: 'absolute'});
+ }
+ section.duration = duration;
+ this.layout.append(section);
+ currentWidth += section.width();
+ sections[i] = section;
+ }
+
+ for (i = 0; i <= this.sectionsNum; i++) {
+ this._drawSectionRuler(sections[i], (i > 0));
+ }
+
+ this._createPointer();
+ this._drawMarkers();
+ },
+
+ _createPointer: function() {
+ if (this.pointer) {
+ this.pointer.clear();
+ }
+ this.pointer = new $N.Marker({
+ rulerLayout: this.layout.get(0),
+ viewer: this.waveContainer,
+ fontSize: this.cfg.fontSize,
+ zIndex: 1000,
+ className: 'pointer',
+ tooltip: 'Move head'
+ });
+ this.pointer
+ .setText($N.Util.makeTimeLabel(0))
+ .observe('move', this.attach(this._onPointerMove));
+ },
+
+ _drawMarkers: function() {
+ if (this.cfg.map) {
+ $J(this.markers).each(function(i, m) {m.clear();});
+ this.markers = new Array();
+ this.cfg.map.each(this.attach(function(i, m) {
+ this.markers.push(this._drawMarker(m, i));
+ }));
+ }
+ },
+
+ _movePointer: function(offset) {
+ if (offset < 0)
+ offset = 0;
+ else if (offset > this.duration)
+ offset = this.duration;
+
+ pixelOffset = offset / this.duration * this.width;
+ if (this.pointer) {
+ this.pointer.move(pixelOffset);
+ this.pointer.setText($N.Util.makeTimeLabel(offset));
+ }
+ this.pointerPos = offset;
+ },
+
+ _setPosition: function(offset) {
+ this._movePointer(offset);
+ if (this.pointer) {
+ this.pointer.show();
+ }
+ },
+
+ setPosition: function(offset) {
+ if (!this.mouseDown) {
+ this._setPosition(offset);
+ }
+ },
+
+ shiftPosition: function(delta) {
+ this.setPosition(this.pointerPos + delta);
+ },
+
+ hidePointer: function() {
+ if (this.pointer)
+ this.pointer.hide();
+ },
+
+ setBuffering: function(state) {
+ if (this.pointer) {
+ this.pointer.blink(state);
+ }
+ },
+/*
+ _onClick: function(evt) {
+ var offset = (evt.pageX - this.container.offset().left)
+ / this.width * this.duration;
+ this._setPosition(offset);
+ this.fire('move', {offset: offset});
+ },
+*/
+ _onMouseDown: function(evt) {
+ this.mouseDown = true;
+ this._onMouseMove(evt);
+ evt.preventDefault();
+ },
+
+ _onPointerMove: function(evt, data) {
+ this.mouseDown = true;
+ this._setPosition(data.offset / this.width * this.duration);
+ if(data.finish) {
+ this.fire('move', {offset: this.pointerPos});
+ this.mouseDown = false;
+ }
+ return false;
+ },
+
+ _onMouseMove: function(evt) {
+ if (this.mouseDown) {
+ var pixelOffset = evt.pageX - this.container.offset().left;
+ this._setPosition(pixelOffset / this.width * this.duration);
+ return false;
+ }
+ },
+
+ _onMouseUp: function(evt) {
+ if (this.mouseDown) {
+ this.mouseDown = false;
+ this.fire('move', {offset: this.pointerPos});
+ return false;
+ }
+ },
+
+ _observeMouseEvents: function(element) {
+ element
+ .bind('click dragstart', function() {return false;})
+ .bind('mousedown', this.attachWithEvent(this._onMouseDown))
+ .bind('mousemove', this.attachWithEvent(this._onMouseMove))
+ .bind('mouseup', this.attachWithEvent(this._onMouseUp));
+ $J(document)
+ .bind('mousemove', this.attachWithEvent(this._onMouseMove));
+ },
+
+ _drawMarker: function(marker, index) {
+ if (marker.offset < 0)
+ marker.offset = 0;
+ else if (marker.offset > this.duration)
+ marker.offset = this.duration;
+
+ pixelOffset = marker.offset / this.duration * this.width;
+
+ m = new $N.Marker({
+ rulerLayout: this.layout.get(0),
+ viewer: this.waveContainer,
+ fontSize: this.cfg.fontSize,
+ className: 'marker',
+ id: marker.id,
+ tooltip: 'Move marker'
+ });
+ m.observe('move', this.attach(this._onMarkerMove))
+ .setText(index + 1)
+ .move(pixelOffset)
+ .show();
+ return m;
+ },
+
+ _onMarkerMove: function(e, data) {
+ if (data.finish) {
+ var offset = data.offset / this.width * this.duration;
+ this.fire('markermove', {id: data.id, offset: offset});
+ }
+ },
+
+ _onMapAdd: function(e, data) {
+ this.markers.push(this._drawMarker(data.marker, data.index));
+ },
+
+
+ _onMapRemove: function(e, data) {
+ $J(this.markers).each(this.attach(function(i, m) {
+ if (m.id == data.marker.id) {
+ m.clear();
+ this.markers.splice(i, 1);
+ }
+ }));
+ },
+
+ _onMapIndexChange: function(e, data) {
+ $J(this.markers).each(this.attach(function(i, m) {
+ if (m.id == data.marker.id) {
+ m.setText(data.index + 1);
+ return false;
+ }
+ }));
+ },
+
+ _onDoubleClick: function(evt) {
+ if (this.cfg.map) {
+ var offset = (evt.pageX - this.container.offset().left)
+ / this.width * this.duration;
+ this.fire('markeradd', {offset: offset});
+ }
+ },
+
+ _onSoundProviderUpdate: function(e) {
+ this.setDuration(this.cfg.soundProvider.getDuration());
+ this.setPosition(this.cfg.soundProvider.getPosition());
+ this.setBuffering(this.cfg.soundProvider.isBuffering() && this.cfg.soundProvider.isPlaying());
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N) {
+
+$N.Class.create("SoundProvider", $N.Core, {
+ sound: null,
+ timer: null,
+ buggyPosition: null,
+ isDurationForced: false,
+ state: {
+ position: null,
+ duration: null,
+ playing: false,
+ buffering: false
+ },
+ lastState: null,
+
+ initialize: function($super, cfg) {
+ $super();
+ this.configure(cfg, {
+ source: null,
+ duration: null
+ });
+ this.sound = this.cfg.source;
+ if (this.cfg.duration) {
+ this.forceDuration(this.cfg.duration);
+ }
+ this.state.position = 0;
+ this.update = this.attach(this._update);
+ this.timer = setInterval(this.update, 43);
+ },
+
+ free: function($super) {
+ this.sound = null;
+ $super();
+ },
+
+ play: function() {
+ if (this.sound) {
+ if (!this.sound.playState) {
+ this.sound.play();
+ } else if (this.sound.paused) {
+ this.sound.resume();
+ }
+ }
+ return this;
+ },
+
+ pause: function() {
+ if (this.sound)
+ this.sound.pause();
+ return this;
+ },
+
+ seek: function(offset) {
+ if (this.sound) {
+ this.sound.setPosition(offset * 1000);
+ if (!this.state.playing) {
+ this.buggyPosition = this.sound.position / 1000;
+ this.state.position = offset;
+ }
+ }
+ return this;
+ },
+
+ isPlaying: function() {
+ return this.state.playing;
+ },
+
+ getPosition: function() {
+ if (this.state.position == null)
+ this._retrieveState();
+ return this.state.position;
+ },
+
+ getDuration: function() {
+ if (this.state.duration == null)
+ this._retrieveState();
+ return this.state.duration;
+ },
+
+ forceDuration: function(duration) {
+ this.state.duration = duration;
+ this.isDurationForced = true;
+ },
+
+ isBuffering: function() {
+ return this.state.buffering;
+ },
+
+ _retrieveState: function() {
+ if (this.sound) {
+ this.state.playing = (this.sound.playState && !this.sound.paused);
+ if (this.state.playing) {
+ var position = this.sound.position / 1000;
+ if (position != this.buggyPosition) {
+ this.state.position = position;
+ this.buggyPosition = null;
+ }
+ }
+ if (!this.isDurationForced) {
+ if (this.sound.readyState == 1) {
+ this.state.duration = this.sound.durationEstimate / 1000;
+ } else {
+ this.state.duration = this.sound.duration / 1000;
+ }
+ }
+ this.state.buffering = (this.sound.readyState == 1 && this.state.position > this.sound.duration / 1000);
+ }
+ },
+
+ _update: function() {
+ this._retrieveState();
+ var updated = false;
+ if (this.lastState) {
+ for (k in this.state) {
+ if (this.state[k] != this.lastState[k]) {
+ updated = true;
+ break;
+ }
+ }
+ } else {
+ this.lastState = {};
+ updated = true;
+ }
+ if (updated) {
+ for (k in this.state) {
+ this.lastState[k] = this.state[k];
+ }
+ this.fire('update');
+ }
+ },
+
+ setSource: function(source) {
+ this.debug("setting source");
+ this.sound = source;
+ return this;
+ }
+
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+var TimeSide = function() {
+ if (arguments[0]) {
+ var toolkit = null;
+ if (typeof jQuery != 'undefined')
+ toolkit = jQuery;
+ (arguments[0])(TimeSide, toolkit)
+ }
+};
+
+TimeSide(function($N, $J) {
+
+$N.isDomLoaded = false;
+$N.isLoaded = false;
+$N.isLoading = false;
+$N.onLoadCallbacks = [];
+$N.cssPrefix = 'ts-';
+$N.debugging = false;
+
+$J(document).ready(function () {
+ $N.isDomLoaded = true;
+});
+
+$N.domReady = function(callback) {
+ // simply calling jQuery.ready() *after* the DOM is loaded doesn't work reliably,
+ // at least with jQuery 1.2.6
+ if ($N.isDomLoaded)
+ callback();
+ else
+ $J(document).ready(callback);
+}
+
+$N.instances = [];
+$N.registerInstance = function(obj) {
+ $N.instances.push(obj);
+}
+
+$N.free = function() {
+ $J($N.instances).each(function(i, obj) {
+ obj.free();
+ });
+}
+
+$J(window).unload($N.free);
+
+$N.loadScriptsNum = 0;
+$N.loadScriptsCallback = null;
+$N.loadScripts = function(root, scripts, callback) {
+ if ($N.loadScriptsCallback) {
+ throw "Timeside loader error: concurrent script loading";
+ }
+
+ $N.loadScriptsNum = scripts.length;
+ $N.loadScriptsCallback = callback;
+
+ var head= document.getElementsByTagName('head')[0];
+ for (i = 0; i < scripts.length; i++) {
+
+ var script = document.createElement('script');
+ script.type = 'text/javascript';
+ var debug = $N.debugging ? '?rand=' + Math.random() : '';
+ script.src = root + scripts[i] + debug;
+ head.appendChild(script);
+ }
+}
+
+$N.notifyScriptLoad = function() {
+ if (--$N.loadScriptsNum == 0 && $N.loadScriptsCallback) {
+ var callback = $N.loadScriptsCallback;
+ $N.loadScriptsCallback = null;
+ callback();
+ }
+}
+
+$N.debug = function(state) {
+ $N.debugging = state;
+}
+
+$N.load = function(callback) {
+ $N.domReady(function() {
+ if ($N.isLoaded) {
+ if (callback)
+ callback();
+ } else {
+ if (callback)
+ $N.onLoadCallbacks.push(callback);
+
+ if (!$N.isLoading) {
+ $N.isLoading = true;
+ var re = /(.*)timeside.js/;
+ var root = '';
+ $J('head script').each(function(i, e) {
+ if (match = re.exec(e.src)) {
+ root = match[1];
+ }
+ });
+
+ $N.loadScripts(root, ['core.js'], function() {
+ $N.loadScripts(root, ['util.js'], function() {
+ var scripts = ['controller.js', 'marker.js', 'markerlist.js',
+ 'markermap.js', 'player.js', 'ruler.js',
+ 'soundprovider.js'];
+
+ $N.loadScripts(root, scripts, function() {
+ $N.isLoaded = true;
+ $N.isLoading = false;
+ $J($N.onLoadCallbacks).each(function(i, callback) {
+ callback();
+ });
+ });
+ });
+ });
+ }
+ }
+ });
+}
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Util = {
+ _loadChild: function(container, tag, className, index, contents) {
+ var p = $N.cssPrefix;
+ var element = container.find('.' + p + className);
+ if (!element.length) {
+ element = $J(document.createElement(tag)).addClass(p + className);
+ if (contents[className]) {
+ element.text(contents[className]);
+ }
+ var children = container.children();
+ if (index < children.length) {
+ children.eq(index).before(element);
+ } else {
+ container.append(element);
+ }
+ }
+ return element;
+ },
+
+ _loadUI: function(container, skeleton, contents) {
+ var i = 0;
+ var elements = {};
+ with ($N.Util) {
+ if (skeleton[0]) {
+ $J(skeleton).each((function(i, selector) {
+ var s = selector.split('.');
+ elements[$N.Util.camelize(s[1])] = _loadChild(container, s[0], s[1], i++, contents);
+ }));
+ } else {
+ for (key in skeleton) {
+ var s = key.split('.');
+ var e = _loadChild(container, s[0], s[1], i++, contents);
+ elements[$N.Util.camelize(s[1])] = e;
+ $N.extend(elements, _loadUI(e, skeleton[key], contents));
+
+ }
+ }
+ }
+ return elements;
+ },
+
+ loadUI: function(container, skeleton, contents) {
+ return $N.Util._loadUI($J(container), skeleton, contents);
+ },
+
+ makeTimeLabel: function(offset) {
+ var minutes = Math.floor(offset / 60);
+ if (minutes < 10)
+ minutes = '0' + minutes;
+ var seconds = Math.floor(offset % 60);
+ if (seconds < 10)
+ seconds = '0' + seconds;
+ return minutes + ':' + seconds;
+ },
+
+ camelize: function(str) {
+ var parts = str.split('-'), len = parts.length;
+ if (len == 1) return parts[0];
+
+ var camelized = str.charAt(0) == '-'
+ ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+ : parts[0];
+
+ for (var i = 1; i < len; i++)
+ camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+ return camelized;
+ }
+
+}
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generic OAI-PMH Data Provider module
+#
+# Copyright (C) 2009 Samalyse SARL
+# Author: Olivier Guilyardi <olivier samalyse com>
+#
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+#
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+#
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+#
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+
+from datetime import datetime
+import time
+try:
+ import libxml2dom as dom
+except ImportError:
+ import xml.dom.minidom as dom
+ try:
+ import libxml2
+ except ImportError:
+ # dangerous: minidom output formatting isn't very good, libxml2 is much better
+ pass
+
+class IDataSource(object):
+ """Interface for OAI datasource adapters"""
+
+ def get_earliest_time(self):
+ """Must return the change time of the oldest record(s) as a datetime object"""
+ pass
+
+ def get_record(self, id):
+ """Must return a tuple of the form:
+ (
+ [(dublin core element, element value), ...],
+ change time
+ )
+ or None if the record doesn't exist. In case the id isn't wellformed
+ a BadArgumentError should be raised.
+
+ The dublin core data must contain an 'identifier' element, which is the same
+ as the id parameter."""
+ pass
+
+ def count_records(self, from_time = None, until_time = None):
+ """Must return the number of records between (optional) from and until change time."""
+ pass
+
+ def list_records(self, offset, limit, from_time = None, until_time = None):
+ """Must return the list of records between (optional) from and
+ until change time, starting from record at offset, with a maximum of limit
+ entries. Each entry of the list must be a tuple of the same form as returned
+ by getRecord().
+
+ If no record matches, should return an empty list. The dublin core data must
+ contain an 'identifier' element, which can be used as a parameter to get_record()."""
+ pass
+
+def iso_time(date_time = None):
+ """Encode a datetime object using ISO8601 format"""
+ if not date_time:
+ date_time = datetime.now()
+ return date_time.strftime('%Y-%m-%dT%H:%M:%SZ')
+
+def parse_iso_time(str):
+ """Parse an ISO8601 time string into a datetime object, or return None on failure"""
+ # Avoid datetime.strptime() for compatibility with python < 2.5
+ try:
+ s = time.strptime(str, '%Y-%m-%dT%H:%M:%SZ')
+ return datetime(s.tm_year, s.tm_mon, s.tm_mday, s.tm_hour, s.tm_min, s.tm_sec)
+ except ValueError:
+ try:
+ s = time.strptime(str, '%Y-%m-%d')
+ return datetime(s.tm_year, s.tm_mon, s.tm_mday)
+ except ValueError:
+ return None
+
+def doc_to_string(doc):
+ if dom.__name__ == 'libxml2dom':
+ return doc.toString(encoding='utf-8', prettyprint=True).decode('utf-8')
+ try:
+ doc2 = libxml2.parseDoc(doc.toxml(encoding="utf-8"))
+ xml = unicode(doc2.serialize(encoding="utf-8", format=1), "utf-8")
+ doc2.free()
+ return xml
+ except NameError:
+ return doc.toprettyxml(encoding="utf-8")
+
+class ArgumentValidator(object):
+ """OAI-PMH request argument validator"""
+
+ def __init__(self, request, response):
+ self.response = response
+ self.opt_args = []
+ self.required_args = ['verb']
+ self.request = request
+ self.format = None
+
+ def optional(self, *args):
+ """Add optional arguments"""
+ self.opt_args.extend(args)
+
+ def require(self, *args):
+ """Add required arguments"""
+ self.required_args.extend(args)
+
+ def accept_format(self, format):
+ """Indicate which metadata format is supported"""
+ self.format = format
+
+ def has_verb(self):
+ """Check if the request includes a valid Verb, return True if it does, False otherwise,
+ setting an error into the response"""
+
+ valid = ['GetRecord', 'Identify', 'ListIdentifiers', 'ListMetadataFormats', 'ListRecords', 'ListSets']
+
+ result = False
+ if self.request.has_key('verb'):
+ try:
+ valid.index(self.request['verb'])
+ result = True
+ except ValueError:
+ pass
+
+ if not result:
+ self.response.error('badVerb')
+
+ return result
+
+ def validate(self):
+ """Perform validation, return True if successfull, False otherwise, setting appropriate
+ errors into the response"""
+ all_args = []
+ all_args[:] = self.opt_args[:]
+ all_args.extend(self.required_args)
+ for k in self.request:
+ try:
+ all_args.index(k)
+ if (k == 'set'):
+ self.response.error('noSetHierarchy')
+ return False
+ except ValueError:
+ self.response.error('badArgument', 'Invalid argument: %s' % k)
+ return False
+
+ return self.pre_validate()
+
+ def pre_validate(self):
+ """Same as validate(), but doesn't not check for unknown arguments"""
+
+ for k in self.required_args:
+ if not self.request.has_key(k):
+ self.response.error('badArgument', 'Missing required argument: %s' % k)
+ return False
+
+ for k in self.request:
+ if k == 'metadataPrefix':
+ if self.format:
+ if self.format != self.request[k]:
+ self.response.error('cannotDisseminateFormat')
+ return False
+ else:
+ raise Exception('Can\'t validate metadataPrefix argument: supported format isn\'t defined')
+ elif (k == 'from') or (k == 'until'):
+ if not parse_iso_time(self.request[k]):
+ self.response.error('badArgument', "Invalid ISO8601 time format in '%s' argument" % k)
+ return False
+
+ return True
+
+class DataProvider(object):
+ """OAI-PMH Data Provider"""
+
+ max_records_per_response = 500
+
+ def __init__(self, datasource, repository_name, base_url, admin_email):
+ self.datasource = datasource
+ self.identity = [
+ ('repositoryName', repository_name),
+ ('baseURL', base_url),
+ ('protocolVersion', '2.0'),
+ ('adminEmail', admin_email),
+ ('deletedRecord', 'no'),
+ ('granularity', 'YYYY-MM-DDThh:mm:ssZ')
+ ]
+
+ def parse_time_range(self, args):
+ if args.get('from'):
+ from_time = parse_iso_time(args['from'])
+ else:
+ from_time = None
+ if args.get('until'):
+ until_time = parse_iso_time(args['until'])
+ else:
+ until_time = None
+
+ return from_time, until_time
+
+ def handle(self, args):
+ """Handle a request and return the response as a DOM document"""
+
+ response = Response(self.identity, self.datasource)
+ response.max_records_per_response = self.max_records_per_response
+
+ validator = ArgumentValidator(args, response)
+ validator.accept_format('oai_dc')
+
+ if validator.has_verb():
+
+ verb = args['verb']
+ response.set_verb(verb)
+
+ if verb == 'Identify':
+ validator.validate() and response.identify()
+ elif verb == 'GetRecord':
+ validator.require('identifier', 'metadataPrefix')
+ validator.validate() and response.get_record(args['identifier'])
+ elif verb == 'ListIdentifiers' or verb == 'ListRecords':
+ validator.optional('metadataPrefix', 'from', 'until', 'set', 'resumptionToken')
+ from_time, until_time = self.parse_time_range(args)
+ token = args.get('resumptionToken')
+ if validator.validate():
+ response.list_records(from_time, until_time, token, ids_only = (verb == 'ListIdentifiers'))
+ elif verb == 'ListSets':
+ validator.optional('resumptionToken')
+ validator.validate() and response.error('noSetHierarchy')
+ elif verb == 'ListMetadataFormats':
+ validator.optional('identifier')
+ validator.validate() and response.list_formats(args.get('identifier'))
+
+ xml = doc_to_string(response.doc)
+ response.free()
+ return xml
+
+class Response(object):
+ """OAI-PMH response generation"""
+
+ max_records_per_response = 500
+
+ def __init__(self, identity, datasource):
+ self.identity = identity
+ self.datasource = datasource
+
+ impl = dom.getDOMImplementation()
+ self.doc = impl.createDocument(None, 'OAI-PMH', None)
+ self.root = self.doc.firstChild
+ self.root.setAttribute('xmlns', 'http://www.openarchives.org/OAI/2.0/')
+ self.root.setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
+ self.root.setAttribute('xsi:schemaLocation', 'http://www.openarchives.org/OAI/2.0/ '
+ 'http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd')
+ self.append_elements(self.root, {'responseDate': iso_time()})
+ self.request = self.root.appendChild(self.doc.createElement('request'))
+ for k, v in self.identity:
+ if k == 'baseURL':
+ url = v
+ break
+ self.request.appendChild(self.doc.createTextNode(url))
+
+ def append_elements(self, parent, elements, prefix=None):
+ """Append several elements to parent. elements must either be a tag:value dict or
+ an ordered list of (tag, value) tuples."""
+ for item in elements:
+ if isinstance(item, tuple):
+ tag, value = item
+ else:
+ tag = item
+ value = elements[tag]
+ if prefix:
+ tag = prefix + ':' + tag
+ e = parent.appendChild(self.doc.createElement(tag))
+ e.appendChild(self.doc.createTextNode(value))
+ return parent
+
+ def set_attributes(self, element, attributes):
+ """Set several attributes on element, from dict. attributes must either be an
+ attr:value dict or an ordered list of (attr, value) tuples. If element is a
+ string, then create an element with than name. Return (possibly created)
+ element."""
+ if isinstance(element, basestring):
+ element = self.doc.createElement(element)
+ for item in attributes:
+ if isinstance(item, tuple):
+ attr, value = item
+ else:
+ attr = item
+ value = attributes[item]
+ element.setAttribute(attr, value)
+ return element
+
+ def set_verb(self, verb):
+ """Set the verb of the response. Should be called before any 'real' method such
+ as identify(), get_record(), etc..."""
+ self.verb = verb
+ self.request.setAttribute('verb', self.verb)
+
+ def identify(self):
+ """Append Identify tag and child nodes"""
+
+ identity = []
+ identity[:] = self.identity[:]
+ earliest = self.datasource.get_earliest_time()
+ identity.insert(4, ('earliestDatestamp', iso_time(earliest)))
+
+ group = self.root.appendChild(self.doc.createElement('Identify'))
+ self.append_elements(group, identity)
+
+ def error(self, code, msg = None):
+ """Add error tag using code. If msg is not provided, use a default error message."""
+
+ msgs = {
+ 'badArgument': 'Incorrect arguments',
+ 'badResumptionToken': 'Invalid resumption token',
+ 'badVerb': 'Illegal OAI verb',
+ 'noSetHierarchy': 'This repository does not support sets.',
+ 'idDoesNotExist': 'No such record',
+ 'cannotDisseminateFormat': 'Unsupported metadata format',
+ 'noRecordsMatch': 'The request returned an empty record set'
+ }
+
+ if not msg:
+ msg = msgs[code]
+ if not msg:
+ raise Exception("No such error code: %s" % code)
+
+ err = self.root.appendChild(self.set_attributes('error', {'code': code}))
+ err.appendChild(self.doc.createTextNode(msg))
+
+ def make_record_header(self, id, ctime):
+ """Build and return a record header"""
+ header = self.doc.createElement('header')
+ self.append_elements(header, [('identifier', id), ('datestamp', iso_time(ctime))])
+ return header
+
+ def make_record(self, id, dc, ctime):
+ """Build and return a record"""
+ record = self.doc.createElement('record')
+ header = record.appendChild(self.make_record_header(id, ctime))
+ metadata = record.appendChild(self.doc.createElement('metadata'))
+ container = metadata.appendChild(self.doc.createElement('oai_dc:dc'))
+ self.set_attributes(container, [
+ ('xmlns:oai_dc', "http://www.openarchives.org/OAI/2.0/oai_dc/"),
+ ('xmlns:dc', "http://purl.org/dc/elements/1.1/"),
+ ('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance"),
+ ('xsi:schemaLocation', "http://www.openarchives.org/OAI/2.0/oai_dc/ "
+ "http://www.openarchives.org/OAI/2.0/oai_dc.xsd")
+ ])
+ self.append_elements(container, dc, prefix='dc')
+ return record
+
+ def parse_dc(self, data):
+ valid = ['title', 'creator', 'subject', 'description', 'publisher', 'contributor',
+ 'date', 'type', 'format', 'identifier', 'source', 'language', 'relation',
+ 'coverage', 'rights']
+
+ parsed = []
+ id = None
+ for k, v in data:
+ try:
+ valid.index(k)
+ parsed.append((k, v))
+ if k == 'identifier':
+ id = v
+ except ValueError:
+ pass
+
+ return id, parsed
+
+
+ def get_record(self, id):
+ """Append GetRecord result"""
+ try:
+ record = self.datasource.get_record(id)
+ except BadArgumentError, e:
+ self.error('badArgument', e.message)
+ return
+ if not record:
+ self.error('idDoesNotExist')
+ else:
+ dc, ctime = record
+ dc_id, dc = self.parse_dc(dc)
+ if dc_id == None:
+ raise Exception("DataSource.get_record() didn't provide an 'identifier' dublin core element")
+ elif dc_id != id:
+ raise Exception("DataSource.get_record() returned an 'identifier' dublin core element "
+ "which is different from the requested identifier")
+
+ self.set_attributes(self.request, {'identifier': id, 'metadataPrefix': 'oai_dc'})
+ container = self.root.appendChild(self.doc.createElement(self.verb))
+ container.appendChild(self.make_record(id, dc, ctime))
+
+ def list_records(self, from_time, until_time, token = None, ids_only = False):
+ """Append ListIdentifiers or ListRecords result"""
+ offset = 0
+ if token:
+ self.request.setAttribute('resumptionToken', token)
+ try:
+ from_time, until_time, offset = token.split(',')
+ except ValueError:
+ self.error('badResumptionToken')
+ return
+
+ if len(from_time):
+ from_time = parse_iso_time(from_time)
+ if not from_time:
+ self.error('badResumptionToken')
+ return
+ else:
+ from_time = None
+
+ if len(until_time):
+ until_time = parse_iso_time(until_time)
+ if not until_time:
+ self.error('badResumptionToken')
+ return
+ else:
+ until_time = None
+
+ try:
+ offset = int(offset)
+ except ValueError:
+ self.error('badResumptionToken')
+ return
+ else:
+ if from_time:
+ self.request.setAttribute('from', iso_time(from_time))
+ if until_time:
+ self.request.setAttribute('until', iso_time(until_time))
+
+ count = self.datasource.count_records(from_time, until_time)
+ data = self.datasource.list_records(offset, self.max_records_per_response, from_time, until_time)
+ if (len(data) > self.max_records_per_response):
+ raise Exception("DataSource.list_records() returned too many records")
+
+ if len(data):
+ container = self.root.appendChild(self.doc.createElement(self.verb))
+ for item in data:
+ dc, ctime = item
+ id, dc = self.parse_dc(dc)
+ if id == None:
+ raise Exception("DataSource.list_records() didn't provide an 'identifier' dublin core element")
+
+ if ids_only:
+ container.appendChild(self.make_record_header(id, ctime))
+ else:
+ container.appendChild(self.make_record(id, dc, ctime))
+
+ if count - offset > self.max_records_per_response:
+ token = container.appendChild(self.doc.createElement('resumptionToken'))
+ token.setAttribute('completeListSize', str(count))
+
+ if from_time:
+ from_time = iso_time(from_time)
+ else:
+ from_time = ''
+
+ if until_time:
+ until_time = iso_time(until_time)
+ else:
+ until_time = ''
+
+ token_str = "%s,%s,%d" % (from_time, until_time, offset + len(data))
+ token.appendChild(self.doc.createTextNode(token_str))
+ elif offset:
+ token = container.appendChild(self.doc.createElement('resumptionToken'))
+ token.setAttribute('completeListSize', str(count))
+ else:
+ self.error("noRecordsMatch")
+
+ def list_formats(self, id = None):
+ """Append ListMetadataFormats result"""
+ if id:
+ record = self.datasource.get_record(id)
+ if not record:
+ self.error('idDoesNotExist')
+ return
+ self.request.setAttribute('identifier', id)
+
+ container = self.root.appendChild(self.doc.createElement(self.verb))
+ format = container.appendChild(self.doc.createElement('metadataFormat'))
+ self.append_elements(format, [
+ ('metadataPrefix', 'oai_dc'),
+ ('schema', 'http://www.openarchives.org/OAI/2.0/oai_dc.xsd'),
+ ('metadataNamespace', 'http://www.openarchives.org/OAI/2.0/oai_dc/')
+ ])
+
+ def free(self):
+ """Free the resources used by this response"""
+ try:
+ self.doc.unlink()
+ except AttributeError:
+ # Apparently no free/unlink method in libxml2dom
+ pass
+
+class BadArgumentError(Exception):
+ pass
--- /dev/null
+# Telemeta OAI-PMH DataSource
+#
+# Copyright (C) 2009 Samalyse SARL
+# Author: Olivier Guilyardi <olivier samalyse com>
+#
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+#
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+#
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+#
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+
+from telemeta.models import MediaCollection, MediaItem, Revision, dublincore
+from telemeta.interop.oai import BadArgumentError
+from datetime import datetime
+
+class TelemetaOAIDataSource(object):
+ """Telemeta OAI datasource adapter. This class implements the oai.IDataSource interface."""
+
+ def get_earliest_time(self):
+ """Return the change time of the oldest record(s) as a datetime object"""
+ try:
+ rev = Revision.objects.order_by('time')[0]
+ return rev.time
+ except IndexError:
+ return datetime.now()
+
+ def prepare_record(self, record):
+ ctime = record.get_revision().time
+ return dublincore.express_resource(record).to_list(), ctime
+
+ def get_record(self, id):
+ """Return a specific record"""
+ try:
+ record = dublincore.lookup_resource(id)
+ except dublincore.MalformedMediaIdentifier, e:
+ raise BadArgumentError(e.message)
+ return record and self.prepare_record(record)
+
+ def count_records(self, from_time = None, until_time = None):
+ """Must return the number of records between (optional) from and until change time."""
+ nitems = MediaItem.objects.by_change_time(from_time, until_time).count()
+ ncolls = MediaCollection.objects.by_change_time(from_time, until_time).count()
+ return nitems + ncolls
+
+ def list_records(self, offset, limit, from_time = None, until_time = None):
+ """Return a list of records"""
+
+ result = []
+
+ query = MediaItem.objects.by_change_time(from_time, until_time)
+ nitems = query.count()
+ if (offset < nitems):
+ set = query[offset:offset + limit]
+ for record in set:
+ result.append(self.prepare_record(record))
+ limit -= len(set)
+ offset = 0
+ else:
+ offset -= nitems
+
+ if limit > 0:
+ query = MediaCollection.objects.by_change_time(from_time, until_time)
+ set = query[offset:offset + limit]
+ for record in set:
+ result.append(self.prepare_record(record))
+
+ return result
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import sys
+from datetime import datetime
+from oai import DataProvider
+import cherrypy
+
+class DataSource(object):
+ def __init__(self):
+ self.oldest = datetime(1988, 1, 1)
+
+ self.data = {
+ '10': ([('title', 'Roger Rabbit'), ('title', 'Roger Le Lapin'), ('creator', 'Bugs Bunny')], self.oldest),
+ '20': ([('title', 'Pulp Fiction'), ('creator', 'Quentin Tarantino')], datetime(1994, 10, 14)),
+ '30': ([('title', 'Children of Men'), ('creator', u'Alfonso Cuarón')], datetime(2006, 10, 18))
+ }
+
+
+ def get_earliest_time(self):
+ return self.oldest
+
+ def get_record(self, id):
+ record = self.data.get(id)
+ if record:
+ dc = []
+ dc[:] = record[0][:]
+ dc.insert(0, ('identifier', id))
+ record = (dc, record[1])
+ return record
+
+ def count_records(self, from_time = None, until_time = None):
+ result = 0
+ for k in self.data:
+ dc, ctime = self.data[k]
+ if ((not from_time) or ctime >= from_time) and ((not until_time) or ctime <= until_time):
+ result += 1
+ #result.push((k, ctime))
+ return result
+
+ def list_records(self, offset, limit, from_time = None, until_time = None):
+ result = []
+ i = 0
+ n = 0
+ for k in self.data:
+ dc = []
+ _dc, ctime = self.data[k]
+ dc[:] = _dc[:]
+ dc.insert(0, ('identifier', k))
+ if ((not from_time) or ctime >= from_time) and ((not until_time) or ctime <= until_time):
+ if (i >= offset) and (n < limit):
+ result.append((dc, ctime))
+ n += 1
+ i += 1
+ return result
+
+class OAIServer:
+ def __init__(self, provider):
+ self.provider = provider
+
+ def index(self, **kwargs):
+ return self.provider.handle(kwargs).encode('UTF-8')
+
+ index.exposed = True
+
+args = {}
+runserver = False
+for item in sys.argv[1:]:
+ cut = item.split('=')
+ if len(cut) == 1:
+ if cut[0] == 'runserver':
+ runserver = True
+ host = None
+ port = None
+ break
+ else:
+ raise Exception("Please pass a value for argument %s" % cut[0])
+ else:
+ k, v = cut
+ if k == 'runserver':
+ runserver = True
+ host, port = v.split(':')
+ break
+ else:
+ args[k] = v
+
+provider = DataProvider(DataSource(), "Test Provider", "http://test.provider.com", "joe@provider.com")
+provider.max_records_per_response = 2
+
+if runserver:
+ if host:
+ cherrypy.config.update({'server.socket_host': host})
+ if port:
+ cherrypy.config.update({'server.socket_port': int(port)})
+
+ cherrypy.quickstart(OAIServer(provider))
+else:
+ sys.stdout.write(provider.handle(args).encode('UTF-8'))
--- /dev/null
+# Telemeta French Translation
+# Copyright (C) 2010 Samalyse
+# This file is distributed under the same license as the Telemeta package.
+# Olivier Guilyardi <olivier samalyse com>, 2010.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-04-11 17:36+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Olivier Guilyardi <olivier samalyse com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: models/core.py:142
+msgid "Duration"
+msgstr "Durée"
+
+#: models/core.py:147
+msgid "Enter a valid duration in HH:MM[:ss] format."
+msgstr "Entrez une durée valide au format HH:MM[:ss]"
+
+#: models/enum.py:41 models/enum.py:139
+msgid "value"
+msgstr "valeur"
+
+#: models/enum.py:57 models/media.py:79
+msgid "archive format"
+msgstr "format d'archivage"
+
+#: models/enum.py:64 models/media.py:86
+msgid "secondary edition"
+msgstr "réédition"
+
+#: models/enum.py:71 models/media.py:101
+msgid "mode of acquisition"
+msgstr "mode d'acquisition"
+
+#: models/enum.py:78 models/media.py:104
+msgid "record author"
+msgstr "rédacteur fiche"
+
+#: models/enum.py:85 models/media.py:106
+msgid "record writer"
+msgstr "saisie fiche"
+
+#: models/enum.py:92 models/media.py:108
+msgid "legal rights"
+msgstr "droit d'utilisation"
+
+#: models/enum.py:99 models/media.py:113
+msgid "recording context"
+msgstr "contexte d'enregistrement"
+
+#: models/enum.py:106 models/media.py:122
+msgid "digitization"
+msgstr "numérisation"
+
+#: models/enum.py:113 models/media.py:231
+msgid "vernacular style"
+msgstr "style vernaculaire"
+
+#: models/enum.py:120 models/media.py:240
+msgid "generic style"
+msgstr "style générique"
+
+#: models/enum.py:127 models/media.py:311
+msgid "keyword"
+msgstr "mot-clé"
+
+#: models/enum.py:134 models/media.py:93
+msgid "publisher / status"
+msgstr "éditeur / statut"
+
+#: models/enum.py:138
+msgid "publisher"
+msgstr "éditeur"
+
+#: models/enum.py:152 models/enum.py:156 models/media.py:226
+msgid "population / social group"
+msgstr "population / groupe social"
+
+#: models/enum.py:157 models/instrument.py:41 models/instrument.py:51
+#: models/location.py:50 models/location.py:148 models/media.py:348
+msgid "name"
+msgstr "nom"
+
+#: models/instrument.py:62 models/instrument.py:75
+msgid "instrument"
+msgstr "instrument"
+
+#: models/instrument.py:64
+msgid "parent instrument"
+msgstr "instrument parent"
+
+#: models/instrument.py:73 models/location.py:156
+msgid "alias"
+msgstr "alias"
+
+#: models/location.py:48
+msgid "country"
+msgstr "état/nation"
+
+#: models/location.py:48
+msgid "continent"
+msgstr "continent"
+
+#: models/location.py:48
+msgid "other"
+msgstr "autre"
+
+#: models/location.py:51
+msgid "type"
+msgstr "type"
+
+#: models/location.py:52
+msgid "complete type"
+msgstr "type complet"
+
+#: models/location.py:54
+msgid "current location"
+msgstr "lieu actuel"
+
+#: models/location.py:57 models/location.py:157 models/location.py:171
+msgid "authoritative"
+msgstr "officiel"
+
+#: models/location.py:111 models/location.py:155 models/location.py:168
+#: models/media.py:223
+msgid "location"
+msgstr "lieu"
+
+#: models/location.py:147
+msgid "identifier"
+msgstr "identifiant"
+
+#: models/location.py:169
+msgid "ancestor location"
+msgstr "lieu ancêtre"
+
+#: models/media.py:50
+msgid "Metadata only"
+msgstr "Métadonnées uniquement"
+
+#: models/media.py:52
+msgid "Sound and metadata"
+msgstr "Son et métadonnées"
+
+#: models/media.py:54
+msgid "Private data"
+msgstr "Données privées"
+
+#: models/media.py:55 models/media.py:123 models/media.py:245
+msgid "public access"
+msgstr "accès public"
+
+#: models/media.py:77 models/media.py:242
+msgid "reference"
+msgstr "référence"
+
+#: models/media.py:80 models/media.py:218
+msgid "old code"
+msgstr "ancienne cote"
+
+#: models/media.py:81 models/media.py:219
+msgid "code"
+msgstr "cote"
+
+#: models/media.py:82 models/media.py:227 models/media.py:335
+msgid "title"
+msgstr "titre"
+
+#: models/media.py:83 models/media.py:228
+msgid "original title / translation"
+msgstr "titre original / traduction"
+
+#: models/media.py:84
+msgid "number of components (medium / piece)"
+msgstr "nb de composants (support / pièce)"
+
+#: models/media.py:87
+msgid "depositor / contributor"
+msgstr "déposant / contributeur"
+
+#: models/media.py:88
+msgid "author of published notice"
+msgstr "auteur de la notice éditée"
+
+#: models/media.py:89
+msgid "related documentation"
+msgstr "documentation associée"
+
+#: models/media.py:90 models/media.py:236
+msgid "recordist"
+msgstr "collecteur"
+
+#: models/media.py:91
+msgid "recordist identical to depositor"
+msgstr "collecteur identique au déposant"
+
+#: models/media.py:94
+msgid "published"
+msgstr "édité"
+
+#: models/media.py:95
+msgid "year published"
+msgstr "année de parution"
+
+#: models/media.py:97
+msgid "publisher collection"
+msgstr "collection éditeur"
+
+#: models/media.py:98
+msgid "publisher serial number"
+msgstr "numéro dans la série"
+
+#: models/media.py:99
+msgid "bibliographic references"
+msgstr "références bibliographiques"
+
+#: models/media.py:102
+msgid "comment"
+msgstr "commentaire"
+
+#: models/media.py:109
+msgid "copies"
+msgstr "autres exemplaires"
+
+#: models/media.py:110
+msgid "recording year (from)"
+msgstr "année d'enregistrement (depuis)"
+
+#: models/media.py:111
+msgid "recording year (until)"
+msgstr "année d'enregistrement (jusqu'à)"
+
+#: models/media.py:114 models/media.py:220
+msgid "approximative duration"
+msgstr "durée approximative"
+
+#: models/media.py:115
+msgid "document type"
+msgstr "type de document"
+
+#: models/media.py:116
+msgid "archiver notes"
+msgstr "notes de l'archiviste"
+
+#: models/media.py:117
+msgid "status"
+msgstr "etat"
+
+#: models/media.py:118
+msgid "CNRS depositor"
+msgstr "déposant CNRS"
+
+#: models/media.py:119
+msgid "items finished"
+msgstr "fiches items faîtes"
+
+#: models/media.py:120
+msgid "a_informer_07_03"
+msgstr "a_informer_07_03"
+
+#: models/media.py:160
+msgid "states / nations"
+msgstr "états / nations"
+
+#: models/media.py:174
+msgid "populations / social groups"
+msgstr "populations / groupes sociaux"
+
+#: models/media.py:182 models/media.py:295
+msgid "computed duration"
+msgstr "durée calculée"
+
+#: models/media.py:216
+msgid "collection"
+msgstr "collection"
+
+#: models/media.py:217
+msgid "item number"
+msgstr "n° de l'item"
+
+#: models/media.py:221
+msgid "recording date (from)"
+msgstr "date d'enregistrement (depuis)"
+
+#: models/media.py:222
+msgid "recording date (until)"
+msgstr "date d'enregistrement (jusqu'à)"
+
+#: models/media.py:224
+msgid "location details"
+msgstr "précisions lieu"
+
+#: models/media.py:229
+msgid "author / compositor"
+msgstr "auteur / compositeur"
+
+#: models/media.py:232
+msgid "comments"
+msgstr "commentaires"
+
+#: models/media.py:233
+msgid "published reference"
+msgstr "référence éditée"
+
+#: models/media.py:234
+msgid "moda_execut"
+msgstr "moda_execut"
+
+#: models/media.py:235
+msgid "copy of"
+msgstr "copie de"
+
+#: models/media.py:237
+msgid "recordist as in collection"
+msgstr "collecteur identique à la collection"
+
+#: models/media.py:238
+msgid "cultural area"
+msgstr "aire culturelle"
+
+#: models/media.py:241
+msgid "recordist selection"
+msgstr "sélection collecteur"
+
+#: models/media.py:243
+msgid "remarks"
+msgstr "remarques"
+
+#: models/media.py:244
+msgid "file"
+msgstr "fichier"
+
+#: models/media.py:251
+msgid "keywords"
+msgstr "mots-clés"
+
+#: models/media.py:310 models/media.py:320 models/media.py:334
+msgid "item"
+msgstr "item"
+
+#: models/media.py:322
+msgid "composition"
+msgstr "formation"
+
+#: models/media.py:324
+msgid "vernacular name"
+msgstr "nom vernaculaire"
+
+#: models/media.py:325
+msgid "number"
+msgstr "nombre"
+
+#: models/media.py:326
+msgid "interprets"
+msgstr "interprètes"
+
+#: models/media.py:336
+msgid "start"
+msgstr "début"
+
+#: models/media.py:337
+msgid "end"
+msgstr "fin"
+
+#: models/media.py:360
+msgid "playlist"
+msgstr "liste de lecture"
+
+#: models/media.py:361
+msgid "resource type"
+msgstr "type de ressource"
+
+#: models/media.py:362
+msgid "resource"
+msgstr "ressource"
+
+#: models/system.py:44
+msgid "username"
+msgstr "nom d'utilisateur"
+
+#: models/system.py:45
+msgid "level"
+msgstr "niveau"
+
+#: models/system.py:46
+msgid "first name"
+msgstr "prénom"
+
+#: models/system.py:47
+msgid "last name"
+msgstr "nom de famille"
+
+#: models/system.py:48
+msgid "phone"
+msgstr "téléphone"
+
+#: models/system.py:49
+msgid "email"
+msgstr "e-mail"
+
+#: models/system.py:62
+msgid "element type"
+msgstr "type d'élément"
+
+#: models/system.py:63
+msgid "element identifier"
+msgstr "identifiant de l'élément"
+
+#: models/system.py:64
+msgid "modification type"
+msgstr "type de modification"
+
+#: models/system.py:65
+msgid "time"
+msgstr "heure"
+
+#: models/system.py:66
+msgid "user"
+msgstr "utilisateur"
+
+#: templates/telemeta_default/base.html:37
+msgid "Sign out"
+msgstr "Déconnexion"
+
+#: templates/telemeta_default/base.html:39
+#: templates/telemeta_default/login.html:20
+msgid "Sign in"
+msgstr "Connexion"
+
+#: templates/telemeta_default/base.html:46
+#: templates/telemeta_default/search_criteria.html:134
+msgid "Search"
+msgstr "Recherche"
+
+#: templates/telemeta_default/base.html:48
+msgid "Advanced search"
+msgstr "Recherche avancée"
+
+#: templates/telemeta_default/base.html:55
+msgid "Collections"
+msgstr "Collections"
+
+#: templates/telemeta_default/base.html:55
+msgid "Items"
+msgstr "Items"
+
+#: templates/telemeta_default/base.html:55
+msgid "Geo Navigator"
+msgstr "Géo-Navigateur"
+
+#: templates/telemeta_default/base.html:55
+msgid "Admin"
+msgstr "Admin"
+
+#: templates/telemeta_default/base.html:75
+msgid "Powered by"
+msgstr "Propulsé par"
+
+#: templates/telemeta_default/base.html:76
+msgid "By"
+msgstr "Par"
+
+#: templates/telemeta_default/base.html:80
+msgid "Visit the Telemeta open source project at"
+msgstr "Visitez le projet libre Telemeta"
+
+#: templates/telemeta_default/collection_detail.html:5
+#: templates/telemeta_default/collection_detail_dc.html:5
+msgid "Collection"
+msgstr "Collection"
+
+#: templates/telemeta_default/collection_detail.html:53
+msgid "Recording year"
+msgstr "Année d'enregistrement"
+
+#: templates/telemeta_default/collection_detail.html:63
+#: templates/telemeta_default/mediaitem_detail.html:148
+msgid "Geographic and cultural informations"
+msgstr "Indications géographiques et culturelles"
+
+#: templates/telemeta_default/collection_detail.html:76
+msgid "Legal mentions"
+msgstr "Mentions légales"
+
+#: templates/telemeta_default/collection_detail.html:81
+#: templates/telemeta_default/inc/collection_list.html:17
+#: templates/telemeta_default/inc/mediaitem_list.html:16
+msgid "Recordist"
+msgstr "Collecteur"
+
+#: templates/telemeta_default/collection_detail.html:102
+#: templates/telemeta_default/mediaitem_detail.html:213
+msgid "Archiving data"
+msgstr "Données d'archivage"
+
+#: templates/telemeta_default/collection_detail.html:125
+#: templates/telemeta_default/mediaitem_detail.html:228
+msgid "Technical data"
+msgstr "Données techniques"
+
+#: templates/telemeta_default/collection_detail.html:130
+#: templates/telemeta_default/mediaitem_detail.html:231
+msgid "Media type"
+msgstr "Type de media"
+
+#: templates/telemeta_default/collection_detail.html:130
+#: templates/telemeta_default/mediaitem_detail.html:231
+msgid "Audio"
+msgstr "Audio"
+
+#: templates/telemeta_default/collection_detail.html:135
+#: templates/telemeta_default/geo_countries.html:14
+msgid "Number of items"
+msgstr "Nombre d'items"
+
+#: templates/telemeta_default/collection_detail_dc.html:10
+#: templates/telemeta_default/mediaitem_detail_dc.html:10
+msgid "Normal View"
+msgstr "Vue normale"
+
+#: templates/telemeta_default/collection_detail_dc.html:20
+msgid "No such collection"
+msgstr "Collection introuvable"
+
+#: templates/telemeta_default/collection_list.html:5
+#: templates/telemeta_default/collection_list.html:8
+msgid "Media Collections"
+msgstr "Collections"
+
+#: templates/telemeta_default/country_info.html:9
+msgid "in"
+msgstr "dans"
+
+#: templates/telemeta_default/country_info.html:18
+msgid "Populations / Social groups"
+msgstr "Populations / Groupes sociaux"
+
+#: templates/telemeta_default/enumeration_edit.html:4
+#: templates/telemeta_default/enumeration_edit.html:7
+#: templates/telemeta_default/enumeration_edit_value.html:4
+#: templates/telemeta_default/enumeration_edit_value.html:7
+msgid "Enumeration"
+msgstr "Enumération"
+
+#: templates/telemeta_default/enumeration_edit.html:12
+msgid "Add entry"
+msgstr "Ajouter une entrée"
+
+#: templates/telemeta_default/enumeration_edit.html:14
+#: templates/telemeta_default/enumeration_edit.html:26
+#: templates/telemeta_default/enumeration_edit_value.html:14
+msgid "Value"
+msgstr "Valeur"
+
+#: templates/telemeta_default/enumeration_edit.html:18
+msgid "Add"
+msgstr "Ajouter"
+
+#: templates/telemeta_default/enumeration_edit.html:40
+msgid "Remove selected items"
+msgstr "Supprimer les éléments sélectionnés"
+
+#: templates/telemeta_default/enumeration_edit.html:44
+msgid "This enumeration is empty"
+msgstr "Cette énumération est vide"
+
+#: templates/telemeta_default/enumeration_edit_value.html:12
+msgid "Modify an entry"
+msgstr "Modification d'une entrée"
+
+#: templates/telemeta_default/enumeration_edit_value.html:18
+msgid "Save"
+msgstr "Enregistrer"
+
+#: templates/telemeta_default/enumeration_edit_value.html:19
+msgid "Cancel"
+msgstr "Annuler"
+
+#: templates/telemeta_default/geo_continents.html:5
+#: templates/telemeta_default/geo_continents.html:26
+#: templates/telemeta_default/geo_countries.html:5
+#: templates/telemeta_default/geo_country_collections.html:5
+#: templates/telemeta_default/geo_country_items.html:5
+#: templates/telemeta_default/index.html:9
+msgid "Geographic Navigator"
+msgstr "Navigateur géographique"
+
+#: templates/telemeta_default/geo_continents.html:21
+msgid "Map"
+msgstr "Carte"
+
+#: templates/telemeta_default/geo_continents.html:22
+msgid "List"
+msgstr "Liste"
+
+#: templates/telemeta_default/geo_countries.html:8
+#: templates/telemeta_default/geo_country_collections.html:8
+#: templates/telemeta_default/geo_country_items.html:8
+msgid "World"
+msgstr "Monde"
+
+#: templates/telemeta_default/geo_countries.html:12
+msgid "Country"
+msgstr "Etat/nation"
+
+#: templates/telemeta_default/geo_countries.html:13
+msgid "Number of collections"
+msgstr "Nombre de collections"
+
+#: templates/telemeta_default/geo_countries.html:22
+#, python-format
+msgid "1 collection"
+msgid_plural "%(counter)s collections"
+msgstr[0] "1 collection"
+msgstr[1] "%(counter)s collections"
+
+#: templates/telemeta_default/geo_countries.html:29
+#, python-format
+msgid "1 item"
+msgid_plural "%(counter)s items "
+msgstr[0] "1 item"
+msgstr[1] "%(counter)s items "
+
+#: templates/telemeta_default/index.html:11
+msgid "Open the geographic navigator"
+msgstr "Accéder au navigateur géographique"
+
+#: templates/telemeta_default/index.html:14
+msgid "Musical selection"
+msgstr "Sélection musicale"
+
+#: templates/telemeta_default/login.html:5
+msgid "User authentication"
+msgstr "Identification"
+
+#: templates/telemeta_default/login.html:8
+msgid "Your username and password didn't match. Please try again."
+msgstr "Vos nom d'utilisateur et/ou mot de passe sont incorrects. Essayez à nouveau."
+
+#: templates/telemeta_default/mediaitem_detail.html:5
+#: templates/telemeta_default/mediaitem_detail_dc.html:5
+msgid "Item"
+msgstr "Item"
+
+#: templates/telemeta_default/mediaitem_detail.html:120
+msgid "Download:"
+msgstr "Téléchargement:"
+
+#: templates/telemeta_default/mediaitem_detail.html:139
+msgid "Recording date"
+msgstr "Date d'enregistrement"
+
+#: templates/telemeta_default/mediaitem_detail.html:151
+#: templates/telemeta_default/inc/mediaitem_list.html:18
+msgid "Location"
+msgstr "Lieu"
+
+#: templates/telemeta_default/mediaitem_detail.html:166
+msgid "Musical informations"
+msgstr "Informations sur la musique"
+
+#: templates/telemeta_default/mediaitem_detail.html:202
+msgid "General informations"
+msgstr "Informations générales"
+
+#: templates/telemeta_default/mediaitem_detail_dc.html:19
+msgid "No such item"
+msgstr "Item introuvable"
+
+#: templates/telemeta_default/mediaitem_list.html:5
+#: templates/telemeta_default/mediaitem_list.html:8
+msgid "Media Items"
+msgstr "Items"
+
+#: templates/telemeta_default/search_criteria.html:5
+#: templates/telemeta_default/search_criteria.html:55
+msgid "Advanced Search"
+msgstr "Recherche avancée"
+
+#: templates/telemeta_default/search_criteria.html:79
+#: templates/telemeta_default/search_results.html:28
+#: templates/telemeta_default/inc/collection_list.html:14
+#: templates/telemeta_default/inc/mediaitem_list.html:14
+msgid "Title"
+msgstr "Titre"
+
+#: templates/telemeta_default/search_criteria.html:95
+#: templates/telemeta_default/search_results.html:31
+#: templates/telemeta_default/inc/collection_list.html:18
+#: templates/telemeta_default/inc/mediaitem_list.html:22
+msgid "Year of recording"
+msgstr "Année d'enregistrement"
+
+#: templates/telemeta_default/search_criteria.html:102
+#: templates/telemeta_default/search_criteria.html:121
+#: templates/telemeta_default/search_results.html:33
+#: templates/telemeta_default/search_results.html:40
+msgid "to"
+msgstr "à"
+
+#: templates/telemeta_default/search_criteria.html:114
+#: templates/telemeta_default/search_results.html:38
+msgid "Year of publication"
+msgstr "Année de publication"
+
+#: templates/telemeta_default/search_results.html:5
+#: templates/telemeta_default/search_results.html:8
+msgid "Search Results"
+msgstr "Résultats de recherche"
+
+#: templates/telemeta_default/search_results.html:13
+msgid "Search pattern"
+msgstr "Recherche"
+
+#: templates/telemeta_default/inc/collection_list.html:6
+#, python-format
+msgid "Collections %(first_on_page)s to %(last_on_page)s on %(hits)s"
+msgstr "Collections %(first_on_page)s à %(last_on_page)s sur %(hits)s"
+
+#: templates/telemeta_default/inc/collection_list.html:15
+#: templates/telemeta_default/inc/mediaitem_list.html:15
+msgid "Code"
+msgstr "Cote"
+
+#: templates/telemeta_default/inc/collection_list.html:42
+msgid "No collection"
+msgstr "Aucune collection"
+
+#: templates/telemeta_default/inc/dublincore.html:4
+msgid "Dublin Core Metadata"
+msgstr "Métadonnées Dublin Core"
+
+#: templates/telemeta_default/inc/mediaitem_list.html:6
+#, python-format
+msgid "Items %(first_on_page)s to %(last_on_page)s on %(hits)s"
+msgstr "Items %(first_on_page)s à %(last_on_page)s sur %(hits)s"
+
+#: templates/telemeta_default/inc/mediaitem_list.html:20
+msgid "Country/Continent"
+msgstr "Etat/Continent"
+
+#: templates/telemeta_default/inc/mediaitem_list.html:50
+msgid "No item"
+msgstr "Aucun item"
+
+#: templatetags/telemeta_utils.py:218
+#, python-format
+msgid "%(count)d item"
+msgid_plural "%(count)d items"
+msgstr[0] "%(count)d item"
+msgstr[1] "%(count)d items"
+
+#: templatetags/telemeta_utils.py:221
+#, python-format
+msgid "%(count)d collection"
+msgid_plural "%(count)d collections"
+msgstr[0] "%(count)d collection"
+msgstr[1] "%(count)d collections"
--- /dev/null
+from optparse import make_option
+from django.conf import settings
+from django.core.management.base import BaseCommand, CommandError
+from telemeta.models import Location
+from telemeta.util.unaccent import unaccent
+import logging
+import codecs
+
+class Command(BaseCommand):
+ help = "Geocode Telemeta countries from a local Geonames data file"
+ args = "path to geoname's allCountries.txt"
+
+ def handle(self, datafile=None, *args, **options):
+
+ if not datafile:
+ raise CommandError("Please provide the %s" % self.args)
+
+ try:
+ datafile = codecs.open(datafile, 'r', 'utf-8')
+ except IOError:
+ raise CommandError("Unable to open %s" % datafile)
+
+ locations = {}
+ for l in Location.objects.all().current().filter(type=Location.COUNTRY):
+ locations[l] = [a.alias for a in l.aliases.all()]
+
+ i = 0
+ geocoded = 0
+ total = len(locations)
+ found_by_alias = {}
+ for line in datafile:
+ (geonameid, name, asciiname, alternatenames, latitude, longitude, feature_class,
+ feature_code, country_code, cc2, admin1_code, admin2_code, admin3_code,
+ admin4_code, population, elevation, gtopo30, timezone, modification_date) = line.strip().split("\t")
+
+ if feature_code[0:3] == 'PCL':
+ names = [asciiname.lower()]
+ if alternatenames:
+ names.extend([unaccent(n).lower() for n in alternatenames.split(',')])
+
+ found = []
+ for l in locations:
+ if unaccent(l.name).lower() in names:
+ l.latitude = float(latitude)
+ l.longitude = float(longitude)
+ l.save()
+ geocoded += 1
+ found.append(l)
+ else:
+ for a in locations[l]:
+ if unaccent(a).lower() in names:
+ found_by_alias[l] = float(latitude), float(longitude)
+ break
+
+
+ for l in found:
+ locations.pop(l)
+
+ i += 1
+
+ if i % 200000 == 0:
+ print "Geocoded %d (%d by alias) out of %d countries (parsed %d geonames)" % (geocoded, len(found_by_alias), total, i)
+
+ if total == geocoded:
+ break
+
+ for l in locations:
+ if found_by_alias.has_key(l):
+ l.latitude, l.longitude = found_by_alias[l]
+ l.save()
+ geocoded += 1
+
+ print "Done. Geocoded %d out of %d countries (parsed %d geonames)" % (geocoded, total, i)
+ datafile.close()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Author: Olivier Guilyardi <olivier@samalyse.com>
+
+from telemeta.models.media import *
+from telemeta.models.location import *
+from telemeta.models.instrument import *
+from telemeta.models.enum import *
+from telemeta.models.system import *
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2010 Samalyse SARL
+#
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+#
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+#
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+#
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+#
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+
+__all__ = ['ModelCore', 'MetaCore', 'DurationField', 'Duration', 'WeakForeignKey',
+ 'EnhancedModel', 'CharField', 'TextField', 'IntegerField', 'BooleanField',
+ 'DateTimeField', 'FileField', 'ForeignKey', 'FloatField', 'DateField',
+ 'RequiredFieldError', 'CoreQuerySet', 'CoreManager', 'word_search_q']
+
+from django.core import exceptions
+from django import forms
+from xml.dom.minidom import getDOMImplementation
+from django.db.models.fields import FieldDoesNotExist
+from django.db.models import Q
+from django.db import models
+import datetime
+from django.utils.translation import ugettext_lazy as _
+import re
+from django.core.exceptions import ObjectDoesNotExist
+
+class Duration(object):
+ """Represent a time duration"""
+ def __init__(self, *args, **kwargs):
+ if len(args) and isinstance(args[0], datetime.timedelta):
+ self._delta = datetime.timedelta(days=args[0].days, seconds=args[0].seconds)
+ else:
+ self._delta = datetime.timedelta(*args, **kwargs)
+
+ def __decorate(self, method, other):
+ if isinstance(other, Duration):
+ res = method(other._delta)
+ else:
+ res = method(other)
+ if type(res) == datetime.timedelta:
+ return Duration(res)
+
+ return res
+
+ def __add__(self, other):
+ return self.__decorate(self._delta.__add__, other)
+
+ def __nonzero__(self):
+ return self._delta.__nonzero__()
+
+ def __str__(self):
+ hours = self._delta.days * 24 + self._delta.seconds / 3600
+ minutes = (self._delta.seconds % 3600) / 60
+ seconds = self._delta.seconds % 60
+
+ return "%.2d:%.2d:%.2d" % (hours, minutes, seconds)
+
+ @staticmethod
+ def fromstr(str):
+ if not str:
+ return Duration()
+
+ test = re.match('^([0-9]+)(?::([0-9]+)(?::([0-9]+))?)?$', str)
+ if test:
+ groups = test.groups()
+ try:
+ hours = minutes = seconds = 0
+ if groups[0]:
+ hours = int(groups[0])
+ if groups[1]:
+ minutes = int(groups[1])
+ if groups[2]:
+ seconds = int(groups[2])
+
+ return Duration(hours=hours, minutes=minutes, seconds=seconds)
+ except TypeError:
+ print groups
+ raise
+ else:
+ raise ValueError("Malformed duration string: " + str)
+
+ def as_seconds(self):
+ return self._delta.days * 24 * 3600 + self._delta.seconds
+
+def normalize_field(args, default_value=None):
+ """Normalize field constructor arguments, so that the field is marked blank=True
+ and has a default value by default.
+
+ This behaviour can be disabled by passing the special argument required=True.
+
+ The default value can also be overriden with the default=value argument.
+ """
+ required = False
+ if args.has_key('required'):
+ required = args['required']
+ args.pop('required')
+
+ args['blank'] = not required
+
+ if not required:
+ if not args.has_key('default'):
+ if args.get('null'):
+ args['default'] = None
+ elif default_value is not None:
+ args['default'] = default_value
+
+ return args
+
+# The following is based on Django TimeField
+class DurationField(models.Field):
+ """Duration Django model field. Essentially the same as a TimeField, but
+ with values over 24h allowed.
+
+ The constructor arguments are also normalized with normalize_field().
+ """
+
+ description = _("Duration")
+
+ __metaclass__ = models.SubfieldBase
+
+ default_error_messages = {
+ 'invalid': _('Enter a valid duration in HH:MM[:ss] format.'),
+ }
+
+ def __init__(self, *args, **kwargs):
+ super(DurationField, self).__init__(*args, **normalize_field(kwargs, '00:00'))
+
+ def db_type(self):
+ return 'int'
+
+ def to_python(self, value):
+ if value is None:
+ return None
+ if isinstance(value, int) or isinstance(value, long):
+ return Duration(seconds=value)
+ if isinstance(value, datetime.time):
+ return Duration(hours=value.hour, minutes=value.minute, seconds=value.second)
+ if isinstance(value, datetime.datetime):
+ # Not usually a good idea to pass in a datetime here (it loses
+ # information), but this can be a side-effect of interacting with a
+ # database backend (e.g. Oracle), so we'll be accommodating.
+ return self.to_python(value.time())
+
+ try:
+ return Duration.fromstr(value)
+ except ValueError:
+ raise exceptions.ValidationError(self.error_messages['invalid'])
+
+ def get_prep_value(self, value):
+ return self.to_python(value)
+
+ def get_db_prep_value(self, value, connection=None, prepared=False):
+ # Casts times into the format expected by the backend
+ return value.as_seconds()
+
+ def value_to_string(self, obj):
+ val = self._get_val_from_obj(obj)
+ if val is None:
+ data = ''
+ else:
+ data = unicode(val)
+ return data
+
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.TimeField}
+ defaults.update(kwargs)
+ return super(DurationField, self).formfield(**defaults)
+
+class ForeignKey(models.ForeignKey):
+ """The constructor arguments of this ForeignKey are normalized
+ with normalize_field(), however the field is marked required by default
+ unless it is allowed to be null."""
+
+ def __init__(self, to, **kwargs):
+ if not kwargs.has_key('required'):
+ if not kwargs.get('null'):
+ kwargs['required'] = True
+
+ super(ForeignKey, self).__init__(to, **normalize_field(kwargs, 0))
+
+class WeakForeignKey(ForeignKey):
+ """A weak foreign key is the same as foreign key but without cascading
+ delete. Instead the reference is set to null when the referenced record
+ get deleted. This emulates the ON DELETE SET NULL sql behaviour.
+
+ This field is automatically allowed to be null, there's no need to pass
+ null=True.
+
+ The constructor arguments are normalized with normalize_field() by the
+ parent ForeignKey
+
+ Warning: must be used in conjunction with EnhancedQuerySet, EnhancedManager,
+ and EnhancedModel
+ """
+ def __init__(self, to, **kwargs):
+ kwargs['null'] = True
+ super(WeakForeignKey, self).__init__(to, **kwargs)
+
+class EnhancedQuerySet(models.query.QuerySet):
+ """QuerySet with added functionalities such as WeakForeignKey handling"""
+
+ def delete(self):
+ CHUNK=1024
+ objects = self.model._meta.get_all_related_objects()
+ ii = self.count()
+ for related in objects:
+ i = 0
+ while i < ii:
+ ids = [v[0] for v in self[i:i + CHUNK].values_list('pk')]
+ filter = {related.field.name + '__pk__in': ids}
+ q = related.model.objects.filter(**filter)
+ if isinstance(related.field, WeakForeignKey):
+ update = {related.field.name: None}
+ q.update(**update)
+ else:
+ q.delete()
+
+ i += CHUNK
+
+ super(EnhancedQuerySet, self).delete()
+
+class EnhancedManager(models.Manager):
+ """Manager which is bound to EnhancedQuerySet"""
+ def get_query_set(self):
+ return EnhancedQuerySet(self.model)
+
+
+class EnhancedModel(models.Model):
+ """Base model class with added functionality. See EnhancedQuerySet"""
+
+ objects = EnhancedManager()
+
+ def delete(self):
+ if not self.pk:
+ raise Exception("Can't delete without a primary key")
+ self.__class__.objects.filter(pk=self.pk).delete()
+
+ class Meta:
+ abstract = True
+
+class CharField(models.CharField):
+ """This is a CharField with a default max_length of 250.
+
+ The arguments are also normalized with normalize_field()"""
+
+ def __init__(self, *args, **kwargs):
+ if not kwargs.has_key('max_length'):
+ kwargs['max_length'] = 250
+
+ super(CharField, self).__init__(*args, **normalize_field(kwargs, ''))
+
+class IntegerField(models.IntegerField):
+ """IntegerField normalized with normalize_field()"""
+
+ def __init__(self, *args, **kwargs):
+ super(IntegerField, self).__init__(*args, **normalize_field(kwargs, 0))
+
+class BooleanField(models.BooleanField):
+ """BooleanField normalized with normalize_field()"""
+
+ def __init__(self, *args, **kwargs):
+ super(BooleanField, self).__init__(*args, **normalize_field(kwargs, False))
+
+class TextField(models.TextField):
+ """TextField normalized with normalize_field()"""
+
+ def __init__(self, *args, **kwargs):
+ super(TextField, self).__init__(*args, **normalize_field(kwargs, ''))
+
+class DateTimeField(models.DateTimeField):
+ """DateTimeField normalized with normalize_field(). This field is allowed to
+ be null by default unless null=False is passed"""
+
+ def __init__(self, *args, **kwargs):
+ if not kwargs.has_key('null'):
+ kwargs['null'] = True
+ super(DateTimeField, self).__init__(*args, **normalize_field(kwargs))
+
+class FileField(models.FileField):
+ """FileField normalized with normalize_field()"""
+
+ def __init__(self, *args, **kwargs):
+ super(FileField, self).__init__(*args, **normalize_field(kwargs, ''))
+
+class FloatField(models.FloatField):
+ """FloatField normalized with normalize_field()"""
+
+ def __init__(self, *args, **kwargs):
+ super(FloatField, self).__init__(*args, **normalize_field(kwargs, 0))
+
+class DateField(models.DateField):
+ """DateField normalized with normalize_field(). This field is allowed to
+ be null by default unless null=False is passed"""
+
+ def __init__(self, *args, **kwargs):
+ if not kwargs.has_key('null'):
+ kwargs['null'] = True
+ super(DateField, self).__init__(*args, **normalize_field(kwargs))
+
+class RequiredFieldError(Exception):
+ def __init__(self, model, field):
+ self.model = model
+ self.field = field
+ super(Exception, self).__init__('%s.%s is required' % (model._meta.object_name, field.name))
+
+class ModelCore(EnhancedModel):
+
+ @classmethod
+ def required_fields(cls):
+ required = []
+ for field in cls._meta.fields:
+ if not field.blank:
+ required.append(field)
+ return required
+
+ def save(self, force_insert=False, force_update=False):
+ required = self.required_fields()
+ for field in required:
+ if not getattr(self, field.name):
+ raise RequiredFieldError(self, field)
+ super(ModelCore, self).save(force_insert, force_update)
+
+ @classmethod
+ def get_dom_name(cls):
+ "Convert the class name to a DOM element name"
+ clsname = cls.__name__
+ return clsname[0].lower() + clsname[1:]
+
+ @staticmethod
+ def get_dom_field_name(field_name):
+ "Convert the class name to a DOM element name"
+ tokens = field_name.split('_')
+ name = tokens[0]
+ for t in tokens[1:]:
+ name += t[0].upper() + t[1:]
+ return name
+
+ def to_dom(self):
+ "Return the DOM representation of this media object"
+ impl = getDOMImplementation()
+ root = self.get_dom_name()
+ doc = impl.createDocument(None, root, None)
+ top = doc.documentElement
+ top.setAttribute("id", str(self.pk))
+ fields = self.to_dict()
+ for name, value in fields.iteritems():
+ element = doc.createElement(self.get_dom_field_name(name))
+ if isinstance(value, EnhancedModel):
+ element.setAttribute('key', str(value.pk))
+ value = unicode(value)
+ element.appendChild(doc.createTextNode(value))
+ top.appendChild(element)
+ return doc
+
+ def to_dict(self):
+ "Return model fields as a dict of name/value pairs"
+ fields_dict = {}
+ for field in self._meta.fields:
+ fields_dict[field.name] = getattr(self, field.name)
+ return fields_dict
+
+ def to_list(self):
+ "Return model fields as a list"
+ fields_list = []
+ for field in self._meta.fields:
+ fields_list.append({'name': field.name, 'value': getattr(self, field.name)})
+ return fields_list
+
+ @classmethod
+ def field_label(cls, field_name=None):
+ if field_name:
+ try:
+ return cls._meta.get_field(field_name).verbose_name
+ except FieldDoesNotExist:
+ try:
+ return getattr(cls, field_name).verbose_name
+ except AttributeError:
+ return field_name
+ else:
+ return cls._meta.verbose_name
+
+ class Meta:
+ abstract = True
+
+class MetaCore:
+ app_label = 'telemeta'
+
+def word_search_q(field, pattern):
+ words = re.split("[ .*-]+", pattern)
+ q = Q()
+ for w in words:
+ if len(w) >= 3:
+ kwargs = {field + '__icontains': w}
+ q &= Q(**kwargs)
+
+ return q
+
+class CoreQuerySet(EnhancedQuerySet):
+ "Base class for all query sets"
+
+ def none(self): # redundant with none() in recent Django svn
+ "Return an empty result set"
+ return self.extra(where = ["0 = 1"])
+
+ def word_search(self, field, pattern):
+ return self.filter(word_search_q(field, pattern))
+
+ def _by_change_time(self, type, from_time = None, until_time = None):
+ "Search between two revision dates"
+ table = self.model._meta.db_table
+ where = []
+ if from_time:
+ where.append("revisions.time >= '%s'" % from_time.strftime('%Y-%m-%d %H:%M:%S'))
+ if until_time:
+ where.append("revisions.time <= '%s'" % until_time.strftime('%Y-%m-%d %H:%M:%S'))
+
+ qs = self
+ if where:
+ where.extend(["revisions.element_type = '%s'" % type, "revisions.element_id = %s.id" % table])
+ qs = qs.extra(where = [" AND ".join(where)],
+ tables = ['revisions']).distinct()
+ return qs
+
+class CoreManager(EnhancedManager):
+ "Base class for all models managers"
+
+ def none(self, *args, **kwargs):
+ ""
+ return self.get_query_set().none(*args, **kwargs)
+
+ def get(self, **kwargs):
+ if kwargs.has_key('public_id'):
+ try:
+ args = kwargs.copy()
+ args['code'] = kwargs['public_id']
+ args.pop('public_id')
+ return super(CoreManager, self).get(**args)
+ except ObjectDoesNotExist:
+ args = kwargs.copy()
+ args['id'] = kwargs['public_id']
+ args.pop('public_id')
+ return super(CoreManager, self).get(**args)
+
+ return super(CoreManager, self).get(**kwargs)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Author: Olivier Guilyardi <olivier@samalyse.com>
+
+from telemeta.models.core import Duration
+from telemeta.models.media import MediaItem, MediaCollection
+from django.conf import settings
+
+class Resource(object):
+ "Represent a Dublin Core resource"
+
+ def __init__(self, *args):
+ self.elements = []
+ self.add(*args)
+
+ def flatten(self):
+ """Convert the resource to a dictionary with element names as keys.
+
+ Warnings:
+ - refinements are lost during this conversion,
+ - if there are several occurences of the same element, only the first is
+ used, others are lost.
+ - all values are converted to strings
+ """
+ result = {}
+ for element in self.elements:
+ if not result.has_key(element.name):
+ result[element.name] = unicode(element.value)
+ return result
+
+ def to_list(self):
+ """Convert the resource to unqualified dublin core, as a list of the form:
+ [(key, value), ...]"""
+ result = []
+ for element in self.elements:
+ result.append((element.name, unicode(element.value)))
+ return result
+
+ def add(self, *elements):
+ for e in elements:
+ if isinstance(e, Element):
+ if not e in self.elements:
+ self.elements.append(e)
+ else:
+ try:
+ iter(e)
+ except TypeError:
+ raise Exception("add() only accepts elements or sequences of elements")
+
+ self.add(*e)
+
+ def __unicode__(self):
+ dump = u''
+ for e in self.elements:
+ key = unicode(e.name)
+ if e.refinement:
+ key += u'.' + unicode(e.refinement)
+ dump += u'%s:\t%s\n' % (key, unicode(e.value))
+ return dump
+
+
+class Element(object):
+ "Represent a Dublin Core element"
+
+ def __init__(self, name, value=None, refinement=None, related=None):
+ self.name = name
+ self.value = value
+ self.refinement = refinement
+ self.related = related
+
+ def __eq__(self, other):
+ return self.name == other.name and self.value == other.value and self.refinement == self.refinement
+
+ def __ne__(self, other):
+ return not (self == other)
+
+ @staticmethod
+ def multiple(name, values, refinement=None):
+ elements = []
+ if values:
+ for v in values:
+ elements.append(Element(name, v, refinement))
+ return elements
+
+class Date(Element):
+ "Dublin Core date element formatted according to W3C-DTF or DCMI Period"
+
+ def __init__(self, start, end=None, refinement=None):
+ value = ''
+ if start:
+ value = str(start)
+ if end and start != end:
+ value = 'start=' + value + '; end=' + unicode(end) + ';'
+ super(Date, self).__init__('date', value, refinement)
+
+def media_access_rights(media):
+ if media.public_access == 'full':
+ return 'public'
+ if media.public_access == 'metadata':
+ return 'restricted'
+ return 'private'
+
+def media_identifier(media):
+ if media.code:
+ return media.element_type + ':' + media.code
+ elif media.old_code:
+ return media.element_type + ':' + media.old_code
+ return None
+
+def express_collection(collection):
+ "Express a collection as a Dublin Core resource"
+
+ if collection.collector:
+ creator = (Element('creator', collection.collector),
+ Element('contributor', collection.creator))
+ else:
+ creator = Element('creator', collection.creator)
+
+ duration = max(collection.approx_duration, collection.computed_duration())
+ parts = []
+ for item in collection.items.all():
+ id = media_identifier(item)
+ if id:
+ parts.append(Element('relation', id, 'hasPart', item))
+
+ resource = Resource(
+ Element('identifier', media_identifier(collection), related=collection),
+ Element('type', 'Collection'),
+ Element('title', collection.title),
+ Element('title', collection.alt_title),
+ creator,
+ Element('contributor', collection.metadata_author),
+ Element.multiple('subject', settings.TELEMETA_SUBJECTS),
+ Element('publisher', collection.publisher),
+ Element('publisher', settings.TELEMETA_ORGANIZATION),
+ Date(collection.recorded_from_year, collection.recorded_to_year, 'created'),
+ Date(collection.year_published, refinement='issued'),
+ Element('rights', collection.legal_rights, 'license'),
+ Element('rights', media_access_rights(collection), 'accessRights'),
+ Element('format', duration, 'extent'),
+ Element('format', collection.physical_format, 'medium'),
+ #FIXME: audio mime types are missing,
+ parts
+ )
+
+ return resource
+
+def express_item(item):
+ "Express a media item as a Dublin Core resource"
+
+ if item.collector:
+ creator = (Element('creator', item.collector),
+ Element('contributor', item.collection.creator))
+ elif item.collection.collector:
+ creator = (Element('creator', item.collection.collector),
+ Element('contributor', item.collection.creator))
+ else:
+ creator = Element('creator', item.collection.creator)
+
+ if item.recorded_from_date:
+ date = Date(item.recorded_from_date, item.recorded_to_date, 'created')
+ else:
+ date = Date(item.collection.recorded_from_year, item.collection.recorded_to_year, 'created'),
+
+ if item.title:
+ title = item.title
+ else:
+ title = item.collection.title
+ if item.track:
+ title += u' - ' + item.track
+
+ resource = Resource(
+ Element('identifier', media_identifier(item), related=item),
+ Element('type', 'Sound'),
+ Element('title', title),
+ Element('title', item.alt_title),
+ creator,
+ Element('contributor', item.collection.metadata_author),
+ Element.multiple('subject', settings.TELEMETA_SUBJECTS),
+ Element.multiple('subject', item.keywords()),
+ Element('description', item.context_comment, 'abstract'),
+ Element('publisher', item.collection.publisher),
+ Element('publisher', settings.TELEMETA_ORGANIZATION),
+ date,
+ Date(item.collection.year_published, refinement='issued'),
+ Element.multiple('coverage', item.location and item.location.fullnames(), 'spatial'),
+ Element('coverage', item.location_comment, 'spatial'),
+ Element('rights', item.collection.legal_rights, 'license'),
+ Element('rights', media_access_rights(item.collection), 'accessRights'),
+
+ Element('format', max(item.approx_duration, item.computed_duration()), 'extent'),
+ Element('format', item.collection.physical_format, 'medium'),
+ #FIXME: audio mime types are missing,
+ Element('relation', media_identifier(item.collection), 'isPartOf', item.collection)
+ )
+
+ return resource
+
+def express_resource(res):
+ if isinstance(res, MediaItem):
+ return express_item(res)
+ elif isinstance(res, MediaCollection):
+ return express_collection(res)
+
+ raise Exception("Invalid resource type")
+
+def lookup_resource(media_id):
+ try:
+ type, code = media_id.split(':', 1)
+ except ValueError:
+ raise MalformedMediaIdentifier("Media identifier must be in type:code format")
+
+ if (type == 'collection'):
+ try:
+ return MediaCollection.objects.get(code=code)
+ except MediaCollection.DoesNotExist:
+ return None
+ elif (type == 'item'):
+ try:
+ return MediaItem.objects.get(code=code)
+ except MediaItem.DoesNotExist:
+ try:
+ return MediaItem.objects.get(old_code=code)
+ except MediaItem.DoesNotExist:
+ return None
+ else:
+ raise MalformedMediaIdentifier("No such type in media identifier: " + type)
+
+class MalformedMediaIdentifier(Exception):
+ pass
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2010 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+# David LIPSZYC <davidlipszyc@gmail.com>
+
+from telemeta.models.core import *
+from django.utils.translation import ugettext_lazy as _
+
+class Enumeration(ModelCore):
+ "Abstract enumerations base class"
+ value = CharField(_('value'), required=True, unique=True)
+
+ def __unicode__(self):
+ return self.value
+
+ class Meta(MetaCore):
+ abstract = True
+
+class MetaEnumeration(MetaCore):
+ ordering = ['value']
+
+class PhysicalFormat(Enumeration):
+ "Collection physical format"
+
+ class Meta(MetaEnumeration):
+ db_table = 'physical_formats'
+ verbose_name = _("archive format")
+
+class PublishingStatus(Enumeration):
+ "Collection publishing status"
+
+ class Meta(MetaEnumeration):
+ db_table = 'publishing_status'
+ verbose_name = _("secondary edition")
+
+class AcquisitionMode(Enumeration):
+ "Mode of acquisition of the collection"
+
+ class Meta(MetaEnumeration):
+ db_table = 'acquisition_modes'
+ verbose_name = _("mode of acquisition")
+
+class MetadataAuthor(Enumeration):
+ "Collection metadata author"
+
+ class Meta(MetaEnumeration):
+ db_table = 'metadata_authors'
+ verbose_name = _("record author")
+
+class MetadataWriter(Enumeration):
+ "Collection metadata writer"
+
+ class Meta(MetaEnumeration):
+ db_table = 'metadata_writers'
+ verbose_name = _("record writer")
+
+class LegalRight(Enumeration):
+ "Collection legal rights"
+
+ class Meta(MetaEnumeration):
+ db_table = 'legal_rights'
+ verbose_name = _("legal rights")
+
+class RecordingContext(Enumeration):
+ "Collection recording context"
+
+ class Meta(MetaEnumeration):
+ db_table = 'recording_contexts'
+ verbose_name = _("recording context")
+
+class AdConversion(Enumeration):
+ "Collection digital to analog conversion status"
+
+ class Meta(MetaEnumeration):
+ db_table = 'ad_conversions'
+ verbose_name = _("A/D conversion")
+
+class VernacularStyle(Enumeration):
+ "Item vernacular style"
+
+ class Meta(MetaEnumeration):
+ db_table = 'vernacular_styles'
+ verbose_name = _("vernacular style")
+
+class GenericStyle(Enumeration):
+ "Item generic style"
+
+ class Meta(MetaEnumeration):
+ db_table = 'generic_styles'
+ verbose_name = _("generic style")
+
+class ContextKeyword(Enumeration):
+ "Keyword"
+
+ class Meta(MetaEnumeration):
+ db_table = 'context_keywords'
+ verbose_name = _("keyword")
+
+class Publisher(Enumeration):
+ "Collection publisher"
+
+ class Meta(MetaEnumeration):
+ db_table = 'publishers'
+ verbose_name = _("publisher / status")
+
+class PublisherCollection(ModelCore):
+ "Collection which belongs to publisher"
+ publisher = ForeignKey('Publisher', related_name="publisher_collections", verbose_name=_('publisher'))
+ value = CharField(_('value'), required=True)
+
+ def __unicode__(self):
+ return self.value
+
+ class Meta(MetaCore):
+ db_table = 'publisher_collections'
+
+class EthnicGroup(Enumeration):
+ "Item ethnic group"
+
+ class Meta(MetaEnumeration):
+ db_table = 'ethnic_groups'
+ verbose_name = _('population / social group')
+
+class EthnicGroupAlias(ModelCore):
+ "Item ethnic group other name"
+ ethnic_group = ForeignKey('EthnicGroup', related_name="aliases", verbose_name=_('population / social group'))
+ value = CharField(_('name'), required=True)
+
+ class Meta(MetaCore):
+ db_table = 'ethnic_group_aliases'
+ unique_together = (('ethnic_group', 'value'),)
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2010 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+# David LIPSZYC <davidlipszyc@gmail.com>
+
+from telemeta.models.core import *
+from django.utils.translation import ugettext_lazy as _
+
+class Instrument(ModelCore):
+ "Instrument used in the item"
+ name = CharField(_('name'), required=True)
+
+ class Meta(MetaCore):
+ db_table = 'instruments'
+
+ def __unicode__(self):
+ return self.name
+
+class InstrumentAlias(ModelCore):
+ "Instrument other name"
+ name = CharField(_('name'), required=True)
+
+ class Meta(MetaCore):
+ db_table = 'instrument_aliases'
+
+ def __unicode__(self):
+ return self.name
+
+class InstrumentRelation(ModelCore):
+ "Instrument family"
+ instrument = ForeignKey('Instrument', related_name="parent_relation",
+ verbose_name=_('instrument'))
+ parent_instrument = ForeignKey('Instrument', related_name="child_relation",
+ verbose_name=_('parent instrument'))
+
+ class Meta(MetaCore):
+ db_table = 'instrument_relations'
+ unique_together = (('instrument', 'parent_instrument'),)
+
+class InstrumentAliasRelation(ModelCore):
+ "Instrument family other name"
+ alias = ForeignKey('InstrumentAlias', related_name="other_name",
+ verbose_name=_('alias'))
+ instrument = ForeignKey('InstrumentAlias', related_name="relation",
+ verbose_name=_('instrument'))
+
+ class Meta(MetaCore):
+ db_table = 'instrument_alias_relations'
+ unique_together = (('alias', 'instrument'),)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+# David LIPSZYC <davidlipszyc@gmail.com>
+
+from telemeta.models.core import *
+from telemeta.util.unaccent import unaccent
+import re
+from django.db.models import Q
+from django.utils.translation import ugettext_lazy as _
+from telemeta.models import query
+
+class Location(ModelCore):
+ "Locations"
+ OTHER_TYPE = 0
+ CONTINENT = 1
+ COUNTRY = 2
+ TYPE_CHOICES = ((COUNTRY, _('country')), (CONTINENT, _('continent')), (OTHER_TYPE, _('other')))
+
+ name = CharField(_('name'), unique=True, max_length=150, required=True)
+ type = IntegerField(_('type'), choices=TYPE_CHOICES, default=OTHER_TYPE, db_index=True)
+ complete_type = ForeignKey('LocationType', related_name="locations", verbose_name=_('complete type'))
+ current_location = WeakForeignKey('self', related_name="past_names",
+ verbose_name=_('current location'))
+ latitude = FloatField(null=True)
+ longitude = FloatField(null=True)
+ is_authoritative = BooleanField(_('authoritative'))
+
+ objects = query.LocationManager()
+
+ def items(self):
+ from telemeta.models import MediaItem
+ return MediaItem.objects.by_location(self)
+
+ def collections(self):
+ from telemeta.models import MediaCollection
+ return MediaCollection.objects.by_location(self)
+
+ def ancestors(self, direct=False):
+ q = Q(descendant_relations__location=self)
+ if direct:
+ q &= Q(descendant_relations__is_direct=True)
+ return Location.objects.filter(q)
+
+ def descendants(self, direct=False):
+ q = Q(ancestor_relations__ancestor_location=self)
+ if direct:
+ q &= Q(ancestor_relations__is_direct=True)
+ return Location.objects.filter(q)
+
+ def apparented(self):
+ return Location.objects.filter(
+ Q(pk=self.id) |
+ Q(ancestor_relations__ancestor_location=self) |
+ Q(current_location=self.id)).distinct()
+
+ def add_child(self, other):
+ LocationRelation.objects.create(location=other, ancestor_location=self, is_direct=True)
+ for location in self.ancestors():
+ #FIXME: might raise Duplicate Entry
+ LocationRelation.objects.create(location=other, ancestor_location=location)
+
+ def add_parent(self, other):
+ LocationRelation.objects.create(location=self, ancestor_location=other, is_direct=True)
+ for location in self.descendants():
+ #FIXME: might raise Duplicate Entry
+ LocationRelation.objects.create(location=location, ancestor_location=other)
+
+ def countries(self):
+ if self.type == self.COUNTRY:
+ return Location.objects.filter(pk=self.id)
+ return self.ancestors().filter(type=self.COUNTRY)
+
+ def continents(self):
+ if self.type == self.CONTINENT:
+ return Location.objects.filter(pk=self.id)
+ return self.ancestors().filter(type=self.CONTINENT)
+
+ class Meta(MetaCore):
+ db_table = 'locations'
+ verbose_name = _('location')
+
+ def __unicode__(self):
+ return self.name
+
+ def flatname(self):
+ if self.type != self.COUNTRY and self.type != self.CONTINENT:
+ raise Exception("Flat names are only supported for countries and continents")
+
+ map = Location.objects.flatname_map()
+ for flatname in map:
+ if self.id == map[flatname]:
+ return flatname
+
+ return None
+
+ def paths(self):
+ #FIXME: need to handle multiple (polyhierarchical) paths
+ path = []
+ location = self
+ while location:
+ path.append(location)
+ try:
+ location = location.ancestors(direct=True)[0]
+ except IndexError:
+ location = None
+ return [path]
+
+ def fullnames(self):
+ names = []
+ for path in self.paths():
+ names.append(u', '.join([unicode(l) for l in path]))
+ return names
+
+class LocationType(ModelCore):
+ "Location types"
+ code = CharField(_('identifier'), max_length=64, unique=True, required=True)
+ name = CharField(_('name'), max_length=150, required=True)
+
+ class Meta(MetaCore):
+ db_table = 'location_types'
+
+class LocationAlias(ModelCore):
+ "Location aliases"
+ location = ForeignKey('Location', related_name="aliases", verbose_name=_('location'))
+ alias = CharField(_('alias'), max_length=150, required=True)
+ is_authoritative = BooleanField(_('authoritative'))
+
+ def __unicode__(self):
+ return self.alias
+
+ class Meta(MetaCore):
+ db_table = 'location_aliases'
+ unique_together = (('location', 'alias'),)
+
+class LocationRelation(ModelCore):
+ "Location relations"
+ location = ForeignKey('Location', related_name="ancestor_relations", verbose_name=_('location'))
+ ancestor_location = ForeignKey('Location', related_name="descendant_relations", verbose_name=_('ancestor location'))
+ is_direct = BooleanField(db_index=True)
+ is_authoritative = BooleanField(_('authoritative'))
+
+ class Meta(MetaCore):
+ db_table = 'location_relations'
+ unique_together = ('location', 'ancestor_location')
+
+ def __unicode__(self):
+ sep = ' > '
+ if not self.is_direct:
+ sep = ' >..> '
+ return unicode(self.ancestor_location) + sep + unicode(self.location)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2010 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+# David LIPSZYC <davidlipszyc@gmail.com>
+
+from django.utils.translation import ugettext_lazy as _
+from telemeta.models.core import *
+from telemeta.models.enum import ContextKeyword
+from telemeta.util.unaccent import unaccent_icmp
+import re
+from telemeta.models.location import LocationRelation, Location
+from telemeta.models.system import Revision
+from telemeta.models import query
+
+class MediaResource(ModelCore):
+ "Base class of all media objects"
+
+ def public_access_label(self):
+ if self.public_access == 'metadata':
+ return _('Metadata only')
+ elif self.public_access == 'full':
+ return _('Sound and metadata')
+
+ return _('Private data')
+ public_access_label.verbose_name = _('public access')
+
+ def save_with_revision(self, user, force_insert=False, force_update=False):
+ "Save a media object and add a revision"
+ self.save(force_insert, force_update)
+ Revision.touch(self, user)
+
+ def get_revision(self):
+ return Revision.objects.filter(element_type=self.element_type, element_id=self.id).order_by('-time')[0]
+
+ class Meta:
+ abstract = True
+
+class MediaCollection(MediaResource):
+ "Describe a collection of items"
+ element_type = 'collection'
+ PUBLIC_ACCESS_CHOICES = (('none', 'none'), ('metadata', 'metadata'), ('full', 'full'))
+
+ published_code_regex = 'CNRSMH_E_[0-9]{4}(?:_[0-9]{3}){2}'
+ unpublished_code_regex = 'CNRSMH_I_[0-9]{4}_[0-9]{3}'
+ code_regex = '(?:%s|%s)' % (published_code_regex, unpublished_code_regex)
+
+ reference = CharField(_('reference'), unique=True, null=True)
+ physical_format = WeakForeignKey('PhysicalFormat', related_name="collections",
+ verbose_name=_('archive format'))
+ old_code = CharField(_('old code'), unique=True, null=True)
+ code = CharField(_('code'), unique=True, required=True)
+ title = CharField(_('title'), required=True)
+ alt_title = CharField(_('original title / translation'))
+ physical_items_num = IntegerField(_('number of components (medium / piece)'))
+ publishing_status = WeakForeignKey('PublishingStatus', related_name="collections",
+ verbose_name=_('secondary edition'))
+ creator = CharField(_('depositor / contributor'))
+ booklet_author = CharField(_('author of published notice'))
+ booklet_description = TextField(_('related documentation'))
+ collector = CharField(_('recordist'))
+ collector_is_creator = BooleanField(_('recordist identical to depositor'))
+ publisher = WeakForeignKey('Publisher', related_name="collections",
+ verbose_name=_('publisher / status'))
+ is_published = BooleanField(_('published'))
+ year_published = IntegerField(_('year published'))
+ publisher_collection = WeakForeignKey('PublisherCollection', related_name="collections",
+ verbose_name=_('publisher collection'))
+ publisher_serial = CharField(_('publisher serial number'))
+ external_references = TextField(_('bibliographic references'))
+ acquisition_mode = WeakForeignKey('AcquisitionMode', related_name="collections",
+ verbose_name=_('mode of acquisition'))
+ comment = TextField(_('comment'))
+ metadata_author = WeakForeignKey('MetadataAuthor', related_name="collections",
+ verbose_name=_('record author'))
+ metadata_writer = WeakForeignKey('MetadataWriter', related_name="collections",
+ verbose_name=_('record writer'))
+ legal_rights = WeakForeignKey('LegalRight', related_name="collections",
+ verbose_name=_('legal rights'))
+ alt_ids = CharField(_('copies'))
+ recorded_from_year = IntegerField(_('recording year (from)'))
+ recorded_to_year = IntegerField(_('recording year (until)'))
+ recording_context = WeakForeignKey('RecordingContext', related_name="collections",
+ verbose_name=_('recording context'))
+ approx_duration = DurationField(_('approximative duration'))
+ doctype_code = IntegerField(_('document type'))
+ travail = CharField(_('archiver notes'))
+ state = TextField(_('status'))
+ cnrs_contributor = CharField(_('CNRS depositor'))
+ items_done = CharField(_('items finished'))
+ a_informer_07_03 = CharField(_('a_informer_07_03'))
+ ad_conversion = WeakForeignKey('AdConversion', related_name='collections',
+ verbose_name=_('digitization'))
+ public_access = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES,
+ max_length=16, default="metadata")
+
+ objects = query.MediaCollectionManager()
+
+ def __unicode__(self):
+ if self.title:
+ return self.title
+
+ return self.code
+
+ @property
+ def public_id(self):
+ return self.code
+
+ def has_mediafile(self):
+ "Tell wether this collection has any media files attached to its items"
+ items = self.items.all()
+ for item in items:
+ if item.file:
+ return True
+ return False
+
+ def __name_cmp(self, obj1, obj2):
+ return unaccent_icmp(obj1.name, obj2.name)
+
+ def countries(self):
+ "Return the countries of the items"
+ countries = []
+ for item in self.items.filter(location__isnull=False):
+ for country in item.location.countries():
+ if not country in countries:
+ countries.append(country)
+
+ countries.sort(self.__name_cmp)
+
+ return countries
+ countries.verbose_name = _("states / nations")
+
+ def ethnic_groups(self):
+ "Return the ethnic groups of the items"
+ groups = []
+ items = self.items.all()
+ for item in items:
+ if item.ethnic_group and not item.ethnic_group in groups:
+ groups.append(item.ethnic_group)
+
+ cmp = lambda a, b: unaccent_icmp(a.value, b.value)
+ groups.sort(cmp)
+
+ return groups
+ ethnic_groups.verbose_name = _('populations / social groups')
+
+ def computed_duration(self):
+ duration = Duration()
+ for item in self.items.all():
+ duration += item.computed_duration()
+
+ return duration
+ computed_duration.verbose_name = _('computed duration')
+
+ def is_valid_code(self, code):
+ "Check if the collection code is well formed"
+ if self.is_published:
+ regex = '^' + self.published_code_regex + '$'
+ else:
+ regex = '^' + self.unpublished_code_regex + '$'
+
+ if re.match(regex, code):
+ return True
+
+ return False
+
+ def save(self, force_insert=False, force_update=False):
+ if not self.code:
+ raise RequiredFieldError(self, self._meta.get_field('code'))
+ if not self.is_valid_code(self.code):
+ raise MediaInvalidCodeError("%s is not a valid code for this collection" % self.code)
+ super(MediaCollection, self).save(force_insert, force_update)
+
+ class Meta(MetaCore):
+ db_table = 'media_collections'
+
+class MediaItem(MediaResource):
+ "Describe an item"
+ element_type = 'item'
+ PUBLIC_ACCESS_CHOICES = (('none', 'none'), ('metadata', 'metadata'), ('full', 'full'))
+
+ published_code_regex = MediaCollection.published_code_regex + '(?:_[0-9]{2}){1,2}'
+ unpublished_code_regex = MediaCollection.unpublished_code_regex + '_[0-9]{2,3}(?:_[0-9]{2}){0,2}'
+ code_regex = '(?:%s|%s)' % (published_code_regex, unpublished_code_regex)
+
+ collection = ForeignKey('MediaCollection', related_name="items",
+ verbose_name=_('collection'))
+ track = CharField(_('item number'))
+ old_code = CharField(_('old code'), unique=True, null=True)
+ code = CharField(_('code'), unique=True, null=True)
+ approx_duration = DurationField(_('approximative duration'))
+ recorded_from_date = DateField(_('recording date (from)'))
+ recorded_to_date = DateField(_('recording date (until)'))
+ location = WeakForeignKey('Location', verbose_name=_('location'))
+ location_comment = CharField(_('location details'))
+ ethnic_group = WeakForeignKey('EthnicGroup', related_name="items",
+ verbose_name=_('population / social group'))
+ title = CharField(_('title'))
+ alt_title = CharField(_('original title / translation'))
+ author = CharField(_('author / compositor'))
+ vernacular_style = WeakForeignKey('VernacularStyle', related_name="items",
+ verbose_name=_('vernacular style'))
+ context_comment = TextField(_('comments'))
+ external_references = TextField(_('published reference'))
+ moda_execut = CharField(_('moda_execut'))
+ copied_from_item = WeakForeignKey('self', related_name="copies", verbose_name=_('copy of'))
+ collector = CharField(_('recordist'))
+ collector_from_collection = BooleanField(_('recordist as in collection'))
+ cultural_area = CharField(_('cultural area'))
+ generic_style = WeakForeignKey('GenericStyle', related_name="items",
+ verbose_name=_('generic style'))
+ collector_selection = CharField(_('recordist selection'))
+ creator_reference = CharField(_('reference'))
+ comment = TextField(_('remarks'))
+ file = FileField(_('file'), upload_to='items/%Y/%m/%d', db_column="filename")
+ public_access = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES, max_length=16, default="metadata")
+
+ objects = query.MediaItemManager()
+
+ def keywords(self):
+ return ContextKeyword.objects.filter(item_relations__item = self)
+ keywords.verbose_name = _('keywords')
+
+ @property
+ def public_id(self):
+ if self.code:
+ return self.code
+ return self.id
+
+ class Meta(MetaCore):
+ db_table = 'media_items'
+
+ def is_valid_code(self, code):
+ "Check if the item code is well formed"
+ if not re.match('^' + self.collection.code, self.code):
+ return False
+
+ if self.collection.is_published:
+ regex = '^' + self.published_code_regex + '$'
+ else:
+ regex = '^' + self.unpublished_code_regex + '$'
+
+ if re.match(regex, code):
+ return True
+
+ return False
+
+ def save(self, force_insert=False, force_update=False):
+ if self.code and not self.is_valid_code(self.code):
+ raise MediaInvalidCodeError("%s is not a valid item code for collection %s"
+ % (self.code, self.collection.code))
+ super(MediaItem, self).save(force_insert, force_update)
+
+ def computed_duration(self):
+ "Tell the length in seconds of this item media data"
+ return self.approx_duration
+
+ computed_duration.verbose_name = _('computed duration')
+
+ def __unicode__(self):
+ if self.title and not re.match('^ *N *$', self.title):
+ title = self.title
+ else:
+ title = unicode(self.collection)
+
+ if self.track:
+ title += ' ' + self.track
+
+ return title
+
+class MediaItemKeyword(ModelCore):
+ "Item keyword"
+ item = ForeignKey('MediaItem', verbose_name=_('item'), related_name="keyword_relations")
+ keyword = ForeignKey('ContextKeyword', verbose_name=_('keyword'), related_name="item_relations")
+
+ class Meta(MetaCore):
+ db_table = 'media_item_keywords'
+ unique_together = (('item', 'keyword'),)
+
+class MediaItemPerformance(ModelCore):
+ "Item performance"
+ media_item = ForeignKey('MediaItem', related_name="performances",
+ verbose_name=_('item'))
+ instrument = WeakForeignKey('Instrument', related_name="performances",
+ verbose_name=_('composition'))
+ alias = WeakForeignKey('InstrumentAlias', related_name="performances",
+ verbose_name=_('vernacular name'))
+ instruments_num = CharField(_('number'))
+ musicians = CharField(_('interprets'))
+
+ class Meta(MetaCore):
+ db_table = 'media_item_performances'
+
+class MediaPart(MediaResource):
+ "Describe an item part"
+ element_type = 'part'
+ item = ForeignKey('MediaItem', related_name="parts", verbose_name=_('item'))
+ title = CharField(_('title'), required=True)
+ start = FloatField(_('start'), required=True)
+ end = FloatField(_('end'), required=True)
+
+ class Meta(MetaCore):
+ db_table = 'media_parts'
+
+ def __unicode__(self):
+ return self.title
+
+class Playlist(ModelCore):
+ "Item or collection playlist"
+ owner_username = ForeignKey('User', related_name="playlists", db_column="owner_username")
+ name = CharField(_('name'), required=True)
+
+ class Meta(MetaCore):
+ db_table = 'playlists'
+
+ def __unicode__(self):
+ return self.name
+
+class PlaylistResource(ModelCore):
+ "Playlist components"
+ RESOURCE_TYPE_CHOICES = (('item', 'item'), ('collection', 'collection'))
+
+ playlist = ForeignKey('Playlist', related_name="resources", verbose_name=_('playlist'))
+ resource_type = CharField(_('resource type'), choices=RESOURCE_TYPE_CHOICES, required=True)
+ resource = IntegerField(_('resource'), required=True)
+
+ class Meta(MetaCore):
+ db_table = 'playlist_resources'
+
+class MediaInvalidCodeError(Exception):
+ pass
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2010 Samalyse SARL
+#
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+#
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+#
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+#
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+#
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+# David LIPSZYC <davidlipszyc@gmail.com>
+
+from django.db.models import Q, Max, Min
+from telemeta.models.core import *
+from telemeta.util.unaccent import unaccent, unaccent_icmp
+from telemeta.models.enum import EthnicGroup
+import re
+
+class MediaItemQuerySet(CoreQuerySet):
+ "Base class for all media item query sets"
+
+ def quick_search(self, pattern):
+ "Perform a quick search on code, title and collector name"
+ pattern = pattern.strip()
+ return self.filter(
+ Q(code__contains=pattern.strip()) |
+ Q(old_code__contains=pattern.strip()) |
+ word_search_q('title', pattern) |
+ self.by_fuzzy_collector_q(pattern)
+ )
+
+ def without_collection(self):
+ "Find items which do not belong to any collection"
+ return self.extra(
+ where = ["collection_id NOT IN (SELECT id FROM media_collections)"]);
+
+ def by_recording_date(self, from_date, to_date = None):
+ "Find items by recording date"
+ if to_date is None:
+ return (self.filter(recorded_from_date__lte=from_date, recorded_to_date__gte=from_date))
+ else :
+ return (self.filter(Q(recorded_from_date__range=(from_date, to_date))
+ | Q(recorded_to_date__range=(from_date, to_date))))
+
+ def by_title(self, pattern):
+ "Find items by title"
+ # to (sort of) sync with models.media.MediaItem.get_title()
+ return self.filter(word_search_q("title", pattern) |
+ (Q(title="") & word_search_q("collection__title", pattern)))
+
+ def by_publish_year(self, from_year, to_year = None):
+ "Find items by publishing year"
+ if to_year is None:
+ to_year = from_year
+ return self.filter(collection__year_published__range=(from_year, to_year))
+
+ def by_change_time(self, from_time = None, until_time = None):
+ "Find items by last change time"
+ return self._by_change_time('item', from_time, until_time)
+
+ def by_location(self, location):
+ "Find items by location"
+ return self.filter(location__in=location.apparented())
+
+ @staticmethod
+ def __name_cmp(obj1, obj2):
+ return unaccent_icmp(obj1.name, obj2.name)
+
+ def locations(self):
+ from telemeta.models import Location, LocationRelation
+ l = self.values('location')
+ c = self.values('location__current_location')
+ r = LocationRelation.objects.filter(location__in=l).values('ancestor_location')
+ return Location.objects.filter(Q(pk__in=l) | Q(pk__in=r) | Q(pk__in=c))
+
+ def countries(self, group_by_continent=False):
+ countries = []
+ from telemeta.models import Location
+ for id in self.filter(location__isnull=False).values_list('location', flat=True).distinct():
+ location = Location.objects.get(pk=id)
+ for l in location.countries():
+ c = l.current_location
+ if not c in countries:
+ countries.append(c)
+
+ if group_by_continent:
+ grouped = {}
+
+ for country in countries:
+ for continent in country.continents():
+ if not grouped.has_key(continent):
+ grouped[continent] = []
+
+ grouped[continent].append(country)
+
+ keys = grouped.keys()
+ keys.sort(self.__name_cmp)
+ ordered = []
+ for c in keys:
+ grouped[c].sort(self.__name_cmp)
+ ordered.append({'continent': c, 'countries': grouped[c]})
+
+ countries = ordered
+ else:
+ countries.sort(self.__name_cmp)
+
+ return countries
+
+ def virtual(self, *args):
+ qs = self
+ need_collection = False
+ related = []
+ from telemeta.models import Location
+ for f in args:
+ if f == 'apparent_collector':
+ related.append('collection')
+ qs = qs.extra(select={f:
+ 'IF(collector_from_collection, '
+ 'IF(media_collections.collector_is_creator, '
+ 'media_collections.creator, '
+ 'media_collections.collector),'
+ 'media_items.collector)'})
+ elif f == 'country_or_continent':
+ related.append('location')
+ qs = qs.extra(select={f:
+ 'IF(locations.type = ' + str(Location.COUNTRY) + ' '
+ 'OR locations.type = ' + str(Location.CONTINENT) + ','
+ 'locations.name, '
+ '(SELECT l2.name FROM location_relations AS r INNER JOIN locations AS l2 '
+ 'ON r.ancestor_location_id = l2.id '
+ 'WHERE r.location_id = media_items.location_id AND l2.type = ' + str(Location.COUNTRY) + ' LIMIT 1))'
+ })
+ else:
+ raise Exception("Unsupported virtual field: %s" % f)
+
+ if related:
+ qs = qs.select_related(*related)
+
+ return qs
+
+ def ethnic_groups(self):
+ ids = self.filter(ethnic_group__isnull=False).values('ethnic_group');
+ return EthnicGroup.objects.filter(pk__in=ids)
+
+ @staticmethod
+ def by_fuzzy_collector_q(pattern):
+ return (word_search_q('collection__creator', pattern) |
+ word_search_q('collection__collector', pattern) |
+ word_search_q('collector', pattern))
+
+ def by_fuzzy_collector(self, pattern):
+ return self.filter(self.by_fuzzy_collector_q(pattern))
+
+class MediaItemManager(CoreManager):
+ "Manage media items queries"
+
+ def get_query_set(self):
+ "Return media query sets"
+ return MediaItemQuerySet(self.model)
+
+ def enriched(self):
+ "Query set with additional virtual fields such as apparent_collector and country_or_continent"
+ return self.get_query_set().virtual('apparent_collector', 'country_or_continent')
+
+ def quick_search(self, *args, **kwargs):
+ return self.get_query_set().quick_search(*args, **kwargs)
+ quick_search.__doc__ = MediaItemQuerySet.quick_search.__doc__
+
+ def without_collection(self, *args, **kwargs):
+ return self.get_query_set().without_collection(*args, **kwargs)
+ without_collection.__doc__ = MediaItemQuerySet.without_collection.__doc__
+
+ def by_recording_date(self, *args, **kwargs):
+ return self.get_query_set().by_recording_date(*args, **kwargs)
+ by_recording_date.__doc__ = MediaItemQuerySet.by_recording_date.__doc__
+
+ def by_title(self, *args, **kwargs):
+ return self.get_query_set().by_title(*args, **kwargs)
+ by_title.__doc__ = MediaItemQuerySet.by_title.__doc__
+
+ def by_publish_year(self, *args, **kwargs):
+ return self.get_query_set().by_publish_year(*args, **kwargs)
+ by_publish_year.__doc__ = MediaItemQuerySet.by_publish_year.__doc__
+
+ def by_change_time(self, *args, **kwargs):
+ return self.get_query_set().by_change_time(*args, **kwargs)
+ by_change_time.__doc__ = MediaItemQuerySet.by_change_time.__doc__
+
+ def by_location(self, *args, **kwargs):
+ return self.get_query_set().by_location(*args, **kwargs)
+ by_location.__doc__ = MediaItemQuerySet.by_location.__doc__
+
+class MediaCollectionQuerySet(CoreQuerySet):
+
+ def quick_search(self, pattern):
+ "Perform a quick search on code, title and collector name"
+ pattern = pattern.strip()
+ return self.filter(
+ Q(code__contains=pattern.strip()) |
+ Q(old_code__contains=pattern.strip()) |
+ word_search_q('title', pattern) |
+ self.by_fuzzy_collector_q(pattern)
+ )
+
+ def by_location(self, location):
+ "Find collections by location"
+ return self.filter(items__location__in=location.apparented()).distinct()
+
+ def by_recording_year(self, from_year, to_year=None):
+ "Find collections by recording year"
+ if to_year is None:
+ return (self.filter(recorded_from_year__lte=from_year, recorded_to_year__gte=from_year))
+ else:
+ return (self.filter(Q(recorded_from_year__range=(from_year, to_year)) |
+ Q(recorded_to_year__range=(from_year, to_year))))
+
+ def by_publish_year(self, from_year, to_year=None):
+ "Find collections by publishing year"
+ if to_year is None:
+ to_year = from_year
+ return self.filter(year_published__range=(from_year, to_year))
+
+ def by_ethnic_group(self, group):
+ "Find collections by ethnic group"
+ return self.filter(items__ethnic_group=group).distinct()
+
+ def by_change_time(self, from_time=None, until_time=None):
+ "Find collections between two dates"
+ return self._by_change_time('collection', from_time, until_time)
+
+ def virtual(self, *args):
+ qs = self
+ for f in args:
+ if f == 'apparent_collector':
+ qs = qs.extra(select={f: 'IF(media_collections.collector_is_creator, '
+ 'media_collections.creator, media_collections.collector)'})
+ else:
+ raise Exception("Unsupported virtual field: %s" % f)
+
+ return qs
+
+ def recording_year_range(self):
+ from_max = self.aggregate(Max('recorded_from_year'))['recorded_from_year__max']
+ to_max = self.aggregate(Max('recorded_to_year'))['recorded_to_year__max']
+ year_max = max(from_max, to_max)
+
+ from_min = self.filter(recorded_from_year__gt=0).aggregate(Min('recorded_from_year'))['recorded_from_year__min']
+ to_min = self.filter(recorded_to_year__gt=0).aggregate(Min('recorded_to_year'))['recorded_to_year__min']
+ year_min = min(from_min, to_min)
+
+ if not year_max:
+ year_max = year_min
+ elif not year_min:
+ year_min = year_max
+
+ return year_min, year_max
+
+ def publishing_year_range(self):
+ year_max = self.aggregate(Max('year_published'))['year_published__max']
+ year_min = self.filter(year_published__gt=0).aggregate(Min('year_published'))['year_published__min']
+
+ return year_min, year_max
+
+ @staticmethod
+ def by_fuzzy_collector_q(pattern):
+ return word_search_q('creator', pattern) | word_search_q('collector', pattern)
+
+ def by_fuzzy_collector(self, pattern):
+ return self.filter(self.by_fuzzy_collector_q(pattern))
+
+class MediaCollectionManager(CoreManager):
+ "Manage collection queries"
+
+ def get_query_set(self):
+ "Return the collection query"
+ return MediaCollectionQuerySet(self.model)
+
+ def enriched(self):
+ "Query set with additional virtual fields such as apparent_collector"
+ return self.get_query_set().virtual('apparent_collector')
+
+ def quick_search(self, *args, **kwargs):
+ return self.get_query_set().quick_search(*args, **kwargs)
+ quick_search.__doc__ = MediaCollectionQuerySet.quick_search.__doc__
+
+ def by_location(self, *args, **kwargs):
+ return self.get_query_set().by_location(*args, **kwargs)
+ by_location.__doc__ = MediaCollectionQuerySet.by_location.__doc__
+
+ def by_recording_year(self, *args, **kwargs):
+ return self.get_query_set().by_recording_year(*args, **kwargs)
+ by_recording_year.__doc__ = MediaCollectionQuerySet.by_recording_year.__doc__
+
+ def by_publish_year(self, *args, **kwargs):
+ return self.get_query_set().by_publish_year(*args, **kwargs)
+ by_publish_year.__doc__ = MediaCollectionQuerySet.by_publish_year.__doc__
+
+ def by_ethnic_group(self, *args, **kwargs):
+ return self.get_query_set().by_ethnic_group(*args, **kwargs)
+ by_ethnic_group.__doc__ = MediaCollectionQuerySet.by_ethnic_group.__doc__
+
+ def by_change_time(self, *args, **kwargs):
+ return self.get_query_set().by_change_time(*args, **kwargs)
+ by_change_time.__doc__ = MediaCollectionQuerySet.by_change_time.__doc__
+
+ @staticmethod
+ def __name_cmp(obj1, obj2):
+ return unaccent_icmp(obj1.name, obj2.name)
+
+class LocationQuerySet(CoreQuerySet):
+ __flatname_map = None
+
+ def by_flatname(self, flatname):
+ map = self.flatname_map()
+ return self.filter(pk=map[flatname])
+
+ def flatname_map(self):
+ if self.__class__.__flatname_map:
+ return self.__class__.__flatname_map
+
+ map = {}
+ locations = self.filter(Q(type=self.model.COUNTRY) | Q(type=self.model.CONTINENT))
+ for l in locations:
+ flatname = unaccent(l.name).lower()
+ flatname = re.sub('[^a-z]', '_', flatname)
+ while map.has_key(flatname):
+ flatname = '_' + flatname
+ map[flatname] = l.id
+
+ self.__class__.__flatname_map = map
+ return map
+
+ def current(self):
+ return self.filter(id__in=self.values_list('current_location_id', flat=True)).distinct()
+
+class LocationManager(CoreManager):
+
+ def get_query_set(self):
+ "Return location query set"
+ return LocationQuerySet(self.model)
+
+ def by_flatname(self, *args, **kwargs):
+ return self.get_query_set().by_flatname(*args, **kwargs)
+ by_flatname.__doc__ = LocationQuerySet.by_flatname.__doc__
+
+ def flatname_map(self, *args, **kwargs):
+ return self.get_query_set().flatname_map(*args, **kwargs)
+ flatname_map.__doc__ = LocationQuerySet.flatname_map.__doc__
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2010 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+# David LIPSZYC <davidlipszyc@gmail.com>
+
+from telemeta.models.core import *
+from django.core.exceptions import ObjectDoesNotExist
+from django.utils.translation import ugettext_lazy as _
+
+class User(ModelCore):
+ "Telemeta user"
+ LEVEL_CHOICES = (('user', 'user'), ('maintainer', 'maintainer'), ('admin', 'admin'))
+
+ username = CharField(_('username'), primary_key=True, max_length=64, required=True)
+ level = CharField(_('level'), choices=LEVEL_CHOICES, max_length=32, required=True)
+ first_name = CharField(_('first name'))
+ last_name = CharField(_('last name'))
+ phone = CharField(_('phone'))
+ email = CharField(_('email'))
+
+ class Meta(MetaCore):
+ db_table = 'users'
+
+ def __unicode__(self):
+ return self.username
+
+class Revision(ModelCore):
+ "Revision made by user"
+ ELEMENT_TYPE_CHOICES = (('collection', 'collection'), ('item', 'item'), ('part', 'part'))
+ CHANGE_TYPE_CHOICES = (('import', 'import'), ('create', 'create'), ('update', 'update'), ('delete','delete'))
+
+ element_type = CharField(_('element type'), choices=ELEMENT_TYPE_CHOICES, max_length=16, required=True)
+ element_id = IntegerField(_('element identifier'), required=True)
+ change_type = CharField(_('modification type'), choices=CHANGE_TYPE_CHOICES, max_length=16, required=True)
+ time = DateTimeField(_('time'), auto_now_add=True)
+ user = ForeignKey('User', db_column='username', related_name="revisions", verbose_name=_('user'))
+
+ @classmethod
+ def touch(cls, element, user):
+ "Create or update a revision"
+ revision = cls(element_type=element.element_type, element_id=element.pk,
+ user=user, change_type='create')
+ if element.pk:
+ try:
+ element.__class__.objects.get(pk=element.pk)
+ except ObjectDoesNotExist:
+ pass
+ else:
+ revision.change_type = 'update'
+
+ revision.save()
+ return revision
+
+ class Meta(MetaCore):
+ db_table = 'revisions'
+
--- /dev/null
+======================================================================================================
+Telemeta : a web frontend to backup, analyse, transcode and stream any audio content with its metadata
+======================================================================================================
+
+Telemeta is a web audio archiving program which introduces useful and secure methods to backup, index, transcode, analyse and publish any digitalized audio file with its metadata. It is dedicated to professionnals who wants to easily backup and publish documented sounds from collections of vinyls, magnetic tapes or audio CDs over a strong database, in accordance with open standards.
+
+Here are the main features of Telemeta:
+
+* Secure archiving, editing and publishing of audio files over internet.
+* User friendly web frontend including workflows and high level search methods
+* Smart dynamical and skinnable audio player (thanks to Timeside and soundmanager2)
+* "On the fly" analyzing, transcoding and metadata embedding based on an easy plugin architecture
+* Multi-format support : FLAC, OGG, MP3, WAV and more
+* GEO Navigator for audio geolocalization
+* DublinCore compatibility
+* OAI-PMH data provider
+* XML serialized backup
+* Strong SQL backend
+
+The Telemeta data model is based on 'collections' and 'items'. A collection is described by its metadata and includes original audio items (sounds) and its own metadata. This existing model has been designed to fit the one of the French Centre of Etnomusicology (CREM) but could be easily adapted/overrided to suit other data structures.
+
+
+
--- /dev/null
+{% extends "telemeta_default/admin.html" %}
--- /dev/null
+{% extends "telemeta_default/base.html" %}
--- /dev/null
+{% extends "telemeta_default/base_site.html" %}
--- /dev/null
+{% extends "telemeta_default/base_xspf.xml" %}
--- /dev/null
+{% extends "telemeta_default/collection.m3u" %}
--- /dev/null
+{% extends "telemeta_default/collection_detail.html" %}
--- /dev/null
+{% extends "telemeta_default/collection_detail_dc.html" %}
--- /dev/null
+{% extends "telemeta_default/collection_list.html" %}
--- /dev/null
+{% extends "telemeta_default/collection_xspf.xml" %}
--- /dev/null
+{% extends "telemeta_default/country_info.html" %}
+
--- /dev/null
+{% extends "telemeta_default/enumeration_edit.html" %}
--- /dev/null
+{% extends "telemeta_default/enumeration_edit_value.html" %}
--- /dev/null
+{% extends "telemeta_default/flatpage.html" %}
--- /dev/null
+{% extends "telemeta_default/geo_continents.html" %}
--- /dev/null
+{% extends "telemeta_default/geo_countries.html" %}
--- /dev/null
+{% extends "telemeta_default/geo_country_collections.html" %}
--- /dev/null
+{% extends "telemeta_default/geo_country_items.html" %}
--- /dev/null
+{% extends "telemeta_default/inc/collection_list.html" %}
--- /dev/null
+{% extends "telemeta_default/inc/dublincore.html" %}
+
--- /dev/null
+{% extends "telemeta_default/inc/mediaitem_list.html" %}
--- /dev/null
+{% extends "telemeta_default/index.html" %}
--- /dev/null
+{% extends "telemeta_default/login.html" %}
--- /dev/null
+{% extends "telemeta_default/mediaitem_detail.html" %}
--- /dev/null
+{% extends "telemeta_default/mediaitem_detail_dc.html" %}
--- /dev/null
+{% extends "telemeta_default/mediaitem_list.html" %}
--- /dev/null
+{% extends "telemeta_default/mediaitem_xspf.xml" %}
--- /dev/null
+{% extends "telemeta_default/search_criteria.html" %}
--- /dev/null
+{% extends "telemeta_default/search_results.html" %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+
+{% block stylesheets %}
+{{ block.super }}
+<link rel="stylesheet" type="text/css" href="{% url telemeta-css "admin.css" %}" />
+{% endblock %}
+
+{% block content %}
+<h3>Administration</h3>
+<div class="tabs">
+<ul>
+<li>Users</li>
+
+{% if enumerations %}
+ <li>Enumerations
+ <ul>
+ {% for enum in enumerations %}
+ {%ifequal enum.id enumeration_id %}
+ <li class="active">{{ enum.name|capfirst }}</li>
+ {%else%}
+ <li><a href="{% url telemeta-enumeration-edit enum.id %}">
+ {{ enum.name|capfirst }}</a></li>
+ {%endifequal%}
+ {% endfor %}
+ </ul>
+</li>
+{% endif %}
+</ul>
+</div>
+<div class="tabcontents">
+ {% block tabcontents %}
+ {% endblock %}
+</div>
+{% endblock %}
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
+<head>
+{% load i18n %}
+{% load telemeta_utils %}
+<title>{%block head_title %}{% organization %} - Telemeta{% endblock %}</title>
+{% block stylesheets %}
+<link rel="stylesheet" type="text/css" href="{% url telemeta-css "telemeta.css" %}" />
+<!--[if IE]>
+<link rel="stylesheet" type="text/css" href="{% url telemeta-css "telemeta_ie.css" %}" />
+<![endif]-->
+<!--[if lte IE 6]>
+<link rel="stylesheet"type="text/css" href="{% url telemeta-css "telemeta_ie6.css" %}" />
+<![endif]-->
+{% endblock %}
+<script src="{% url telemeta-js "jquery.js" %}" type="text/javascript"></script>
+<script src="{% url telemeta-js "application.js" %}" type="text/javascript"></script>
+{% block extra_javascript %}{% endblock %}
+</head>
+<body>
+<div id="layout">
+<div id="header">
+<div id="logo">
+{% block logo %}
+<a href="{% url telemeta-home %}"><img src="{% url telemeta-images "logo_telemeta_2.png" %}" alt="Telemeta" /></a>
+{% endblock %}
+</div>
+
+<div id="auth_info">
+{% if user.is_authenticated %}
+{% if user.first_name and user.last_name %}
+{{ user.first_name }} {{ user.last_name }}
+{% else %}
+{{ user.username }}
+{% endif %}
+|
+<a href="{% url telemeta-logout %}">{% trans "Sign out" %}</a>
+{% else %}
+<a href="{% url telemeta-login %}?next={{ request.path|urlencode }}">{% trans "Sign in" %}</a>
+{% endif %}
+</div>
+
+<div id="quick_search">
+<form action="{% url telemeta-search %}" method="GET">
+<input type="text" id="quick_search_pattern" name="pattern" />
+<input type="submit" value="{% trans 'Search' %}" />
+</form>
+<p><a href="{% url telemeta-search-criteria %}">{% trans "Advanced search" %}</a></p>
+</div>
+
+<div id="menu" class="nav">
+{% block menu %}
+<ul>
+{# spaces between li and a elements breaks layout #}
+<li><a href="/">Home</a></li><li><a href="{% url telemeta-collections %}">{% trans "Collections" %}</a></li><li><a href="{% url telemeta-items %}">{% trans "Items" %}</a></li><li {% if not user.is_authenticated %} class="last" {% endif %}><a href="{% url telemeta-geo-continents %}">{% trans "Geo Navigator" %}</a></li>{% if user.is_authenticated %}<li class="last"><a href="{% url telemeta-admin %}">{% trans "Admin" %}</a></li>{% endif %}
+</ul>
+{% endblock %}
+</div>
+</div>
+<div id="submenu">
+{% block submenu %}{% endblock %}
+</div>
+
+<div id="content">
+{% block content %}{% endblock %}
+<div class="nett"></div>
+</div>
+
+<div id="footer">
+{% block footer %}
+ <hr />
+ <a id="telemeta_powered" href="{% telemeta_url %}"><img src="{% url telemeta-images "logo_mini_2.png" %}" height="30" width="93"
+ alt="Telemeta Powered"/></a>
+ <p class="left">
+ {% trans "Powered by" %} <a href="{% telemeta_url %}"><strong>Telemeta {% telemeta_version %}</strong></a><br />
+ {% trans "By" %} <a href="http://www.parisson.com/">Parisson</a> & <a href="http://www.samalyse.com/">Samalyse</a>.
+ </p>
+
+ <p class="right">
+ {% trans "Visit the Telemeta open source project at" %}<br /><a href="{% telemeta_url %}">{% telemeta_url %}</a>
+ </p>
+{% endblock %}
+</div>
+</div>
+</body>
+</html>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<playlist version="1" xmlns="http://xspf.org/ns/0/">
+{% block listinfo %}{% endblock %}
+ <trackList>
+ {% block tracklist %}{% endblock %}
+ </trackList>
+</playlist>
+
+
--- /dev/null
+#EXTM3U{% load telemeta_utils %}{% for item in collection.items.all %}
+#EXTINF:{{ item.get_duration }},{{ item }}
+http://{{ host }}{% url telemeta-item-export item.public_id,"mp3" %}{% endfor %}
--- /dev/null
+{% extends "telemeta/base.html" %}\r
+{% load telemeta_utils %}\r
+{% load i18n %}\r
+\r
+{% block head_title %}{% trans "Collection" %}{{collection|prepend:': '}} - {{ block.super }}{% endblock %}\r
+\r
+{% block extra_javascript %}\r
+<script src="{% url telemeta-js "swfobject.js" %}" type="text/javascript"></script>\r
+{% endblock %}\r
+\r
+{% if collection %}\r
+\r
+{% block submenu %}\r
+ <div><a href="{% url telemeta-collection-dublincore collection.public_id %}">Dublin Core</a></div>\r
+{% endblock %}\r
+\r
+{% block content %}\r
+ <h3>Collection: {{ collection }}</h3>\r
+ <div class="{% if collection.has_mediafile %}with-rightcol{% endif %}">\r
+ {% if collection.has_mediafile %}\r
+ <div id="rightcol">\r
+ <div id="collection_player">\r
+ <p><b>Listen to this collection</b>\r
+ (<a href="{% url telemeta-collection-m3u collection.public_id %}">M3U</a>,\r
+ <a href="{% url telemeta-collection-xspf collection.public_id %}">XSPF</a>)</p>\r
+ <!-- This is Jeroen Wijering's Flash MP3 Player, \r
+ under CC Attribution-NonCommercial-ShareAlike 2.0 license\r
+ from: http://www.jeroenwijering.com/?item=Flash_MP3_Player-->\r
+ <p id="collection_player_c">\r
+ <a href="http://www.macromedia.com/go/getflashplayer">Get Flash</a> to see this player.\r
+ </p>\r
+ <script type="text/javascript">\r
+ var so = new SWFObject('{% url telemeta-swf "mp3player.swf" %}','playlist','362','200','7');\r
+ so.addVariable("file","{% url telemeta-collection-xspf collection.public_id %}");\r
+ so.addVariable("displayheight","0");\r
+ so.write('collection_player_c');\r
+ </script> \r
+ </div>\r
+ </div>\r
+ {% endif %}\r
+ <div class="intro">\r
+ <span>{% if collection.items.count %}{{ collection.items.count }} {% ifequal collection.items.count 1 %}item{% else %}items{% endifequal %}{% else %}No item{% endif %}</span>\r
+ </div>\r
+ <div class="infos">\r
+ {% block general_info %}\r
+ <dl class="listing">\r
+ {% dl_field collection "reference" %}\r
+ {% dl_field collection "title" %}\r
+ {% dl_field collection "alt_title" %}\r
+ {% dl_field collection "creator" %}\r
+ {% dl_field collection "recording_context" %}\r
+ {% if collection.recorded_from_year %}\r
+ <dt>{% trans "Recording year" %}</dt>\r
+ <dd>{{ collection.recorded_from_year|default:'' }} {{ collection.recorded_to_year|prepend:" - " }}</dd>\r
+ {% endif %}\r
+ {% dl_field collection "year_published" %}\r
+ </dl>\r
+ {% endblock general_info %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block geoethnic_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "Geographic and cultural informations" %}</a></h4>\r
+ <div>\r
+ <dl class="listing">\r
+ {% dl_field collection "countries" join with ", " %}\r
+ {% dl_field collection "ethnic_groups" join with ", " %}\r
+ </dl>\r
+ </div>\r
+ </div>\r
+ {% endblock geoethnic_data %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block legal_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "Legal mentions" %}</a></h4>\r
+ <div>\r
+ <dl class="listing">\r
+ {% if collection.collector_is_creator %}\r
+ {% if collection.creator %}\r
+ <dt>{% trans "Recordist" %}</dt><dd>{{ collection.creator }}</dd>\r
+ {% endif%}\r
+ {% else %}\r
+ {% dl_field collection "collector" %}\r
+ {% endif %}\r
+ {% dl_field collection "publisher" %}\r
+ {% dl_field collection "publisher_collection" %}\r
+ {% dl_field collection "publisher_serial" %}\r
+ {% dl_field collection "booklet_author" %}\r
+ {% dl_field collection "external_references" %}\r
+ {% dl_field collection "doctype_code" %}\r
+ {% dl_field collection "public_access_label" %}\r
+ {% dl_field collection "legal_rights" %}\r
+ </dl>\r
+ </div>\r
+ </div>\r
+ {% endblock legal_data %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block archive_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "Archiving data" %}</a></h4>\r
+ <div>\r
+ <dl class="listing">\r
+ {% dl_field collection "acquisition_mode" %}\r
+ {% dl_field collection "cnrs_contributor" %}\r
+ {% dl_field collection "metadata_author" %}\r
+ {% dl_field collection "booklet_description" %}\r
+ {% dl_field collection "publishing_status" %}\r
+ <!-- FIXME: alt_ids unsupported\r
+ {% dl_field collection "alt_ids" %}\r
+ -->\r
+ {% dl_field collection "comment" %}\r
+ {% dl_field collection "metadata_writer" %}\r
+ {% dl_field collection "travail" %}\r
+ {% dl_field collection "items_done" %}\r
+ </dl>\r
+ </div>\r
+ </div>\r
+ {% endblock archive_data %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block technical_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "Technical data" %}</a></h4>\r
+ <div>\r
+ <dl class="listing">\r
+ {% dl_field collection "code" %}\r
+ {% dl_field collection "old_code" %}\r
+ <dt>{% trans "Media type" %}</dt><dd>{% trans "Audio" %}</dd>\r
+ {% dl_field collection "approx_duration" %}\r
+ {% dl_field collection "computed_duration" %}\r
+ {% dl_field collection "physical_items_num" %}\r
+ <div class="wazing"></div>\r
+ <dt>{% trans "Number of items" %}</dt><dd>{{ collection.items.count }}</dd>\r
+ {% dl_field collection "physical_format" %}\r
+ {% dl_field collection "ad_conversion" %}\r
+ </dl>\r
+ </div>\r
+ </div>\r
+ {% endblock technical_data %}\r
+ </div>\r
+ <h4>Items</h4>\r
+ {% with collection.items.enriched as items %}\r
+ {% with "1" as location_name %}\r
+ {% include "telemeta/inc/mediaitem_list.html" %}\r
+ {% endwith %}\r
+ {% endwith %}\r
+ <!--\r
+ {% with collection.ordered_items as items %}\r
+ {% include "telemeta/inc/mediaitem_list.html" %}\r
+ {% endwith %}\r
+ -->\r
+ </div>\r
+ </div>\r
+{% endblock %}\r
+{% else %}\r
+ <p>No such collection</p>\r
+{% endif %}\r
+\r
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block head_title %}{% trans "Collection" %}{{collection|prepend:': '}} - {{ block.super }}{% endblock %}
+
+{% if collection %}
+{% block submenu %}
+ <h3>Collection: {{ collection }}</h3>
+ <div><a href="{% url telemeta-collection-detail collection.public_id %}">{% trans "Normal View" %}</a></div>
+{% endblock %}
+
+{% block content %}
+{% with collection|to_dublincore as resource %}
+{% include "telemeta/inc/dublincore.html" %}
+{% endwith %}
+
+{% endblock %}
+{% else %}
+ <p>{% trans "No such collection" %}</p>
+{% endif %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block head_title %}{% trans "Media Collections" %} - {{ block.super }}{% endblock %}
+
+{% block content %}
+<h3>{% trans "Media Collections" %}</h3>
+
+{% with object_list as collections %}
+<div class="fullpage">
+{% include "telemeta/inc/collection_list.html" %}
+</div>
+{% endwith %}
+
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base_xspf.xml" %}
+{% load telemeta_utils %}
+
+{% block listinfo %}
+{% with collection.to_dublincore.flatten as dc %}
+ <creator>{{ dc.creator }}</creator>
+ <title>{{ dc.title }}</title>
+ <info>http://{{ host }}{% url telemeta-collection-detail collection.public_id %}</info>
+{% endwith %}
+{% endblock %}
+
+{% block tracklist %}
+{% for item in collection.items.all %}
+ <track>
+ <title>{{ item }}</title>
+ <meta rel="type">mp3</meta>
+ <location>http://{{ host }}{% url telemeta-item-export item.public_id,"mp3" %}</location>
+ <duration>{{ item.computed_duration.as_seconds|mul:1000 }}</duration>
+ <info>http://{{ host }}{% url telemeta-item-detail item.public_id %}</info>
+ </track>
+{% endfor %}
+{% endblock %}
+
--- /dev/null
+{% load telemeta_utils %}
+{% load i18n %}
+
+<h2>{{ country }}</h2>
+<p>
+<a href="{% url telemeta-geo-country-items continent.flatname,country.flatname %}">
+{{ country.items|resources_num }}
+</a>
+{% trans "in" %}
+<a href="{% url telemeta-geo-country-collections continent.flatname,country.flatname %}">
+{{ country.collections|resources_num }}
+</a>
+</p>
+<!--
+{% with country.items.all.ethnic_groups as ethnic_groups %}
+{% if ethnic_groups %}
+<p>
+<b>{% trans "Populations / Social groups" %}:</b>
+{{ ethnic_groups|join:', ' }}
+</p>
+{% endif %}
+{% endwith %}
+-->
--- /dev/null
+{% extends "telemeta/admin.html" %}
+{% load i18n %}
+
+{% block head_title %}{% trans "Enumeration" %}: {{ enumeration_name|capfirst }} - {{ block.super }}{% endblock %}
+
+{% block tabcontents %}
+ <h4>{% trans "Enumeration" %}: {{ enumeration_name|capfirst }}</h4>
+
+ <form class="addnew" id="addenum" method="post"
+ action="{% url telemeta-enumeration-add enumeration_id %}">
+ <fieldset>
+ <legend>{% trans "Add entry" %}</legend>
+ <div class="field">
+ <label>{% trans "Value" %}: <input type="text" name="value"></label>
+
+ </div>
+ <div class="buttons">
+ <input type="submit" name="add" value="{% trans 'Add' %}">
+ </div>
+ </fieldset>
+ </form>
+ {% if enumeration_values %}
+ <form method="POST" action="{% url telemeta-enumeration-update enumeration_id %}">
+ <table class="listing">
+ <thead>
+ <tr><th class="sel"> </th><th>{% trans "Value"%}</th>
+
+ </tr>
+ </thead><tbody>
+ {% for record in enumeration_values %}
+ <tr>
+ <td><input type="checkbox" name="sel" value="{{record.id}}" /></td>
+ <td><a href="{% url telemeta-enumeration-record-edit enumeration_id,record.id %}">
+ {{record.value}}</a></td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ <div class="buttons">
+ <input type="submit" name="remove" value="{% trans 'Remove selected items' %}" />
+ </div>
+ </form>
+ {% else %}
+ <p class="help">{% trans "This enumeration is empty" %}</p>
+ {% endif %}
+
+ <br style="clear: right"/>
+{% endblock %}
--- /dev/null
+{% extends "telemeta/admin.html" %}
+{% load i18n %}
+
+{% block head_title %}{% trans "Enumeration" %}: {{ enumeration_name|capfirst }} - {{ block.super }}{% endblock %}
+
+{% block tabcontents %}
+ <h4>{% trans "Enumeration" %}: {{ enumeration_name|capfirst }}</h4>
+
+ <form class="mod" id="addenum" method="post"
+ action="{% url telemeta-enumeration-record-update enumeration_id,enumeration_record.id %}">
+ <fieldset>
+ <legend>{% trans "Modify an entry" %}</legend>
+ <div class="field">
+ <label>{% trans "Value" %}: <input type="text" name="value" value="{{enumeration_record.value}}" /></label>
+
+ </div>
+ <div class="buttons">
+ <input type="submit" name="save" value="{% trans 'Save' %}">
+ <input type="submit" name="cancel" value="{% trans 'Cancel' %}">
+ </div>
+ </fieldset>
+ </form>
+ <br style="clear: right"/>
+
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% block content %}
+{{ page_content|render_flatpage }}
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block head_title %}{% trans "Geographic Navigator" %} - {{ block.super }}{% endblock %}
+
+{% block extra_javascript %}
+{% if gmap_key %}
+<script src="http://www.google.com/jsapi?key={{ gmap_key }}" type="text/javascript"></script>
+<script src="{% url telemeta-js "resourcemap.js" %}" type="text/javascript"></script>
+<script type="text/javascript">
+var resourceMap = new ResourceMap('.continents', {
+ 'countryInfoUri': '{% url telemeta-country-info "RESOURCEID" %}'
+});
+</script>
+{% endif %}
+{% endblock %}
+
+{% block submenu %}
+ <div>
+ <a href="#" onclick="resourceMap.toggle('map'); return false;">{% trans "Map" %}</a> |
+ <a href="#"onclick="resourceMap.toggle('list'); return false;">{% trans "List" %}</a>
+ </div>
+{% endblock %}
+{% block content %}
+<h3>{% trans "Geographic Navigator" %}</h3>
+{% if continents %}
+<ul class="continents">
+{% for group in continents %}
+ <li class="name {% if not forloop.counter0|divisibleby:"2" %}odd{% endif %}"><b><a href="{% url telemeta-geo-countries group.continent.flatname %}">{{ group.continent }}</a></b>
+ <ul>
+ {% for country in group.countries %}
+ <li id="resource-{{country.id}}" class="country_name resourcemap-element">
+ <a href="{% url telemeta-geo-country-collections group.continent.flatname,country.flatname %}">
+ <span class="resourcemap-name">{{ country }}</span></a>
+ {% if not country.latitude|is_none and not country.longitude|is_none %}
+ <input type="hidden" class="resourcemap-lat" value="{{country.latitude}}" />
+ <input type="hidden" class="resourcemap-lng" value="{{country.longitude}}" />
+ {% endif %}
+ </li>
+ {% endfor %}
+ </ul>
+ </li>
+{% endfor %}
+</ul>
+{% else %}
+<p>No data</p>
+{% endif %}
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block head_title %}{{ continent }} - {% trans "Geographic Navigator" %} - {{ block.super }}{% endblock %}
+
+{% block content %}
+<h3><a href="{% url telemeta-geo-continents %}">{% trans "World" %}</a> /
+ {{ continent }}</h3>
+<table class="listing">
+<tr>
+ <th>{% trans "Country" %}</th>
+ <th>{% trans "Number of collections" %}</th>
+ <th>{% trans "Number of items" %}</th>
+</tr>
+{% for country in countries %}
+<tr>
+ <td>{{ country }}</td>
+ <td>
+ {% with country.collections.count as num %}
+ <a href="{% url telemeta-geo-country-collections continent.flatname,country.flatname %}">
+ {% blocktrans count num as counter %}1 collection{% plural %}{{ counter }} collections{% endblocktrans %}
+ </a>
+ {% endwith %}
+ </td>
+ <td>
+ {% with country.items.count as num %}
+ <a href="{% url telemeta-geo-country-items continent.flatname,country.flatname %}">
+ {% blocktrans count num as counter %}1 item{% plural %}{{ counter }} items {% endblocktrans %}
+ </a>
+ {% endwith %}
+ </td>
+</tr>
+{% endfor %}
+</table>
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block head_title %}{{ country }} - {% trans "Geographic Navigator" %} - {{ block.super }}{% endblock %}
+
+{% block content %}
+<h3><a href="{% url telemeta-geo-continents %}">{% trans "World" %}</a> /
+ <a href="{% url telemeta-geo-countries continent.flatname %}">{{ continent }}</a>
+ / {{ country }}</h3>
+
+{% with object_list as collections %}
+<div class="fullpage">
+{% include "telemeta/inc/collection_list.html" %}
+</div>
+{% endwith %}
+
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block head_title %}{{ country }} - {% trans "Geographic Navigator" %} - {{ block.super }}{% endblock %}
+
+{% block content %}
+<h3><a href="{% url telemeta-geo-continents %}">{% trans "World" %}</a> /
+ <a href="{% url telemeta-geo-countries continent.flatname %}">{{ continent }}</a>
+ / {{ country }}</h3>
+
+{% with object_list as items %}
+<div class="fullpage">
+{% include "telemeta/inc/mediaitem_list.html" %}
+</div>
+{% endwith %}
+
+{% endblock %}
--- /dev/null
+{% load telemeta_utils %}
+{% load i18n %}
+{% if collections %}
+{% if hits %}
+<p class="pagination">
+{% blocktrans %}Collections {{ first_on_page }} to {{ last_on_page }} on {{ hits }}{% endblocktrans %}
+
+{% if has_previous %} <a href="?page={{ previous }}&{{criteria|build_query_string}}"><<</a> {% endif %}
+{% if has_next %} <a href="?page={{ next }}&{{criteria|build_query_string}}">>></a> {% endif %}
+</p>
+{% endif %}
+<table class="listing">
+<tr>
+ <th class="highlight">{% trans "Title" %}</th>
+ <th>{% trans "Code" %}</th>
+ <th>{% field_label "MediaCollection" "creator" %}</th>
+ <th>{% trans "Recordist" %}</th>
+ <th>{% trans "Year of recording" %}</th>
+</tr>
+{% for collection in collections %}
+<tr {% if not forloop.counter0|divisibleby:"2" %}class="odd"{% endif %}>
+ <td class="highlight">
+ <a href="{% url telemeta-collection-detail collection.public_id %}">{{ collection }}</a>
+ </td>
+ <td>
+ {{ collection.code|default:collection.old_code }}
+ </td>
+ <td>{{ collection.creator }}</td>
+ <td>{{ collection.apparent_collector }}</td>
+ <td>
+ {% if collection.recorded_from_year %}
+ {{ collection.recorded_from_year }}
+ {% if collection.recorded_to_year and not collection.recorded_to_year|equals:collection.recorded_from_year %}
+ - {{ collection.recorded_to_year }}
+ {% endif %}
+ {% endif %}
+ </td>
+</tr>
+{% endfor %}
+</table>
+{% else %}
+ <p>{% trans "No collection" %}</p>
+{% endif %}
+
--- /dev/null
+{% load telemeta_utils %}
+{% load i18n %}
+
+ <h4 class="dublincore">{% trans "Dublin Core Metadata" %}</h4>
+ <dl class="dublincore">
+ <dt class="caption"><span>Element</span>Refinement</dt><dd class="caption">Value</dd>
+ {% for element in resource.elements %}
+ <dt><span>{{ element.name }}</span>{{ element.refinement|default:" " }}</dt>
+ <dd>
+ {% if element.related|is_item or element.related|is_collection %}
+ {% if element.related|is_item %}
+ <a href="{% url telemeta-item-dublincore element.related.public_id %}">{{ element.value }}</a>
+ {% else %}
+ <a href="{% url telemeta-collection-dublincore element.related.public_id %}">{{ element.value }}</a>
+ {% endif %}
+ {% else %}
+ {{ element.value }}
+ {% endif %}
+ </dd>
+ {% endfor %}
+
+ </dl>
--- /dev/null
+{% load telemeta_utils %}
+{% load i18n %}
+{% if items %}
+{% if hits %}
+<p class="pagination">
+{% blocktrans %}Items {{ first_on_page }} to {{ last_on_page }} on {{ hits }}{% endblocktrans %}
+
+{% if has_previous %} <a href="?page={{ previous }}&{{criteria|build_query_string}}"><<</a> {% endif %}
+{% if has_next %} <a href="?page={{ next }}&{{criteria|build_query_string}}">>></a> {% endif %}
+</p>
+{% endif %}
+<table class="listing">
+<tr>
+ <th class="highlight">{% trans "Title" %}</th>
+ <th>{% trans "Code" %}</th>
+ <th>{% trans "Recordist" %}</th>
+ {% if location_name %}
+ <th>{% trans "Location" %}</th>
+ {% else %}
+ <th>{% trans "Country/Continent" %}</th>
+ {% endif %}
+ <th>{% trans "Year of recording" %}</th>
+</tr>
+{% for item in items %}
+<tr {% if not forloop.counter0|divisibleby:"2" %}class="odd"{% endif %}>
+ <td class="highlight">
+ <a href="{% url telemeta-item-detail item.public_id %}">{{ item }}</a>
+ </td>
+ <td>
+ {{ item.code|default:item.old_code }}
+ </td>
+ <td>{{ item.apparent_collector }}</td>
+ {% if location_name %}
+ <td>{{ item.location.name }}</td>
+ {% else %}
+ <td>{{ item.country_or_continent|default:' ' }}</td>
+ {% endif %}
+ <td>
+ {% if item.recorded_from_date %}
+ {{ item.recorded_from_date.year }}
+ {% if item.recorded_to_date and not item.recorded_to_date.year|equals:item.recorded_from_date.year %}
+ - {{ item.recorded_to_date.year }}
+ {% endif %}
+ {% endif %}
+ </td>
+</tr>
+{% endfor %}
+</table>
+{% else %}
+ <p>{% trans "No item" %}</p>
+{% endif %}
+
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block content %}
+<div class="home-content">
+
+<div class="module-set">
+
+{% block modules %}
+<div class="module">
+ <h3>{% trans "Geographic Navigator" %}</h3>
+ <a class="image-link" href="{% url telemeta-geo-continents %}">
+ <img class="map-thumbnail" src="{% url telemeta-images "map_thumbnail.png" %}" alt="{% trans "Open the geographic navigator" %}" /></a>
+</div>
+<div class="module">
+ <h3>{% trans "Musical selection" %}</h3>
+ <ul class="playlist">
+ {% for item in items %}
+ <li>
+ <a href="{% url telemeta-item-detail item.public_id %}"><b>{{item}}</b></a>
+ <br />
+ <span class="info">{{item.apparent_collector|prepend:' - '}} - {{item.country_or_continent}}</span>
+ </li>
+ {% endfor %}
+ </ul>
+</div>
+{% endblock %}
+
+</div>
+
+<div class="home-description">
+{{ page_content|render_flatpage }}
+</div>
+</div>
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<h3>{% trans "User authentication" %}</h3>
+
+{% if form.errors %}
+<p class="login-error">{% trans "Your username and password didn't match. Please try again." %}</p>
+{% endif %}
+
+<form class="login" method="post" action="{% url telemeta-login %}">
+<p>
+{{ form.username.label_tag }}
+{{ form.username }}<br />
+
+{{ form.password.label_tag }}
+{{ form.password }}
+
+</p>
+<input class="submit" type="submit" value="{% trans "Sign in" %}"/>
+<input type="hidden" name="next" value="{{ next }}" />
+</form>
+
+<div class="wazing" />
+
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base.html" %}\r
+{% load telemeta_utils %}\r
+{% load i18n %}\r
+\r
+{% block head_title %}{% trans "Item" %}{{item|prepend:': '}} - {{ block.super }}{% endblock %}\r
+\r
+{% block stylesheets %}\r
+{{ block.super }}\r
+<link rel="stylesheet" type="text/css" href="{% url telemeta-timeside "css/timeside.css" %}" />\r
+<link rel="stylesheet" type="text/css" href="{% url telemeta-timeside "skins/lab/style.css" %}" />\r
+<link rel="stylesheet" type="text/css" href="{% url telemeta-css "player.css" %}" />\r
+{% endblock %}\r
+{% block extra_javascript %}\r
+\r
+<script src="{% url telemeta-js "wz_jsgraphics.js" %}" type="text/javascript"></script>\r
+<script src="{% url telemeta-js "soundmanager2.js" %}" type="text/javascript"></script>\r
+<script src="{% url telemeta-timeside "src/timeside.js" %}" type="text/javascript"></script>\r
+<script src="{% url telemeta-js "player.js" %}" type="text/javascript"></script>\r
+\r
+<script type="text/javascript">\r
+soundManager.url = '{% url telemeta-swf "./" %}';\r
+soundManager.flashVersion = 9;\r
+soundManager.useMovieStar = true; // enable MP4/M4A/AAC\r
+soundManager.debugMode = false;\r
+set_player_image_url('{% url telemeta-item-visualize item.public_id,visualizer_id,"WIDTH","HEIGHT" %}');\r
+load_player({{ item.approx_duration.as_seconds }});\r
+</script>\r
+\r
+{% endblock %}\r
+\r
+\r
+{% if item %}\r
+{% block submenu %}\r
+ <div><a href="{% url telemeta-item-dublincore item.public_id %}">Dublin Core</a></div>\r
+{% endblock %}\r
+\r
+{% block content %}\r
+\r
+<h3>Item : {{ item }}</h3>\r
+<div class="{% if item.file %}with-rightcol{% endif %}">\r
+\r
+{% if item.file %}\r
+ <div id="player_maximized" class="ts-skin-lab">\r
+ <a href="#" class="toggle">Minimize</a>\r
+ <div class="wazing"></div>\r
+ </div>\r
+ <div id="rightcol">\r
+ <div id="player_minimized" class="ts-skin-lab">\r
+ <a href="#" class="toggle">Maximize</a>\r
+ <div class="wazing"></div>\r
+ <div id="player" class="ts-player">\r
+ <div class="ts-viewer">\r
+ <div class="ts-wave">\r
+ <div class="ts-image-container">\r
+ <a href="{% url telemeta-item-export item.public_id,"mp3" %}">\r
+ <img class="ts-image" src="{% url telemeta-item-visualize item.public_id,visualizer_id,360,130 %}"\r
+ alt="" /></a>\r
+ </div>\r
+ </div>\r
+ </div>\r
+ </div>\r
+ </div>\r
+\r
+ <div class="item_visualization">\r
+ <form id="visualizer_id_form" method="get" action="#">\r
+ <!--\r
+ <select name="visualizer_id" onchange="this.form.submit()">\r
+ {% for v in visualizers %}\r
+ <option value="{{ v.id }}" {% ifequal v.id visualizer_id %} selected="selected" {% endifequal %}>\r
+ {{v.name}}</option>\r
+ {% endfor %}\r
+ </select>\r
+ -->\r
+ <select id="visualizer_id" name="visualizer_id">\r
+ {% for v in visualizers %}\r
+ <option value="{% url telemeta-item-visualize item.public_id,v.id,"WIDTH","HEIGHT" %}">\r
+ {{v.name}}</option>\r
+ {% endfor %}\r
+ </select>\r
+ <input type="submit" value="Set" />\r
+ </form>\r
+\r
+ <div class="analyzer">\r
+ <table width="100%">\r
+ <tr class="analyzer-title">\r
+ <td>Property</td>\r
+ <td>Value</td>\r
+ <td>Unit</td>\r
+ <tr>\r
+ {% for analyser in analysers %}\r
+ <tr class="analyzer-line">\r
+ <td>\r
+ {{ analyser.name }}\r
+ </td>\r
+ <td>\r
+ {{ analyser.value }}\r
+ </td>\r
+ <td>\r
+ {{ analyser.unit }}\r
+ </td>\r
+ </tr>\r
+ {% endfor %}\r
+ </table>\r
+ </div>\r
+<!--\r
+ <form method="get" action="#">\r
+ <p> Vamp plugin analysis</p>\r
+ <select name="vamp_id">\r
+ {% for plugin in vamp_plugins %}\r
+ <option value="{{ plugin }}" {% ifequal plugin vamp_id %} selected="selected" {% endifequal %}>\r
+ {{ plugin }}</option>\r
+ {% endfor %}\r
+ </select>\r
+ <input type="submit" value="Get" />\r
+ </form>\r
+-->\r
+ </div>\r
+\r
+ {% if audio_export_enabled %}\r
+ <div class="exporter">\r
+ <p>{% trans "Download:" %}\r
+ {% for format in export_formats %}\r
+ <a href="{% url telemeta-item-export item.public_id,format.extension %}">{{ format.name }}</a>\r
+ {% endfor %}</p>\r
+ </div>\r
+ {% endif %}\r
+\r
+ </div>\r
+{% endif %}\r
+\r
+ <div class="infos">\r
+ {% block general_info %}\r
+ <dl class="listing">\r
+ {% dl_field item "title" %}\r
+ {% dl_field item "alt_title" %}\r
+ {% dl_field item "collector" %}\r
+ <dt>{% field_label item "collection" %}</dt>\r
+ <dd><a href="{% url telemeta-collection-detail item.collection.public_id %}">{{ item.collection }}</a></dd>\r
+ {% if item.recorded_from_date %}\r
+ <dt>{% trans "Recording date" %}</dt>\r
+ <dd>{{ item.recorded_from_date }} {{ item.recorded_to_date|prepend:" - " }}</dd>\r
+ {% endif %}\r
+ </dl>\r
+ {% endblock general_info %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block geoethnic_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "Geographic and cultural informations" %}</a></h4>\r
+ <dl class="listing">\r
+ {% if item.location %}\r
+ <dt>{% trans "Location" %}</dt>\r
+ <dd>{{ item.location.fullnames|join:"<br/>" }}</dd>\r
+ {% endif %}\r
+ {% dl_field item "location_comment" %}\r
+ {% dl_field item "cultural_area" %}\r
+ {% dl_field item "ethnic_group" %}\r
+ {% dl_field item "context_comment" %}\r
+ {% dl_field item "keywords" join with ", " %}\r
+ </dl>\r
+ </div>\r
+ {% endblock geoethnic_data %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block musical_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "Musical informations" %}</a></h4>\r
+ <dl class="listing">\r
+ {% dl_field item "vernacular_style" %}\r
+ {% dl_field item "generic_style" %}\r
+ {% dl_field item "author" %}\r
+ </dl>\r
+ {% if item.performances %}\r
+ <div class="instruments">\r
+ <table class="instruments">\r
+ <thead>\r
+ <tr>\r
+ <td>{% field_label "MediaItemPerformance" "instruments_num" %}</td>\r
+ <td>{% field_label "MediaItemPerformance" "instrument" %}</td>\r
+ <td>{% field_label "MediaItemPerformance" "alias" %}</td>\r
+ <td>{% field_label "MediaItemPerformance" "musicians" %}</td>\r
+ </tr>\r
+ </thead>\r
+ <tbody>\r
+ {% for performance in item.performances.all %}\r
+ <tr>\r
+ <td>{{ performance.instruments_num }}</td>\r
+ <td>{{ performance.instrument|default:"" }}</td>\r
+ <td>{{ performance.alias|default:"" }}</td>\r
+ <td>{{ performance.musicians }}</td>\r
+ </tr>\r
+ {% endfor %}\r
+ </tbody>\r
+ </table>\r
+ </div>\r
+ {% endif %}\r
+ </div>\r
+ {% endblock musical_data %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block general_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "General informations" %}</a></h4>\r
+ <dl class="listing">\r
+ {% dl_field item "comment" %}\r
+ {% dl_field item "collector_selection" %}\r
+ </dl>\r
+ </div>\r
+ {% endblock general_data %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block archive_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "Archiving data" %}</a></h4>\r
+ <dl class="listing">\r
+ {% dl_field item "code" %}\r
+ {% dl_field item "old_code" %}\r
+ {% dl_field item "track" %}\r
+ {% dl_field item "creator_reference" %}\r
+ {% dl_field item "external_references" %}\r
+ {% dl_field item "public_access_label" %}\r
+ </dl>\r
+ </div>\r
+ {% endblock archive_data %}\r
+ </div>\r
+ <div class="extraInfos">\r
+ {% block technical_data %}\r
+ <div>\r
+ <h4><a href="#">{% trans "Technical data" %}</a></h4>\r
+ <div>\r
+ <dl class="listing">\r
+ <dt>{% trans "Media type" %}</dt><dd>{% trans "Audio" %}</dd>\r
+ {% dl_field item "approx_duration" %}\r
+ </dl>\r
+ </div>\r
+ </div>\r
+ {% endblock technical_data %}\r
+ </div>\r
+\r
+</div> <!-- with-rightcol -->\r
+\r
+{% endblock %}\r
+{% else %}\r
+ <p>No such item</p>\r
+{% endif %}\r
--- /dev/null
+{% extends "telemeta/base.html" %}\r
+{% load telemeta_utils %}\r
+{% load i18n %}\r
+\r
+{% block head_title %}{% trans "Item" %}{{item|prepend:': '}} - {{ block.super }}{% endblock %}\r
+\r
+{% if item %}\r
+{% block submenu %}\r
+ <h3>Item: {{ item }}</h3>\r
+ <div><a href="{% url telemeta-item-detail item.public_id %}">{% trans "Normal View" %}</a></div>\r
+{% endblock %}\r
+\r
+{% block content %}\r
+{% with item|to_dublincore as resource %}\r
+{% include "telemeta/inc/dublincore.html" %}\r
+{% endwith %}\r
+{% endblock %}\r
+{% else %}\r
+ <p>{% trans "No such item" %}</p>\r
+{% endif %}\r
+\r
+\r
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load i18n %}
+{% load telemeta_utils %}
+
+{% block head_title %}{% trans "Media Items" %} - {{ block.super }}{% endblock %}
+
+{% block content %}
+<h3>{% trans "Media Items" %}</h3>
+{% with object_list as items %}
+<div class="fullpage">
+{% include "telemeta/inc/mediaitem_list.html" %}
+</div>
+{% endwith %}
+
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base_xspf.xml" %}
+{% load telemeta_utils %}
+
+{% block tracklist %}
+ <track>
+ <title>{{ item }}</title>
+ <meta rel="type">mp3</meta>
+ <location>http://{{ host }}{% url telemeta-item-export item.public_id,"mp3" %}</location>
+ <duration>{{ item.get_duration|mul:1000 }}</duration>
+ <info>http://{{ host }}{% url telemeta-item-detail item.public_id %}</info>
+ </track>
+{% endblock %}
+
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block head_title %}{% trans "Advanced Search" %} - {{ block.super }}{% endblock %}
+
+{% block stylesheets %}
+{{ block.super }}
+<link rel="stylesheet" type="text/css" href="{% url telemeta-css "jquery.autocomplete.css" %}" />
+{% endblock %}
+
+{% block extra_javascript %}
+<script src="{% url telemeta-js "jquery.bgiframe.js" %}" type="text/javascript"></script>
+<script src="{% url telemeta-js "jquery.autocomplete.js" %}" type="text/javascript"></script>
+<script type="text/javascript">
+function update_period(source, from_field, to_field) {
+ var from_year = $(from_field);
+ var to_year = $(to_field);
+
+ if (from_year.val() == "0") {
+ to_year.attr('disabled', '1');
+ to_year.val('0');
+ } else {
+ to_year.removeAttr('disabled');
+ if ($(source).is(to_field)) {
+ if (parseInt(from_year.val()) > parseInt(to_year.val()))
+ from_year.val(to_year.val());
+ } else if (parseInt(from_year.val()) > parseInt(to_year.val())) {
+ to_year.val(from_year.val());
+ }
+ }
+}
+
+$(document).ready(function () {
+ $('#location').autocomplete('{% url telemeta-complete-location %}', {
+ max: 20,
+ formatResult: function(data) {
+ return data[0].replace(/ *\([0-9]+.*\) *$/, '');
+ }
+ });
+ update_period('#rec_year_from', '#rec_year_to');
+ $('#rec_year_from, #rec_year_to').change(function () {
+ update_period(this, '#rec_year_from', '#rec_year_to');
+ });
+ update_period('#pub_year_from', '#pub_year_to');
+ $('#pub_year_from, #pub_year_to').change(function () {
+ update_period(this, '#pub_year_from', '#pub_year_to');
+ });
+});
+
+</script>
+{% endblock %}
+
+{% block content %}
+<h3>{% trans "Advanced Search" %}</h3>
+
+<form action="{% url telemeta-search %}" id="searchform">
+<fieldset>
+
+ <p>
+ <label for="location">{% field_label "Location" %}</label>
+ <input type="text" name="location" id="location" value="{{ criteria.location }}" />
+ </p>
+
+ <p>
+ <label for="ethnic_group">{% field_label "EthnicGroup" %}</label>
+ <select id="ethnic_group" name="ethnic_group">
+ <option value="">All ethnic groups</option>
+ {% for group in ethnic_groups %}
+ <option value="{{group.id}}" {% ifequal criteria.ethnic_group.id group.id %}selected {% endifequal %}>{{group|escape}}</option>
+ {% endfor %}
+ </select>
+ </p>
+
+</fieldset>
+<fieldset>
+
+ <p>
+ <label for="title">{% trans "Title" %}</label>
+ <input type="text" id="title" name="title" />
+ </p>
+
+ <p>
+ <label for="creator">{% field_label "MediaCollection" "creator" %}</label>
+ <input type="text" id="creator" name="creator" />
+ </p>
+
+ <p>
+ <label for="collector">{% field_label "MediaCollection" "collector" %}</label>
+ <input type="text" id="collector" name="collector" />
+ </p>
+
+ {% if rec_years %}
+ <p>
+ <label for="rec_date_from">{% trans "Year of recording" %}</label>
+ <select id="rec_year_from" name="rec_year_from" class="tiny">
+ <option value="0"></option>
+ {% for year in rec_years %}
+ <option value="{{ year }}" {% ifequal criteria.rec_year_from year %}selected {% endifequal %}>{{year}}</option>
+ {% endfor %}
+ </select>
+ {% trans "to" %}
+ <select id="rec_year_to" name="rec_year_to" class="tiny">
+ <option value="0"></option>
+ {% for year in rec_years %}
+ <option value="{{ year }}" {% ifequal criteria.rec_year_to year %}selected {% endifequal %}>{{year}}</option>
+ {% endfor %}
+ </select>
+ </p>
+ {% endif %}
+
+ {% if pub_years %}
+ <p>
+ <label for="pub_date_from">{% trans "Year of publication" %}</label>
+ <select id="pub_year_from" name="pub_year_from" class="tiny">
+ <option value="0"></option>
+ {% for year in pub_years %}
+ <option value="{{ year }}" {% ifequal criteria.pub_year_from year %}selected {% endifequal %}>{{year}}</option>
+ {% endfor %}
+ </select>
+ {% trans "to" %}
+ <select id="pub_year_to" name="pub_year_to" class="tiny">
+ <option value="0"></option>
+ {% for year in pub_years %}
+ <option value="{{ year }}" {% ifequal criteria.pub_year_to year %}selected {% endifequal %}>{{year}}</option>
+ {% endfor %}
+ </select>
+ </p>
+ {% endif %}
+
+</fieldset>
+
+<p class="input">
+<input type="submit" value="{% trans 'Search' %}" />
+</p>
+
+</form>
+{% endblock %}
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% block head_title %}{% trans "Search Results" %} - {{ block.super }}{% endblock %}
+
+{% block content %}
+<h3>{% trans "Search Results" %}</h3>
+
+{% if criteria %}
+<ul>
+ {% if criteria.pattern %}
+ <li><b>{% trans "Search pattern" %}:</b> {{criteria.pattern}}</li>
+ {% endif %}
+ {% if criteria.location %}
+ <li><b>{% field_label "Location" %}:</b> {{criteria.location}}</li>
+ {% endif %}
+ {% if criteria.ethnic_group %}
+ <li><b>{% field_label "EthnicGroup" %}:</b> {{criteria.ethnic_group}}</li>
+ {% endif %}
+ {% if criteria.creator %}
+ <li><b>{% field_label "MediaCollection" "creator" %}:</b> {{criteria.creator}}</li>
+ {% endif %}
+ {% if criteria.collector %}
+ <li><b>{% field_label "MediaCollection" "collector" %}:</b> {{criteria.collector}}</li>
+ {% endif %}
+ {% if criteria.title %}
+ <li><b>{% trans "Title" %}:</b> {{criteria.title}}</li>
+ {% endif %}
+ {% if criteria.rec_year_from %}
+ <li><b>{% trans "Year of recording" %}:</b> {{criteria.rec_year_from}}
+ {% ifnotequal criteria.rec_year_to criteria.rec_year_from %}
+ {% trans "to" %} {{criteria.rec_year_to}}
+ {% endifnotequal %}
+ </li>
+ {% endif %}
+ {% if criteria.pub_year_from %}
+ <li><b>{% trans "Year of publication" %}:</b> {{criteria.pub_year_from}}
+ {% ifnotequal criteria.pub_year_to criteria.pub_year_from %}
+ {% trans "to" %} {{criteria.pub_year_to}}
+ {% endifnotequal %}
+ </li>
+ {% endif %}
+</ul>
+{% endif %}
+
+{% ifequal type 'items' %}
+
+ <p><b>Items ({{items_num}})</b> |
+ <a href="{% url telemeta-search-collections %}?{{criteria|build_query_string}}">
+ Collections ({{collections_num}})</a></p>
+
+ {% with object_list as items %}
+ {% include "telemeta/inc/mediaitem_list.html" %}
+ {% endwith %}
+
+{% else %}
+
+ <p><a href="{% url telemeta-search-items %}?{{criteria|build_query_string}}">
+ Items ({{items_num}})</a> |
+ <b>Collections ({{collections_num}})</b></p>
+
+ {% with object_list as collections %}
+ {% include "telemeta/inc/collection_list.html" %}
+ {% endwith %}
+
+{% endifequal %}
+
+{% endblock %}
--- /dev/null
+from django import template
+from django.utils.http import urlquote
+from telemeta import models
+from django.core.urlresolvers import reverse
+import telemeta.models.dublincore as dc
+from django.utils import html
+from django import template
+from django.utils.text import capfirst
+from telemeta import models
+from django.utils.translation import ungettext
+from docutils.core import publish_parts
+from django.utils.encoding import smart_str, force_unicode
+from django.utils.safestring import mark_safe
+from django import db
+import re
+from django.conf import settings
+
+register = template.Library()
+
+@register.filter
+def tolist(dict):
+ "Converts a simple dict into a list"
+ list = []
+ for k, v in dict.iteritems():
+ list.append({'name': k, 'value': v})
+ return list
+
+@register.filter
+def mul(value, arg):
+ "Multiply a numeric value"
+ return value * arg
+
+class TelemetaVersionNode(template.Node):
+ def render(self, context):
+ from telemeta import __version__
+ return __version__
+
+@register.tag
+def telemeta_version(parser, token):
+ "Get Telemeta version number"
+ return TelemetaVersionNode()
+
+class TelemetaUrlNode(template.Node):
+ def render(self, context):
+ from telemeta import __url__
+ return __url__
+
+@register.tag
+def telemeta_url(parser, token):
+ "Get Telemeta project homepage URL"
+ return TelemetaUrlNode()
+
+_js_escapes = (
+ ('\\', '\\\\'),
+ ('"', '\\"'),
+ ("'", "\\'"),
+ ('\n', '\\n'),
+ ('\r', '\\r'),
+ ('\b', '\\b'),
+ ('\f', '\\f'),
+ ('\t', '\\t'),
+ ('\v', '\\v'),
+ ('</', '<\\/'),
+)
+@register.filter
+def escapejs(value):
+ """Backslash-escapes characters for use in JavaScript strings."""
+ for bad, good in _js_escapes:
+ value = value.replace(bad, good)
+ return value
+
+@register.filter
+def build_query_string(vars):
+ """Build an HTTP query string out of a dict"""
+ if type(vars) == dict:
+ import urllib
+ args = []
+ for k, v in vars.iteritems():
+ if isinstance(v, db.models.Model):
+ v = v.pk
+ elif not isinstance(v, basestring):
+ v = unicode(v)
+ args.append(urlquote(k) + '=' + urlquote(v))
+
+ return "&".join(args)
+ return ''
+
+@register.filter
+def code_or_id(resource):
+ if resource.code:
+ return resource.code
+ else:
+ return resource.id
+
+@register.filter
+def is_item(resource):
+ return isinstance(resource, models.MediaItem)
+
+@register.filter
+def is_collection(resource):
+ return isinstance(resource, models.MediaCollection)
+
+@register.filter
+def to_dublincore(resource):
+ if isinstance(resource, models.MediaItem):
+ return dc.express_item(resource)
+ else:
+ return dc.express_collection(resource)
+
+class DescriptionListFieldNode(template.Node):
+ def __init__(self, model, attr, join_with = None, show_empty = False):
+ self.model = model
+ self.member = attr
+ self.join_with = join_with
+ self.show_empty = show_empty
+
+ def render(self, context):
+ try:
+ model = self.model.resolve(context)
+ if isinstance(self.member, template.Variable):
+ member = self.member.resolve(context)
+ else:
+ member = self.member
+ label = html.escape(capfirst(unicode(model.field_label(member))))
+ try:
+ value = getattr(model, member)
+ except AttributeError:
+ value = '<ERROR: no such field>'
+ except template.VariableDoesNotExist:
+ label = unicode(self.model) + '.' + self.member
+ value = '<ERROR: can\'t find variable>'
+
+ try:
+ value = value()
+ except TypeError:
+ pass
+ if self.join_with:
+ value = self.join_with.join([unicode(v) for v in value])
+ if not value:
+ value = ''
+ if value or self.show_empty:
+ value = html.escape(unicode(value))
+ markup = '<dt>%s</dt><dd>%s</dd>' % (label, value)
+ return markup
+
+ return ''
+
+@register.tag
+def dl_field(parser, token):
+ cut = token.split_contents()
+ join_with = None
+ show_empty = False
+ if len(cut) == 3:
+ tag_name, model, attr = cut
+ elif len(cut) == 4:
+ tag_name, model, attr, arg3 = cut
+ if arg3 == 'placeholder':
+ show_empty = True
+ else:
+ raise ValueError()
+ elif len(cut) >= 6:
+ tag_name, model, attr, arg3, arg4, arg5 = cut[0:6]
+ if arg3 == 'join' and arg4 == 'with'and arg5[0] == arg5[-1] and arg5[0] in ('"', "'"):
+ join_with = arg5[1:-1]
+ else:
+ raise ValueError()
+ if len(cut) > 6:
+ if cut[6] == 'placeholder':
+ show_empty = True
+ else:
+ raise ValueError();
+ else:
+ raise template.TemplateSyntaxError("%r tag: invalid arguments"
+ % token.contents.split()[0])
+
+ if attr[0] == attr[-1] and attr[0] in ('"', "'"):
+ attr = attr[1:-1]
+ else:
+ attr = template.Variable(attr)
+ model = template.Variable(model)
+ return DescriptionListFieldNode(model, attr, join_with=join_with, show_empty=show_empty)
+
+@register.filter
+def prepend(str, prefix):
+ if str:
+ return prefix + unicode(str)
+ return ''
+
+@register.simple_tag
+def field_label(model, field=None):
+ if isinstance(model, basestring):
+ model = getattr(models, model)
+
+ if not field:
+ return capfirst(unicode(model._meta.verbose_name))
+
+ return capfirst(unicode(model.field_label(field)))
+
+@register.simple_tag
+def field_value(object, member):
+ value = getattr(object, member)
+ try:
+ value = value()
+ except TypeError:
+ pass
+ return value
+
+@register.filter
+def is_none(value):
+ return value is None
+
+@register.filter
+def resources_num(value):
+ model = value.model
+ count = value.count()
+ label = str(count)
+ if model == models.MediaItem:
+ label = ungettext('%(count)d item', '%(count)d items', count) % {
+ 'count': count, }
+ elif model == models.MediaCollection:
+ label = ungettext('%(count)d collection', '%(count)d collections', count) % {
+ 'count': count, }
+
+ return label
+
+@register.filter
+def split(value, sep=','):
+ return value.split(sep)
+
+@register.simple_tag
+def variable_link(object, url_name, url_key):
+ return reverse(url_name, args=[field_value(object, url_key)])
+
+@register.filter
+def equals(value1, value2):
+ return value1 == value2
+
+@register.filter
+def render_flatpage(content):
+ parsed = ""
+ path = getattr(content, 'path', '')
+ if isinstance(content, basestring):
+ content = content.split("\n")
+
+ for line in content:
+ match = re.match('^(\.\. *(?:_[^:]*:|(?:\|\w+\|)? *image::) *)([^ ]+) *$', line)
+ if match:
+ directive, urlname = match.groups()
+ line = directive
+ try:
+ i = urlname.index('telemeta-')
+ except ValueError:
+ i = -1
+ if i == 0:
+ line += reverse(urlname)
+ elif urlname[:1] != '/':
+ line += reverse('telemeta-flatpage', args=[path + '/../' + urlname])
+ else:
+ line += urlname
+
+ parsed += line + "\n"
+
+ parts = publish_parts(source=smart_str(parsed), writer_name="html4css1", settings_overrides={})
+ return mark_safe('<div class="rst-content">\n' + force_unicode(parts["html_body"]) + '</div>')
+render_flatpage.is_safe = True
+
+@register.simple_tag
+def organization():
+ return settings.TELEMETA_ORGANIZATION
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+# David LIPSZYC <davidlipszyc@gmail.com>
+
+from model_tests import *
+from util_tests import *
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2010 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+# David LIPSZYC <davidlipszyc@gmail.com>
+
+import unittest
+from telemeta.models import *
+from datetime import datetime, timedelta
+
+class CollectionItemTestCase(unittest.TestCase):
+
+ def setUp(self):
+ "Create a test database based on objects created in Django"
+
+ self.david = User.objects.create(username="david", level="user")
+ self.olivier = User.objects.create(username="olivier", level="admin")
+
+ self.country = LocationType.objects.create(code="country", name="Country")
+ self.continent = LocationType.objects.create(code="continent", name="Continent")
+ self.city = LocationType.objects.create(code="city", name="City")
+
+ self.paris = Location.objects.create(name="Paris", type=Location.OTHER_TYPE, complete_type=self.city)
+ self.france = Location.objects.create(name="France", type=Location.COUNTRY, complete_type=self.country)
+ self.europe = Location.objects.create(name="Europe", type=Location.CONTINENT, complete_type=self.continent)
+ self.belgique = Location.objects.create(name="Belgique", type=Location.COUNTRY, complete_type=self.country)
+
+ self.europe.add_child(self.france)
+ self.france.add_child(self.paris)
+ self.europe.add_child(self.belgique)
+
+ self.a = EthnicGroup.objects.create(value="a")
+ self.b = EthnicGroup.objects.create(value="b")
+ self.c = EthnicGroup.objects.create(value="c")
+ self.d = EthnicGroup.objects.create(value="d")
+
+ self.persepolis = MediaCollection(id=1, code="CNRSMH_E_1970_001_002", reference="A1", title="persepolis",
+ creator="Abraham LINCOLN", collector="Friedrich HEINZ", year_published=2009, is_published=True,
+ recorded_from_year=1970, recorded_to_year=1980)
+
+ self.persepolis.save_with_revision(self.david)
+
+ self.volonte = MediaCollection(id=2, reference="A2", code="CNRSMH_I_1960_001", title="Volonté de puissance",
+ creator="Friedrich NIETZSCHE", collector="Jean AMORA", year_published=1999,
+ recorded_from_year=1960, recorded_to_year=2000)
+
+ self.volonte.save_with_revision(self.olivier)
+
+ self.nicolas = MediaCollection(id=3, reference="A3", code="CNRSMH_I_1967_123", title="petit nicolas",
+ creator="Georgette McKenic", collector="Paul MAILLE", year_published=1999,
+ recorded_from_year=1967, recorded_to_year=1968)
+
+ self.nicolas.save_with_revision(self.olivier)
+
+ self.item_1 = MediaItem(id=1, collection=self.persepolis, code="CNRSMH_E_1970_001_002_44",
+ recorded_from_date="1971-01-12", recorded_to_date="1971-02-24", location=self.paris,
+ ethnic_group=self.a, title="item 1", author="Mickael SHEPHERD", collector="Charles PREMIER",
+ comment="comment 1")
+
+ self.item_1.save_with_revision(self.david)
+
+ self.item_2 = MediaItem(id=2, collection=self.volonte, code="CNRSMH_I_1960_001_129",
+ recorded_from_date="1981-01-12", recorded_to_date="1991-02-24", location=self.france,
+ ethnic_group=self.a, title="item 2", author="Rick ROLL", comment="comment 2")
+
+ self.item_2.save_with_revision(self.david)
+
+ self.item_3 = MediaItem(id=3, collection=self.nicolas, code="CNRSMH_I_1967_123_456_01",
+ recorded_from_date="1968-01-12", recorded_to_date="1968-02-24", location=self.belgique,
+ ethnic_group=self.b, title="item 3", author="John SMITH", collector="Paul CARLOS",
+ comment="comment 3", )
+
+ self.item_3.save_with_revision(self.olivier)
+
+ self.item_4 = MediaItem(id=4, collection=self.persepolis, code="CNRSMH_E_1970_001_002_22_33",
+ recorded_from_date="1972-01-12", recorded_to_date="1972-02-24", location=self.europe,
+ ethnic_group=self.a, title="item 4", alt_title="I4", author="Keanu REAVES",
+ collector="Christina BARCELONA", comment="comment 4")
+
+ self.item_4.save_with_revision(self.olivier)
+
+ self.item_5 = MediaItem(id=5, collection=self.volonte,code="CNRSMH_I_1960_001_789_85_22",
+ approx_duration="00:05:00", recorded_from_date="1978-01-12", recorded_to_date="1978-02-24",
+ location=self.belgique, ethnic_group=self.a, title="item 5", alt_title="I5",
+ author="Simon PAUL", collector="Javier BARDEM",
+ comment="comment 5")
+
+ self.item_5.save_with_revision(self.olivier)
+
+ self.item_6 = MediaItem(id=6, collection=self.persepolis, code="CNRSMH_E_1970_001_002_90",
+ recorded_from_date="1968-01-12", recorded_to_date="1968-02-11", location=self.france,
+ ethnic_group=self.b, title="item 6", author="Paul ANDERSON",
+ collector="Jim CARLSON", comment="comment 10000")
+
+ self.item_6.save_with_revision(self.david)
+
+ self.collections = MediaCollection.objects.all()
+ self.items = MediaItem.objects.all()
+
+ def tearDown(self):
+ User.objects.all().delete()
+ LocationType.objects.all().delete()
+ Location.objects.all().delete()
+ EthnicGroup.objects.all().delete()
+ MediaCollection.objects.all().delete()
+ MediaItem.objects.all().delete()
+
+ def testQuickSearchOnCollections(self):
+ "Test quick_search property of MediaCollection class"
+ result = self.collections.quick_search("persepolis")
+ self.assertEquals(len(result), 1)
+ self.assertEquals(result[0], self.persepolis)
+ self.assertEquals(self.collections.quick_search("nietzsche")[0], self.volonte)
+ result = self.collections.quick_search("nicolas")
+ self.assertEquals(result[0], self.nicolas)
+
+ def testQuickSearchOnItems(self):
+ "Test quick_search property of MediaItem class"
+ result = self.items.quick_search("item").order_by("title")
+ self.assertEquals(result[0], self.item_1)
+ self.assertEquals(result[1], self.item_2)
+ self.assertEquals(result[2], self.item_3)
+ self.assertEquals(result[3], self.item_4)
+ self.assertEquals(result[4], self.item_5)
+ self.assertEquals(result[5], self.item_6)
+
+ def testWordSearch(self):
+ "Test quick_search property of MediaCollection class, specificly quick_search on collection title"
+ result = self.collections.quick_search("volonté puissance")
+ self.assertEquals(result[0], self.volonte)
+ result = self.collections.quick_search("puissance volonté")
+ self.assertEquals(result[0], self.volonte)
+ result = self.collections.quick_search("volonte puissance")
+ self.assertEquals(result[0], self.volonte)
+ result = self.collections.quick_search("puissance volonte")
+ self.assertEquals(result[0], self.volonte)
+
+ def testLocationSearch(self):
+ "Test by_country and by_continent properties of MediaCollection class"
+ self.assertEquals(self.collections.by_location(self.france)[0], self.persepolis)
+ self.assertEquals(self.collections.by_location(self.europe)[0], self.persepolis)
+ self.assertEquals(self.collections.by_location(self.belgique).order_by("title")[0], self.nicolas)
+ self.assertEquals(self.collections.by_location(self.belgique).order_by("title")[1], self.volonte)
+
+ def testRecordingYear(self):
+ "Test by_recording_year property of MediaCollection class"
+ self.assertEquals(self.collections.by_recording_year(1970, 1980)[0], self.persepolis)
+ result = self.collections.by_recording_year(1975).order_by("title")
+ self.assertEquals(result[0], self.persepolis)
+ self.assertEquals(result[1], self.volonte)
+
+ def testPublishYearOnCollection(self):
+ "Test by_publish_year property of MediaCollection class"
+ result=self.collections.by_publish_year(1999).order_by("title")
+ self.assertEquals(result[0], self.nicolas)
+ self.assertEquals(result[1], self.volonte)
+
+ def testEthnicGroup(self):
+ "Test by_ethnic_group property of MediaCollection class"
+ result=self.collections.by_ethnic_group(self.a).order_by("title")
+ self.assertEquals(result[0], self.persepolis)
+ self.assertEquals(result[1], self.volonte)
+
+ def testRecordingDate(self):
+ "Test by_recording_date property of MediaItem class"
+ result = self.items.by_recording_date("1968-01-01", "1972-12-12").order_by("title")
+ self.assertEquals(result[0], self.item_1)
+ self.assertEquals(result[1], self.item_3)
+ self.assertEquals(result[2], self.item_4)
+ self.assertEquals(result[3], self.item_6)
+ result = self.items.by_recording_date("1968-02-06").order_by("title")
+ self.assertEquals(result[0], self.item_3)
+ self.assertEquals(result[1], self.item_6)
+
+ def testTitle(self):
+ "Test by_title property of MediaItem class"
+ result = self.items.by_title("item").order_by("title")
+ self.assertEquals(result[0], self.item_1)
+ self.assertEquals(result[1], self.item_2)
+ self.assertEquals(result[2], self.item_3)
+ self.assertEquals(result[3], self.item_4)
+ self.assertEquals(result[4], self.item_5)
+ self.assertEquals(result[5], self.item_6)
+ self.item_2.title = ''
+ self.item_2.save()
+ self.item_5.title = ''
+ self.item_5.save()
+ result = self.items.by_title("volonté").order_by("title")
+ self.assertEquals(result[0], self.item_2)
+ self.assertEquals(result[1], self.item_5)
+ result = self.items.by_title("puissance volonté").order_by("title")
+ self.assertEquals(result[0], self.item_2)
+ self.assertEquals(result[1], self.item_5)
+
+ def testPublishYearOnItem(self):
+ "Test by_publish_year property of MediaItem class"
+ result = self.items.by_publish_year(1999).order_by("title")
+ self.assertEquals(result[0], self.item_2)
+ self.assertEquals(result[1], self.item_3)
+ self.assertEquals(result[2], self.item_5)
+
+ def testWordSearchCore(self):
+ "Test word_search property of CoreQuerySet class"
+ self.assertEquals(self.collections.word_search("title", "volonté")[0], self.volonte)
+ self.assertEquals(self.collections.word_search("code", "CNRSMH_E_1970_001_002")[0], self.persepolis)
+ self.assertEquals(self.items.word_search("code", "CNRSMH_E_1970_001_002_44")[0], self.item_1)
+ result = self.items.word_search("comment", "comment").order_by("title")
+ self.assertEquals(result[0], self.item_1)
+ self.assertEquals(result[1], self.item_2)
+ self.assertEquals(result[2], self.item_3)
+ self.assertEquals(result[3], self.item_4)
+ self.assertEquals(result[4], self.item_5)
+ self.assertEquals(result[5], self.item_6)
+
+ def testByChangeTimeOnCollection(self):
+ "Test by_change_time property of MediaCollection class"
+ now = datetime.now()
+ result = self.collections.by_change_time(now - timedelta(hours=1), now).order_by("title")
+ self.assertEquals(result[0], self.persepolis)
+
+ def testByChangeTimeOnItem(self):
+ "Test by_change_time property of MediaItem class"
+ now = datetime.now()
+ result = self.items.by_change_time(now - timedelta(hours=1), now).order_by("title")
+ self.assertEquals(result[0], self.item_1)
+
+ def testWithoutCollection(self):
+ "Test without_collection property of MediaItem class"
+ self.assertEquals(self.items.without_collection().count(), 0)
+
+ def testCodeRequired(self):
+ "Test that a proper failure occur when a collection code isn't provided"
+ c = MediaCollection()
+ try:
+ c.save_with_revision(self.olivier)
+ except RequiredFieldError, e:
+ self.assertEquals(e.field.name, 'code')
+ else:
+ self.fail("No exception raised")
+
+ def testDomForeignKey(self):
+ "Test DOM foreign key embedding"
+ doc = self.item_4.to_dom()
+ self.assertEquals(doc.getElementsByTagName('collection')[0].getAttribute('key'), str(self.persepolis.id))
+
+ def testLocationRelation(self):
+ "Test location country and continent resolving"
+ self.assertEquals(self.france, self.item_1.location.countries()[0])
+ self.assertEquals(self.europe, self.item_1.location.continents()[0])
+ self.assertEquals(self.france, self.item_2.location.countries()[0])
+ self.assertEquals(self.europe, self.item_2.location.continents()[0])
+
+ def testCollectionCountries(self):
+ "Test the MediaCollection.countries() method"
+ self.assertEquals(self.volonte.countries(), [self.belgique, self.france])
+
+
+class RelatedDeleteTestCase(unittest.TestCase):
+ def setUp(self):
+ self.publisher1 = Publisher.objects.create(id=1, value='publisher1')
+ self.publisher2 = Publisher.objects.create(id=2, value='publisher2')
+ self.pubcollection1 = PublisherCollection.objects.create(publisher=self.publisher1, value='pub1_collection1')
+
+ self.rights1 = LegalRight.objects.create(id=1, value='right1')
+
+ MediaCollection.objects.create(id=1, code='CNRSMH_I_1256_456', title='Collection1',
+ publisher=self.publisher1, publisher_collection=self.pubcollection1,
+ legal_rights=self.rights1)
+ MediaCollection.objects.create(id=2, code='CNRSMH_I_1256_123', title='Collection2',
+ publisher=self.publisher2)
+
+ def tearDown(self):
+ Publisher.objects.all().delete()
+ PublisherCollection.objects.all().delete()
+ LegalRight.objects.all().delete()
+ MediaCollection.objects.all().delete()
+
+ def testOnDeleteSetNull(self):
+ self.rights1.delete()
+ self.assertEquals(LegalRight.objects.filter(id=1).count(), 0)
+ q = MediaCollection.objects.filter(id=1)
+ self.assertEquals(q.count(), 1)
+ self.assertEquals(q[0].legal_rights, None)
+
+ def testOnDeleteCascade(self):
+ self.publisher1.delete()
+ self.assertEquals(Publisher.objects.filter(id=1).count(), 0)
+ self.assertEquals(Publisher.objects.filter(id=2).count(), 1)
+ self.assertEquals(PublisherCollection.objects.filter(id=1).count(), 0)
+
+ q = MediaCollection.objects.filter(id=1)
+ self.assertEquals(q.count(), 1)
+ self.assertEquals(q[0].publisher, None)
+ self.assertEquals(q[0].publisher_collection, None)
+
+ q = MediaCollection.objects.filter(id=2)
+ self.assertEquals(q.count(), 1)
+ self.assertEquals(q[0].publisher, self.publisher2)
+ self.assertEquals(q[0].publisher_collection, None)
+
+ def testOnDeleteMultiple(self):
+ Publisher.objects.all().delete()
+ self.assertEquals(Publisher.objects.count(), 0)
+ self.assertEquals(PublisherCollection.objects.count(), 0)
+ self.assertEquals(MediaCollection.objects.count(), 2)
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2010 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Authors: Olivier Guilyardi <olivier@samalyse.com>
+
+import unittest
+from telemeta.util.unaccent import unaccent_icmp
+
+class UnaccentTestCase(unittest.TestCase):
+ def testSorting(self):
+ strings = [u'Métro', u'évasion', u'àccent', u'È', u'île', u'arrivée', u'elle']
+ strings.sort(unaccent_icmp)
+ expected = [u'àccent', u'arrivée', u'È', u'elle', u'évasion', u'île', u'Métro']
+ self.assertEquals(strings, expected)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import timeside.api
+import timeside.exceptions
+import timeside.core
+import timeside.component
+import timeside.metadata
+import timeside.decoder
+import timeside.encoder
+import timeside.grapher
+import timeside.analyzer
+from timeside.core import *
--- /dev/null
+ # -*- coding: utf-8 -*-
+
+from core import *
+
+from duration import *
+from max_level import *
+from mean_level import *
+from dc import *
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Authors:
+# Guillaume Pellerin <yomguy at parisson.com>
+
+pass
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.analyzer.core import *
+from timeside.api import IValueAnalyzer
+import numpy
+
+class MeanDCShift(Processor):
+ implements(IValueAnalyzer)
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(MeanDCShift, self).setup(channels, samplerate, nframes)
+ self.value = 0
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "dc"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Mean DC shift"
+
+ @staticmethod
+ @interfacedoc
+ def unit():
+ return "%"
+
+ def __str__(self):
+ return "%s %s" % (str(self.value), unit())
+
+ def process(self, frames, eod=False):
+ self.value = numpy.round(100*numpy.mean(frames),3)
+ return frames, eod
+
+ def result(self):
+ return self.value
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.analyzer.core import *
+from timeside.api import IValueAnalyzer
+
+
+class Duration(Processor):
+ """A rather useless duration analyzer. Its only purpose is to test the
+ nframes characteristic."""
+ implements(IValueAnalyzer)
+
+ @interfacedoc
+ def setup(self, channels, samplerate, nframes):
+ if not nframes:
+ raise Exception("nframes argument required")
+ super(Duration, self).setup(channels, samplerate, nframes)
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "duration"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Duration"
+
+ @staticmethod
+ @interfacedoc
+ def unit():
+ return "seconds"
+
+ def __str__(self):
+ return "%s %s" % (str(self.value), unit())
+
+ def process(self, frames, eod=False):
+ return frames, eod
+
+ def result(self):
+ return self.input_nframes / float(self.input_samplerate)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+# Copyright (c) 2009 Olivier Guilyardi <olivier@samalyse.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.analyzer.core import *
+from timeside.api import IValueAnalyzer
+import numpy
+
+
+class MaxLevel(Processor):
+ implements(IValueAnalyzer)
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(MaxLevel, self).setup(channels, samplerate, nframes)
+ self.value = 0
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "maxlevel"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Max level"
+
+ @staticmethod
+ @interfacedoc
+ def unit():
+ return "dB"
+
+ def process(self, frames, eod=False):
+ max = round(20*numpy.log(frames.max()), 3)
+ if max > self.value:
+ self.max_value = max
+ return frames, eod
+
+ def result(self):
+ return self.value
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.analyzer.core import *
+from timeside.api import IValueAnalyzer
+import numpy
+
+
+class MeanLevel(Processor):
+ implements(IValueAnalyzer)
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(MeanLevel, self).setup(channels, samplerate, nframes)
+ self.value = -140
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "meanlevel"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Mean RMS level"
+
+ @staticmethod
+ @interfacedoc
+ def unit():
+ return "dB"
+
+ def __str__(self):
+ return "%s %s" % (str(self.value), unit())
+
+ def process(self, frames, eod=False):
+ value = numpy.round(20*numpy.log10(numpy.mean(numpy.sqrt(numpy.square(frames)))), 3)
+ if value > self.value:
+ self.value = value
+ return frames, eod
+
+ def result(self):
+ return self.value
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from timeside.analyzer.vamp.core import *
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from timeside.core import *
+from tempfile import NamedTemporaryFile
+from timeside.exceptions import SubProcessError
+import os
+import random
+import subprocess
+import signal
+import time
+
+class VampCoreAnalyzer:
+ """Parent class for Vamp plugin drivers"""
+
+ def __init__(self):
+ self.vamp_path = '/usr/lib/vamp/'
+ # needs vamp-examples package
+ self.host = 'vamp-simple-host'
+ self.buffer_size = 0xFFFF
+
+ def id(self):
+ return "vamp_plugins"
+
+ def name(self):
+ return "Vamp plugins"
+
+ def unit(self):
+ return ""
+
+ def get_plugins_list(self):
+ if os.path.exists(self.vamp_path):
+ args = ' --list-outputs'
+ command = self.host + args
+ #tmp_file = NamedTemporaryFile()
+ data = self.core_process(command, self.buffer_size)
+ text = ''
+ plugins = []
+ for chunk in data:
+ text = text + chunk
+ lines = text.split('\n')
+ for line in lines:
+ if line != '':
+ struct = line.split(':')
+ struct = struct[1:]
+ plugins.append(struct)
+ return plugins
+ else:
+ return []
+
+ def get_wav_path(self, media_item):
+ return settings.MEDIA_ROOT + '/' + media_item.file
+ #return media_item
+
+ def render(self, plugin, media_item):
+ self.wavFile = self.get_wav_path(media_item)
+ args = ' -s ' + ':'.join(plugin) + ' ' + str(self.wavFile)
+ command = command = self.host + args
+ data = self.core_process(command, self.buffer_size)
+ string = ''
+ values = {}
+ for chunk in data:
+ string = string + chunk
+ lines = string.split('\n')
+ for line in lines:
+ if line != '':
+ struct = line.split(':')
+ values[struct[0]] = struct[1]
+ return values
+
+ def core_process(self, command, buffer_size):
+ """Encode and stream audio data through a generator"""
+
+ __chunk = 0
+
+ try:
+ proc = subprocess.Popen(command,
+ shell = True,
+ bufsize = buffer_size,
+ stdin = subprocess.PIPE,
+ stdout = subprocess.PIPE,
+ close_fds = True)
+ except:
+ raise SubProcessError('Command failure:', command, proc)
+
+ # Core processing
+ while True:
+ __chunk = proc.stdout.read(buffer_size)
+ status = proc.poll()
+ if status != None and status != 0:
+ raise SubProcessError('Command failure:', command, proc)
+ if len(__chunk) == 0:
+ break
+ yield __chunk
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Parisson
+# Copyright (c) 2007 Olivier Guilyardi <olivier@samalyse.com>
+# Copyright (c) 2007-2009 Guillaume Pellerin <pellerin@parisson.com>
+#
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+from timeside.component import Interface
+
+class IProcessor(Interface):
+ """Common processor interface"""
+
+ @staticmethod
+ def id():
+ """Short alphanumeric, lower-case string which uniquely identify this
+ processor, suitable for use as an HTTP/GET argument value, in filenames,
+ etc..."""
+
+ # implementation: only letters and digits are allowed. An exception will
+ # be raised by MetaProcessor if the id is malformed or not unique amongst
+ # registered processors.
+
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ """Allocate internal resources and reset state, so that this processor is
+ ready for a new run.
+
+ The channels, samplerate and/or nframes arguments may be required by
+ processors which accept input. An error will occur if any of
+ these arguments is passed to an output-only processor such as a decoder.
+ """
+
+ # implementations should always call the parent method
+
+ def channels(self):
+ """Number of channels in the data returned by process(). May be different from
+ the number of channels passed to setup()"""
+
+ def samplerate(self):
+ """Samplerate of the data returned by process(). May be different from
+ the samplerate passed to setup()"""
+
+ def nframes():
+ """The total number of frames that this processor can output, or None if
+ the duration is unknown."""
+
+ def process(self, frames=None, eod=False):
+ """Process input frames and return a (output_frames, eod) tuple.
+ Both input and output frames are 2D numpy arrays, where columns are
+ channels, and containing an undetermined number of frames. eod=True
+ means that the end-of-data has been reached.
+
+ Output-only processors (such as decoders) will raise an exception if the
+ frames argument is not None. All processors (even encoders) return data,
+ even if that means returning the input unchanged.
+
+ Warning: it is required to call setup() before this method."""
+
+ def release(self):
+ """Release resources owned by this processor. The processor cannot
+ be used anymore after calling this method."""
+
+ # implementations should always call the parent method
+
+class IEncoder(IProcessor):
+ """Encoder driver interface. Each encoder is expected to support a specific
+ format."""
+
+ def __init__(self, output):
+ """Create a new encoder. output can either be a filename or a python callback
+ function/method for streaming mode.
+
+ The streaming callback prototype is: callback(data, eod)
+ Where data is a block of binary data of an undetermined size, and eod
+ True when end-of-data is reached."""
+
+ # implementation: the constructor must always accept the output argument. It may
+ # accept extra arguments such as bitrate, depth, etc.., but these must be optionnal
+
+ @staticmethod
+ def format():
+ """Return the encode/encoding format as a short string
+ Example: "MP3", "OGG", "AVI", ...
+ """
+
+ @staticmethod
+ def description():
+ """Return a string describing what this encode format provides, is good
+ for, etc... The description is meant to help the end user decide what
+ format is good for him/her
+ """
+
+ @staticmethod
+ def file_extension():
+ """Return the filename extension corresponding to this encode format"""
+
+ @staticmethod
+ def mime_type():
+ """Return the mime type corresponding to this encode format"""
+
+ def set_metadata(self, metadata):
+ """Set the metadata to be embedded in the encoded output.
+
+ In non-streaming mode, this method updates the metadata directly into the
+ output file, without re-encoding the audio data, provided this file already
+ exists.
+
+ It isn't required to call this method, but if called, it must be before
+ process()."""
+
+class IDecoder(IProcessor):
+ """Decoder driver interface. Decoders are different of encoders in that
+ a given driver may support several input formats, hence this interface doesn't
+ export any static method, all informations are dynamic."""
+
+ def __init__(self, filename):
+ """Create a new decoder for filename."""
+ # implementation: additional optionnal arguments are allowed
+
+ def format():
+ """Return a user-friendly file format string"""
+
+ def encoding():
+ """Return a user-friendly encoding string"""
+
+ def resolution():
+ """Return the sample width (8, 16, etc..) of original audio file/stream,
+ or None if not applicable/known"""
+
+ def metadata(self):
+ """Return the metadata embedded into the encoded stream, if any."""
+
+class IGrapher(IProcessor):
+ """Media item visualizer driver interface"""
+
+ # implementation: graphers which need to know the total number of frames
+ # should raise an exception in setup() if the nframes argument is None
+
+ def __init__(self, width, height):
+ """Create a new grapher. width and height are generally
+ in pixels but could be something else for eg. svg rendering, etc.. """
+
+ # implementation: additional optionnal arguments are allowed
+
+ @staticmethod
+ def name():
+ """Return the graph name, such as "Waveform", "Spectral view",
+ etc.. """
+
+ def set_colors(self, background=None, scheme=None):
+ """Set the colors used for image generation. background is a RGB tuple,
+ and scheme a a predefined color theme name"""
+
+ def render(self, output=None):
+ """Return a PIL Image object visually representing all of the data passed
+ by repeatedly calling process() and write the image to the output if specified"""
+
+class IAnalyzer(IProcessor):
+ """Media item analyzer driver interface. This interface is abstract, it doesn't
+ describe a particular type of analyzer but is rather meant to group analyzers.
+ In particular, the way the result is returned may greatly vary from sub-interface
+ to sub-interface. For example the IValueAnalyzer returns a final single numeric
+ result at the end of the whole analysis. But some other analyzers may return
+ numpy arrays, and this, either at the end of the analysis, or from process()
+ for each block of data (as in Vamp)."""
+
+ def __init__(self):
+ """Create a new analyzer."""
+ # implementation: additional optionnal arguments are allowed
+
+ @staticmethod
+ def name():
+ """Return the analyzer name, such as "Mean Level", "Max level",
+ "Total length, etc.. """
+
+ @staticmethod
+ def unit():
+ """Return the unit of the data such as "dB", "seconds", etc... """
+
+class IValueAnalyzer(IAnalyzer):
+ """Interface for analyzers which return a single numeric value from result()"""
+
+ def result():
+ """Return the final result of the analysis performed over the data passed by
+ repeatedly calling process()"""
+
+ def __str__(self):
+ """Return a human readable string containing both result and unit
+ ('5.30dB', '4.2s', etc...)"""
+
+class IEffect(IProcessor):
+ """Effect processor interface"""
+
+ def __init__(self):
+ """Create a new effect."""
+ # implementation: additional optionnal arguments are allowed
+
+ @staticmethod
+ def name():
+ """Return the effect name"""
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009 Olivier Guilyardi <olivier@samalyse.com>
+#
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This file defines a generic object interface mechanism and
+# a way to determine which components implements a given interface.
+#
+# For example, the following defines the Music class as implementing the
+# listenable interface.
+#
+# class Listenable(Interface):
+# pass
+#
+# class Music(Component):
+# implements(Listenable)
+#
+# Several class can implements a such interface, and it is possible to
+# discover which class implements it with implementations():
+#
+# list_of_classes = implementations(Listenable)
+#
+# This mechanism support inheritance of interfaces: a class implementing a given
+# interface is also considered to implement all the ascendants of this interface.
+#
+# However, inheritance is not supported for components. The descendants of a class
+# implementing a given interface are not automatically considered to implement this
+# interface too.
+
+__all__ = ['Component', 'MetaComponent', 'implements', 'abstract',
+ 'interfacedoc', 'Interface', 'implementations', 'ComponentError']
+
+class Interface(object):
+ """Marker base class for interfaces."""
+
+def implements(*interfaces):
+ """Registers the interfaces implemented by a component when placed in the
+ class header"""
+ MetaComponent.implements.extend(interfaces)
+
+def abstract():
+ """Declare a component as abstract when placed in the class header"""
+ MetaComponent.abstract = True
+
+def implementations(interface, recurse=True, abstract=False):
+ """Returns the components implementing interface, and if recurse, any of
+ the descendants of interface. If abstract is True, also return the
+ abstract implementations."""
+ result = []
+ find_implementations(interface, recurse, abstract, result)
+ return result
+
+def interfacedoc(func):
+ if isinstance(func, staticmethod):
+ raise ComponentError("@interfacedoc can't handle staticmethod (try to put @staticmethod above @interfacedoc)")
+
+ if not func.__doc__:
+ func.__doc__ = "@interfacedoc"
+ func._interfacedoc = True
+ return func
+
+class MetaComponent(type):
+ """Metaclass of the Component class, used mainly to register the interface
+ declared to be implemented by a component."""
+
+ implementations = []
+ implements = []
+ abstract = False
+
+ def __new__(cls, name, bases, d):
+ new_class = type.__new__(cls, name, bases, d)
+
+ # Register implementations
+ if MetaComponent.implements:
+ for i in MetaComponent.implements:
+ MetaComponent.implementations.append({
+ 'interface': i,
+ 'class': new_class,
+ 'abstract': MetaComponent.abstract})
+
+ # Propagate @interfacedoc
+ for name in new_class.__dict__:
+ member = new_class.__dict__[name]
+ if isinstance(member, staticmethod):
+ member = getattr(new_class, name)
+
+ if member.__doc__ == "@interfacedoc":
+ if_member = None
+ for i in MetaComponent.implements:
+ if hasattr(i, name):
+ if_member = getattr(i, name)
+ if not if_member:
+ raise ComponentError("@interfacedoc: %s.%s: no such member in implemented interfaces: %s"
+ % (new_class.__name__, name, str(MetaComponent.implements)))
+ member.__doc__ = if_member.__doc__
+
+ MetaComponent.implements = []
+ MetaComponent.abstract = False
+
+ return new_class
+
+class Component(object):
+ """Base class of all components"""
+ __metaclass__ = MetaComponent
+
+def extend_unique(list1, list2):
+ """Extend list1 with list2 as list.extend(), but doesn't append duplicates
+ to list1"""
+ for item in list2:
+ if item not in list1:
+ list1.append(item)
+
+def find_implementations(interface, recurse, abstract, result):
+ """Find implementations of an interface or of one of its descendants and
+ extend result with the classes found."""
+ for item in MetaComponent.implementations:
+ if (item['interface'] == interface and (abstract or not item['abstract'])):
+ extend_unique(result, [item['class']])
+
+ if recurse:
+ subinterfaces = interface.__subclasses__()
+ if subinterfaces:
+ for i in subinterfaces:
+ find_implementations(i, recurse, abstract, result)
+
+class ComponentError(Exception):
+ pass
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009 Olivier Guilyardi <olivier@samalyse.com>
+#
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+from timeside.component import *
+from timeside.api import IProcessor
+from timeside.exceptions import Error, ApiError
+import re
+import numpy
+
+__all__ = ['Processor', 'MetaProcessor', 'implements', 'abstract',
+ 'interfacedoc', 'processors', 'get_processor', 'ProcessPipe',
+ 'FixedSizeInputAdapter']
+
+_processors = {}
+
+class MetaProcessor(MetaComponent):
+ """Metaclass of the Processor class, used mainly for ensuring that processor
+ id's are wellformed and unique"""
+
+ valid_id = re.compile("^[a-z][_a-z0-9]*$")
+
+ def __new__(cls, name, bases, d):
+ new_class = MetaComponent.__new__(cls, name, bases, d)
+ if new_class in implementations(IProcessor):
+ id = str(new_class.id())
+ if _processors.has_key(id):
+ raise ApiError("%s and %s have the same id: '%s'"
+ % (new_class.__name__, _processors[id].__name__, id))
+ if not MetaProcessor.valid_id.match(id):
+ raise ApiError("%s has a malformed id: '%s'"
+ % (new_class.__name__, id))
+
+ _processors[id] = new_class
+
+ return new_class
+
+class Processor(Component):
+ """Base component class of all processors"""
+ __metaclass__ = MetaProcessor
+
+ abstract()
+ implements(IProcessor)
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ self.input_channels = channels
+ self.input_samplerate = samplerate
+ self.input_nframes = nframes
+
+ # default channels(), samplerate() and nframes() implementations returns
+ # the input characteristics, but processors may change this behaviour by
+ # overloading those methods
+ @interfacedoc
+ def channels(self):
+ return self.input_channels
+
+ @interfacedoc
+ def samplerate(self):
+ return self.input_samplerate
+
+ @interfacedoc
+ def nframes(self):
+ return self.input_nframes
+
+ @interfacedoc
+ def process(self, frames, eod):
+ return frames, eod
+
+ @interfacedoc
+ def release(self):
+ pass
+
+ def __del__(self):
+ self.release()
+
+ def __or__(self, other):
+ return ProcessPipe(self, other)
+
+class FixedSizeInputAdapter(object):
+ """Utility to make it easier to write processors which require fixed-sized
+ input buffers."""
+
+ def __init__(self, buffer_size, channels, pad=False):
+ """Construct a new adapter: buffer_size is the desired buffer size in frames,
+ channels the number of channels, and pad indicates whether the last block should
+ be padded with zeros."""
+
+ self.buffer = numpy.empty((buffer_size, channels))
+ self.buffer_size = buffer_size
+ self.len = 0
+ self.pad = pad
+
+ def nframes(self, input_nframes):
+ """Return the total number of frames that this adapter will output according to the
+ input_nframes argument"""
+
+ nframes = input_nframes
+ if self.pad:
+ mod = input_nframes % self.buffer_size
+ if mod:
+ nframes += self.buffer_size - mod
+
+ return nframes
+
+
+ def process(self, frames, eod):
+ """Returns an iterator over tuples of the form (buffer, eod) where buffer is a
+ fixed-sized block of data, and eod indicates whether this is the last block.
+ In case padding is deactivated the last block may be smaller than the buffer size.
+ """
+ src_index = 0
+ remaining = len(frames)
+
+ while remaining:
+ space = self.buffer_size - self.len
+ copylen = remaining < space and remaining or space
+ src = frames[src_index:src_index + copylen]
+ if self.len == 0 and copylen == self.buffer_size:
+ # avoid unnecessary copy
+ buffer = src
+ else:
+ buffer = self.buffer
+ buffer[self.len:self.len + copylen] = src
+
+ remaining -= copylen
+ src_index += copylen
+ self.len += copylen
+
+ if self.len == self.buffer_size:
+ yield buffer, (eod and not remaining)
+ self.len = 0
+
+ if eod and self.len:
+ block = self.buffer
+ if self.pad:
+ self.buffer[self.len:self.buffer_size] = 0
+ else:
+ block = self.buffer[0:self.len]
+
+ yield block, True
+ self.len = 0
+
+def processors(interface=IProcessor, recurse=True):
+ """Returns the processors implementing a given interface and, if recurse,
+ any of the descendants of this interface."""
+ return implementations(interface, recurse)
+
+
+def get_processor(processor_id):
+ """Return a processor by its id"""
+ if not _processors.has_key(processor_id):
+ raise Error("No processor registered with id: '%s'"
+ % processor_id)
+
+ return _processors[processor_id]
+
+class ProcessPipe(object):
+ """Handle a pipe of processors"""
+
+ def __init__(self, *others):
+ self.processors = []
+ self |= others
+
+ def __or__(self, other):
+ return ProcessPipe(self, other)
+
+ def __ior__(self, other):
+ if isinstance(other, Processor):
+ self.processors.append(other)
+ elif isinstance(other, ProcessPipe):
+ self.processors.extend(other.processors)
+ else:
+ try:
+ iter(other)
+ except TypeError:
+ raise Error("Can not add this type of object to a pipe: %s", str(other))
+
+ for item in other:
+ self |= item
+
+ return self
+
+ def run(self):
+ """Setup/reset all processors in cascade and stream audio data along
+ the pipe. Also returns the pipe itself."""
+
+ source = self.processors[0]
+ items = self.processors[1:]
+
+ # setup/reset processors and configure channels and samplerate throughout the pipe
+ source.setup()
+ last = source
+ for item in items:
+ item.setup(last.channels(), last.samplerate(), last.nframes())
+ last = item
+
+ # now stream audio data along the pipe
+ eod = False
+ while not eod:
+ frames, eod = source.process()
+ for item in items:
+ frames, eod = item.process(frames, eod)
+
+ return self
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import timeside.core
+from core import *
--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2007-2009 Parisson
+# Copyright (c) 2007 Olivier Guilyardi <olivier@samalyse.com>
+# Copyright (c) 2007-2009 Guillaume Pellerin <pellerin@parisson.com>
+#
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Paul Brossier <piem@piem.org>
+
+from timeside.core import Processor, implements, interfacedoc
+from timeside.api import IDecoder
+from numpy import array, frombuffer, getbuffer, float32
+
+import pygst
+pygst.require('0.10')
+import gst
+import gobject
+gobject.threads_init ()
+
+
+class FileDecoder(Processor):
+ """ gstreamer-based decoder """
+ implements(IDecoder)
+
+ # duration ms, before discovery process times out
+ MAX_DISCOVERY_TIME = 3000
+
+ audioformat = None
+ audiochannels = None
+ audiorate = None
+ audionframes = None
+ mimetype = ''
+
+ # IProcessor methods
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "gstreamerdec"
+
+ def setup(self, channels = None, samplerate = None, nframes = None):
+ # the output data format we want
+ caps = "audio/x-raw-float, width=32"
+ pipeline = gst.parse_launch('''uridecodebin uri="%s"
+ ! audioconvert
+ ! %s
+ ! appsink name=sink sync=False ''' % (self.uri, caps))
+ # store a pointer to appsink in our decoder object
+ self.sink = pipeline.get_by_name('sink')
+ # adjust length of emitted buffers
+ # self.sink.set_property('blocksize', 0x10000)
+ # start pipeline
+ pipeline.set_state(gst.STATE_PLAYING)
+
+ @interfacedoc
+ def channels(self):
+ return self.audiochannels
+
+ @interfacedoc
+ def samplerate(self):
+ return self.audiorate
+
+ @interfacedoc
+ def nframes(self):
+ return self.audionframes
+
+ @interfacedoc
+ def process(self, frames = None, eod = False):
+ try:
+ buf = self.sink.emit('pull-buffer')
+ except SystemError, e:
+ # should never happen
+ print 'SystemError', e
+ return array([0.]), True
+ if buf == None:
+ return array([0.]), True
+ return self.gst_buffer_to_numpy_array(buf), False
+
+ @interfacedoc
+ def release(self):
+ # nothing to do for now
+ pass
+
+ ## IDecoder methods
+
+ @interfacedoc
+ def __init__(self, uri):
+
+ # is this a file?
+ import os.path
+ if os.path.exists(uri):
+ # get the absolute path
+ uri = os.path.abspath(uri)
+ # first run the file/uri through the discover pipeline
+ self.discover(uri)
+ # and make a uri of it
+ from urllib import quote
+ self.uri = 'file://'+quote(uri)
+ else:
+ self.uri = uri
+
+ @interfacedoc
+ def format(self):
+ # TODO check
+ if self.mimetype == 'application/x-id3':
+ self.mimetype = 'audio/mpeg'
+ return self.mimetype
+
+ @interfacedoc
+ def encoding(self):
+ # TODO check
+ return self.mimetype.split('/')[-1]
+
+ @interfacedoc
+ def resolution(self):
+ # TODO check: width or depth?
+ return self.audiowidth
+
+ @interfacedoc
+ def metadata(self):
+ # TODO check
+ return self.tags
+
+ ## gst.extend discoverer
+
+ def discover(self, path):
+ """ gstreamer based helper function to get file attributes """
+ from gst.extend import discoverer
+ d = discoverer.Discoverer(path, timeout = self.MAX_DISCOVERY_TIME)
+ d.connect('discovered', self.discovered)
+ self.mainloop = gobject.MainLoop()
+ d.discover()
+ self.mainloop.run()
+
+ def discovered(self, d, is_media):
+ """ gstreamer based helper executed upon discover() completion """
+ if is_media and d.is_audio:
+ # copy the discoverer attributes to self
+ self.audiorate = d.audiorate
+ self.mimetype= d.mimetype
+ self.audiochannels = d.audiochannels
+ self.audiowidth = d.audiowidth
+ # conversion from time in nanoseconds to frames
+ from math import ceil
+ duration = d.audiorate * d.audiolength * 1.e-9
+ self.audionframes = int (ceil ( duration ) )
+ self.tags = d.tags
+ elif not d.is_audio:
+ print "error, no audio found!"
+ else:
+ print "fail", path
+ self.mainloop.quit()
+
+ def gst_buffer_to_numpy_array(self, buf):
+ """ gstreamer buffer to numpy array conversion """
+ chan = self.audiochannels
+ samples = frombuffer(buf.data, dtype=float32)
+ samples.resize([len(samples)/chan, chan])
+ return samples
+
+
+class SubProcessPipe:
+
+ def __init__(self, command, stdin=None):
+ """Read media and stream data through a generator.
+ Taken from Telemeta (see http://telemeta.org)"""
+
+ self.buffer_size = 0xFFFF
+
+ if not stdin:
+ stdin = subprocess.PIPE
+
+ self.proc = subprocess.Popen(command.encode('utf-8'),
+ shell = True,
+ bufsize = self.buffer_size,
+ stdin = stdin,
+ stdout = subprocess.PIPE,
+ close_fds = True)
+
+ self.input = self.proc.stdin
+ self.output = self.proc.stdout
+
+
+class DecoderSubProcessCore(Processor):
+ """Defines the main parts of the decoding tools :
+ paths, metadata parsing, data streaming thru system command"""
+
+ def __init__(self):
+ self.command = 'ffmpeg -i "%s" -f wav - '
+
+ def process(self, source, options=None):
+ """Encode and stream audio data through a generator"""
+
+ command = self.command % source
+ proc = SubProcessPipe(command)
+ return proc.output
+
+ #while True:
+ #__chunk = proc.output.read(self.proc.buffer_size)
+ #status = proc.poll()
+ #if status != None and status != 0:
+ #raise ExportProcessError('Command failure:', command, proc)
+ #if len(__chunk) == 0:
+ #break
+ #yield __chunk
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from core import *
+from ogg import *
+from wav import *
+from mp3 import *
+from m4a import *
+#from timeside.encoder.flac import *
--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from timeside.core import *
+import subprocess
+
+class SubProcessPipe:
+ """Read media and stream data through a generator.
+ Taken from Telemeta (see http://telemeta.org)"""
+
+ def __init__(self, command, stdin=None):
+ self.buffer_size = 0xFFFF
+ if not stdin:
+ stdin = subprocess.PIPE
+
+ self.proc = subprocess.Popen(command.encode('utf-8'),
+ shell = True,
+ bufsize = self.buffer_size,
+ stdin = stdin,
+ stdout = subprocess.PIPE,
+ close_fds = True)
+
+ self.input = self.proc.stdin
+ self.output = self.proc.stdout
+
+class EncoderSubProcessCore(Processor):
+ """Defines the main parts of the encoding tools :
+ paths, metadata parsing, data streaming thru system command"""
+
+ def core_process(self, command, stdin):
+ """Encode and stream audio data through a generator"""
+
+ proc = SubProcessPipe(command, stdin)
+
+ while True:
+ __chunk = proc.output.read(proc.buffer_size)
+ #status = proc.poll()
+ #if status != None and status != 0:
+ #raise EncodeProcessError('Command failure:', command, proc)
+ if len(__chunk) == 0:
+ break
+ yield __chunk
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+import os
+import string
+import subprocess
+
+from timeside.encoder.core import *
+from timeside.api import IEncoder
+from tempfile import NamedTemporaryFile
+
+class FlacEncoder(EncoderCore):
+ """Defines methods to encode to FLAC"""
+
+ implements(IEncoder)
+
+ def __init__(self):
+ self.quality_default = '-5'
+ self.dub2args_dict = {'creator': 'artist',
+ 'relation': 'album'
+ }
+
+ @staticmethod
+ def id():
+ return "flacenc"
+
+ def format(self):
+ return 'FLAC'
+
+ def file_extension(self):
+ return 'flac'
+
+ def mime_type(self):
+ return 'audio/x-flac'
+
+ def description(self):
+ return """
+ Free Lossless Audio Codec (FLAC) is a file format for lossless audio
+ data compression.
+ """
+
+ def get_file_info(self):
+ try:
+ file1, file2 = os.popen4('metaflac --list "'+self.dest+'"')
+ info = []
+ for line in file2.readlines():
+ info.append(clean_word(line[:-1]))
+ self.info = info
+ return self.info
+ except:
+ raise IOError('EncoderError: metaflac is not installed or ' + \
+ 'file does not exist.')
+
+ def write_tags(self, file):
+ from mutagen.flac import FLAC
+ media = FLAC(file)
+ for tag in self.metadata:
+ name = tag[0]
+ value = clean_word(tag[1])
+ if name in self.dub2args_dict.keys():
+ name = self.dub2args_dict[name]
+ if name == 'comment':
+ media['DESCRIPTION'] = unicode(value)
+ else:
+ media[name] = unicode(value)
+ try:
+ media.save()
+ except:
+ raise IOError('EncoderError: cannot write tags.')
+
+
+ def get_args(self,options=None):
+ """Get process options and return arguments for the encoder"""
+ args = []
+ if not options is None:
+ self.options = options
+ if not ('verbose' in self.options and self.options['verbose'] != '0'):
+ args.append('-s')
+ if 'flac_quality' in self.options:
+ args.append('-f ' + self.options['flac_quality'])
+ else:
+ args.append('-f ' + self.quality_default)
+ else:
+ args.append('-s -f ' + self.quality_default)
+
+ #for tag in self.metadata.keys():
+ #value = clean_word(self.metadata[tag])
+ #args.append('-c %s="%s"' % (tag, value))
+ #if tag in self.dub2args_dict.keys():
+ #arg = self.dub2args_dict[tag]
+ #args.append('-c %s="%s"' % (arg, value))
+
+ return args
+
+ def process(self, source, metadata, options=None):
+ buffer_size = 0xFFFF
+ self.metadata= metadata
+ self.options = options
+ args = self.get_args()
+ args = ' '.join(args)
+ ext = self.file_extension()
+ temp_file = NamedTemporaryFile()
+ command = 'flac %s - -o %s ' % (args, temp_file.name)
+
+ stream = self.core_process(command, source)
+
+ for __chunk in stream:
+ #temp_file.write(__chunk)
+ #temp_file.flush()
+ pass
+
+ #self.write_tags(temp_file.name)
+
+ while True:
+ __chunk = temp_file.read(buffer_size)
+ if len(__chunk) == 0:
+ break
+ yield __chunk
+
+ temp_file.close()
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2010 Paul Brossier <piem@piem.org>
+# Copyright (c) 2010 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+
+from timeside.core import Processor, implements, interfacedoc
+from timeside.api import IEncoder
+from numpy import array, frombuffer, getbuffer, float32
+
+import pygst
+pygst.require('0.10')
+import gst
+import gobject
+gobject.threads_init ()
+
+
+class AacEncoder(Processor):
+ """ gstreamer-based AAC encoder """
+ implements(IEncoder)
+
+ def __init__(self, output):
+ self.file = None
+ if isinstance(output, basestring):
+ self.filename = output
+ else:
+ raise Exception("Streaming not supported")
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(AacEncoder, self).setup(channels, samplerate, nframes)
+ # TODO open file for writing
+ # the output data format we want
+ pipeline = gst.parse_launch(''' appsrc name=src
+ ! audioconvert
+ ! faac
+ ! filesink location=%s ''' % self.filename)
+ # store a pointer to appsink in our encoder object
+ self.src = pipeline.get_by_name('src')
+ srccaps = gst.Caps("""audio/x-raw-float,
+ endianness=(int)1234,
+ channels=(int)%s,
+ width=(int)32,
+ rate=(int)%d""" % (int(channels), int(samplerate)))
+ self.src.set_property("caps", srccaps)
+
+ # start pipeline
+ pipeline.set_state(gst.STATE_PLAYING)
+ self.pipeline = pipeline
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "gst_aac_enc"
+
+ @staticmethod
+ @interfacedoc
+ def description():
+ return "AAC GStreamer based encoder"
+
+ @staticmethod
+ @interfacedoc
+ def format():
+ return "AAC"
+
+ @staticmethod
+ @interfacedoc
+ def file_extension():
+ return "m4a"
+
+ @staticmethod
+ @interfacedoc
+ def mime_type():
+ return "audio/x-m4a"
+
+ @interfacedoc
+ def set_metadata(self, metadata):
+ #TODO
+ pass
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ buf = self.numpy_array_to_gst_buffer(frames)
+ self.src.emit('push-buffer', buf)
+ if eod: self.src.emit('end-of-stream')
+ return frames, eod
+
+ def numpy_array_to_gst_buffer(self, frames):
+ """ gstreamer buffer to numpy array conversion """
+ buf = gst.Buffer(getbuffer(frames))
+ return buf
+
+
+
--- /dev/null
+ # -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Parisson SARL
+# Copyright (c) 2006-2007 Guillaume Pellerin <pellerin@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Authors: Guillaume Pellerin <yomguy@parisson.com>
+# Paul Brossier <piem@piem.org>
+
+from timeside.core import Processor, implements, interfacedoc
+from timeside.api import IEncoder
+from numpy import array, frombuffer, getbuffer, float32
+
+import pygst
+pygst.require('0.10')
+import gst
+import gobject
+gobject.threads_init ()
+
+
+class Mp3Encoder(Processor):
+ """ gstreamer-based mp3 encoder """
+ implements(IEncoder)
+
+ def __init__(self, output):
+ self.file = None
+ if isinstance(output, basestring):
+ self.filename = output
+ else:
+ raise Exception("Streaming not supported")
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(Mp3Encoder, self).setup(channels, samplerate, nframes)
+ #TODO: open file for writing
+ # the output data format we want
+ pipeline = gst.parse_launch(''' appsrc name=src
+ ! audioconvert
+ ! lame name=enc vbr=0 bitrate=256 ! id3v2mux
+ ! filesink location=%s ''' % self.filename)
+ # store a pointer to appsink in our encoder object
+ self.src = pipeline.get_by_name('src')
+ srccaps = gst.Caps("""audio/x-raw-float,
+ endianness=(int)1234,
+ channels=(int)%s,
+ width=(int)32,
+ rate=(int)%d""" % (int(channels), int(samplerate)))
+ self.src.set_property("caps", srccaps)
+
+ # start pipeline
+ pipeline.set_state(gst.STATE_PLAYING)
+ self.pipeline = pipeline
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "gst_mp3_enc"
+
+ @staticmethod
+ @interfacedoc
+ def description():
+ return "MP3 GStreamer based encoder"
+
+ @staticmethod
+ @interfacedoc
+ def format():
+ return "MP3"
+
+ @staticmethod
+ @interfacedoc
+ def file_extension():
+ return "mp3"
+
+ @staticmethod
+ @interfacedoc
+ def mime_type():
+ return "audio/mpeg"
+
+ @interfacedoc
+ def set_metadata(self, metadata):
+ #TODO:
+ pass
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ buf = self.numpy_array_to_gst_buffer(frames)
+ self.src.emit('push-buffer', buf)
+ if eod: self.src.emit('end-of-stream')
+ return frames, eod
+
+ def numpy_array_to_gst_buffer(self, frames):
+ """ gstreamer buffer to numpy array conversion """
+ buf = gst.Buffer(getbuffer(frames))
+ return buf
+
+
+class Mp3EncoderOld:
+ """Defines methods to encode to MP3"""
+
+# implements(IEncoder)
+
+ def __init__(self):
+ import os
+ import string
+ import subprocess
+ self.bitrate_default = '192'
+ self.dub2id3_dict = {'title': 'TIT2', #title2
+ 'creator': 'TCOM', #composer
+ 'creator': 'TPE1', #lead
+ 'identifier': 'UFID', #Unique ID...
+ 'identifier': 'TALB', #album
+ 'type': 'TCON', #genre
+ 'publisher': 'TPUB', #comment
+ #'date': 'TYER', #year
+ }
+ self.dub2args_dict = {'title': 'tt', #title2
+ 'creator': 'ta', #composerS
+ 'relation': 'tl', #album
+ #'type': 'tg', #genre
+ 'publisher': 'tc', #comment
+ 'date': 'ty', #year
+ }
+
+ @staticmethod
+ def id():
+ return "mp3enc"
+
+ def format(self):
+ return 'MP3'
+
+ def file_extension(self):
+ return 'mp3'
+
+ def mime_type(self):
+ return 'audio/mpeg'
+
+ def description(self):
+ return """
+ MPEG-1 Audio Layer 3, more commonly referred to as MP3, is a patented
+ digital audio encoding format using a form of lossy data compression.
+ """
+
+ def get_file_info(self):
+ try:
+ file_out1, file_out2 = os.popen4('mp3info "'+self.dest+'"')
+ info = []
+ for line in file_out2.readlines():
+ info.append(clean_word(line[:-1]))
+ self.info = info
+ return self.info
+ except:
+ raise IOError('EncoderError: file does not exist.')
+
+ def write_tags(self):
+ """Write all ID3v2.4 tags by mapping dub2id3_dict dictionnary with the
+ respect of mutagen classes and methods"""
+ from mutagen import id3
+ id3 = id3.ID3(self.dest)
+ for tag in self.metadata.keys():
+ if tag in self.dub2id3_dict.keys():
+ frame_text = self.dub2id3_dict[tag]
+ value = self.metadata[tag]
+ frame = mutagen.id3.Frames[frame_text](3,value)
+ try:
+ id3.add(frame)
+ except:
+ raise IOError('EncoderError: cannot tag "'+tag+'"')
+ try:
+ id3.save()
+ except:
+ raise IOError('EncoderError: cannot write tags')
+
+ def get_args(self):
+ """Get process options and return arguments for the encoder"""
+ args = []
+ if not self.options is None:
+ if not ( 'verbose' in self.options and self.options['verbose'] != '0' ):
+ args.append('-S')
+ if 'mp3_bitrate' in self.options:
+ args.append('-b ' + self.options['mp3_bitrate'])
+ else:
+ args.append('-b '+self.bitrate_default)
+ #Copyrights, etc..
+ args.append('-c -o')
+ else:
+ args.append('-S -c --tt "unknown" -o')
+
+ for tag in self.metadata:
+ name = tag[0]
+ value = clean_word(tag[1])
+ if name in self.dub2args_dict.keys():
+ arg = self.dub2args_dict[name]
+ args.append('--' + arg + ' "' + value + '"')
+ return args
+
+ def process(self, source, metadata, options=None):
+ self.metadata = metadata
+ self.options = options
+ args = self.get_args()
+ args = ' '.join(args)
+ command = 'lame %s - -' % args
+
+ stream = self.core_process(command, source)
+ for __chunk in stream:
+ yield __chunk
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2010 Paul Brossier <piem@piem.org>
+# Copyright (c) 2010 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+
+from timeside.core import Processor, implements, interfacedoc
+from timeside.api import IEncoder
+from numpy import array, frombuffer, getbuffer, float32
+
+import pygst
+pygst.require('0.10')
+import gst
+import gobject
+gobject.threads_init ()
+
+
+class VorbisEncoder(Processor):
+ """ gstreamer-based vorbis encoder """
+ implements(IEncoder)
+
+ def __init__(self, output):
+ self.file = None
+ if isinstance(output, basestring):
+ self.filename = output
+ else:
+ raise Exception("Streaming not supported")
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(VorbisEncoder, self).setup(channels, samplerate, nframes)
+ # TODO open file for writing
+ # the output data format we want
+ pipeline = gst.parse_launch(''' appsrc name=src
+ ! audioconvert
+ ! vorbisenc
+ ! oggmux
+ ! filesink location=%s ''' % self.filename)
+ # store a pointer to appsink in our encoder object
+ self.src = pipeline.get_by_name('src')
+ srccaps = gst.Caps("""audio/x-raw-float,
+ endianness=(int)1234,
+ channels=(int)%s,
+ width=(int)32,
+ rate=(int)%d""" % (int(channels), int(samplerate)))
+ self.src.set_property("caps", srccaps)
+
+ # start pipeline
+ pipeline.set_state(gst.STATE_PLAYING)
+ self.pipeline = pipeline
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "gst_vorbis_enc"
+
+ @staticmethod
+ @interfacedoc
+ def description():
+ return "Vorbis GStreamer based encoder"
+
+ @staticmethod
+ @interfacedoc
+ def format():
+ return "OGG"
+
+ @staticmethod
+ @interfacedoc
+ def file_extension():
+ return "ogg"
+
+ @staticmethod
+ @interfacedoc
+ def mime_type():
+ return "application/ogg"
+
+ @interfacedoc
+ def set_metadata(self, metadata):
+ #TODO
+ pass
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ buf = self.numpy_array_to_gst_buffer(frames)
+ self.src.emit('push-buffer', buf)
+ if eod: self.src.emit('end-of-stream')
+ return frames, eod
+
+ def numpy_array_to_gst_buffer(self, frames):
+ """ gstreamer buffer to numpy array conversion """
+ buf = gst.Buffer(getbuffer(frames))
+ return buf
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2010 Parisson
+# Copyright (c) 2010 Paul Brossier <piem@piem.org>
+#
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Paul Brossier <piem@piem.org>
+
+from timeside.core import Processor, implements, interfacedoc
+from timeside.api import IEncoder
+from numpy import array, frombuffer, getbuffer, float32
+
+import pygst
+pygst.require('0.10')
+import gst
+import gobject
+gobject.threads_init ()
+
+
+class WavEncoder(Processor):
+ """ gstreamer-based encoder """
+ implements(IEncoder)
+
+ def __init__(self, output):
+ self.file = None
+ if isinstance(output, basestring):
+ self.filename = output
+ else:
+ raise Exception("Streaming not supported")
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(WavEncoder, self).setup(channels, samplerate, nframes)
+ # TODO open file for writing
+ # the output data format we want
+ pipeline = gst.parse_launch(''' appsrc name=src
+ ! audioconvert
+ ! wavenc
+ ! filesink location=%s ''' % self.filename)
+ # store a pointer to appsink in our encoder object
+ self.src = pipeline.get_by_name('src')
+ srccaps = gst.Caps("""audio/x-raw-float,
+ endianness=(int)1234,
+ channels=(int)%s,
+ width=(int)32,
+ rate=(int)%d""" % (int(channels), int(samplerate)))
+ self.src.set_property("caps", srccaps)
+
+ # start pipeline
+ pipeline.set_state(gst.STATE_PLAYING)
+ self.pipeline = pipeline
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "gst_wav_enc"
+
+ @staticmethod
+ @interfacedoc
+ def description():
+ return "Wav GStreamer based encoder"
+
+ @staticmethod
+ @interfacedoc
+ def format():
+ return "WAV"
+
+ @staticmethod
+ @interfacedoc
+ def file_extension():
+ return "wav"
+
+ @staticmethod
+ @interfacedoc
+ def mime_type():
+ return "audio/x-wav"
+
+ @interfacedoc
+ def set_metadata(self, metadata):
+ #TODO
+ pass
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ buf = self.numpy_array_to_gst_buffer(frames)
+ self.src.emit('push-buffer', buf)
+ if eod: self.src.emit('end-of-stream')
+ return frames, eod
+
+ def numpy_array_to_gst_buffer(self, frames):
+ """ gstreamer buffer to numpy array conversion """
+ buf = gst.Buffer(getbuffer(frames))
+ return buf
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009 Olivier Guilyardi <olivier@samalyse.com>
+#
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+class Error(Exception):
+ """Exception base class for errors in TimeSide."""
+
+class ApiError(Exception):
+ """Exception base class for errors in TimeSide."""
+
+class SubProcessError(Error):
+ """Exception for reporting errors from a subprocess"""
+
+ def __init__(self, message, command, subprocess):
+ self.message = message
+ self.command = str(command)
+ self.subprocess = subprocess
+
+ def __str__(self):
+ if self.subprocess.stderr != None:
+ error = self.subprocess.stderr.read()
+ else:
+ error = ''
+ return "%s ; command: %s; error: %s" % (self.message,
+ self.command,
+ error)
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from core import *
+from waveform import *
+from spectrogram import *
+from waveform_joydiv import *
+from waveform_awdio import *
--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# wav2png.py -- converts wave files to wave file and spectrogram images
+# Copyright (C) 2008 MUSIC TECHNOLOGY GROUP (MTG)
+# UNIVERSITAT POMPEU FABRA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Authors:
+# Bram de Jong <bram.dejong at domain.com where domain in gmail>
+# Guillaume Pellerin <yomguy@parisson.com>
+
+
+import optparse, math, sys
+import ImageFilter, ImageChops, Image, ImageDraw, ImageColor
+import numpy
+from timeside.core import FixedSizeInputAdapter
+
+default_color_schemes = {
+ 'default': {
+ 'waveform': [(50,0,200), (0,220,80), (255,224,0), (255,0,0)],
+ 'spectrogram': [(0, 0, 0), (58/4,68/4,65/4), (80/2,100/2,153/2), (90,180,100),
+ (224,224,44), (255,60,30), (255,255,255)]
+ },
+ 'iso': {
+ 'waveform': [(0,0,255), (0,255,255), (255,255,0), (255,0,0)],
+ 'spectrogram': [(0, 0, 0), (58/4,68/4,65/4), (80/2,100/2,153/2), (90,180,100),
+ (224,224,44), (255,60,30), (255,255,255)]
+ },
+ 'purple': {
+ 'waveform': [(173,173,173), (147,149,196), (77,80,138), (108,66,0)],
+ 'spectrogram': [(0, 0, 0), (58/4,68/4,65/4), (80/2,100/2,153/2), (90,180,100),
+ (224,224,44), (255,60,30), (255,255,255)]
+ }
+}
+
+
+class Spectrum(object):
+ """ FFT based frequency analysis of audio frames."""
+
+ def __init__(self, fft_size, nframes, samplerate, lower, higher, window_function=numpy.ones):
+ self.fft_size = fft_size
+ self.window = window_function(self.fft_size)
+ self.spectrum_range = None
+ self.lower = lower
+ self.higher = higher
+ self.lower_log = math.log10(self.lower)
+ self.higher_log = math.log10(self.higher)
+ self.clip = lambda val, low, high: min(high, max(low, val))
+ self.nframes = nframes
+ self.samplerate = samplerate
+ self.spectrum_adapter = FixedSizeInputAdapter(self.fft_size, 1, pad=True)
+
+ def process(self, frames, eod, spec_range=120.0):
+ """ Returns a tuple containing the spectral centroid and the spectrum (dB scales) of the input audio frames.
+ An adapter is used to fix the buffer length and then provide fixed FFT window sizes."""
+
+ for buffer, end in self.spectrum_adapter.process(frames, eod):
+ samples = buffer[:,0].copy()
+ if end:
+ break
+
+ #samples = numpy.concatenate((numpy.zeros(self.fft_size/2), samples), axis=1)
+ samples *= self.window
+ fft = numpy.fft.fft(samples)
+ spectrum = numpy.abs(fft[:fft.shape[0] / 2 + 1]) / float(self.fft_size) # normalized abs(FFT) between 0 and 1
+ length = numpy.float64(spectrum.shape[0])
+
+ # scale the db spectrum from [- spec_range db ... 0 db] > [0..1]
+ db_spectrum = ((20*(numpy.log10(spectrum + 1e-30))).clip(-spec_range, 0.0) + spec_range)/spec_range
+ energy = spectrum.sum()
+ spectral_centroid = 0
+
+ if energy > 1e-20:
+ # calculate the spectral centroid
+ if self.spectrum_range == None:
+ self.spectrum_range = numpy.arange(length)
+
+ spectral_centroid = (spectrum * self.spectrum_range).sum() / (energy * (length - 1)) * self.samplerate * 0.5
+ # clip > log10 > scale between 0 and 1
+ spectral_centroid = (math.log10(self.clip(spectral_centroid, self.lower, self.higher)) - self.lower_log) / (self.higher_log - self.lower_log)
+
+ return (spectral_centroid, db_spectrum)
+
+
+def interpolate_colors(colors, flat=False, num_colors=256):
+ """ Given a list of colors, create a larger list of colors interpolating
+ the first one. If flatten is True a list of numers will be returned. If
+ False, a list of (r,g,b) tuples. num_colors is the number of colors wanted
+ in the final list """
+
+ palette = []
+
+ for i in range(num_colors):
+ index = (i * (len(colors) - 1))/(num_colors - 1.0)
+ index_int = int(index)
+ alpha = index - float(index_int)
+
+ if alpha > 0:
+ r = (1.0 - alpha) * colors[index_int][0] + alpha * colors[index_int + 1][0]
+ g = (1.0 - alpha) * colors[index_int][1] + alpha * colors[index_int + 1][1]
+ b = (1.0 - alpha) * colors[index_int][2] + alpha * colors[index_int + 1][2]
+ else:
+ r = (1.0 - alpha) * colors[index_int][0]
+ g = (1.0 - alpha) * colors[index_int][1]
+ b = (1.0 - alpha) * colors[index_int][2]
+
+ if flat:
+ palette.extend((int(r), int(g), int(b)))
+ else:
+ palette.append((int(r), int(g), int(b)))
+
+ return palette
+
+
+class WaveformImage(object):
+ """ Builds a PIL image representing a waveform of the audio stream.
+ Adds pixels iteratively thanks to the adapter providing fixed size frame buffers.
+ Peaks are colored relative to the spectral centroids of each frame packet. """
+
+ def __init__(self, image_width, image_height, nframes, samplerate, fft_size, bg_color, color_scheme):
+ self.image_width = image_width
+ self.image_height = image_height
+ self.nframes = nframes
+ self.samplerate = samplerate
+ self.fft_size = fft_size
+ self.bg_color = bg_color
+ self.color_scheme = color_scheme
+
+ if isinstance(color_scheme, dict):
+ colors = color_scheme['waveform']
+ else:
+ colors = default_color_schemes[color_scheme]['waveform']
+
+ self.color_lookup = interpolate_colors(colors)
+
+ self.samples_per_pixel = self.nframes / float(self.image_width)
+ self.buffer_size = int(round(self.samples_per_pixel, 0))
+ self.pixels_adapter = FixedSizeInputAdapter(self.buffer_size, 1, pad=False)
+ self.pixels_adapter_nframes = self.pixels_adapter.nframes(self.nframes)
+
+ self.lower = 800
+ self.higher = 12000
+ self.spectrum = Spectrum(self.fft_size, self.nframes, self.samplerate, self.lower, self.higher, numpy.hanning)
+
+ self.image = Image.new("RGBA", (self.image_width, self.image_height), self.bg_color)
+ self.pixel = self.image.load()
+ self.draw = ImageDraw.Draw(self.image)
+ self.previous_x, self.previous_y = None, None
+ self.frame_cursor = 0
+ self.pixel_cursor = 0
+
+ def peaks(self, samples):
+ """ Find the minimum and maximum peak of the samples.
+ Returns that pair in the order they were found.
+ So if min was found first, it returns (min, max) else the other way around. """
+
+ max_index = numpy.argmax(samples)
+ max_value = samples[max_index]
+
+ min_index = numpy.argmin(samples)
+ min_value = samples[min_index]
+
+ if min_index < max_index:
+ return (min_value, max_value)
+ else:
+ return (max_value, min_value)
+
+ def color_from_value(self, value):
+ """ given a value between 0 and 1, return an (r,g,b) tuple """
+
+ return ImageColor.getrgb("hsl(%d,%d%%,%d%%)" % (int( (1.0 - value) * 360 ), 80, 50))
+
+ def draw_peaks(self, x, peaks, spectral_centroid):
+ """ draw 2 peaks at x using the spectral_centroid for color """
+
+ y1 = self.image_height * 0.5 - peaks[0] * (self.image_height - 4) * 0.5
+ y2 = self.image_height * 0.5 - peaks[1] * (self.image_height - 4) * 0.5
+
+ line_color = self.color_lookup[int(spectral_centroid*255.0)]
+
+ if self.previous_y:
+ self.draw.line([self.previous_x, self.previous_y, x, y1, x, y2], line_color)
+ else:
+ self.draw.line([x, y1, x, y2], line_color)
+
+ self.previous_x, self.previous_y = x, y2
+
+ self.draw_anti_aliased_pixels(x, y1, y2, line_color)
+
+ def draw_anti_aliased_pixels(self, x, y1, y2, color):
+ """ vertical anti-aliasing at y1 and y2 """
+
+ y_max = max(y1, y2)
+ y_max_int = int(y_max)
+ alpha = y_max - y_max_int
+
+ if alpha > 0.0 and alpha < 1.0 and y_max_int + 1 < self.image_height:
+ current_pix = self.pixel[int(x), y_max_int + 1]
+
+ r = int((1-alpha)*current_pix[0] + alpha*color[0])
+ g = int((1-alpha)*current_pix[1] + alpha*color[1])
+ b = int((1-alpha)*current_pix[2] + alpha*color[2])
+
+ self.pixel[x, y_max_int + 1] = (r,g,b)
+
+ y_min = min(y1, y2)
+ y_min_int = int(y_min)
+ alpha = 1.0 - (y_min - y_min_int)
+
+ if alpha > 0.0 and alpha < 1.0 and y_min_int - 1 >= 0:
+ current_pix = self.pixel[x, y_min_int - 1]
+
+ r = int((1-alpha)*current_pix[0] + alpha*color[0])
+ g = int((1-alpha)*current_pix[1] + alpha*color[1])
+ b = int((1-alpha)*current_pix[2] + alpha*color[2])
+
+ self.pixel[x, y_min_int - 1] = (r,g,b)
+
+ def process(self, frames, eod):
+ if len(frames) != 1:
+ buffer = frames[:,0].copy()
+ buffer.shape = (len(buffer),1)
+ (spectral_centroid, db_spectrum) = self.spectrum.process(buffer, True)
+ for samples, end in self.pixels_adapter.process(buffer, eod):
+ if self.pixel_cursor < self.image_width:
+ peaks = self.peaks(samples)
+ self.draw_peaks(self.pixel_cursor, peaks, spectral_centroid)
+ self.pixel_cursor += 1
+
+ def save(self, filename):
+ """ Apply last 2D transforms and write all pixels to the file. """
+
+ # middle line (0 for none)
+ a = 1
+ for x in range(self.image_width):
+ self.pixel[x, self.image_height/2] = tuple(map(lambda p: p+a, self.pixel[x, self.image_height/2]))
+ self.image.save(filename)
+
+
+class WaveformImageJoyContour(WaveformImage):
+
+ def __init__(self, image_width, image_height, nframes, samplerate, fft_size, bg_color, color_scheme, ndiv=1, symetry=None):
+ WaveformImage.__init__(self, image_width, image_height, nframes, samplerate, fft_size, bg_color, color_scheme)
+ self.contour = numpy.zeros(self.image_width)
+ self.centroids = numpy.zeros(self.image_width)
+ self.ndiv = ndiv
+ self.x = numpy.r_[0:self.image_width-1:1]
+ self.dx1 = self.x[1]-self.x[0]
+ self.symetry = symetry
+
+ def get_peaks_contour(self, x, peaks, spectral_centroid=None):
+ self.contour[x] = numpy.max(peaks)
+ self.centroids[x] = spectral_centroid
+
+ def mean(self, samples):
+ return numpy.mean(samples)
+
+ def normalize(self, contour):
+ contour = contour-min(contour)
+ return contour/max(contour)
+
+ def draw_peaks_contour(self):
+ contour = self.contour.copy()
+
+ # Smoothing
+ contour = smooth(contour, window_len=16)
+
+ # Normalize
+ contour = self.normalize(contour)
+
+ # Scaling
+ #ratio = numpy.mean(contour)/numpy.sqrt(2)
+ ratio = 1
+ contour = self.normalize(numpy.expm1(contour/ratio))*(1-10**-6)
+
+ # Spline
+ #contour = cspline1d(contour)
+ #contour = cspline1d_eval(contour, self.x, dx=self.dx1, x0=self.x[0])
+
+ if self.symetry:
+ height = int(self.image_height/2)
+ else:
+ height = self.image_height
+
+ # Multicurve rotating
+ for i in range(0,self.ndiv):
+ self.previous_x, self.previous_y = None, None
+
+ #bright_color = 255
+ bright_color = int(255*(1-float(i)/(self.ndiv*2)))
+ bright_color = 255-bright_color+160
+ #line_color = self.color_lookup[int(self.centroids[j]*255.0)]
+ line_color = (bright_color,bright_color,bright_color)
+
+ # Linear
+ #contour = contour*(1.0-float(i)/self.ndiv)
+ #contour = contour*(1-float(i)/self.ndiv)
+
+ # Cosine
+ contour = contour*numpy.arccos(float(i)/self.ndiv)*2/numpy.pi
+ #contour = self.contour*(1-float(i)*numpy.arccos(float(i)/self.ndiv)*2/numpy.pi/self.ndiv)
+
+ # Negative Sine
+ #contour = contour + ((1-contour)*2/numpy.pi*numpy.arcsin(float(i)/self.ndiv))
+
+ curve = (height-1)*contour
+ #curve = contour*(height-2)/2+height/2
+
+ for x in self.x:
+ x = int(x)
+ y = curve[x]
+ if not x == 0:
+ if not self.symetry:
+ self.draw.line([self.previous_x, self.previous_y, x, y], line_color)
+ self.draw_anti_aliased_pixels(x, y, y, line_color)
+ else:
+ self.draw.line([self.previous_x, self.previous_y+height, x, y+height], line_color)
+ self.draw_anti_aliased_pixels(x, y+height, y+height, line_color)
+ self.draw.line([self.previous_x, -self.previous_y+height, x, -y+height], line_color)
+ self.draw_anti_aliased_pixels(x, -y+height, -y+height, line_color)
+ else:
+ if not self.symetry:
+ self.draw.point((x, y), line_color)
+ else:
+ self.draw.point((x, y+height), line_color)
+ self.previous_x, self.previous_y = x, y
+
+ def process(self, frames, eod):
+ if len(frames) != 1:
+ buffer = frames[:,0].copy()
+ buffer.shape = (len(buffer),1)
+ for samples, end in self.pixels_adapter.process(buffer, eod):
+ if self.pixel_cursor < self.image_width:
+ #(spectral_centroid, db_spectrum) = self.spectrum.process(buffer, True)
+ peaks = self.peaks(samples)
+ self.get_peaks_contour(self.pixel_cursor, peaks)
+ self.pixel_cursor += 1
+ if eod:
+ self.draw_peaks_contour()
+
+ def save(self, filename):
+ """ Apply last 2D transforms and write all pixels to the file. """
+ # middle line (0 for none)
+ a = 1
+ for x in range(self.image_width):
+ self.pixel[x, self.image_height/2] = tuple(map(lambda p: p+a, self.pixel[x, self.image_height/2]))
+ #self.image = self.image.transpose(Image.FLIP_TOP_BOTTOM)
+ self.image.save(filename)
+
+
+class WaveformImageSimple(WaveformImage):
+ """ Builds a PIL image representing a waveform of the audio stream.
+ Adds pixels iteratively thanks to the adapter providing fixed size frame buffers.
+ Peaks are colored relative to the spectral centroids of each frame packet. """
+
+ def __init__(self, image_width, image_height, nframes, samplerate, fft_size, bg_color, color_scheme):
+ WaveformImage.__init__(self, image_width, image_height, nframes, samplerate, fft_size, bg_color, color_scheme)
+ if isinstance(color_scheme, dict):
+ colors = color_scheme['waveform']
+ else:
+ colors = default_color_schemes[color_scheme]['waveform']
+ self.line_color = colors[0]
+ self.image = Image.new("RGBA", (self.image_width, self.image_height))
+ self.pixel = self.image.load()
+ self.draw = ImageDraw.Draw(self.image)
+
+ def normalize(self, contour):
+ contour = contour-min(contour)
+ return contour/max(contour)
+
+ def draw_peaks(self, x, peaks):
+ """ draw 2 peaks at x using the spectral_centroid for color """
+
+ y1 = self.image_height * 0.5 - peaks[0] * (self.image_height - 4) * 0.5
+ y2 = self.image_height * 0.5 - peaks[1] * (self.image_height - 4) * 0.5
+
+ if self.previous_y and x < self.image_width-1 and self.pixel_cursor % 2:
+ if y1 < y2:
+ self.draw.line((x, 0, x, y1), self.line_color)
+ self.draw.line((x, self.image_height , x, y2), self.line_color)
+ else:
+ self.draw.line((x, 0, x, y2), self.line_color)
+ self.draw.line((x, self.image_height , x, y1), self.line_color)
+ else:
+ self.draw.line((x, 0, x, self.image_height), self.line_color)
+
+ self.previous_x, self.previous_y = x, y1
+
+ def process(self, frames, eod):
+ if len(frames) != 1:
+ buffer = frames[:,0].copy()
+ buffer.shape = (len(buffer),1)
+ for samples, end in self.pixels_adapter.process(buffer, eod):
+ if self.pixel_cursor < self.image_width-1:
+ self.draw_peaks(self.pixel_cursor, self.peaks(samples))
+ self.pixel_cursor += 1
+ if self.pixel_cursor == self.image_width-1:
+ self.draw_peaks(self.pixel_cursor, (0, 0))
+ self.pixel_cursor += 1
+
+ def save(self, filename):
+ """ Apply last 2D transforms and write all pixels to the file. """
+
+ # middle line (0 for none)
+ a = 0
+ for x in range(self.image_width):
+ self.pixel[x, self.image_height/2] = tuple(map(lambda p: p+a, self.pixel[x, self.image_height/2]))
+ self.image.save(filename)
+
+
+class SpectrogramImage(object):
+ """ Builds a PIL image representing a spectrogram of the audio stream (level vs. frequency vs. time).
+ Adds pixels iteratively thanks to the adapter providing fixed size frame buffers."""
+
+ def __init__(self, image_width, image_height, nframes, samplerate, fft_size, bg_color=None, color_scheme='default'):
+ self.image_width = image_width
+ self.image_height = image_height
+ self.nframes = nframes
+ self.samplerate = samplerate
+ self.fft_size = fft_size
+ self.color_scheme = color_scheme
+
+ if isinstance(color_scheme, dict):
+ colors = color_scheme['spectrogram']
+ else:
+ colors = default_color_schemes[color_scheme]['spectrogram']
+
+ self.image = Image.new("P", (self.image_height, self.image_width))
+ self.image.putpalette(interpolate_colors(colors, True))
+
+ self.samples_per_pixel = self.nframes / float(self.image_width)
+ self.buffer_size = int(round(self.samples_per_pixel, 0))
+ self.pixels_adapter = FixedSizeInputAdapter(self.buffer_size, 1, pad=False)
+ self.pixels_adapter_nframes = self.pixels_adapter.nframes(self.nframes)
+
+ self.lower = 100
+ self.higher = 22050
+ self.spectrum = Spectrum(self.fft_size, self.nframes, self.samplerate, self.lower, self.higher, numpy.hanning)
+
+ # generate the lookup which translates y-coordinate to fft-bin
+ self.y_to_bin = []
+ f_min = float(self.lower)
+ f_max = float(self.higher)
+ y_min = math.log10(f_min)
+ y_max = math.log10(f_max)
+ for y in range(self.image_height):
+ freq = math.pow(10.0, y_min + y / (image_height - 1.0) *(y_max - y_min))
+ bin = freq / 22050.0 * (self.fft_size/2 + 1)
+
+ if bin < self.fft_size/2:
+ alpha = bin - int(bin)
+
+ self.y_to_bin.append((int(bin), alpha * 255))
+
+ # this is a bit strange, but using image.load()[x,y] = ... is
+ # a lot slower than using image.putadata and then rotating the image
+ # so we store all the pixels in an array and then create the image when saving
+ self.pixels = []
+ self.pixel_cursor = 0
+
+ def draw_spectrum(self, x, spectrum):
+ for (index, alpha) in self.y_to_bin:
+ self.pixels.append( int( ((255.0-alpha) * spectrum[index] + alpha * spectrum[index + 1] )) )
+
+ for y in range(len(self.y_to_bin), self.image_height):
+ self.pixels.append(0)
+
+ def process(self, frames, eod):
+ if len(frames) != 1:
+ buffer = frames[:,0].copy()
+ buffer.shape = (len(buffer),1)
+
+ # FIXME : breaks spectrum linearity
+ for samples, end in self.pixels_adapter.process(buffer, eod):
+ if self.pixel_cursor < self.image_width:
+ (spectral_centroid, db_spectrum) = self.spectrum.process(samples, True)
+ self.draw_spectrum(self.pixel_cursor, db_spectrum)
+ self.pixel_cursor += 1
+
+ def save(self, filename):
+ """ Apply last 2D transforms and write all pixels to the file. """
+ self.image.putdata(self.pixels)
+ self.image.transpose(Image.ROTATE_90).save(filename)
+
+
+class Noise(object):
+ """A class that mimics audiolab.sndfile but generates noise instead of reading
+ a wave file. Additionally it can be told to have a "broken" header and thus crashing
+ in the middle of the file. Also useful for testing ultra-short files of 20 samples."""
+
+ def __init__(self, num_frames, has_broken_header=False):
+ self.seekpoint = 0
+ self.num_frames = num_frames
+ self.has_broken_header = has_broken_header
+
+ def seek(self, seekpoint):
+ self.seekpoint = seekpoint
+
+ def get_nframes(self):
+ return self.num_frames
+
+ def get_samplerate(self):
+ return 44100
+
+ def get_channels(self):
+ return 1
+
+ def read_frames(self, frames_to_read):
+ if self.has_broken_header and self.seekpoint + frames_to_read > self.num_frames / 2:
+ raise IOError()
+
+ num_frames_left = self.num_frames - self.seekpoint
+ if num_frames_left < frames_to_read:
+ will_read = num_frames_left
+ else:
+ will_read = frames_to_read
+ self.seekpoint += will_read
+ return numpy.random.random(will_read)*2 - 1
+
+
+# TOOLS
+
+def downsample(vector, factor):
+ """
+ downsample(vector, factor):
+ Downsample (by averaging) a vector by an integer factor.
+ """
+ if (len(vector) % factor):
+ print "Length of 'vector' is not divisible by 'factor'=%d!" % factor
+ return 0
+ vector.shape = (len(vector)/factor, factor)
+ return numpy.mean(vector, axis=1)
+
+
+def smooth(x, window_len=10, window='hanning'):
+ """smooth the data using a window with requested size.
+
+ This method is based on the convolution of a scaled window with the signal.
+ The signal is prepared by introducing reflected copies of the signal
+ (with the window size) in both ends so that transient parts are minimized
+ in the begining and end part of the output signal.
+
+ input:
+ x: the input signal
+ window_len: the dimension of the smoothing window
+ window: the type of window from 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'
+ flat window will produce a moving average smoothing.
+
+ output:
+ the smoothed signal
+
+ example:
+
+ import numpy as np
+ t = numpy.linspace(-2,2,0.1)
+ x = numpy.sin(t)+numpy.random.randn(len(t))*0.1
+ y = smooth(x)
+
+ see also:
+
+ numpy.hanning, numpy.hamming, numpy.bartlett, numpy.blackman, numpy.convolve
+ scipy.signal.lfilter
+
+ TODO: the window parameter could be the window itself if an array instead of a string
+ """
+
+ if x.ndim != 1:
+ raise ValueError, "smooth only accepts 1 dimension arrays."
+
+ if x.size < window_len:
+ raise ValueError, "Input vector needs to be bigger than window size."
+
+ if window_len < 3:
+ return x
+
+ if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']:
+ raise ValueError, "Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'"
+
+ s=numpy.r_[2*x[0]-x[window_len:1:-1], x, 2*x[-1]-x[-1:-window_len:-1]]
+
+ if window == 'flat': #moving average
+ w = numpy.ones(window_len,'d')
+ else:
+ w = getattr(numpy, window)(window_len)
+
+ y = numpy.convolve(w/w.sum(), s, mode='same')
+ return y[window_len-1:-window_len+1]
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2010 Guillaume Pellerin <yomguy@parisson.com>
+# Copyright (c) 2010 Olivier Guilyardi <olivier@samalyse.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.api import IGrapher
+from timeside.grapher.core import *
+
+
+class Spectrogram(Processor):
+ implements(IGrapher)
+
+ FFT_SIZE = 0x400
+
+ @interfacedoc
+ def __init__(self, width=1024, height=256, bg_color=(0,0,0), color_scheme='default'):
+ self.width = width
+ self.height = height
+ self.bg_color = bg_color
+ self.color_scheme = color_scheme
+ self.graph = None
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "spectrogram"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Spectrogram"
+
+ @interfacedoc
+ def set_colors(self, background, scheme):
+ self.bg_color = background
+ self.color_scheme = scheme
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(Spectrogram, self).setup(channels, samplerate, nframes)
+ if self.graph:
+ self.graph = None
+ self.graph = SpectrogramImage(self.width, self.height, self.nframes(), self.samplerate(), self.FFT_SIZE,
+ bg_color=self.bg_color, color_scheme=self.color_scheme)
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ self.graph.process(frames, eod)
+ return frames, eod
+
+ @interfacedoc
+ def render(self, output=None):
+ if output:
+ self.graph.save(output)
+ return self.graph.image
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from timeside.core import *
+from timeside.api import IGrapher
+from tempfile import NamedTemporaryFile
+from timeside.grapher.core import *
+
+class SpectrogramGrapherAudiolab(Processor):
+ """Spectrogram graph driver (python style thanks to wav2png.py and scikits.audiolab)"""
+
+ implements(IGrapher)
+
+ bg_color = None
+ color_scheme = None
+
+ @staticmethod
+ def id():
+ return "spectrogram"
+
+ def name(self):
+ return "Spectrogram (audiolab)"
+
+ def set_colors(self, background=None, scheme=None):
+ self.bg_color = background
+ self.color_scheme = scheme
+
+ def render(self, media_item, width=None, height=None, options=None):
+ """Generator that streams the spectrogram as a PNG image with a python method"""
+
+ wav_file = media_item
+ pngFile = NamedTemporaryFile(suffix='.png')
+
+ if not width == None:
+ image_width = width
+ else:
+ image_width = 1500
+ if not height == None:
+ image_height = height
+ else:
+ image_height = 200
+
+ fft_size = 2048
+ args = (wav_file, pngFile.name, image_width, image_height, fft_size,
+ self.bg_color, self.color_scheme)
+ create_spectrogram_png(*args)
+
+ buffer = pngFile.read(0xFFFF)
+ while buffer:
+ yield buffer
+ buffer = pngFile.read(0xFFFF)
+
+ pngFile.close()
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2010 Guillaume Pellerin <yomguy@parisson.com>
+# Copyright (c) 2010 Olivier Guilyardi <olivier@samalyse.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.api import IGrapher
+from timeside.grapher.core import *
+
+
+class Waveform(Processor):
+ implements(IGrapher)
+
+ FFT_SIZE = 0x400
+
+ @interfacedoc
+ def __init__(self, width=1024, height=256, bg_color=(0,0,0), color_scheme='default'):
+ self.width = width
+ self.height = height
+ self.bg_color = bg_color
+ self.color_scheme = color_scheme
+ self.graph = None
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "waveform"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Waveform"
+
+ @interfacedoc
+ def set_colors(self, background, scheme):
+ self.bg_color = background
+ self.color_scheme = scheme
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(Waveform, self).setup(channels, samplerate, nframes)
+ if self.graph:
+ self.graph = None
+ self.graph = WaveformImage(self.width, self.height, self.nframes(), self.samplerate(), self.FFT_SIZE,
+ bg_color=self.bg_color, color_scheme=self.color_scheme)
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ self.graph.process(frames, eod)
+ return frames, eod
+
+ @interfacedoc
+ def render(self, output=None):
+ if output:
+ self.graph.save(output)
+ return self.graph.image
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+from timeside.core import *
+from timeside.api import IGrapher
+from tempfile import NamedTemporaryFile
+from timeside.grapher.core import *
+
+class WaveFormGrapherAudiolab(Processor):
+ """WaveForm graph driver (python style thanks to wav2png.py and scikits.audiolab)"""
+
+ implements(IGrapher)
+
+ bg_color = None
+ color_scheme = None
+
+ @staticmethod
+ def id():
+ return "waveform"
+
+ def name(self):
+ return "Waveform (audiolab)"
+
+ def set_colors(self, background=None, scheme=None):
+ self.bg_color = background
+ self.color_scheme = scheme
+
+ def render(self, media_item, width=None, height=None, options=None):
+ """Generator that streams the waveform as a PNG image with a python method"""
+
+ wav_file = media_item
+ pngFile = NamedTemporaryFile(suffix='.png')
+
+ if not width == None:
+ image_width = width
+ else:
+ image_width = 1500
+ if not height == None:
+ image_height = height
+ else:
+ image_height = 200
+
+ fft_size = 2048
+ args = (wav_file, pngFile.name, image_width, image_height, fft_size,
+ self.bg_color, self.color_scheme)
+ create_wavform_png(*args)
+
+ buffer = pngFile.read(0xFFFF)
+ while buffer:
+ yield buffer
+ buffer = pngFile.read(0xFFFF)
+
+ pngFile.close()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2010 Guillaume Pellerin <yomguy@parisson.com>
+# Copyright (c) 2010 Olivier Guilyardi <olivier@samalyse.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.api import IGrapher
+from timeside.grapher.core import *
+
+
+class WaveformAwdio(Processor):
+ implements(IGrapher)
+
+ FFT_SIZE = 0x400
+
+ @interfacedoc
+ def __init__(self, width=572, height=74, bg_color=None, color_scheme='iso'):
+ self.width = width
+ self.height = height
+ self.bg_color = bg_color
+ self.color_scheme = color_scheme
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "waveform_awdio"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Waveform Awdio"
+
+ @interfacedoc
+ def set_colors(self, background, scheme):
+ self.bg_color = background
+ self.color_scheme = scheme
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(WaveformAwdio, self).setup(channels, samplerate, nframes)
+ self.graph = WaveformImageSimple(self.width, self.height, self.nframes(), self.samplerate(), self.FFT_SIZE,
+ bg_color=self.bg_color, color_scheme=self.color_scheme)
+
+ @interfacedoc
+ def release(self):
+ pass
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ self.graph.process(frames, eod)
+ return frames, eod
+
+ @interfacedoc
+ def render(self, output):
+ if output:
+ self.graph.save(output)
+ return self.graph.image
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007-2010 Guillaume Pellerin <yomguy@parisson.com>
+# Copyright (c) 2010 Olivier Guilyardi <olivier@samalyse.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.api import IGrapher
+from timeside.grapher.core import *
+
+
+class WaveformJoyDiv(Processor):
+ implements(IGrapher)
+
+ FFT_SIZE = 0x400
+
+ @interfacedoc
+ def __init__(self, width=1024, height=256, bg_color=(136,136,136), color_scheme='default'):
+ self.width = width
+ self.height = height
+ self.bg_color = bg_color
+ self.color_scheme = color_scheme
+ self.graph = None
+ self.ndiv = 4
+ self.symetry = True
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "waveform_joydiv"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Waveform JoyDiv"
+
+ @interfacedoc
+ def set_colors(self, background, scheme):
+ self.bg_color = background
+ self.color_scheme = scheme
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(WaveformJoyDiv, self).setup(channels, samplerate, nframes)
+ if self.graph:
+ self.graph = None
+ self.graph = WaveformImageJoyContour(self.width, self.height, self.nframes(), self.samplerate(), self.FFT_SIZE,
+ bg_color=self.bg_color, color_scheme=self.color_scheme, ndiv=self.ndiv, symetry=self.symetry)
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ self.graph.process(frames, eod)
+ return frames, eod
+
+ @interfacedoc
+ def render(self, output):
+ if output:
+ self.graph.save(output)
+ return self.graph.image
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Parisson
+# Copyright (c) 2007 Olivier Guilyardi <olivier@samalyse.com>
+# Copyright (c) 2007-2009 Guillaume Pellerin <pellerin@parisson.com>
+#
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+class Metadata(object):
+ pass
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import unittest
+import sys
+import time
+
+class TestCase(unittest.TestCase):
+
+ def assertSameList(self, list1, list2):
+ "Test that two lists contain the same elements, in any order"
+ if len(list1) != len(list2):
+ self.fail("Lists length differ : %d != %d" % (len(list1), len(list2)))
+
+ for item in list1:
+ if not item in list2:
+ self.fail("%s is not in list2" % str(item))
+
+ for item in list2:
+ if not item in list1:
+ self.fail("%s is not in list1" % str(item))
+
+class _TextTestResult(unittest.TestResult):
+ """A test result class that can print formatted text results to a stream.
+
+ Used by TextTestRunner.
+ """
+ separator1 = '=' * 70
+ separator2 = '-' * 70
+
+ def __init__(self, stream, descriptions, verbosity):
+ unittest.TestResult.__init__(self)
+ self.stream = stream
+ self.showAll = verbosity > 1
+ self.dots = verbosity == 1
+ self.descriptions = descriptions
+ self.currentTestCase = None
+
+ def getDescription(self, test):
+ if self.descriptions:
+ return test.shortDescription() or str(test)
+ else:
+ return str(test)
+
+ def startTest(self, test):
+ unittest.TestResult.startTest(self, test)
+ if self.showAll:
+ if self.currentTestCase != test.__class__:
+ self.currentTestCase = test.__class__
+ self.stream.writeln()
+ self.stream.writeln("[%s]" % self.currentTestCase.__name__)
+ self.stream.write(" " + self.getDescription(test))
+ self.stream.write(" ... ")
+
+ def addSuccess(self, test):
+ unittest.TestResult.addSuccess(self, test)
+ if self.showAll:
+ self.stream.writeln("ok")
+ elif self.dots:
+ self.stream.write('.')
+
+ def addError(self, test, err):
+ unittest.TestResult.addError(self, test, err)
+ if self.showAll:
+ self.stream.writeln("ERROR")
+ elif self.dots:
+ self.stream.write('E')
+
+ def addFailure(self, test, err):
+ unittest.TestResult.addFailure(self, test, err)
+ if self.showAll:
+ self.stream.writeln("FAIL")
+ elif self.dots:
+ self.stream.write('F')
+
+ def printErrors(self):
+ if self.dots or self.showAll:
+ self.stream.writeln()
+ self.printErrorList('ERROR', self.errors)
+ self.printErrorList('FAIL', self.failures)
+
+ def printErrorList(self, flavour, errors):
+ for test, err in errors:
+ self.stream.writeln(self.separator1)
+ self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
+ self.stream.writeln(self.separator2)
+ self.stream.writeln("%s" % err)
+
+
+class _WritelnDecorator:
+ """Used to decorate file-like objects with a handy 'writeln' method"""
+ def __init__(self,stream):
+ self.stream = stream
+
+ def __getattr__(self, attr):
+ return getattr(self.stream,attr)
+
+ def writeln(self, arg=None):
+ if arg: self.write(arg)
+ self.write('\n') # text-mode streams translate to \r\n if needed
+
+class TestRunner:
+ """A test runner class that displays results in textual form.
+
+ It prints out the names of tests as they are run, errors as they
+ occur, and a summary of the results at the end of the test run.
+ """
+ def __init__(self, stream=sys.stderr, descriptions=1, verbosity=2):
+ self.stream = _WritelnDecorator(stream)
+ self.descriptions = descriptions
+ self.verbosity = verbosity
+
+ def _makeResult(self):
+ return _TextTestResult(self.stream, self.descriptions, self.verbosity)
+
+ def run(self, test):
+ "Run the given test case or test suite."
+ result = self._makeResult()
+ startTime = time.time()
+ test(result)
+ stopTime = time.time()
+ timeTaken = stopTime - startTime
+ result.printErrors()
+ self.stream.writeln(result.separator2)
+ run = result.testsRun
+ self.stream.writeln("Ran %d test%s in %.3fs" %
+ (run, run != 1 and "s" or "", timeTaken))
+ self.stream.writeln()
+ if not result.wasSuccessful():
+ self.stream.write("FAILED (")
+ failed, errored = map(len, (result.failures, result.errors))
+ if failed:
+ self.stream.write("failures=%d" % failed)
+ if errored:
+ if failed: self.stream.write(", ")
+ self.stream.write("errors=%d" % errored)
+ self.stream.writeln(")")
+ else:
+ self.stream.writeln("OK")
+ return result
+
+
--- /dev/null
+from timeside.tests.testcomponent import *
+from timeside.tests.testinputadapter import *
+from timeside.tests import TestRunner
+
+unittest.main(testRunner=TestRunner())
--- /dev/null
+# -*- coding: utf-8 -*-
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from timeside.core import Processor, implements, interfacedoc, FixedSizeInputAdapter
+from timeside.api import *
+import numpy
+
+
+class Gain(Processor):
+ implements(IEffect)
+
+ @interfacedoc
+ def __init__(self, gain=1.0):
+ self.gain = gain
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "test_gain"
+
+ @staticmethod
+ @interfacedoc
+ def name():
+ return "Gain test effect"
+
+ def process(self, frames, eod=False):
+ return numpy.multiply(frames, self.gain), eod
+
+
+class FixedInputProcessor(Processor):
+ """Processor which does absolutely nothing except illustrating the use
+ of the FixedInputSizeAdapter. It also tests things a bit."""
+
+ implements(IProcessor)
+
+ BUFFER_SIZE = 1024
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "test_fixed"
+
+ @interfacedoc
+ def setup(self, channels, samplerate, nframes):
+ super(FixedInputProcessor, self).setup(channels, samplerate, nframes)
+ self.adapter = FixedSizeInputAdapter(self.BUFFER_SIZE, channels, pad=True)
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ for buffer, end in self.adapter.process(frames, eod):
+ # Test that the adapter is actually doing the job:
+ if len(buffer) != self.BUFFER_SIZE:
+ raise Exception("Bad buffer size from adapter")
+
+ return frames, eod
+
+
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007-2009 Parisson
+# Copyright (c) 2007 Olivier Guilyardi <olivier@samalyse.com>
+# Copyright (c) 2007-2009 Guillaume Pellerin <pellerin@parisson.com>
+#
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Paul Brossier <piem@piem.org>
+
+from timeside.core import Processor, implements, interfacedoc
+from timeside.api import IDecoder, IEncoder
+from numpy import array, frombuffer, getbuffer, float32
+
+import pygst
+pygst.require('0.10')
+import gst
+import gobject
+gobject.threads_init ()
+
+class FileDecoder(Processor):
+ """ gstreamer-based decoder """
+ implements(IDecoder)
+
+ # duration ms, before discovery process times out
+ MAX_DISCOVERY_TIME = 3000
+
+ audioformat = None
+ audiochannels = None
+ audiorate = None
+ audionframes = None
+ mimetype = ''
+
+ # IProcessor methods
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "test_gstreamerdec"
+
+ def setup(self, channels = None, samplerate = None, nframes = None):
+ # the output data format we want
+ caps = "audio/x-raw-float, width=32"
+ pipeline = gst.parse_launch('''uridecodebin uri=%s
+ ! audioconvert
+ ! %s
+ ! appsink name=sink sync=False ''' % (self.uri, caps))
+ # store a pointer to appsink in our decoder object
+ self.sink = pipeline.get_by_name('sink')
+ # adjust length of emitted buffers
+ # self.sink.set_property('blocksize', 0x10000)
+ # start pipeline
+ pipeline.set_state(gst.STATE_PLAYING)
+
+ @interfacedoc
+ def channels(self):
+ return self.audiochannels
+
+ @interfacedoc
+ def samplerate(self):
+ return self.audiorate
+
+ @interfacedoc
+ def nframes(self):
+ return self.audionframes
+
+ @interfacedoc
+ def process(self, frames = None, eod = False):
+ try:
+ buf = self.sink.emit('pull-buffer')
+ except SystemError, e:
+ # should never happen
+ print 'SystemError', e
+ return array([0.]), True
+ if buf == None:
+ return array([0.]), True
+ return self.gst_buffer_to_numpy_array(buf), False
+
+ @interfacedoc
+ def release(self):
+ # nothing to do for now
+ pass
+
+ ## IDecoder methods
+
+ @interfacedoc
+ def __init__(self, uri):
+
+ # is this a file?
+ import os.path
+ if os.path.exists(uri):
+ # get the absolute path
+ uri = os.path.abspath(uri)
+ # first run the file/uri through the discover pipeline
+ self.discover(uri)
+ # and make a uri of it
+ from urllib import quote
+ self.uri = 'file://'+quote(uri)
+
+ @interfacedoc
+ def format(self):
+ # TODO check
+ return self.mimetype
+
+ @interfacedoc
+ def encoding(self):
+ # TODO check
+ return self.mimetype.split('/')[-1]
+
+ @interfacedoc
+ def resolution(self):
+ # TODO check: width or depth?
+ return self.audiowidth
+
+ @interfacedoc
+ def metadata(self):
+ # TODO check
+ return self.tags
+
+ ## gst.extend discoverer
+
+ def discover(self, path):
+ """ gstreamer based helper function to get file attributes """
+ from gst.extend import discoverer
+ d = discoverer.Discoverer(path, timeout = self.MAX_DISCOVERY_TIME)
+ d.connect('discovered', self.discovered)
+ self.mainloop = gobject.MainLoop()
+ d.discover()
+ self.mainloop.run()
+
+ def discovered(self, d, is_media):
+ """ gstreamer based helper executed upon discover() completion """
+ if is_media and d.is_audio:
+ # copy the discoverer attributes to self
+ self.audiorate = d.audiorate
+ self.mimetype= d.mimetype
+ self.audiochannels = d.audiochannels
+ self.audiowidth = d.audiowidth
+ # conversion from time in nanoseconds to frames
+ from math import ceil
+ duration = d.audiorate * d.audiolength * 1.e-9
+ self.audionframes = int (ceil ( duration ) )
+ self.tags = d.tags
+ elif not d.is_audio:
+ print "error, no audio found!"
+ else:
+ print "fail", path
+ self.mainloop.quit()
+
+ def gst_buffer_to_numpy_array(self, buf):
+ """ gstreamer buffer to numpy array conversion """
+ chan = self.audiochannels
+ samples = frombuffer(buf.data, dtype=float32)
+ samples.resize([len(samples)/chan, chan])
+ return samples
+
+class WavEncoder(Processor):
+ """ gstreamer-based encoder """
+ implements(IEncoder)
+
+ def __init__(self, output):
+ self.file = None
+ if isinstance(output, basestring):
+ self.filename = output
+ else:
+ raise Exception("Streaming not supported")
+
+ @interfacedoc
+ def setup(self, channels=None, samplerate=None, nframes=None):
+ super(WavEncoder, self).setup(channels, samplerate, nframes)
+ # TODO open file for writing
+ # the output data format we want
+ pipeline = gst.parse_launch(''' appsrc name=src
+ ! audioconvert
+ ! wavenc
+ ! filesink location=%s ''' % self.filename)
+ # store a pointer to appsink in our encoder object
+ self.src = pipeline.get_by_name('src')
+ srccaps = gst.Caps("""audio/x-raw-float,
+ endianness=(int)1234,
+ channels=(int)%s,
+ width=(int)32,
+ rate=(int)%d""" % (int(channels), int(samplerate)))
+ self.src.set_property("caps", srccaps)
+
+ # start pipeline
+ pipeline.set_state(gst.STATE_PLAYING)
+ self.pipeline = pipeline
+
+ @staticmethod
+ @interfacedoc
+ def id():
+ return "test_gstreamerenc"
+
+ @staticmethod
+ @interfacedoc
+ def description():
+ return "Gstreamer based encoder"
+
+ @staticmethod
+ @interfacedoc
+ def file_extension():
+ return "wav"
+
+ @staticmethod
+ @interfacedoc
+ def mime_type():
+ return "audio/x-wav"
+
+ @interfacedoc
+ def set_metadata(self, metadata):
+ #TODO
+ pass
+
+ @interfacedoc
+ def process(self, frames, eod=False):
+ buf = self.numpy_array_to_gst_buffer(frames)
+ self.src.emit('push-buffer', buf)
+ if eod: self.src.emit('end-of-stream')
+ return frames, eod
+
+ def numpy_array_to_gst_buffer(self, frames):
+ """ gstreamer buffer to numpy array conversion """
+ buf = gst.Buffer(getbuffer(frames))
+ return buf
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import timeside
+from sys import stdout
+import os.path
+import numpy
+
+
+class TestAnalyzer:
+
+ graphers = timeside.core.processors(timeside.api.IGrapher)
+ decoders = timeside.core.processors(timeside.api.IDecoder)
+ encoders= timeside.core.processors(timeside.api.IEncoder)
+ analyzers = timeside.core.processors(timeside.api.IAnalyzer)
+
+ def __init__(self, path):
+ self.source = os.path.join(os.path.dirname(__file__), path)
+ print "Processing %s" % self.source
+ self.decoder = timeside.decoder.FileDecoder(self.source)
+ print 'format: ', self.decoder.format()
+ self.pipe = self.decoder
+ self.analyzers_sub_pipe = []
+
+ def process(self):
+ for analyzer in self.analyzers:
+ sub_pipe = analyzer()
+ self.analyzers_sub_pipe.append(sub_pipe)
+ self.pipe = self.pipe | sub_pipe
+ self.pipe.run()
+
+ def results(self):
+ analyzers = []
+ for analyzer in self.analyzers_sub_pipe:
+ value = analyzer.result()
+ analyzers.append({'name':analyzer.name(),
+ 'id':analyzer.id(),
+ 'unit':analyzer.unit(),
+ 'value':str(value)})
+ print analyzers
+
+
+test = TestAnalyzer('../samples/guitar.wav')
+#test = TestAnalyzer('/home/momo/music/wav/Cellar/Cellar-FinallyMix_01.wav')
+test.process()
+test.results()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from timeside.tests.api.examples import Gain
+from timeside.core import *
+from timeside.decoder import *
+from timeside.analyzer import *
+from timeside.encoder import *
+from timeside.api import *
+
+import sys
+if len(sys.argv) > 1:
+ source = sys.argv[1]
+else:
+ import os.path
+ source= os.path.join (os.path.dirname(__file__), "../samples/guitar.wav")
+
+Decoder = FileDecoder
+print "Creating decoder with id=%s for: %s" % (Decoder.id(), source)
+decoder = Decoder(source)
+analyzer = MaxLevel()
+decoder.setup()
+nchannels = decoder.channels()
+samplerate = decoder.samplerate()
+nframes = decoder.nframes()
+analyzer.setup(nchannels, samplerate)
+
+print "Stats: duration=%f, nframes=%d, nchannels=%d, samplerate=%d, resolution=%d" % (
+ nframes / float(samplerate), nframes, nchannels, samplerate, decoder.resolution())
+
+while True:
+ frames, eod = decoder.process()
+ analyzer.process(frames, eod)
+ if eod:
+ break
+
+max_level = analyzer.result()
+print "Max level: %f" % max_level
+
+destination = "../results/guitar_normalized.wav"
+Encoder = WavEncoder
+print "Creating encoder with id=%s for: %s" % (Encoder.id(), destination)
+encoder = Encoder(destination)
+
+gain = 1
+if max_level > 0:
+ gain = 0.9 / max_level
+
+effect = Gain(gain)
+
+decoder.setup()
+effect.setup(decoder.channels(), decoder.samplerate())
+encoder.setup(effect.channels(), effect.samplerate())
+
+print "Applying effect id=%s with gain=%f" % (effect.id(), gain)
+
+while True:
+ frames, eod = decoder.process()
+ encoder.process(*effect.process(frames, eod))
+ if eod:
+ break
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from timeside.tests.api.examples import Gain
+from timeside.core import *
+from timeside.decoder import *
+from timeside.analyzer import *
+from timeside.encoder import *
+from timeside.api import *
+from sys import stdout
+import os.path
+import numpy
+
+source = os.path.join(os.path.dirname(__file__), "../samples/guitar.wav")
+
+print "Normalizing %s" % source
+decoder = FileDecoder(source)
+maxlevel = MaxLevel()
+duration = Duration()
+
+(decoder | maxlevel | duration).run()
+
+gain = 1
+if maxlevel.result() < 0:
+ gain = 0.9 / numpy.exp(maxlevel.result()/20)
+
+print "input maxlevel: %f" % maxlevel.result()
+print "gain: %f" % gain
+print "duration: %f %s" % (duration.result(), duration.unit())
+
+gain = Gain(gain)
+encoder = WavEncoder("../results/guitar_normalized.wav")
+
+subpipe = gain | maxlevel
+
+(decoder | subpipe | encoder).run()
+
+print "output maxlevel: %f" % maxlevel.result()
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import os
+from timeside.core import *
+from timeside.api import *
+from timeside.decoder import *
+from timeside.grapher import *
+
+sample_dir = '../samples'
+img_dir = '../results/img'
+if not os.path.exists(img_dir):
+ os.mkdir(img_dir)
+
+test_dict = {'sweep.wav': 'spec_wav.png',
+ 'sweep.flac': 'spec_flac.png',
+ 'sweep.ogg': 'spec_ogg.png',
+ 'sweep.mp3': 'spec_mp3.png',
+ }
+
+for source, image in test_dict.iteritems():
+ audio = os.path.join(os.path.dirname(__file__), sample_dir + os.sep + source)
+ image = img_dir + os.sep + image
+ print 'Test : decoder(%s) | waveform (%s)' % (source, image)
+ decoder = FileDecoder(audio)
+ spectrogram = Spectrogram(width=1024, height=256, bg_color=(0,0,0), color_scheme='default')
+ (decoder | spectrogram).run()
+ print 'frames per pixel = ', spectrogram.graph.samples_per_pixel
+ print "render spectrogram to: %s" % image
+ spectrogram.render(image)
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import os
+from timeside.core import *
+from timeside.api import *
+from timeside.decoder import *
+from timeside.grapher import *
+
+sample_dir = '../samples'
+img_dir = '../results/img'
+if not os.path.exists(img_dir):
+ os.mkdir(img_dir)
+
+test_dict = {'sweep.wav': 'waveform_wav.png',
+ 'sweep.flac': 'waveform_flac.png',
+ 'sweep.ogg': 'waveform_ogg.png',
+ 'sweep.mp3': 'waveform_mp3.png',
+ }
+
+for source, image in test_dict.iteritems():
+ audio = os.path.join(os.path.dirname(__file__), sample_dir + os.sep + source)
+ image = img_dir + os.sep + image
+ print 'Test : decoder(%s) | waveform (%s)' % (source, image)
+ decoder = FileDecoder(audio)
+ waveform = Waveform(width=1024, height=256, bg_color=(0,0,0), color_scheme='default')
+ (decoder | waveform).run()
+ print 'frames per pixel = ', waveform.graph.samples_per_pixel
+ print "render waveform to: %s" % image
+ waveform.render(image)
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from timeside.decoder import *
+from timeside.analyzer import *
+from timeside.encoder import *
+
+import os.path
+source = os.path.join(os.path.dirname(__file__), "../samples/sweep.wav")
+dest = os.path.join(os.path.dirname(__file__), "../results/sweep_wav.ogg")
+
+decoder = FileDecoder(source)
+encoder = VorbisEncoder(dest)
+
+(decoder | encoder).run()
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from timeside.decoder import *
+from timeside.analyzer import *
+from timeside.encoder import *
+
+import os.path
+source = os.path.join(os.path.dirname(__file__), "../samples/sweep.wav")
+dest = os.path.join(os.path.dirname(__file__), "../results/sweep_wav.wav")
+
+decoder = FileDecoder(source)
+encoder = WavEncoder(dest)
+
+(decoder | encoder).run()
+
--- /dev/null
+import timeside
+
+def list_processors(interface, prefix=""):
+ print prefix + interface.__name__
+ subinterfaces = interface.__subclasses__()
+ for i in subinterfaces:
+ list_processors(i, prefix + " ")
+ processors = timeside.processors(interface, False)
+ for p in processors:
+ print prefix + " %s [%s]" % (p.__name__, p.id())
+
+list_processors(timeside.api.IProcessor)
--- /dev/null
+
+from timeside.component import *
+from timeside.tests import TestCase, TestRunner
+import unittest
+
+__all__ = ['TestComponentArchitecture']
+
+class TestComponentArchitecture(TestCase):
+ "Test the component and interface system"
+
+ def testOneInterface(self):
+ "Test a component implementing one interface"
+ self.assertSameList(implementations(I1), [C1])
+
+ def testTwoInterfaces(self):
+ "Test a component implementing two interfaces"
+ self.assertSameList(implementations(I2), [C2])
+ self.assertSameList(implementations(I3), [C2])
+
+ def testTwoImplementations(self):
+ "Test an interface implemented by two components"
+ self.assertSameList(implementations(I4), [C3, C4])
+
+ def testInterfaceInheritance(self):
+ "Test whether a component implements an interface's parent"
+ self.assertSameList(implementations(I5), [C5])
+
+ def testImplementationInheritance(self):
+ "Test that a component doesn't implement the interface implemented by its parent"
+ self.assertSameList(implementations(I7), [C6])
+
+ def testImplementationRedundancy(self):
+ "Test implementation redundancy across inheritance"
+ self.assertSameList(implementations(I8), [C8, C9])
+
+ def testAbstractImplementation(self):
+ "Test abstract implementation"
+ self.assertSameList(implementations(I11), [])
+ self.assertSameList(implementations(I11, abstract=True), [C11])
+
+ def testInterfaceDoc(self):
+ "Test @interfacedoc decorator"
+ self.assertEquals(C10.test.__doc__, "testdoc")
+
+ def testInterfaceDocStatic(self):
+ "Test @interfacedoc decorator on static method"
+ self.assertEquals(C10.teststatic.__doc__, "teststaticdoc")
+
+ def testIntefaceDocReversed(self):
+ "Test @interfacedoc on static method (decorators reversed)"
+
+ try:
+
+ class BogusDoc1(Component):
+ implements(I10)
+
+ @interfacedoc
+ @staticmethod
+ def teststatic(self):
+ pass
+
+ self.fail("No error raised with reversed decorators")
+
+ except ComponentError:
+ pass
+
+ def testInterfaceDocBadMethod(self):
+ "Test @interfacedoc with unexistant method in interface"
+
+ try:
+ class BogusDoc2(Component):
+ implements(I10)
+
+ @interfacedoc
+ def nosuchmethod(self):
+ pass
+
+ self.fail("No error raised when decorating an unexistant method")
+
+ except ComponentError:
+ pass
+
+class I1(Interface):
+ pass
+
+class I2(Interface):
+ pass
+
+class I3(Interface):
+ pass
+
+class I4(Interface):
+ pass
+
+class I5(Interface):
+ pass
+
+class I6(I5):
+ pass
+
+class I7(Interface):
+ pass
+
+class I8(Interface):
+ pass
+
+class I9(I8):
+ pass
+
+class I10(Interface):
+ def test(self):
+ """testdoc"""
+
+ @staticmethod
+ def teststatic(self):
+ """teststaticdoc"""
+
+class I11(Interface):
+ pass
+
+class C1(Component):
+ implements(I1)
+
+class C2(Component):
+ implements(I2, I3)
+
+class C3(Component):
+ implements(I4)
+
+class C4(Component):
+ implements(I4)
+
+class C5(Component):
+ implements(I6)
+
+class C6(Component):
+ implements(I7)
+
+class C7(C6):
+ pass
+
+class C8(Component):
+ implements(I8)
+
+class C9(Component):
+ implements(I8, I9)
+
+class C10(Component):
+ implements(I10)
+
+ @interfacedoc
+ def test(self):
+ pass
+
+ @staticmethod
+ @interfacedoc
+ def teststatic(self):
+ pass
+
+class C11(Component):
+ abstract()
+ implements(I11)
+
+if __name__ == '__main__':
+ unittest.main(testRunner=TestRunner())
+
--- /dev/null
+from timeside.core import FixedSizeInputAdapter
+from timeside.tests import TestCase, TestRunner
+import numpy
+import unittest
+
+class TestFixedSizeInputAdapter(TestCase):
+ "Test the fixed-sized input adapter"
+
+ def assertIOEquals(self, adapter, input, input_eod, output, output_eod=None):
+ output = output[:]
+ output.reverse()
+ _eod = None
+ for buffer, _eod in adapter.process(input, input_eod):
+ a = output.pop()
+ if not numpy.array_equiv(buffer, a):
+ self.fail("\n-- Actual --\n%s\n -- Expected -- \n%s\n" % (str(buffer), str(a)))
+
+ if _eod != output_eod:
+ self.fail("eod do not match: %s != %s", (str(_eod), str(output_eod)))
+
+ if output:
+ self.fail("trailing expected data: %s" % output)
+
+ def setUp(self):
+ self.data = numpy.arange(44).reshape(2,22).transpose()
+
+ def testTwoChannels(self):
+ "Test simple stream with two channels"
+ adapter = FixedSizeInputAdapter(4, 2)
+
+ self.assertEquals(len(self.data), adapter.nframes(len(self.data)))
+
+ self.assertIOEquals(adapter, self.data[0:1], False, [])
+ self.assertIOEquals(adapter, self.data[1:5], False, [self.data[0:4]], False)
+ self.assertIOEquals(adapter, self.data[5:12], False, [self.data[4:8], self.data[8:12]], False)
+ self.assertIOEquals(adapter, self.data[12:13], False, [])
+ self.assertIOEquals(adapter, self.data[13:14], False, [])
+ self.assertIOEquals(adapter, self.data[14:18], False, [self.data[12:16]], False)
+ self.assertIOEquals(adapter, self.data[18:20], False, [self.data[16:20]], False)
+ self.assertIOEquals(adapter, self.data[20:21], False, [])
+ self.assertIOEquals(adapter, self.data[21:22], True, [self.data[20:22]], True)
+
+ def testPadding(self):
+ "Test automatic padding support"
+ adapter = FixedSizeInputAdapter(4, 2, pad=True)
+
+ self.assertEquals(len(self.data) + 2, adapter.nframes(len(self.data)))
+
+ self.assertIOEquals(adapter, self.data[0:21], False,
+ [self.data[0:4], self.data[4:8], self.data[8:12], self.data[12:16], self.data[16:20]],
+ False)
+
+ self.assertIOEquals(adapter, self.data[21:22], True, [[
+ [20, 42],
+ [21, 43],
+ [0, 0],
+ [0, 0]
+ ]], True)
+
+ def testSizeMultiple(self):
+ "Test a stream which contain a multiple number of buffers"
+ adapter = FixedSizeInputAdapter(4, 2)
+
+ self.assertIOEquals(adapter, self.data[0:20], True,
+ [self.data[0:4], self.data[4:8], self.data[8:12], self.data[12:16], self.data[16:20]],
+ True)
+
+
+if __name__ == '__main__':
+ unittest.main(testRunner=TestRunner())
+
--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import logging
+
+class Logger:
+ """A logging object"""
+
+ def __init__(self, file):
+ self.logger = logging.getLogger('myapp')
+ self.hdlr = logging.FileHandler(file)
+ self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
+ self.hdlr.setFormatter(self.formatter)
+ self.logger.addHandler(self.hdlr)
+ self.logger.setLevel(logging.INFO)
+
+ def write_info(self, message):
+ self.logger.info(message)
+
+ def write_error(self, message):
+ self.logger.error(message)
+
--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009-2010 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+version = '0.1-beta'
+
+import os
+import sys
+import timeside
+
+class GrapherScheme:
+
+ def __init__(self):
+
+ self.color_scheme = {
+ 'waveform': [ # Four (R,G,B) tuples for three main color channels for the spectral centroid method
+ (50,0,200), (0,220,80), (255,224,0), (255,0,0)
+ ],
+ 'spectrogram': [
+ (0, 0, 0), (58/4,68/4,65/4), (80/2,100/2,153/2), (90,180,100), (224,224,44), (255,60,30), (255,255,255)
+ ]}
+
+ # Width of the image
+ self.width = 655
+
+ # Height of the image
+ self.height = 96
+
+ # Background color
+ self.bg_color = (0,0,0)
+
+ # Force computation. By default, the class doesn't overwrite existing image files.
+ self.force = True
+
+
+class Media2Waveform(object):
+
+ def __init__(self, media_dir, img_dir):
+ self.root_dir = os.path.join(os.path.dirname(__file__), media_dir)
+ self.img_dir = os.path.join(os.path.dirname(__file__), img_dir)
+ self.scheme = GrapherScheme()
+ self.width = self.scheme.width
+ self.height = self.scheme.height
+ self.bg_color = self.scheme.bg_color
+ self.color_scheme = self.scheme.color_scheme
+ self.force = self.scheme.force
+
+ self.media_list = self.get_media_list()
+ if not os.path.exists(self.img_dir):
+ os.makedirs(self.img_dir)
+ self.path_dict = self.get_path_dict()
+
+ def get_media_list(self):
+ media_list = []
+ for root, dirs, files in os.walk(self.root_dir):
+ if root:
+ for file in files:
+ ext = file.split('.')[-1]
+ media_list.append(root+os.sep+file)
+ return media_list
+
+ def get_path_dict(self):
+ path_dict = {}
+ for media in self.media_list:
+ filename = media.split(os.sep)[-1]
+ name, ext = os.path.splitext(filename)
+ path_dict[media] = self.img_dir + os.sep + filename.replace('.', '_') + '.png'
+ return path_dict
+
+ def process(self):
+ for source, image in self.path_dict.iteritems():
+ if not os.path.exists(image) or self.force:
+ print 'Processing ', source
+ audio = os.path.join(os.path.dirname(__file__), source)
+ decoder = timeside.decoder.FileDecoder(audio)
+ analyzer = timeside.analyzer.Duration()
+ waveform = timeside.grapher.WaveformJoyDiv(width=self.width, height=self.height,
+ bg_color=self.bg_color, color_scheme=self.color_scheme)
+ (decoder | analyzer | waveform).run()
+ duration = analyzer.result()
+ img_name = os.path.split(image)[1]
+ image = os.path.split(image)[0]+os.sep+os.path.splitext(img_name)[0] + '_' +\
+ '_'.join([str(self.width), str(self.height), str(int(duration))])+os.path.splitext(img_name)[1]
+ waveform.graph.filename = image
+ print 'Rendering ', source, ' to ', waveform.graph.filename, '...'
+ print 'frames per pixel = ', waveform.graph.samples_per_pixel
+ waveform.render(output=image)
+
+
+if __name__ == '__main__':
+ if len(sys.argv) <= 2:
+ print """
+ Usage : python waveform_batch /path/to/media_dir /path/to/img_dir
+
+ Dependencies : timeside, python, python-numpy, python-gst0.10, gstreamer0.10-plugins-base
+ See http://code.google.com/p/timeside/ for more information.
+ """
+ else:
+ media_dir = sys.argv[-2]
+ img_dir = sys.argv[-1]
+ m = Media2Waveform(media_dir, img_dir)
+ m.process()
--- /dev/null
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009-2010 Guillaume Pellerin <yomguy@parisson.com>
+
+# This file is part of TimeSide.
+
+# TimeSide is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# TimeSide is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with TimeSide. If not, see <http://www.gnu.org/licenses/>.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+
+version = '0.2'
+
+import os
+import sys
+import timeside
+from logger import Logger
+
+class GrapherScheme:
+
+ def __init__(self):
+ self.color = 255
+ self.color_scheme = {
+ 'waveform': [ # Four (R,G,B) tuples for three main color channels for the spectral centroid method
+ (self.color,self.color,self.color)
+# (0, 0, 0), (0, 0, 0), (0, 0, 0), (0,0,0)
+ ],
+ 'spectrogram': [
+ (0, 0, 0), (58/4,68/4,65/4), (80/2,100/2,153/2), (90,180,100), (224,224,44), (255,60,30), (255,255,255)
+ ]}
+
+ # Width of the image
+ self.width = 572
+
+ # Height of the image
+ self.height = 74
+
+ # Background color
+ self.bg_color = None
+
+ # Force computation. By default, the class doesn't overwrite existing image files.
+ self.force = False
+
+
+class Media2Waveform:
+
+ def __init__(self, media_dir, img_dir, log_file):
+ self.root_dir = os.path.join(os.path.dirname(__file__), media_dir)
+ self.img_dir = os.path.join(os.path.dirname(__file__), img_dir)
+ self.scheme = GrapherScheme()
+ self.width = self.scheme.width
+ self.height = self.scheme.height
+ self.bg_color = self.scheme.bg_color
+ self.color_scheme = self.scheme.color_scheme
+ self.force = self.scheme.force
+ self.logger = Logger(log_file)
+
+ self.media_list = self.get_media_list()
+ if not os.path.exists(self.img_dir):
+ os.makedirs(self.img_dir)
+ self.path_dict = self.get_path_dict()
+
+ def get_media_list(self):
+ media_list = []
+ for root, dirs, files in os.walk(self.root_dir):
+ if root:
+ for file in files:
+ ext = file.split('.')[-1]
+ media_list.append(root+os.sep+file)
+ return media_list
+
+ def get_path_dict(self):
+ path_dict = {}
+ for media in self.media_list:
+ filename = media.split(os.sep)[-1]
+ name, ext = os.path.splitext(filename)
+ path_dict[media] = self.img_dir + os.sep + name + '.png'
+ return path_dict
+
+ def process(self):
+ for audio, image in self.path_dict.iteritems():
+ if not os.path.exists(image) or self.force:
+ mess = 'Processing ' + audio
+ self.logger.write_info(mess)
+ pipe = PipeWaveform()
+ waveform = pipe.process(audio, self.width, self.height, self.bg_color, self.color_scheme)
+ if os.path.exists(image):
+ os.remove(image)
+ mess = 'Rendering ' + image
+ self.logger.write_info(mess)
+ waveform.render(output=image)
+ mess = 'frames per pixel = ' + str(waveform.graph.samples_per_pixel)
+ self.logger.write_info(mess)
+ waveform.release()
+
+class PipeWaveform:
+
+ def process(self, audio, width, height, bg_color, color_scheme):
+ decoder = timeside.decoder.FileDecoder(audio)
+ waveform = timeside.grapher.WaveformAwdio(width=width, height=height,
+ bg_color=bg_color, color_scheme=color_scheme)
+ (decoder | waveform).run()
+ return waveform
+
+if __name__ == '__main__':
+ if len(sys.argv) <= 2:
+ print """
+ Usage : python waveform_batch /path/to/media_dir /path/to/img_dir
+
+ Dependencies : timeside, python, python-numpy, python-gst0.10, gstreamer0.10-plugins-base
+ See http://code.google.com/p/timeside/ for more information.
+ """
+ else:
+ media_dir = sys.argv[-3]
+ img_dir = sys.argv[-2]
+ log_file = sys.argv[-1]
+ m = Media2Waveform(media_dir, img_dir, log_file)
+ m.process()
--- /dev/null
+===============================
+TimeSide - Web Audio Components
+===============================
+
+TimeSide UI Dependencies
+========================
+
+* SoundManager 2 >= 2.91 : http://www.schillmania.com/projects/soundmanager2
+* jQuery => 1.2.6 : http://www.jquery.com
+* jsGraphics => 3.03 http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm
+
+Licensing
+=========
+
+Copyright (c) 2008-2009 Samalyse
+Author: Olivier Guilyardi <olivier samalyse com>
+
+TimeSide is released under the terms of the GNU General Public License
+version 2. Please see the LICENSE file for details.
+
--- /dev/null
+/* FIXME: These CSS styles are essential and non intrusive. They should be
+ * dynamically assigned in javascript, and this file removed. */
+
+.ts-player .ts-ruler .ts-section .ts-canvas {
+ position: relative;
+}
+
+.ts-player .ts-wave {
+ position: relative;
+ clear: both;
+ overflow: hidden;
+}
+
+.ts-player .ts-wave .ts-image-container {
+ position: relative;
+}
+
+.ts-player .ts-wave .ts-image {
+ position: absolute;
+ left: 0;
+ clear: both;
+}
+
+.ts-player .ts-wave .ts-image-canvas {
+ position: absolute;
+ z-index: 100;
+ overflow: hidden;
+}
+
--- /dev/null
+<html>
+
+<head>
+<link type="text/css" href="../css/timeside.css" rel="stylesheet" media="screen" />
+<link type="text/css" href="../skins/lab/style.css" rel="stylesheet" media="screen" />
+<style type="text/css">
+.ts-player { width: 360px; }
+</style>
+<!--
+<script type="text/javascript" src="../lib/firebug-lite-compressed.js"></script>
+-->
+<script type="text/javascript">
+function get_globals() {
+ var g = [];
+ for (var v in window)
+ g = g.concat([v]);
+ return g;
+}
+function diff_array(a1, a2) {
+ var diff = [];
+ var i, ii = a2.length;
+ for (i = 0; i < ii; i++) {
+ if (a1.indexOf(a2[i]) == -1) {
+ diff = diff.concat([a2[i]]);
+ }
+ }
+ return diff;
+}
+
+function log_globals(label) {
+ var g = get_globals();
+ if (log_globals.cache && label && typeof console != 'undefined') {
+ console.log(label + ':');
+ console.log(diff_array(log_globals.cache, g));
+ }
+ log_globals.cache = g;
+}
+</script>
+<script>log_globals(false);</script>
+<script type="text/javascript" src="../lib/jquery.js"></script>
+<script type="text/javascript">
+jQuery.noConflict();
+jQuery(window).bind('load', function() {if (jQuery.browser.mozilla) jQuery('#Firebug').hide()});
+log_globals('jquery globals');
+</script>
+
+<!--
+<script type="text/javascript" src="jquery-ui.js"></script>
+-->
+<script>log_globals('jquery ui globals');</script>
+<script type="text/javascript" src="../lib/wz_jsgraphics.js"></script>
+<script>log_globals('jsgraphics globals');</script>
+<script type="text/javascript" src="../lib/soundmanager2.js"></script>
+<script>log_globals('soundmanager globals');</script>
+<script type="text/javascript" src="../src/timeside.js"></script>
+
+<script type="text/javascript">
+var sound = null;
+var map;
+var provider = null;
+var player = null;
+
+function shiftSize(delta) {
+ jQuery('#player').width(jQuery('#player').width() + delta);
+ player.resize();
+}
+
+function fullSize() {
+ jQuery('#player').css({width: 'auto'});
+ player.resize();
+}
+
+TimeSide.debug(true);
+TimeSide.load(function() {
+ map = new TimeSide.MarkerMap();
+ provider = new TimeSide.SoundProvider({source: sound});
+ player = new TimeSide.Player('#player', {
+ image: 'waveform.png'
+ });
+ controller = new TimeSide.Controller({
+ player: player,
+ soundProvider: provider,
+ map: map
+ });
+
+ jQuery('#skinner').get(0).className=jQuery('#skin').get(0).value; player.resize();
+});
+if (typeof soundManager != 'undefined') {
+ soundManager.url = '../lib/';
+ soundManager.flashVersion = 9;
+ soundManager.consoleOnly = true;
+ if (typeof console == 'undefined') {
+ soundManager.debugMode = false;
+ }
+
+ soundManager.onload = function() {
+ sound = soundManager.createSound({
+ id: 'test',
+ url: 'http://ns22997.ovh.net/tmp/crem.mp3'
+ //autoLoad: true
+ });
+
+ if (provider) {
+ provider.setSource(sound);
+ } else {
+ TimeSide.load(function () {
+ provider.setSource(sound);
+ });
+ }
+ }
+}
+
+</script>
+
+</head>
+
+<body>
+
+<h2>TimeSide Player</h2>
+
+<div id="skinner" class="">
+ <div id="player" class="ts-player">
+ </div>
+</div>
+
+<p>
+<!--
+ <button onclick="setup()">Setup</button>
+-->
+ <button onclick="shiftSize(-10)">Smaller</button>
+ <button onclick="shiftSize(10)">Bigger</button>
+ <button onclick="fullSize()">Full size</button>
+ <br />
+ Skin:
+ <select id="skin" onchange="jQuery('#skinner').get(0).className=this.value; player.resize(); ">
+ <option selected value="">None</option>
+ <option value="ts-skin-lab">Lab</option>
+ </select>
+</p>
+</body>
+</html>
--- /dev/null
+(function(_scope){_scope.pi=Object(3.14159265358979323846);var pi=_scope.pi;pi.version=1.0;pi.env={ie:/MSIE/i.test(navigator.userAgent),ie6:/MSIE 6/i.test(navigator.userAgent),ie7:/MSIE 7/i.test(navigator.userAgent),ie8:/MSIE 8/i.test(navigator.userAgent),firefox:/Firefox/i.test(navigator.userAgent),opera:/Opera/i.test(navigator.userAgent),webkit:/Webkit/i.test(navigator.userAgent)};pi.util={IsArray:function(_object){return _object&&_object!=window&&(_object instanceof Array||(typeof _object.length=="number"&&typeof _object.item=="function"))},IsHash:function(_object){return _object&&typeof _object=="object"&&(_object==window||_object instanceof Object)&&!_object.nodeName&&!pi.util.IsArray(_object)},DOMContentLoaded:[],AddEvent:function(_element,_eventName,_fn,_useCapture){_element[pi.env.ie.toggle("attachEvent","addEventListener")](pi.env.ie.toggle("on","")+_eventName,_fn,_useCapture||false);return pi.util.AddEvent.curry(this,_element)},RemoveEvent:function(_element,_eventName,_fn,_useCapture){return _element[pi.env.ie.toggle("detachEvent","removeEventListener")](pi.env.ie.toggle("on","")+_eventName,_fn,_useCapture||false)},GetWindowSize:function(){return{height:pi.env.ie?Math.max(document.documentElement.clientHeight,document.body.clientHeight):window.innerHeight,width:pi.env.ie?Math.max(document.documentElement.clientWidth,document.body.clientWidth):window.innerWidth}},Include:function(_url,_callback){var script=new pi.element("script").attribute.set("src",_url),callback=_callback||new Function,done=false,head=pi.get.byTag("head")[0];script.environment.getElement().onload=script.environment.getElement().onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){callback.call(this);done=true;head.removeChild(script.environment.getElement())}};script.insert(head)},Element:{addClass:function(_element,_class){if(!pi.util.Element.hasClass(_element,_class))pi.util.Element.setClass(_element,pi.util.Element.getClass(_element)+" "+_class)},getClass:function(_element){return _element.getAttribute(pi.env.ie.toggle("className","class"))||""},hasClass:function(_element,_class){return pi.util.Element.getClass(_element).split(" ").indexOf(_class)>-1},removeClass:function(_element,_class){if(pi.util.Element.hasClass(_element,_class))pi.util.Element.setClass(_element,pi.util.Element.getClass(_element,_class).split(" ").removeValue(_class).join(" "))},setClass:function(_element,_value){_element.setAttribute(pi.env.ie.toggle("className","class"),_value)},toggleClass:function(){if(pi.util.Element.hasClass.apply(this,arguments))pi.util.Element.removeClass.apply(this,arguments);else pi.util.Element.addClass.apply(this,arguments)},getOpacity:function(_styleObject){var styleObject=_styleObject;if(!pi.env.ie)return styleObject["opacity"];var alpha=styleObject["filter"].match(/opacity\=(\d+)/i);return alpha?alpha[1]/100:1},setOpacity:function(_element,_value){if(!pi.env.ie)return pi.util.Element.addStyle(_element,{"opacity":_value});_value*=100;pi.util.Element.addStyle(_element,{"filter":"alpha(opacity="+_value+")"});return this._parent_},getPosition:function(_element){var parent=_element,offsetLeft=0,offsetTop=0,view=pi.util.Element.getView(_element);while(parent&&parent!=document.body&&parent!=document.firstChild){offsetLeft+=parseInt(parent.offsetLeft);offsetTop+=parseInt(parent.offsetTop);parent=parent.offsetParent};return{"bottom":view["bottom"],"left":view["left"],"marginTop":view["marginTop"],"marginLeft":view["marginLeft"],"offsetLeft":offsetLeft,"offsetTop":offsetTop,"position":view["position"],"right":view["right"],"top":view["top"],"z-index":view["zIndex"]}},getSize:function(_element){var view=pi.util.Element.getView(_element);return{"height":view["height"],"offsetHeight":_element.offsetHeight,"offsetWidth":_element.offsetWidth,"width":view["width"]}},addStyle:function(_element,_style){for(var key in _style){key=key=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):key;if(key=="opacity"&&pi.env.ie){pi.util.Element.setOpacity(_element,_style[key]);continue}_element.style[key]=_style[key]}},getStyle:function(_element,_property){_property=_property=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):_property;if(_property=="opacity"&&pi.env.ie)return pi.util.Element.getOpacity(_element.style);return typeof _property=="string"?_element.style[_property]:_element.style},getView:function(_element,_property){var view=document.defaultView?document.defaultView.getComputedStyle(_element,null):_element.currentStyle;_property=_property=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):_property;if(_property=="opacity"&&pi.env.ie)return pi.util.Element.getOpacity(_element,view);return typeof _property=="string"?view[_property]:view}},CloneObject:function(_object,_fn){var tmp={};for(var key in _object){if(pi.util.IsArray(_object[key])){tmp[key]=Array.prototype.clone.apply(_object[key])}else if(pi.util.IsHash(_object[key])){tmp[key]=pi.util.CloneObject(_object[key]);if(_fn)_fn.call(tmp,key,_object)}else tmp[key]=_object[key]}return tmp},MergeObjects:function(_object,_source){for(var key in _source){var value=_source[key];if(pi.util.IsArray(_source[key])){if(pi.util.IsArray(_object[key])){Array.prototype.push.apply(_source[key],_object[key])}else value=_source[key].clone()}else if(pi.util.IsHash(_source[key])){if(pi.util.IsHash(_object[key])){value=pi.util.MergeObjects(_object[key],_source[key])}else{value=pi.util.CloneObject(_source[key])}}_object[key]=value};return _object}};pi.get=function(){return document.getElementById(arguments[0])};pi.get.byTag=function(){return document.getElementsByTagName(arguments[0])};pi.get.byClass=function(){return document.getElementsByClassName.apply(document,arguments)};pi.base=function(){this.body={};this.constructor=null;this.build=function(_skipClonning){var base=this,skipClonning=_skipClonning||false,_private={},fn=function(){var _p=pi.util.CloneObject(_private);if(!skipClonning){for(var key in this){if(pi.util.IsArray(this[key])){this[key]=Array.prototype.clone.apply(this[key])}else if(pi.util.IsHash(this[key])){this[key]=pi.util.CloneObject(this[key],function(_key,_object){this[_key]._parent_=this});this[key]._parent_=this}}};base.createAccessors(_p,this);if(base.constructor)return base.constructor.apply(this,arguments);return this};this.movePrivateMembers(this.body,_private);if(this.constructor){fn["$Constructor"]=this.constructor}fn.prototype=this.body;return fn};this.createAccessors=function(_p,_branch){var getter=function(_property){return this[_property]},setter=function(_property,_value){this[_property]=_value;return _branch._parent_||_branch};for(var name in _p){var isPrivate=name.substring(0,1)=="_",title=name.substring(1,2).toUpperCase()+name.substring(2);if(isPrivate){_branch["get"+title]=getter.curry(_p,name);_branch["set"+title]=setter.curry(_p,name)}else if(pi.util.IsHash(_p[name])){if(!_branch[name])_branch[name]={};this.createAccessors(_p[name],_branch[name])}}};this.movePrivateMembers=function(_object,_branch){for(var name in _object){var isPrivate=name.substring(0,1)=="_";if(isPrivate){_branch[name]=_object[name];delete _object[name]}else if(pi.util.IsHash(_object[name])){_branch[name]={};this.movePrivateMembers(_object[name],_branch[name])}}}};Function.prototype.extend=function(_prototype,_skipClonning){var object=new pi.base,superClass=this;if(_prototype["$Constructor"]){object.constructor=_prototype["$Constructor"];delete _prototype["$Constructor"]};object.body=superClass==pi.base?_prototype:pi.util.MergeObjects(_prototype,superClass.prototype,2);object.constructor=object.constructor||function(){if(superClass!=pi.base)superClass.apply(this,arguments)};return object.build(_skipClonning)};Function.prototype.curry=function(_scope){var fn=this,scope=_scope||window,args=Array.prototype.slice.call(arguments,1);return function(){return fn.apply(scope,args.concat(Array.prototype.slice.call(arguments,0)))}};pi.element=pi.base.extend({"$Constructor":function(_tag){this.environment.setElement(document.createElement(_tag||"DIV"));this.environment.getElement().pi=this;return this},"clean":function(){var childs=this.child.get();while(childs.length){childs[0].parentNode.removeChild(childs[0])}},"clone":function(_deep){return this.environment.getElement().cloneNode(_deep)},"insert":function(_element){_element=_element.environment?_element.environment.getElement():_element;_element.appendChild(this.environment.getElement());return this},"insertAfter":function(_referenceElement){_referenceElement=_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement;_referenceElement.nextSibling?this.insertBefore(_referenceElement.nextSibling):this.insert(_referenceElement.parentNode);return this},"insertBefore":function(_referenceElement){_referenceElement=_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement;_referenceElement.parentNode.insertBefore(this.environment.getElement(),_referenceElement);return this},"query":function(_expression,_resultType,namespaceResolver,_result){return pi.xpath(_expression,_resultType||"ORDERED_NODE_SNAPSHOT_TYPE",this.environment.getElement(),_namespaceResolver,_result)},"remove":function(){this.environment.getParent().removeChild(this.environment.getElement())},"update":function(_value){["TEXTAREA","INPUT"].indexOf(this.environment.getName())>-1?(this.environment.getElement().value=_value):(this.environment.getElement().innerHTML=_value);return this},"attribute":{"getAll":function(_name){return this._parent_.environment.getElement().attributes},"clear":function(_name){this.set(_name,"");return this._parent_},"get":function(_name){return this._parent_.environment.getElement().getAttribute(_name)},"has":function(_name){return pi.env.ie?(this.get(_name)!=null):this._parent_.environment.getElement().hasAttribute(_name)},"remove":function(_name){this._parent_.environment.getElement().removeAttribute(_name);return this._parent_},"set":function(_name,_value){this._parent_.environment.getElement().setAttribute(_name,_value);return this._parent_},"addClass":function(_classes){for(var i=0;i<arguments.length;i++){pi.util.Element.addClass(this._parent_.environment.getElement(),arguments[i])};return this._parent_},"clearClass":function(){this.setClass("");this._parent_},"getClass":function(){return pi.util.Element.getClass(this._parent_.environment.getElement())},"hasClass":function(_class){return pi.util.Element.hasClass(this._parent_.environment.getElement(),_class)},"setClass":function(_value){return pi.util.Element.setClass(this._parent_.environment.getElement(),_value)},"removeClass":function(_class){pi.util.Element.removeClass(this._parent_.environment.getElement(),_class);return this._parent_},"toggleClass":function(_class){pi.util.Element.toggleClass(this._parent_.environment.getElement(),_class)}},"child":{"get":function(){return this._parent_.environment.getElement().childNodes},"add":function(_elements){for(var i=0;i<arguments.length;i++){var el=arguments[i];this._parent_.environment.getElement().appendChild(el.environment?el.environment.getElement():el)}return this._parent_},"addAfter":function(_element,_referenceElement){this.addBefore(_element.environment?_element.environment.getElement():_element,(_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement).nextSibling);return this._parent_},"addBefore":function(_element,_referenceElement){this._parent_.environment.getElement().insertBefore(_element.environment?_element.environment.getElement():_element,_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement);return this._parent_},"query":function(_tag,_attributeName,_attributeValue){return this._parent_.query("{0}{1}".format((_tag?"{0}".format(_tag):"/*"),_attributeName||_attributeValue?"[contains(concat(' ', @{0}, ' '),' {1} ')]".format(_attributeName||"",_attributeValue||""):""))},"remove":function(_element){this._parent_.environment.getElement().removeChild(_element.environment?_element.environment.getElement():_element)}},"environment":{"_element":null,"getParent":function(){return this.getElement().parentNode},"getPosition":function(){return pi.util.Element.getPosition(this.getElement())},"getSize":function(){return pi.util.Element.getSize(this.getElement())},"addStyle":function(_styleObject){pi.util.Element.addStyle(this.getElement(),_styleObject);return this._parent_},"getStyle":function(_property){return pi.util.Element.getStyle(_property)},"getName":function(){return this.getElement().nodeName},"getType":function(){return this.getElement().nodeType},"getView":function(_property){return pi.util.Element.getView(this.getElement(),_property)}},"event":{"addListener":function(_event,_fn,_useCapture){pi.util.AddEvent(this._parent_.environment.getElement(),_event,_fn,_useCapture);return this._parent_},"removeListener":function(_event,_fn,_useCapture){pi.util.RemoveEvent(this._parent_.environment.getElement(),_event,_fn,_useCapture);return this._parent_}}});pi.xhr=new pi.base;pi.xhr.constructor=function(){var api;if(!window.XMLHttpRequest){var names=["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];for(var i=0;i<names.length;i++){try{this.environment.setApi(new ActiveXObject(names[i]));break}catch(e){continue}}}else this.environment.setApi(new XMLHttpRequest());this.environment.getApi().onreadystatechange=this.event.readystatechange.curry(this);return this};pi.xhr.body={"abort":function(){this.environment.getApi().abort()},"send":function(){var url=this.environment.getUrl(),data=this.environment.getData(),dataUrl="";for(var key in data)dataUrl+="{0}={1}&".format(key,data[key]);if(this.environment.getType()=="GET")url+=(url.search("\\?")==-1?"?":"&")+"{0}".format(dataUrl);this.environment.getApi().open(this.environment.getType(),url,this.environment.getAsync());for(var key in this.environment.getHeader())this.environment.getApi().setRequestHeader(key,this.environment.getHeader()[key]);this.environment.getApi().send(this.environment.getType()=="GET"?"":dataUrl)}};pi.xhr.body.environment={"_async":true,"_api":null,"_cache":true,"_callback":[],"_channel":null,"_data":{},"_header":{},"_mimeType":null,"_multipart":false,"_type":"GET","_timeout":0,"_url":"","addCallback":function(_options,_fn){this.getCallback().push({"fn":_fn,"options":_options})},"addHeader":function(_key,_value){this.getHeader()[_key]=_value},"addData":function(_key,_value){this.getData()[_key]=_value},"changeCache":function(_value){if(_value==false){this.addData("forceCache",Math.round(Math.random()*10000))}this.setCache(_value)},"changeType":function(_value){if(_value=="POST"){this.addHeader("Content-Type","application/x-www-form-urlencoded")}this.setType(_value)}};pi.xhr.body.event={"readystatechange":function(){var readyState=this.environment.getApi().readyState;var callback=this.environment.getCallback();for(var i=0;i<callback.length;i++){if(callback[i].options.readyState.indexOf(readyState)>-1)callback[i].fn.apply(this)}}};pi.xhr=pi.xhr.build();pi.xhr.get=function(_url,_returnPiObject){var request=new pi.xhr();request.environment.setAsync(false);request.environment.setUrl(_url);request.send();return _returnPiObject?request:request.environment.getApi()};pi.xpath=function(_expression,_resultType,_contextNode,_namespaceResolver,_result){var contextNode=_contextNode||document,expression=_expression||"",namespaceResolver=_namespaceResolver||null,result=_result||null,resultType=_resultType||"ANY_TYPE";return document.evaluate(expression,contextNode,namespaceResolver,XPathResult[resultType],result)};Array.prototype.clone=function(){var tmp=[];Array.prototype.push.apply(tmp,this);tmp.forEach(function(item,index,object){if(item instanceof Array)object[index]=object[index].clone()});return tmp};Array.prototype.count=function(_value){var count=0;this.forEach(function(){count+=Number(arguments[0]==_value)});return count};Array.prototype.forEach=Array.prototype.forEach||function(_function){for(var i=0;i<this.length;i++)_function.apply(this,[this[i],i,this])};Array.prototype.getLastItem=function(){return this[this.length-1]};Array.prototype.indexOf=Array.prototype.indexOf||function(_value){var index=-1;for(var i=0;i<this.length;i++)if(this[i]==_value){index=i;break}return index};Array.prototype.remove=function(_index){var array=this.slice(0,_index);Array.prototype.push.apply(array,this.slice(_index+1));return array};Array.prototype.removeValue=function(_value){return this.remove(this.indexOf(_value))};Boolean.prototype.toggle=function(){return this==true?arguments[0]:arguments[1]};Number.prototype.base=function(_system){var remain=this%_system;if(this==remain)return String.fromCharCode(this+(this>9?87:48));return((this-remain)/_system).base(_system)+String.fromCharCode(remain+(remain>9?87:48))};Number.prototype.decimal=function(_system){var result=0,digit=String(this).split("");for(var i=0;i<digit.length;i++){digit[i]=parseInt((digit[i].charCodeAt(0)>58)?digit[i].charCodeAt(0)-87:digit[i]);result+=digit[i]*(Math.pow(_system,digit.length-1-i))}return result};Number.prototype.range=function(_pattern){for(var value=String(this),isFloat=/\./i.test(value),i=isFloat.toggle(parseInt(value.split(".")[0]),0),end=parseInt(value.split(".")[isFloat.toggle(1,0)]),array=[];i<end;i++){array.push(Boolean(_pattern)==false?i:(typeof _pattern=="function"?_pattern(i):_pattern[i]))}return array};String.prototype.escape=function(){return escape(this)};String.prototype.format=function(){var values=arguments;return this.replace(/\{(\d)\}/g,function(){return values[arguments[1]]})};String.prototype.leftpad=function(_len,_ch){var str=this;var ch=Boolean(_ch)==false?" ":_ch;while(str.length<_len)str=ch+str;return str};String.prototype.toggle=function(_value,_other){return this==_value?_value:_other};String.prototype.unicode=function(){var str="",obj=this.split("");for(var i=obj.length-1;i>=0;i--)str="\\u{0}{1}".format(String(obj[i].charCodeAt(0).base(16)).leftpad(4,"0"),str);return str};pi.util.AddEvent(pi.env.ie?window:document,pi.env.ie?"load":"DOMContentLoaded",function(){for(var i=0;i<pi.util.DOMContentLoaded.length;i++){pi.util.DOMContentLoaded[i]()}})})(window);
+var firebug={env:{"cache":{},"ctmp":[],"dIndex":"console","init":false,"ml":false,"objCn":[]},init:function(){firebug.el={};firebug.el.content={};with(firebug){document.documentElement.childNodes[0].appendChild(new pi.element("link").attribute.set("rel","stylesheet").attribute.set("href","http://firebuglite.appspot.com/firebug-lite.css").environment.getElement());el.main=new pi.element("DIV").attribute.set("id","Firebug").environment.addStyle({"width":pi.util.GetWindowSize().width+"px"}).insert(document.body);el.header=new pi.element("DIV").attribute.addClass("Header").insert(el.main);el.left={};el.left.container=new pi.element("DIV").attribute.addClass("Left").insert(el.main);el.right={};el.right.container=new pi.element("DIV").attribute.addClass("Right").insert(el.main);el.main.child.add(new pi.element("DIV").environment.addStyle({"clear":"both"}));el.button={};el.button.container=new pi.element("DIV").attribute.addClass("ButtonContainer").insert(el.header);el.button.logo=new pi.element("A").attribute.set("title","Firebug Lite").attribute.set("target","_blank").attribute.set("href","http://getfirebug.com/lite.html").update(" ").attribute.addClass("Button Logo").insert(el.button.container);el.button.inspect=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.inspector.toggle).update("Inspect").insert(el.button.container);el.button.maximize=new pi.element("A").attribute.addClass("Button Maximize").event.addListener("click",win.maximize).insert(el.button.container);el.button.minimize=new pi.element("A").attribute.addClass("Button Minimize").event.addListener("click",win.minimize).insert(el.button.container);el.button.close=new pi.element("A").attribute.addClass("Button Close").event.addListener("click",win.close).insert(el.button.container);if(pi.env.ie||pi.env.webkit){el.button.container.environment.addStyle({"paddingTop":"12px"})}el.nav={};el.nav.container=new pi.element("DIV").attribute.addClass("Nav").insert(el.left.container);el.nav.console=new pi.element("A").attribute.addClass("Tab Selected").event.addListener("click",d.navigate.curry(window,"console")).update("Console").insert(el.nav.container);el.nav.html=new pi.element("A").attribute.addClass("Tab").update("HTML").event.addListener("click",d.navigate.curry(window,"html")).insert(el.nav.container);el.nav.css=new pi.element("A").attribute.addClass("Tab").update("CSS").event.addListener("click",d.navigate.curry(window,"css")).insert(el.nav.container);el.nav.scripts=new pi.element("A").attribute.addClass("Tab").update("Script").event.addListener("click",d.navigate.curry(window,"scripts")).insert(el.nav.container);el.nav.dom=new pi.element("A").attribute.addClass("Tab").update("DOM").event.addListener("click",d.navigate.curry(window,"dom")).insert(el.nav.container);el.nav.xhr=new pi.element("A").attribute.addClass("Tab").update("XHR").event.addListener("click",d.navigate.curry(window,"xhr")).insert(el.nav.container);el.borderInspector=new pi.element("DIV").attribute.set("id","FirebugBorderInspector").event.addListener("click",listen.inspector).insert(document.body);el.bgInspector=new pi.element("DIV").attribute.set("id","FirebugBGInspector").insert(document.body);el.left.console={};el.left.console.container=new pi.element("DIV").attribute.addClass("Console").insert(el.left.container);el.left.console.mlButton=new pi.element("A").attribute.addClass("MLButton").event.addListener("click",d.console.toggleML).insert(el.left.console.container);el.left.console.monitor=new pi.element("DIV").insert(new pi.element("DIV").attribute.addClass("Monitor").insert(el.left.console.container));el.left.console.container.child.add(new pi.element("DIV").attribute.addClass("InputArrow").update(">>>"));el.left.console.input=new pi.element("INPUT").attribute.set("type","text").attribute.addClass("Input").event.addListener("keydown",listen.consoleTextbox).insert(new pi.element("DIV").attribute.addClass("InputContainer").insert(el.left.console.container));el.right.console={};el.right.console.container=new pi.element("DIV").attribute.addClass("Console Container").insert(el.right.container);el.right.console.mlButton=new pi.element("A").attribute.addClass("MLButton CloseML").event.addListener("click",d.console.toggleML).insert(el.right.console.container);el.right.console.input=new pi.element("TEXTAREA").attribute.addClass("Input").insert(el.right.console.container);el.right.console.run=new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.runMultiline).update("Run").insert(el.right.console.container);el.right.console.clear=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.right.console.input)).update("Clear").insert(el.right.console.container);el.button.console={};el.button.console.container=new pi.element("DIV").attribute.addClass("ButtonSet").insert(el.button.container);el.button.console.clear=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.left.console.monitor)).update("Clear").insert(el.button.console.container);el.left.html={};el.left.html.container=new pi.element("DIV").attribute.addClass("HTML").insert(el.left.container);el.right.html={};el.right.html.container=new pi.element("DIV").attribute.addClass("HTML Container").insert(el.right.container);el.right.html.nav={};el.right.html.nav.container=new pi.element("DIV").attribute.addClass("Nav").insert(el.right.html.container);el.right.html.nav.computedStyle=new pi.element("A").attribute.addClass("Tab Selected").event.addListener("click",d.html.navigate.curry(firebug,"computedStyle")).update("Computed Style").insert(el.right.html.nav.container);if(!pi.env.ie6)el.right.html.nav.dom=new pi.element("A").attribute.addClass("Tab").event.addListener("click",d.html.navigate.curry(firebug,"dom")).update("DOM").insert(el.right.html.nav.container);el.right.html.content=new pi.element("DIV").attribute.addClass("Content").insert(el.right.html.container);el.button.html={};el.button.html.container=new pi.element("DIV").attribute.addClass("ButtonSet HTML").insert(el.button.container);el.left.css={};el.left.css.container=new pi.element("DIV").attribute.addClass("CSS").insert(el.left.container);el.right.css={};el.right.css.container=new pi.element("DIV").attribute.addClass("CSS Container").insert(el.right.container);el.right.css.nav={};el.right.css.nav.container=new pi.element("DIV").attribute.addClass("Nav").insert(el.right.css.container);el.right.css.nav.runCSS=new pi.element("A").attribute.addClass("Tab Selected").update("Run CSS").insert(el.right.css.nav.container);el.right.css.mlButton=new pi.element("A").attribute.addClass("MLButton CloseML").event.addListener("click",d.console.toggleML).insert(el.right.css.container);el.right.css.input=new pi.element("TEXTAREA").attribute.addClass("Input").insert(el.right.css.container);el.right.css.run=new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.runCSS).update("Run").insert(el.right.css.container);el.right.css.clear=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.right.css.input)).update("Clear").insert(el.right.css.container);el.button.css={};el.button.css.container=new pi.element("DIV").attribute.addClass("ButtonSet CSS").insert(el.button.container);el.button.css.selectbox=new pi.element("SELECT").event.addListener("change",listen.cssSelectbox).insert(el.button.css.container);el.left.scripts={};el.left.scripts.container=new pi.element("DIV").attribute.addClass("Scripts").insert(el.left.container);el.right.scripts={};el.right.scripts.container=new pi.element("DIV").attribute.addClass("Scripts Container").insert(el.right.container);el.button.scripts={};el.button.scripts.container=new pi.element("DIV").attribute.addClass("ButtonSet Scripts").insert(el.button.container);el.button.scripts.selectbox=new pi.element("SELECT").event.addListener("change",listen.scriptsSelectbox).insert(el.button.scripts.container);el.button.scripts.lineNumbers=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.scripts.toggleLineNumbers).update("Show Line Numbers").insert(el.button.scripts.container);el.left.dom={};el.left.dom.container=new pi.element("DIV").attribute.addClass("DOM").insert(el.left.container);el.right.dom={};el.right.dom.container=new pi.element("DIV").attribute.addClass("DOM Container").insert(el.right.container);el.button.dom={};el.button.dom.container=new pi.element("DIV").attribute.addClass("ButtonSet DOM").insert(el.button.container);el.button.dom.label=new pi.element("LABEL").update("Object Path:").insert(el.button.dom.container);el.button.dom.textbox=new pi.element("INPUT").event.addListener("keydown",listen.domTextbox).update("window").insert(el.button.dom.container);el.left.str={};el.left.str.container=new pi.element("DIV").attribute.addClass("STR").insert(el.left.container);el.right.str={};el.right.str.container=new pi.element("DIV").attribute.addClass("STR").insert(el.left.container);el.button.str={};el.button.str.container=new pi.element("DIV").attribute.addClass("ButtonSet XHR").insert(el.button.container);el.button.str.watch=new pi.element("A").attribute.addClass("Button").event.addListener("click",d.navigate.curry(window,"xhr")).update("Back").insert(el.button.str.container);el.left.xhr={};el.left.xhr.container=new pi.element("DIV").attribute.addClass("XHR").insert(el.left.container);el.right.xhr={};el.right.xhr.container=new pi.element("DIV").attribute.addClass("XHR").insert(el.left.container);el.button.xhr={};el.button.xhr.container=new pi.element("DIV").attribute.addClass("ButtonSet XHR").insert(el.button.container);el.button.xhr.label=new pi.element("LABEL").update("XHR Path:").insert(el.button.xhr.container);el.button.xhr.textbox=new pi.element("INPUT").event.addListener("keydown",listen.xhrTextbox).insert(el.button.xhr.container);el.button.xhr.watch=new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.addXhrObject).update("Watch").insert(el.button.xhr.container);if(pi.env.ie6){var buttons=[el.button.inspect,el.button.close,el.button.inspect,el.button.console.clear,el.right.console.run,el.right.console.clear,el.right.css.run,el.right.css.clear];for(var i=0;i<buttons.length;i++)buttons[i].attribute.set("href","#")}env.init=true;for(var i=0;i<env.ctmp.length;i++){d.console.log.apply(window,env.ctmp[i])}}},win:{close:function(){with(firebug){el.main.update("");el.main.remove()}},minimize:function(){with(firebug){el.main.environment.addStyle({"height":"35px"});el.button.maximize.environment.addStyle({"display":"block"});el.button.minimize.environment.addStyle({"display":"none"});d.refreshSize()}},maximize:function(){with(firebug){el.main.environment.addStyle({"height":"295px"});el.button.minimize.environment.addStyle({"display":"block"});el.button.maximize.environment.addStyle({"display":"none"});d.refreshSize()}}},watchXHR:function(){with(firebug){d.xhr.addObject.apply(window,arguments);if(env.dIndex!="xhr"){d.navigate("xhr")}}},d:{clean:function(_element){with(firebug){_element.update("")}},console:{dir:function(_value){with(firebug){d.console.addLine().attribute.addClass("Arrow").update(">>> console.dir("+_value+")");d.dom.open(_value,d.console.addLine())}},addLine:function(){with(firebug){return new pi.element("DIV").attribute.addClass("Row").insert(el.left.console.monitor)}},openObject:function(_index){with(firebug){d.dom.open(env.objCn[_index],el.left.dom.container,pi.env.ie);d.navigate("dom")}},historyIndex:0,history:[],log:function(_values){with(firebug){if(env.init==false){env.ctmp.push(arguments);return}var value="";for(var i=0;i<arguments.length;i++){value+=(i>0?" ":"")+d.highlight(arguments[i],false,false,true)}d.console.addLine().update(value);d.console.scroll()}},print:function(_cmd,_text){with(firebug){d.console.addLine().attribute.addClass("Arrow").update(">>> "+_cmd);d.console.addLine().update(d.highlight(_text,false,false,true));d.console.scroll();d.console.historyIndex=d.console.history.push(_cmd)}},run:function(cmd){with(firebug){if(cmd.length==0)return;el.left.console.input.environment.getElement().value="";try{var result=eval.call(window,cmd);d.console.print(cmd,result)}catch(e){d.console.addLine().attribute.addClass("Arrow").update(">>> "+cmd);if(!pi.env.ff){d.console.scroll();return d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+(e.description||e),true)}if(e.fileName==null){d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+e.message,true)}var fileName=e.fileName.split("\/").getLastItem();d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+e.message+" (<em>"+fileName+"</em>,"+e.lineNumber+")",true);d.console.scroll()}d.console.scroll()}},scroll:function(){with(firebug){el.left.console.monitor.environment.getElement().parentNode.scrollTop=Math.abs(el.left.console.monitor.environment.getSize().offsetHeight-200)}},toggleML:function(){with(firebug){var open=!env.ml;env.ml=!env.ml;d.navigateRightColumn("console",open);el[open?"left":"right"].console.mlButton.environment.addStyle({display:"none"});el[!open?"left":"right"].console.mlButton.environment.addStyle({display:"block"});el.left.console.monitor.environment.addStyle({"height":(open?233:210)+"px"});el.left.console.mlButton.attribute[(open?"add":"remove")+"Class"]("CloseML")}}},css:{index:-1,open:function(_index){with(firebug){var item=document.styleSheets[_index];var uri=item.href;if(uri.indexOf("http:\/\/")>-1&&getDomain(uri)!=document.domain){el.left.css.container.update("<em>Access to restricted URI denied</em>");return}var rules=item[pi.env.ie?"rules":"cssRules"];var str="";for(var i=0;i<rules.length;i++){var item=rules[i];var selector=item.selectorText;var cssText=pi.env.ie?item.style.cssText:item.cssText.match(/\{(.*)\}/)[1];str+=d.css.printRule(selector,cssText.split(";"),el.left.css.container)}el.left.css.container.update(str)}},printRule:function(_selector,_css,_layer){with(firebug){var str="<div class='Selector'>"+_selector+" {</div>";for(var i=0;i<_css.length;i++){var item=_css[i];str+="<div class='CSSText'>"+item.replace(/(.+\:)(.+)/,"<span class='CSSProperty'>$1</span><span class='CSSValue'>$2;</span>")+"</div>"}str+="<div class='Selector'>}</div>";return str}},refresh:function(){with(firebug){el.button.css.selectbox.update("");var collection=document.styleSheets;for(var i=0;i<collection.length;i++){var uri=collection[i].href;d.css.index=d.css.index<0?i:d.css.index;el.button.css.selectbox.child.add(new pi.element("OPTION").attribute.set("value",i).update(uri))};d.css.open(d.css.index)}}},dom:{open:function(_object,_layer){with(firebug){_layer.clean();var container=new pi.element("DIV").attribute.addClass("DOMContent").insert(_layer);d.dom.print(_object,container)}},print:function(_object,_parent,_inTree){with(firebug){var obj=_object||window,parentElement=_parent;parentElement.update("");if(parentElement.opened&&parentElement!=el.left.dom.container){parentElement.environment.getParent().pi.child.get()[0].pi.child.get()[0].pi.attribute.removeClass("Opened");parentElement.opened=false;parentElement.environment.addStyle({"display":"none"});return}if(_inTree)parentElement.environment.getParent().pi.child.get()[0].pi.child.get()[0].pi.attribute.addClass("Opened");parentElement.opened=true;for(var key in obj){try{var value=obj[key],property=key,container=new pi.element("DIV").attribute.addClass("DOMRow").insert(parentElement),left=new pi.element("DIV").attribute.addClass("DOMRowLeft").insert(container),right=new pi.element("DIV").attribute.addClass("DOMRowRight").insert(container);container.child.add(new pi.element("DIV").environment.addStyle({"clear":"both"}));var link=new pi.element("A").attribute.addClass(typeof value=="object"&&Boolean(value)?"Property Object":"Property").update(property).insert(left);right.update(d.highlight(value,false,true));var subContainer=new pi.element("DIV").attribute.addClass("DOMRowSubContainer").insert(container);if(typeof value!="object"||Boolean(value)==false)continue;link.event.addListener("click",d.dom.print.curry(window,value,subContainer,true))}catch(e){}}parentElement.environment.addStyle({"display":"block"})}}},highlight:function(_value,_inObject,_inArray,_link){with(firebug){var isArray=false,isElement=false;try{isArray=pi.util.IsArray(_value);isElement=_value!=undefined&&Boolean(_value.nodeName)&&Boolean(_value.nodeType)}catch(e){};if(_value==null||["boolean","function","number","string"].indexOf(typeof _value)>-1){if(_value==null){return"<span class='Null'>null</span>"}if(["boolean","number"].indexOf(typeof _value)>-1){return"<span class='DarkBlue'>"+_value+"</span>"}if(typeof _value=="function"){return"<span class='"+(_inObject?"Italic Gray":"Green")+"'>function()</span>"}return"<span class='Red'>\""+(!_inObject&&!_inArray?_value:_value.substring(0,35)).replace(/\n/g,"\\n").replace(/\s/g," ").replace(/>/g,">").replace(/</g,"<")+"\"</span>"}else if(isElement){if(_value.nodeType==3)return d.highlight(_value.nodeValue);if(_inArray||_inObject){var result="<span class='Blue'>"+_value.nodeName.toLowerCase();if(_value.getAttribute&&_value.getAttribute("id"))result+="<span class='DarkBlue'>#"+_value.getAttribute("id")+"</span>";var elClass=_value.getAttribute?_value.getAttribute(pi.env.ie?"className":"class"):"";if(elClass)result+="<span class='Red'>."+elClass.split(" ")[0]+"</span>";return result+"</span>"}var result="<span class='Blue'><"+_value.nodeName.toLowerCase()+"";if(_value.attributes)for(var i=0;i<_value.attributes.length;i++){var item=_value.attributes[i];if(pi.env.ie&&Boolean(item.nodeValue)==false)continue;result+=" <span class='DarkBlue'>"+item.nodeName+"=\"<span class='Red'>"+item.nodeValue+"</span>\"</span>"}result+="></span>";return result}else if(isArray||["object","array"].indexOf(typeof _value)>-1){var result="";if(isArray||_value instanceof Array){if(_inObject)return"<span class='Gray Italic'>["+_value.length+"]</span>";result+="<span class='Strong'>[ ";for(var i=0;i<_value.length;i++){if((_inObject||_inArray)&&pi.env.ie&&i>3)break;result+=(i>0?", ":"")+d.highlight(_value[i],false,true,true)}result+=" ]</span>";return result}if(_inObject)return"<span class='Gray Italic'>Object</span>";result+="<span class='Strong Green"+(!_link?"'":" ObjectLink' onmouseover='this.className=this.className.replace(\"ObjectLink\",\"ObjectLinkHover\")' onmouseout='this.className=this.className.replace(\"ObjectLinkHover\",\"ObjectLink\")' onclick='firebug.d.console.openObject("+(env.objCn.push(_value)-1)+")'")+">Object";var i=0;for(var key in _value){var value=_value[key];if((_inObject||_inArray)&&pi.env.ie&&i>3)break;result+=" "+key+"="+d.highlight(value,true);i++};result+="</span>";return result}else{if(_inObject)return"<span class='Gray Italic'>"+_value+"</span>";return _value}}},html:{nIndex:"computedStyle",current:null,highlight:function(_element,_clear,_event){with(firebug){if(_clear){el.bgInspector.environment.addStyle({"display":"none"});return}d.inspector.inspect(_element,true)}},inspect:function(_element){var el=_element,map=[],parent=_element;while(parent){map.push(parent);if(parent==document.body)break;parent=parent.parentNode}map=map.reverse();with(firebug){d.inspector.toggle();var parentLayer=el.left.html.container.child.get()[1].childNodes[1].pi;for(var t=0;map[t];){if(t==map.length-1){var link=parentLayer.environment.getElement().previousSibling.pi;link.attribute.addClass("Selected");if(d.html.current)d.html.current[1].attribute.removeClass("Selected");d.html.current=[_element,link];return;t}parentLayer=d.html.openHtmlTree(map[t],parentLayer,map[t+1]);t++}}},navigate:function(_index,_element){with(firebug){el.right.html.nav[d.html.nIndex].attribute.removeClass("Selected");el.right.html.nav[_index].attribute.addClass("Selected");d.html.nIndex=_index;d.html.openProperties()}},openHtmlTree:function(_element,_parent,_returnParentElementByElement,_event){with(firebug){var element=_element||document.documentElement,parent=_parent||el.left.html.container,returnParentEl=_returnParentElementByElement||null,returnParentVal=null;if(parent!=el.left.html.container){var nodeLink=parent.environment.getParent().pi.child.get()[0].pi;if(d.html.current)d.html.current[1].attribute.removeClass("Selected");nodeLink.attribute.addClass("Selected");d.html.current=[_element,nodeLink];d.html.openProperties()}if(element.childNodes&&(element.childNodes.length==0||(element.childNodes.length==1&&element.childNodes[0].nodeType==3)))return;parent.clean();if(parent.opened&&Boolean(_returnParentElementByElement)==false){parent.opened=false;parent.environment.getParent().pi.child.get()[0].pi.attribute.removeClass("Open");return}if(parent!=el.left.html.container){parent.environment.getParent().pi.child.get()[0].pi.attribute.addClass("Open");parent.opened=true}for(var i=0;i<element.childNodes.length;i++){var item=element.childNodes[i];if(item.nodeType==3)continue;var container=new pi.element().attribute.addClass("Block").insert(parent);var link=new pi.element("A").attribute.addClass("Link").update(d.highlight(item)).insert(container);var subContainer=new pi.element("DIV").attribute.addClass("SubContainer").insert(container);link.event.addListener("click",d.html.openHtmlTree.curry(window,item,subContainer,false));link.event.addListener("mouseover",d.html.highlight.curry(window,item,false));link.event.addListener("mouseout",d.html.highlight.curry(window,item,true));returnParentVal=returnParentEl==item?subContainer:returnParentVal;if(d.html.current==null&&item==document.body){link.attribute.addClass("Selected");d.html.current=[item,link];d.html.openHtmlTree(item,subContainer)}if(item.childNodes&&item.childNodes.length==1&&item.childNodes[0].nodeType==3){link.child.get()[0].appendChild(document.createTextNode(item.childNodes[0].nodeValue.substring(0,100)));link.child.get()[0].appendChild(document.createTextNode("</"));link.child.get()[0].appendChild(new pi.element("span").attribute.addClass("Blue").update(item.nodeName.toLowerCase()).environment.getElement());link.child.get()[0].appendChild(document.createTextNode(">"));continue}else if(item.childNodes&&item.childNodes.length==0)continue;link.attribute.addClass("ParentLink")}return returnParentVal}},openProperties:function(){with(firebug){var index=d.html.nIndex;var node=d.html.current[0];d.clean(el.right.html.content);var str="";switch(index){case"computedStyle":var property=["opacity","filter","azimuth","background","backgroundAttachment","backgroundColor","backgroundImage","backgroundPosition","backgroundRepeat","border","borderCollapse","borderColor","borderSpacing","borderStyle","borderTop","borderRight","borderBottom","borderLeft","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderWidth","bottom","captionSide","clear","clip","color","content","counterIncrement","counterReset","cue","cueAfter","cueBefore","cursor","direction","display","elevation","emptyCells","cssFloat","font","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","height","left","letterSpacing","lineHeight","listStyle","listStyleImage","listStylePosition","listStyleType","margin","marginTop","marginRight","marginBottom","marginLeft","markerOffset","marks","maxHeight","maxWidth","minHeight","minWidth","orphans","outline","outlineColor","outlineStyle","outlineWidth","overflow","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","page","pageBreakAfter","pageBreakBefore","pageBreakInside","pause","pauseAfter","pauseBefore","pitch","pitchRange","playDuring","position","quotes","richness","right","size","speak","speakHeader","speakNumeral","speakPunctuation","speechRate","stress","tableLayout","textAlign","textDecoration","textIndent","textShadow","textTransform","top","unicodeBidi","verticalAlign","visibility","voiceFamily","volume","whiteSpace","widows","width","wordSpacing","zIndex"].sort();var view=document.defaultView?document.defaultView.getComputedStyle(node,null):node.currentStyle;for(var i=0;i<property.length;i++){var item=property[i];if(!view[item])continue;str+="<div class='CSSItem'><div class='CSSProperty'>"+item+"</div><div class='CSSValue'>"+d.highlight(view[item])+"</div></div>"}el.right.html.content.update(str);break;case"dom":d.dom.open(node,el.right.html.content,pi.env.ie);break}}}},inspector:{enabled:false,el:null,inspect:function(_element,_bgInspector){var el=_element,top=el.offsetTop,left=el.offsetLeft,parent=_element.offsetParent;while(Boolean(parent)&&parent!=document.firstChild){top+=parent.offsetTop;left+=parent.offsetLeft;parent=parent.offsetParent;if(parent==document.body)break};with(firebug){el[_bgInspector?"bgInspector":"borderInspector"].environment.addStyle({"width":_element.offsetWidth+"px","height":_element.offsetHeight+"px","top":top-(_bgInspector?0:2)+"px","left":left-(_bgInspector?0:2)+"px","display":"block"});if(!_bgInspector){d.inspector.el=_element}}},toggle:function(){with(firebug){d.inspector.enabled=!d.inspector.enabled;el.button.inspect.attribute[(d.inspector.enabled?"add":"remove")+"Class"]("Enabled");if(d.inspector.enabled==false){el.borderInspector.environment.addStyle({"display":"none"});d.inspector.el=null}else if(pi.env.dIndex!="html"){d.navigate("html")}}}},scripts:{index:-1,lineNumbers:false,open:function(_index){with(firebug){d.scripts.index=_index;el.left.scripts.container.update("");var script=document.getElementsByTagName("script")[_index],uri=script.src||document.location.href,source;if(uri.indexOf("http:\/\/")>-1&&getDomain(uri)!=document.domain){el.left.scripts.container.update("<em>Access to restricted URI denied</em>");return}if(uri!=document.location.href){source=env.cache[uri]||pi.xhr.get(uri).responseText;env.cache[uri]=source}else source=script.innerHTML;source=source.replace(/\n|\t|<|>/g,function(_ch){return({"<":"<",">":">","\t":" ","\n":"<br />"})[_ch]});if(!d.scripts.lineNumbers)el.left.scripts.container.child.add(new pi.element("DIV").attribute.addClass("CodeContainer").update(source));else{source=source.split("<br />");for(var i=0;i<source.length;i++){el.left.scripts.container.child.add(new pi.element("DIV").child.add(new pi.element("DIV").attribute.addClass("LineNumber").update(i+1),new pi.element("DIV").attribute.addClass("Code").update(" "+source[i]),new pi.element("DIV").environment.addStyle({"clear":"both"})))}}}},toggleLineNumbers:function(){with(firebug){d.scripts.lineNumbers=!d.scripts.lineNumbers;el.button.scripts.lineNumbers.attribute[(d.scripts.lineNumbers?"add":"remove")+"Class"]("Enabled");d.scripts.open(d.scripts.index)}},refresh:function(){with(firebug){el.button.scripts.selectbox.clean();var collection=document.getElementsByTagName("script");for(var i=0;i<collection.length;i++){var item=collection[i];d.scripts.index=d.scripts.index<0?i:d.scripts.index;el.button.scripts.selectbox.child.add(new pi.element("OPTION").attribute.set("value",i).update(item.src||item.baseURI||".."))}d.scripts.open(d.scripts.index)}}},str:{open:function(_str){with(firebug){d.navigate("str");el.left.str.container.update(_str.replace(/\n/g,"<br />"))}}},xhr:{objects:[],addObject:function(){with(firebug){for(var i=0;i<arguments.length;i++){try{var item=arguments[i];var val=eval(item);d.xhr.objects.push([item,val])}catch(e){continue}}}},open:function(){with(firebug){el.left.xhr.container.update("");el.left.xhr.name=new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").attribute.addClass("Block").environment.addStyle({"width":"20%"}).insert(el.left.xhr.container));el.left.xhr.nameTitle=new pi.element("STRONG").update("Object Name:").insert(el.left.xhr.name);el.left.xhr.nameContent=new pi.element("DIV").insert(el.left.xhr.name);el.left.xhr.status=new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").attribute.addClass("Block").environment.addStyle({"width":"10%"}).insert(el.left.xhr.container));el.left.xhr.statusTitle=new pi.element("STRONG").update("Status:").insert(el.left.xhr.status);el.left.xhr.statusContent=new pi.element("DIV").insert(el.left.xhr.status);el.left.xhr.readystate=new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").environment.addStyle({"width":"15%"}).attribute.addClass("Block").insert(el.left.xhr.container));el.left.xhr.readystateTitle=el.left.xhr.nameTitle=new pi.element("STRONG").update("Ready State:").insert(el.left.xhr.readystate);el.left.xhr.readystateContent=new pi.element("DIV").insert(el.left.xhr.readystate);el.left.xhr.response=new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").environment.addStyle({"width":(pi.env.ie?"50":"55")+"%"}).attribute.addClass("Block").insert(el.left.xhr.container));el.left.xhr.responseTitle=new pi.element("STRONG").update("Response:").insert(el.left.xhr.response);el.left.xhr.responseContent=new pi.element("DIV").insert(el.left.xhr.response);setTimeout(d.xhr.refresh,500)}},refresh:function(){with(firebug){el.left.xhr.nameContent.update("");el.left.xhr.statusContent.update("");el.left.xhr.readystateContent.update("");el.left.xhr.responseContent.update("");for(var i=0;i<d.xhr.objects.length;i++){var item=d.xhr.objects[i];var response=item[1].responseText;if(Boolean(item[1])==false)continue;el.left.xhr.nameContent.child.add(new pi.element("span").update(item[0]));try{el.left.xhr.statusContent.child.add(new pi.element("span").update(item[1].status))}catch(e){el.left.xhr.statusContent.child.add(new pi.element("span").update(" "))}el.left.xhr.readystateContent.child.add(new pi.element("span").update(item[1].readyState));el.left.xhr.responseContent.child.add(new pi.element("span").child.add(new pi.element("A").event.addListener("click",d.str.open.curry(window,response)).update(" "+response.substring(0,50))))};if(env.dIndex=="xhr")setTimeout(d.xhr.refresh,500)}}},navigateRightColumn:function(_index,_open){with(firebug){el.left.container.environment.addStyle({"width":_open?"70%":"100%"});el.right.container.environment.addStyle({"display":_open?"block":"none"})}},navigate:function(_index){with(firebug){var open=_index,close=env.dIndex;env.dIndex=open;el.button[close].container.environment.addStyle({"display":"none"});el.left[close].container.environment.addStyle({"display":"none"});el.right[close].container.environment.addStyle({"display":"none"});el.button[open].container.environment.addStyle({"display":"inline"});el.left[open].container.environment.addStyle({"display":"block"});el.right[open].container.environment.addStyle({"display":"block"});if(el.nav[close])el.nav[close].attribute.removeClass("Selected");if(el.nav[open])el.nav[open].attribute.addClass("Selected");switch(open){case"console":d.navigateRightColumn(_index);break;case"html":d.navigateRightColumn(_index,true);d.html.openHtmlTree();break;case"css":d.navigateRightColumn(_index,true);d.css.refresh();break;case"scripts":d.navigateRightColumn(_index);d.scripts.refresh();break;case"dom":d.navigateRightColumn(_index);if(el.left.dom.container.environment.getElement().innerHTML=="")d.dom.open(eval(el.button.dom.textbox.environment.getElement().value),el.left.dom.container);break;case"xhr":d.navigateRightColumn(_index);d.xhr.open();break}}},refreshSize:function(){with(firebug){el.main.environment.addStyle({"width":pi.util.GetWindowSize().width+"px"});if(pi.env.ie6)el.main.environment.addStyle({"top":pi.util.GetWindowSize().height-el.main.environment.getSize().offsetHeight+"px"})}}},getDomain:function(_url){return _url.match(/http:\/\/(www.)?([\.\w]+)/)[2]},listen:{addXhrObject:function(){with(firebug){d.xhr.addObject.apply(window,el.button.xhr.textbox.environment.getElement().value.split(","))}},consoleTextbox:function(_event){with(firebug){if(_event.keyCode==13&&(env.multilinemode==false||_event.shiftKey==false)){d.console.historyIndex=d.console.history.length;d.console.run(el.left.console.input.environment.getElement().value);return false}if([13,38,40].indexOf(_event.keyCode)==-1)return;d.console.historyIndex+=_event.keyCode!=40?0:d.console.historyIndex==d.console.history.length?0:1;d.console.historyIndex-=_event.keyCode!=38?0:d.console.historyIndex==0?0:1;el.left.console.input.update(d.console.history.length>d.console.historyIndex?d.console.history[d.console.historyIndex]:"")}},cssSelectbox:function(){with(firebug){d.css.open(el.button.css.selectbox.environment.getElement().selectedIndex)}},domTextbox:function(_event){with(firebug){if(_event.keyCode==13){d.dom.open(eval(el.button.dom.textbox.environment.getElement().value),el.left.dom.container)}}},inspector:function(){with(firebug){d.html.inspect(d.inspector.el)}},keyboard:function(_event){with(firebug){if(_event.keyCode==27&&d.inspector.enabled)d.inspector.toggle()}},mouse:function(_event){with(firebug){var target=_event[pi.env.ie?"srcElement":"target"];if(d.inspector.enabled&&target!=document.body&&target!=document.firstChild&&target!=document.childNodes[1]&&target!=el.borderInspector.environment.getElement()&&target!=el.main.environment.getElement()&&target.offsetParent!=el.main.environment.getElement())d.inspector.inspect(target)}},runMultiline:function(){with(firebug){d.console.run.call(window,el.right.console.input.environment.getElement().value)}},runCSS:function(){with(firebug){var source=el.right.css.input.environment.getElement().value.replace(/\n|\t/g,"").split("}");for(var i=0;i<source.length;i++){var item=source[i]+"}",rule=!pi.env.ie?item:item.split(/{|}/),collection=document.getElementsByTagName("style"),style=collection.length>0?collection[0]:document.body.appendChild(document.createElement("style"));if(!item.match(/.+\{.+\}/))continue;if(pi.env.ie)style.styleSheet.addRule(rule[0],rule[1]);else style.sheet.insertRule(rule,style.sheet.cssRules.length)}}},scriptsSelectbox:function(){with(firebug){d.scripts.open(parseInt(el.button.scripts.selectbox.environment.getElement().value))}},xhrTextbox:function(_event){with(firebug){if(_event.keyCode==13){d.xhr.addObject.apply(window,el.button.xhr.textbox.environment.getElement().value.split(","))}}}}};window.console=firebug.d.console;pi.util.AddEvent(window,"resize",firebug.d.refreshSize);pi.util.AddEvent(document,"mousemove",firebug.listen.mouse);pi.util.AddEvent(document,"keydown",firebug.listen.keyboard);pi.util.DOMContentLoaded.push(firebug.init);
\ No newline at end of file
--- /dev/null
+(function(){
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+
+// Map over jQuery in case of overwrite
+var _jQuery = window.jQuery,
+// Map over the $ in case of overwrite
+ _$ = window.$;
+
+var jQuery = window.jQuery = window.$ = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context );
+};
+
+// A simple way to check for HTML strings or ID strings
+// (both of which we optimize for)
+var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
+
+// Is it a simple selector
+ isSimple = /^.[^:#\[\.]*$/,
+
+// Will speed up references to undefined, and allows munging its name.
+ undefined;
+
+jQuery.fn = jQuery.prototype = {
+ init: function( selector, context ) {
+ // Make sure that a selection was provided
+ selector = selector || document;
+
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this[0] = selector;
+ this.length = 1;
+ return this;
+ }
+ // Handle HTML strings
+ if ( typeof selector == "string" ) {
+ // Are we dealing with HTML string or an ID?
+ var match = quickExpr.exec( selector );
+
+ // Verify a match, and that no context was specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] )
+ selector = jQuery.clean( [ match[1] ], context );
+
+ // HANDLE: $("#id")
+ else {
+ var elem = document.getElementById( match[3] );
+
+ // Make sure an element was located
+ if ( elem ){
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id != match[3] )
+ return jQuery().find( selector );
+
+ // Otherwise, we inject the element directly into the jQuery object
+ return jQuery( elem );
+ }
+ selector = [];
+ }
+
+ // HANDLE: $(expr, [context])
+ // (which is just equivalent to: $(content).find(expr)
+ } else
+ return jQuery( context ).find( selector );
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) )
+ return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
+
+ return this.setArray(jQuery.makeArray(selector));
+ },
+
+ // The current version of jQuery being used
+ jquery: "1.2.6",
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ // The number of elements contained in the matched element set
+ length: 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 == undefined ?
+
+ // Return a 'clean' array
+ jQuery.makeArray( this ) :
+
+ // Return just the object
+ this[ num ];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+ // Build a new jQuery matched element set
+ var ret = jQuery( elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Force the current matched set of elements to become
+ // the specified array of elements (destroying the stack in the process)
+ // You should use pushStack() in order to do this, but maintain the stack
+ setArray: function( elems ) {
+ // Resetting the length to 0, then using the native Array push
+ // is a super-fast way to populate an object with array-like properties
+ this.length = 0;
+ Array.prototype.push.apply( this, elems );
+
+ return this;
+ },
+
+ // 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 );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+ var ret = -1;
+
+ // Locate the position of the desired element
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem && elem.jquery ? elem[0] : elem
+ , this );
+ },
+
+ attr: function( name, value, type ) {
+ var options = name;
+
+ // Look for the case where we're accessing a style value
+ if ( name.constructor == String )
+ if ( value === undefined )
+ return this[0] && jQuery[ type || "attr" ]( this[0], name );
+
+ else {
+ options = {};
+ options[ name ] = value;
+ }
+
+ // Check to see if we're setting style values
+ return this.each(function(i){
+ // Set all the styles
+ for ( name in options )
+ jQuery.attr(
+ type ?
+ this.style :
+ this,
+ name, jQuery.prop( this, options[ name ], type, i, name )
+ );
+ });
+ },
+
+ css: function( key, value ) {
+ // ignore negative width and height values
+ if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
+ value = undefined;
+ return this.attr( key, value, "curCSS" );
+ },
+
+ text: function( text ) {
+ if ( typeof text != "object" && text != null )
+ return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+
+ var ret = "";
+
+ jQuery.each( text || this, function(){
+ jQuery.each( this.childNodes, function(){
+ if ( this.nodeType != 8 )
+ ret += this.nodeType != 1 ?
+ this.nodeValue :
+ jQuery.fn.text( [ this ] );
+ });
+ });
+
+ return ret;
+ },
+
+ wrapAll: function( html ) {
+ if ( this[0] )
+ // The elements to wrap the target around
+ jQuery( html, this[0].ownerDocument )
+ .clone()
+ .insertBefore( this[0] )
+ .map(function(){
+ var elem = this;
+
+ while ( elem.firstChild )
+ elem = elem.firstChild;
+
+ return elem;
+ })
+ .append(this);
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ return this.each(function(){
+ jQuery( this ).contents().wrapAll( html );
+ });
+ },
+
+ wrap: function( html ) {
+ return this.each(function(){
+ jQuery( this ).wrapAll( html );
+ });
+ },
+
+ append: function() {
+ return this.domManip(arguments, true, false, function(elem){
+ if (this.nodeType == 1)
+ this.appendChild( elem );
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, true, function(elem){
+ if (this.nodeType == 1)
+ this.insertBefore( elem, this.firstChild );
+ });
+ },
+
+ before: function() {
+ return this.domManip(arguments, false, false, function(elem){
+ this.parentNode.insertBefore( elem, this );
+ });
+ },
+
+ after: function() {
+ return this.domManip(arguments, false, true, function(elem){
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ });
+ },
+
+ end: function() {
+ return this.prevObject || jQuery( [] );
+ },
+
+ find: function( selector ) {
+ var elems = jQuery.map(this, function(elem){
+ return jQuery.find( selector, elem );
+ });
+
+ return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
+ jQuery.unique( elems ) :
+ elems );
+ },
+
+ clone: function( events ) {
+ // Do the clone
+ var ret = this.map(function(){
+ if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
+ // IE copies events bound via attachEvent when
+ // using cloneNode. Calling detachEvent on the
+ // clone will also remove the events from the orignal
+ // In order to get around this, we use innerHTML.
+ // Unfortunately, this means some modifications to
+ // attributes in IE that are actually only stored
+ // as properties will not be copied (such as the
+ // the name attribute on an input).
+ var clone = this.cloneNode(true),
+ container = document.createElement("div");
+ container.appendChild(clone);
+ return jQuery.clean([container.innerHTML])[0];
+ } else
+ return this.cloneNode(true);
+ });
+
+ // Need to set the expando to null on the cloned set if it exists
+ // removeData doesn't work here, IE removes it from the original as well
+ // this is primarily for IE but the data expando shouldn't be copied over in any browser
+ var clone = ret.find("*").andSelf().each(function(){
+ if ( this[ expando ] != undefined )
+ this[ expando ] = null;
+ });
+
+ // Copy the events from the original to the clone
+ if ( events === true )
+ this.find("*").andSelf().each(function(i){
+ if (this.nodeType == 3)
+ return;
+ var events = jQuery.data( this, "events" );
+
+ for ( var type in events )
+ for ( var handler in events[ type ] )
+ jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
+ });
+
+ // Return the cloned set
+ return ret;
+ },
+
+ filter: function( selector ) {
+ return this.pushStack(
+ jQuery.isFunction( selector ) &&
+ jQuery.grep(this, function(elem, i){
+ return selector.call( elem, i );
+ }) ||
+
+ jQuery.multiFilter( selector, this ) );
+ },
+
+ not: function( selector ) {
+ if ( selector.constructor == String )
+ // test special case where just one selector is passed in
+ if ( isSimple.test( selector ) )
+ return this.pushStack( jQuery.multiFilter( selector, this, true ) );
+ else
+ selector = jQuery.multiFilter( selector, this );
+
+ var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
+ return this.filter(function() {
+ return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
+ });
+ },
+
+ add: function( selector ) {
+ return this.pushStack( jQuery.unique( jQuery.merge(
+ this.get(),
+ typeof selector == 'string' ?
+ jQuery( selector ) :
+ jQuery.makeArray( selector )
+ )));
+ },
+
+ is: function( selector ) {
+ return !!selector && jQuery.multiFilter( selector, this ).length > 0;
+ },
+
+ hasClass: function( selector ) {
+ return this.is( "." + selector );
+ },
+
+ val: function( value ) {
+ if ( value == undefined ) {
+
+ if ( this.length ) {
+ var elem = this[0];
+
+ // We need to handle select boxes special
+ if ( jQuery.nodeName( elem, "select" ) ) {
+ var 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
+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+ var option = options[ i ];
+
+ if ( option.selected ) {
+ // Get the specifc value for the option
+ value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
+
+ // We don't need an array for one selects
+ if ( one )
+ return value;
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+
+ // Everything else, we just grab the value
+ } else
+ return (this[0].value || "").replace(/\r/g, "");
+
+ }
+
+ return undefined;
+ }
+
+ if( value.constructor == Number )
+ value += '';
+
+ return this.each(function(){
+ if ( this.nodeType != 1 )
+ return;
+
+ if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
+ this.checked = (jQuery.inArray(this.value, value) >= 0 ||
+ jQuery.inArray(this.name, value) >= 0);
+
+ else if ( jQuery.nodeName( this, "select" ) ) {
+ var values = jQuery.makeArray(value);
+
+ jQuery( "option", this ).each(function(){
+ this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
+ jQuery.inArray( this.text, values ) >= 0);
+ });
+
+ if ( !values.length )
+ this.selectedIndex = -1;
+
+ } else
+ this.value = value;
+ });
+ },
+
+ html: function( value ) {
+ return value == undefined ?
+ (this[0] ?
+ this[0].innerHTML :
+ null) :
+ this.empty().append( value );
+ },
+
+ replaceWith: function( value ) {
+ return this.after( value ).remove();
+ },
+
+ eq: function( i ) {
+ return this.slice( i, i + 1 );
+ },
+
+ slice: function() {
+ return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function(elem, i){
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ andSelf: function() {
+ return this.add( this.prevObject );
+ },
+
+ data: function( key, value ){
+ var parts = key.split(".");
+ parts[1] = parts[1] ? "." + parts[1] : "";
+
+ if ( value === undefined ) {
+ var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+ if ( data === undefined && this.length )
+ data = jQuery.data( this[0], key );
+
+ return data === undefined && parts[1] ?
+ this.data( parts[0] ) :
+ data;
+ } else
+ return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
+ jQuery.data( this, key, value );
+ });
+ },
+
+ removeData: function( key ){
+ return this.each(function(){
+ jQuery.removeData( this, key );
+ });
+ },
+
+ domManip: function( args, table, reverse, callback ) {
+ var clone = this.length > 1, elems;
+
+ return this.each(function(){
+ if ( !elems ) {
+ elems = jQuery.clean( args, this.ownerDocument );
+
+ if ( reverse )
+ elems.reverse();
+ }
+
+ var obj = this;
+
+ if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
+ obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
+
+ var scripts = jQuery( [] );
+
+ jQuery.each(elems, function(){
+ var elem = clone ?
+ jQuery( this ).clone( true )[0] :
+ this;
+
+ // execute all scripts after the elements have been injected
+ if ( jQuery.nodeName( elem, "script" ) )
+ scripts = scripts.add( elem );
+ else {
+ // Remove any inner scripts for later evaluation
+ if ( elem.nodeType == 1 )
+ scripts = scripts.add( jQuery( "script", elem ).remove() );
+
+ // Inject the elements into the document
+ callback.call( obj, elem );
+ }
+ });
+
+ scripts.each( evalScript );
+ });
+ }
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+function evalScript( i, elem ) {
+ if ( elem.src )
+ jQuery.ajax({
+ url: elem.src,
+ async: false,
+ dataType: "script"
+ });
+
+ else
+ jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+
+ if ( elem.parentNode )
+ elem.parentNode.removeChild( elem );
+}
+
+function now(){
+ return +new Date;
+}
+
+jQuery.extend = jQuery.fn.extend = function() {
+ // copy reference to target object
+ var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
+
+ // Handle a deep copy situation
+ if ( target.constructor == 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 copy)
+ if ( typeof target != "object" && typeof target != "function" )
+ 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 ( var name in options ) {
+ var src = target[ name ], copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy )
+ continue;
+
+ // Recurse if we're merging object values
+ if ( deep && copy && typeof copy == "object" && !copy.nodeType )
+ target[ name ] = jQuery.extend( deep,
+ // Never move original objects, clone them
+ src || ( copy.length != null ? [ ] : { } )
+ , copy );
+
+ // Don't bring in undefined values
+ else if ( copy !== undefined )
+ target[ name ] = copy;
+
+ }
+
+ // Return the modified object
+ return target;
+};
+
+var expando = "jQuery" + now(), uuid = 0, windowData = {},
+ // exclude the following css properties to add px
+ exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+ // cache defaultView
+ defaultView = document.defaultView || {};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ window.$ = _$;
+
+ if ( deep )
+ window.jQuery = _jQuery;
+
+ return jQuery;
+ },
+
+ // See test/unit/core.js for details concerning this function.
+ isFunction: function( fn ) {
+ return !!fn && typeof fn != "string" && !fn.nodeName &&
+ fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
+ },
+
+ // check if an element is in a (or is an) XML document
+ isXMLDoc: function( elem ) {
+ return elem.documentElement && !elem.body ||
+ elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
+ },
+
+ // Evalulates a script in a global context
+ globalEval: function( data ) {
+ data = jQuery.trim( data );
+
+ if ( data ) {
+ // Inspired by code by Andrea Giammarchi
+ // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+ var head = document.getElementsByTagName("head")[0] || document.documentElement,
+ script = document.createElement("script");
+
+ script.type = "text/javascript";
+ if ( jQuery.browser.msie )
+ script.text = data;
+ else
+ script.appendChild( document.createTextNode( data ) );
+
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709).
+ head.insertBefore( script, head.firstChild );
+ head.removeChild( script );
+ }
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
+ },
+
+ cache: {},
+
+ data: function( elem, name, data ) {
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var id = elem[ expando ];
+
+ // Compute a unique ID for the element
+ if ( !id )
+ id = elem[ expando ] = ++uuid;
+
+ // Only generate the data cache if we're
+ // trying to access or manipulate it
+ if ( name && !jQuery.cache[ id ] )
+ jQuery.cache[ id ] = {};
+
+ // Prevent overriding the named cache with undefined values
+ if ( data !== undefined )
+ jQuery.cache[ id ][ name ] = data;
+
+ // Return the named cache data, or the ID for the element
+ return name ?
+ jQuery.cache[ id ][ name ] :
+ id;
+ },
+
+ removeData: function( elem, name ) {
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var id = elem[ expando ];
+
+ // If we want to remove a specific section of the element's data
+ if ( name ) {
+ if ( jQuery.cache[ id ] ) {
+ // Remove the section of cache data
+ delete jQuery.cache[ id ][ name ];
+
+ // If we've removed all the data, remove the element's cache
+ name = "";
+
+ for ( name in jQuery.cache[ id ] )
+ break;
+
+ if ( !name )
+ jQuery.removeData( elem );
+ }
+
+ // Otherwise, we want to remove all of the element's data
+ } else {
+ // Clean up the element expando
+ try {
+ delete elem[ expando ];
+ } catch(e){
+ // IE has trouble directly removing the expando
+ // but it's ok with using removeAttribute
+ if ( elem.removeAttribute )
+ elem.removeAttribute( expando );
+ }
+
+ // Completely remove the data cache
+ delete jQuery.cache[ id ];
+ }
+ },
+
+ // args is for internal usage only
+ each: function( object, callback, args ) {
+ var name, i = 0, length = object.length;
+
+ if ( args ) {
+ if ( length == undefined ) {
+ for ( name in object )
+ if ( callback.apply( object[ name ], args ) === false )
+ break;
+ } else
+ for ( ; i < length; )
+ if ( callback.apply( object[ i++ ], args ) === false )
+ break;
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( length == undefined ) {
+ for ( name in object )
+ if ( callback.call( object[ name ], name, object[ name ] ) === false )
+ break;
+ } else
+ for ( var value = object[0];
+ i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
+ }
+
+ return object;
+ },
+
+ prop: function( elem, value, type, i, name ) {
+ // Handle executable functions
+ if ( jQuery.isFunction( value ) )
+ value = value.call( elem, i );
+
+ // Handle passing in a number to a CSS property
+ return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
+ value + "px" :
+ value;
+ },
+
+ className: {
+ // internal only, use addClass("class")
+ add: function( elem, classNames ) {
+ jQuery.each((classNames || "").split(/\s+/), function(i, className){
+ if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
+ elem.className += (elem.className ? " " : "") + className;
+ });
+ },
+
+ // internal only, use removeClass("class")
+ remove: function( elem, classNames ) {
+ if (elem.nodeType == 1)
+ elem.className = classNames != undefined ?
+ jQuery.grep(elem.className.split(/\s+/), function(className){
+ return !jQuery.className.has( classNames, className );
+ }).join(" ") :
+ "";
+ },
+
+ // internal only, use hasClass("class")
+ has: function( elem, className ) {
+ return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
+ }
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations
+ swap: function( elem, options, callback ) {
+ var old = {};
+ // Remember the old values, and insert the new ones
+ for ( var name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ callback.call( elem );
+
+ // Revert the old values
+ for ( var name in options )
+ elem.style[ name ] = old[ name ];
+ },
+
+ css: function( elem, name, force ) {
+ if ( name == "width" || name == "height" ) {
+ var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
+
+ function getWH() {
+ val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
+ var padding = 0, border = 0;
+ jQuery.each( which, function() {
+ padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+ border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+ });
+ val -= Math.round(padding + border);
+ }
+
+ if ( jQuery(elem).is(":visible") )
+ getWH();
+ else
+ jQuery.swap( elem, props, getWH );
+
+ return Math.max(0, val);
+ }
+
+ return jQuery.curCSS( elem, name, force );
+ },
+
+ curCSS: function( elem, name, force ) {
+ var ret, style = elem.style;
+
+ // A helper method for determining if an element's values are broken
+ function color( elem ) {
+ if ( !jQuery.browser.safari )
+ return false;
+
+ // defaultView is cached
+ var ret = defaultView.getComputedStyle( elem, null );
+ return !ret || ret.getPropertyValue("color") == "";
+ }
+
+ // We need to handle opacity special in IE
+ if ( name == "opacity" && jQuery.browser.msie ) {
+ ret = jQuery.attr( style, "opacity" );
+
+ return ret == "" ?
+ "1" :
+ ret;
+ }
+ // Opera sometimes will give the wrong display answer, this fixes it, see #2037
+ if ( jQuery.browser.opera && name == "display" ) {
+ var save = style.outline;
+ style.outline = "0 solid black";
+ style.outline = save;
+ }
+
+ // Make sure we're using the right name for getting the float value
+ if ( name.match( /float/i ) )
+ name = styleFloat;
+
+ if ( !force && style && style[ name ] )
+ ret = style[ name ];
+
+ else if ( defaultView.getComputedStyle ) {
+
+ // Only "float" is needed here
+ if ( name.match( /float/i ) )
+ name = "float";
+
+ name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
+
+ var computedStyle = defaultView.getComputedStyle( elem, null );
+
+ if ( computedStyle && !color( elem ) )
+ ret = computedStyle.getPropertyValue( name );
+
+ // If the element isn't reporting its values properly in Safari
+ // then some display: none elements are involved
+ else {
+ var swap = [], stack = [], a = elem, i = 0;
+
+ // Locate all of the parent display: none elements
+ for ( ; a && color(a); a = a.parentNode )
+ stack.unshift(a);
+
+ // Go through and make them visible, but in reverse
+ // (It would be better if we knew the exact display type that they had)
+ for ( ; i < stack.length; i++ )
+ if ( color( stack[ i ] ) ) {
+ swap[ i ] = stack[ i ].style.display;
+ stack[ i ].style.display = "block";
+ }
+
+ // Since we flip the display style, we have to handle that
+ // one special, otherwise get the value
+ ret = name == "display" && swap[ stack.length - 1 ] != null ?
+ "none" :
+ ( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
+
+ // Finally, revert the display styles back
+ for ( i = 0; i < swap.length; i++ )
+ if ( swap[ i ] != null )
+ stack[ i ].style.display = swap[ i ];
+ }
+
+ // We should always get a number back from opacity
+ if ( name == "opacity" && ret == "" )
+ ret = "1";
+
+ } else if ( elem.currentStyle ) {
+ var camelCase = name.replace(/\-(\w)/g, function(all, letter){
+ return letter.toUpperCase();
+ });
+
+ ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
+
+ // From the awesome hack by Dean Edwards
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+ // If we're not dealing with a regular pixel number
+ // but a number that has a weird ending, we need to convert it to pixels
+ if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
+ // Remember the original values
+ var left = style.left, rsLeft = elem.runtimeStyle.left;
+
+ // Put in the new values to get a computed value out
+ elem.runtimeStyle.left = elem.currentStyle.left;
+ style.left = ret || 0;
+ ret = style.pixelLeft + "px";
+
+ // Revert the changed values
+ style.left = left;
+ elem.runtimeStyle.left = rsLeft;
+ }
+ }
+
+ return ret;
+ },
+
+ clean: function( elems, context ) {
+ var ret = [];
+ context = context || document;
+ // !context.createElement fails in IE with an error but returns typeof 'object'
+ if (typeof context.createElement == 'undefined')
+ context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+
+ jQuery.each(elems, function(i, elem){
+ if ( !elem )
+ return;
+
+ if ( elem.constructor == Number )
+ elem += '';
+
+ // Convert html string into DOM nodes
+ if ( typeof elem == "string" ) {
+ // Fix "XHTML"-style tags in all browsers
+ elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
+ return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
+ all :
+ front + "></" + tag + ">";
+ });
+
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
+
+ var wrap =
+ // option or optgroup
+ !tags.indexOf("<opt") &&
+ [ 1, "<select multiple='multiple'>", "</select>" ] ||
+
+ !tags.indexOf("<leg") &&
+ [ 1, "<fieldset>", "</fieldset>" ] ||
+
+ tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
+ [ 1, "<table>", "</table>" ] ||
+
+ !tags.indexOf("<tr") &&
+ [ 2, "<table><tbody>", "</tbody></table>" ] ||
+
+ // <thead> matched above
+ (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
+ [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
+
+ !tags.indexOf("<col") &&
+ [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
+
+ // IE can't serialize <link> and <script> tags normally
+ jQuery.browser.msie &&
+ [ 1, "div<div>", "</div>" ] ||
+
+ [ 0, "", "" ];
+
+ // Go to html and back, then peel off extra wrappers
+ div.innerHTML = wrap[1] + elem + wrap[2];
+
+ // Move to the right depth
+ while ( wrap[0]-- )
+ div = div.lastChild;
+
+ // Remove IE's autoinserted <tbody> from table fragments
+ if ( jQuery.browser.msie ) {
+
+ // String was a <table>, *may* have spurious <tbody>
+ var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
+ div.firstChild && div.firstChild.childNodes :
+
+ // String was a bare <thead> or <tfoot>
+ wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
+ div.childNodes :
+ [];
+
+ for ( var j = tbody.length - 1; j >= 0 ; --j )
+ if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
+ tbody[ j ].parentNode.removeChild( tbody[ j ] );
+
+ // IE completely kills leading whitespace when innerHTML is used
+ if ( /^\s/.test( elem ) )
+ div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
+
+ }
+
+ elem = jQuery.makeArray( div.childNodes );
+ }
+
+ if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
+ return;
+
+ if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
+ ret.push( elem );
+
+ else
+ ret = jQuery.merge( ret, elem );
+
+ });
+
+ return ret;
+ },
+
+ attr: function( elem, name, value ) {
+ // don't set attributes on text and comment nodes
+ if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
+ return undefined;
+
+ var notxml = !jQuery.isXMLDoc( elem ),
+ // Whether we are setting (or getting)
+ set = value !== undefined,
+ msie = jQuery.browser.msie;
+
+ // Try to normalize/fix the name
+ name = notxml && jQuery.props[ name ] || name;
+
+ // Only do all the following if this is a node (faster for style)
+ // IE elem.getAttribute passes even for style
+ if ( elem.tagName ) {
+
+ // These attributes require special treatment
+ var special = /href|src|style/.test( name );
+
+ // Safari mis-reports the default selected property of a hidden option
+ // Accessing the parent's selectedIndex property fixes it
+ if ( name == "selected" && jQuery.browser.safari )
+ elem.parentNode.selectedIndex;
+
+ // If applicable, access the attribute via the DOM 0 way
+ if ( name in elem && notxml && !special ) {
+ if ( set ){
+ // We can't allow the type property to be changed (since it causes problems in IE)
+ if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
+ throw "type property can't be changed";
+
+ elem[ name ] = value;
+ }
+
+ // browsers index elements by id/name on forms, give priority to attributes.
+ if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
+ return elem.getAttributeNode( name ).nodeValue;
+
+ return elem[ name ];
+ }
+
+ if ( msie && notxml && name == "style" )
+ return jQuery.attr( elem.style, "cssText", value );
+
+ if ( set )
+ // convert the value to a string (all browsers do this but IE) see #1070
+ elem.setAttribute( name, "" + value );
+
+ var attr = msie && notxml && special
+ // Some attributes require a special call on IE
+ ? elem.getAttribute( name, 2 )
+ : elem.getAttribute( name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return attr === null ? undefined : attr;
+ }
+
+ // elem is actually elem.style ... set the style
+
+ // IE uses filters for opacity
+ if ( msie && name == "opacity" ) {
+ if ( set ) {
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ elem.zoom = 1;
+
+ // Set the alpha filter to set the opacity
+ elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
+ (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+ }
+
+ return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
+ (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
+ "";
+ }
+
+ name = name.replace(/-([a-z])/ig, function(all, letter){
+ return letter.toUpperCase();
+ });
+
+ if ( set )
+ elem[ name ] = value;
+
+ return elem[ name ];
+ },
+
+ trim: function( text ) {
+ return (text || "").replace( /^\s+|\s+$/g, "" );
+ },
+
+ makeArray: function( array ) {
+ var ret = [];
+
+ if( array != null ){
+ var i = array.length;
+ //the window, strings and functions also have 'length'
+ if( i == null || array.split || array.setInterval || array.call )
+ ret[0] = array;
+ else
+ while( i )
+ ret[--i] = array[i];
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, array ) {
+ for ( var i = 0, length = array.length; i < length; i++ )
+ // Use === because on IE, window == document
+ if ( array[ i ] === elem )
+ return i;
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ // We have to loop this way because IE & Opera overwrite the length
+ // expando of getElementsByTagName
+ var i = 0, elem, pos = first.length;
+ // Also, we need to make sure that the correct elements are being returned
+ // (IE returns comment nodes in a '*' query)
+ if ( jQuery.browser.msie ) {
+ while ( elem = second[ i++ ] )
+ if ( elem.nodeType != 8 )
+ first[ pos++ ] = elem;
+
+ } else
+ while ( elem = second[ i++ ] )
+ first[ pos++ ] = elem;
+
+ return first;
+ },
+
+ unique: function( array ) {
+ var ret = [], done = {};
+
+ try {
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ var id = jQuery.data( array[ i ] );
+
+ if ( !done[ id ] ) {
+ done[ id ] = true;
+ ret.push( array[ i ] );
+ }
+ }
+
+ } catch( e ) {
+ ret = array;
+ }
+
+ return ret;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var ret = [];
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( var i = 0, length = elems.length; i < length; i++ )
+ if ( !inv != !callback( elems[ i ], i ) )
+ ret.push( elems[ i ] );
+
+ return ret;
+ },
+
+ map: function( elems, callback ) {
+ var ret = [];
+
+ // Go through the array, translating each of the items to their
+ // new value (or values).
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ var value = callback( elems[ i ], i );
+
+ if ( value != null )
+ ret[ ret.length ] = value;
+ }
+
+ return ret.concat.apply( [], ret );
+ }
+});
+
+var userAgent = navigator.userAgent.toLowerCase();
+
+// Figure out what browser is being used
+jQuery.browser = {
+ version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
+ safari: /webkit/.test( userAgent ),
+ opera: /opera/.test( userAgent ),
+ msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
+ mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
+};
+
+var styleFloat = jQuery.browser.msie ?
+ "styleFloat" :
+ "cssFloat";
+
+jQuery.extend({
+ // Check to see if the W3C box model is being used
+ boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
+
+ props: {
+ "for": "htmlFor",
+ "class": "className",
+ "float": styleFloat,
+ cssFloat: styleFloat,
+ styleFloat: styleFloat,
+ readonly: "readOnly",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing"
+ }
+});
+
+jQuery.each({
+ parent: function(elem){return elem.parentNode;},
+ parents: function(elem){return jQuery.dir(elem,"parentNode");},
+ 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");},
+ siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
+ 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( selector ) {
+ var ret = jQuery.map( this, fn );
+
+ if ( selector && typeof selector == "string" )
+ ret = jQuery.multiFilter( selector, ret );
+
+ return this.pushStack( jQuery.unique( ret ) );
+ };
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function(name, original){
+ jQuery.fn[ name ] = function() {
+ var args = arguments;
+
+ return this.each(function(){
+ for ( var i = 0, length = args.length; i < length; i++ )
+ jQuery( args[ i ] )[ original ]( this );
+ });
+ };
+});
+
+jQuery.each({
+ removeAttr: function( name ) {
+ jQuery.attr( this, name, "" );
+ if (this.nodeType == 1)
+ this.removeAttribute( name );
+ },
+
+ addClass: function( classNames ) {
+ jQuery.className.add( this, classNames );
+ },
+
+ removeClass: function( classNames ) {
+ jQuery.className.remove( this, classNames );
+ },
+
+ toggleClass: function( classNames ) {
+ jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );
+ },
+
+ remove: function( selector ) {
+ if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
+ // Prevent memory leaks
+ jQuery( "*", this ).add(this).each(function(){
+ jQuery.event.remove(this);
+ jQuery.removeData(this);
+ });
+ if (this.parentNode)
+ this.parentNode.removeChild( this );
+ }
+ },
+
+ empty: function() {
+ // Remove element nodes and prevent memory leaks
+ jQuery( ">*", this ).remove();
+
+ // Remove any remaining nodes
+ while ( this.firstChild )
+ this.removeChild( this.firstChild );
+ }
+}, function(name, fn){
+ jQuery.fn[ name ] = function(){
+ return this.each( fn, arguments );
+ };
+});
+
+jQuery.each([ "Height", "Width" ], function(i, name){
+ var type = name.toLowerCase();
+
+ jQuery.fn[ type ] = function( size ) {
+ // Get window width or height
+ return this[0] == window ?
+ // Opera reports document.body.client[Width/Height] properly in both quirks and standards
+ jQuery.browser.opera && document.body[ "client" + name ] ||
+
+ // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
+ jQuery.browser.safari && window[ "inner" + name ] ||
+
+ // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+ document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
+
+ // Get document width or height
+ this[0] == document ?
+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+ Math.max(
+ Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
+ Math.max(document.body["offset" + name], document.documentElement["offset" + name])
+ ) :
+
+ // Get or set width or height on the element
+ size == undefined ?
+ // Get width or height on the element
+ (this.length ? jQuery.css( this[0], type ) : null) :
+
+ // Set the width or height on the element (default to pixels if value is unitless)
+ this.css( type, size.constructor == String ? size : size + "px" );
+ };
+});
+
+// Helper function used by the dimensions and offset modules
+function num(elem, prop) {
+ return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
+}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
+ "(?:[\\w*_-]|\\\\.)" :
+ "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
+ quickChild = new RegExp("^>\\s*(" + chars + "+)"),
+ quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
+ quickClass = new RegExp("^([#.]?)(" + chars + "*)");
+
+jQuery.extend({
+ expr: {
+ "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},
+ "#": function(a,i,m){return a.getAttribute("id")==m[2];},
+ ":": {
+ // Position Checks
+ lt: function(a,i,m){return i<m[3]-0;},
+ gt: function(a,i,m){return i>m[3]-0;},
+ nth: function(a,i,m){return m[3]-0==i;},
+ eq: function(a,i,m){return m[3]-0==i;},
+ first: function(a,i){return i==0;},
+ last: function(a,i,m,r){return i==r.length-1;},
+ even: function(a,i){return i%2==0;},
+ odd: function(a,i){return i%2;},
+
+ // Child Checks
+ "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},
+ "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},
+ "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},
+
+ // Parent Checks
+ parent: function(a){return a.firstChild;},
+ empty: function(a){return !a.firstChild;},
+
+ // Text Check
+ contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},
+
+ // Visibility
+ visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},
+ hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},
+
+ // Form attributes
+ enabled: function(a){return !a.disabled;},
+ disabled: function(a){return a.disabled;},
+ checked: function(a){return a.checked;},
+ selected: function(a){return a.selected||jQuery.attr(a,"selected");},
+
+ // Form elements
+ text: function(a){return "text"==a.type;},
+ radio: function(a){return "radio"==a.type;},
+ checkbox: function(a){return "checkbox"==a.type;},
+ file: function(a){return "file"==a.type;},
+ password: function(a){return "password"==a.type;},
+ submit: function(a){return "submit"==a.type;},
+ image: function(a){return "image"==a.type;},
+ reset: function(a){return "reset"==a.type;},
+ button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},
+ input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},
+
+ // :has()
+ has: function(a,i,m){return jQuery.find(m[3],a).length;},
+
+ // :header
+ header: function(a){return /h\d/i.test(a.nodeName);},
+
+ // :animated
+ animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}
+ }
+ },
+
+ // The regular expressions that power the parsing engine
+ parse: [
+ // Match: [@value='test'], [@foo]
+ /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
+
+ // Match: :contains('foo')
+ /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
+
+ // Match: :even, :last-child, #id, .class
+ new RegExp("^([:.#]*)(" + chars + "+)")
+ ],
+
+ multiFilter: function( expr, elems, not ) {
+ var old, cur = [];
+
+ while ( expr && expr != old ) {
+ old = expr;
+ var f = jQuery.filter( expr, elems, not );
+ expr = f.t.replace(/^\s*,\s*/, "" );
+ cur = not ? elems = f.r : jQuery.merge( cur, f.r );
+ }
+
+ return cur;
+ },
+
+ find: function( t, context ) {
+ // Quickly handle non-string expressions
+ if ( typeof t != "string" )
+ return [ t ];
+
+ // check to make sure context is a DOM element or a document
+ if ( context && context.nodeType != 1 && context.nodeType != 9)
+ return [ ];
+
+ // Set the correct context (if none is provided)
+ context = context || document;
+
+ // Initialize the search
+ var ret = [context], done = [], last, nodeName;
+
+ // Continue while a selector expression exists, and while
+ // we're no longer looping upon ourselves
+ while ( t && last != t ) {
+ var r = [];
+ last = t;
+
+ t = jQuery.trim(t);
+
+ var foundToken = false,
+
+ // An attempt at speeding up child selectors that
+ // point to a specific element tag
+ re = quickChild,
+
+ m = re.exec(t);
+
+ if ( m ) {
+ nodeName = m[1].toUpperCase();
+
+ // Perform our own iteration and filter
+ for ( var i = 0; ret[i]; i++ )
+ for ( var c = ret[i].firstChild; c; c = c.nextSibling )
+ if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
+ r.push( c );
+
+ ret = r;
+ t = t.replace( re, "" );
+ if ( t.indexOf(" ") == 0 ) continue;
+ foundToken = true;
+ } else {
+ re = /^([>+~])\s*(\w*)/i;
+
+ if ( (m = re.exec(t)) != null ) {
+ r = [];
+
+ var merge = {};
+ nodeName = m[2].toUpperCase();
+ m = m[1];
+
+ for ( var j = 0, rl = ret.length; j < rl; j++ ) {
+ var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
+ for ( ; n; n = n.nextSibling )
+ if ( n.nodeType == 1 ) {
+ var id = jQuery.data(n);
+
+ if ( m == "~" && merge[id] ) break;
+
+ if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
+ if ( m == "~" ) merge[id] = true;
+ r.push( n );
+ }
+
+ if ( m == "+" ) break;
+ }
+ }
+
+ ret = r;
+
+ // And remove the token
+ t = jQuery.trim( t.replace( re, "" ) );
+ foundToken = true;
+ }
+ }
+
+ // See if there's still an expression, and that we haven't already
+ // matched a token
+ if ( t && !foundToken ) {
+ // Handle multiple expressions
+ if ( !t.indexOf(",") ) {
+ // Clean the result set
+ if ( context == ret[0] ) ret.shift();
+
+ // Merge the result sets
+ done = jQuery.merge( done, ret );
+
+ // Reset the context
+ r = ret = [context];
+
+ // Touch up the selector string
+ t = " " + t.substr(1,t.length);
+
+ } else {
+ // Optimize for the case nodeName#idName
+ var re2 = quickID;
+ var m = re2.exec(t);
+
+ // Re-organize the results, so that they're consistent
+ if ( m ) {
+ m = [ 0, m[2], m[3], m[1] ];
+
+ } else {
+ // Otherwise, do a traditional filter check for
+ // ID, class, and element selectors
+ re2 = quickClass;
+ m = re2.exec(t);
+ }
+
+ m[2] = m[2].replace(/\\/g, "");
+
+ var elem = ret[ret.length-1];
+
+ // Try to do a global search by ID, where we can
+ if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
+ // Optimization for HTML document case
+ var oid = elem.getElementById(m[2]);
+
+ // Do a quick check for the existence of the actual ID attribute
+ // to avoid selecting by the name attribute in IE
+ // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
+ if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
+ oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
+
+ // Do a quick check for node name (where applicable) so
+ // that div#foo searches will be really fast
+ ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
+ } else {
+ // We need to find all descendant elements
+ for ( var i = 0; ret[i]; i++ ) {
+ // Grab the tag name being searched for
+ var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
+
+ // Handle IE7 being really dumb about <object>s
+ if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
+ tag = "param";
+
+ r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
+ }
+
+ // It's faster to filter by class and be done with it
+ if ( m[1] == "." )
+ r = jQuery.classFilter( r, m[2] );
+
+ // Same with ID filtering
+ if ( m[1] == "#" ) {
+ var tmp = [];
+
+ // Try to find the element with the ID
+ for ( var i = 0; r[i]; i++ )
+ if ( r[i].getAttribute("id") == m[2] ) {
+ tmp = [ r[i] ];
+ break;
+ }
+
+ r = tmp;
+ }
+
+ ret = r;
+ }
+
+ t = t.replace( re2, "" );
+ }
+
+ }
+
+ // If a selector string still exists
+ if ( t ) {
+ // Attempt to filter it
+ var val = jQuery.filter(t,r);
+ ret = r = val.r;
+ t = jQuery.trim(val.t);
+ }
+ }
+
+ // An error occurred with the selector;
+ // just return an empty set instead
+ if ( t )
+ ret = [];
+
+ // Remove the root context
+ if ( ret && context == ret[0] )
+ ret.shift();
+
+ // And combine the results
+ done = jQuery.merge( done, ret );
+
+ return done;
+ },
+
+ classFilter: function(r,m,not){
+ m = " " + m + " ";
+ var tmp = [];
+ for ( var i = 0; r[i]; i++ ) {
+ var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
+ if ( !not && pass || not && !pass )
+ tmp.push( r[i] );
+ }
+ return tmp;
+ },
+
+ filter: function(t,r,not) {
+ var last;
+
+ // Look for common filter expressions
+ while ( t && t != last ) {
+ last = t;
+
+ var p = jQuery.parse, m;
+
+ for ( var i = 0; p[i]; i++ ) {
+ m = p[i].exec( t );
+
+ if ( m ) {
+ // Remove what we just matched
+ t = t.substring( m[0].length );
+
+ m[2] = m[2].replace(/\\/g, "");
+ break;
+ }
+ }
+
+ if ( !m )
+ break;
+
+ // :not() is a special case that can be optimized by
+ // keeping it out of the expression list
+ if ( m[1] == ":" && m[2] == "not" )
+ // optimize if only one selector found (most common case)
+ r = isSimple.test( m[3] ) ?
+ jQuery.filter(m[3], r, true).r :
+ jQuery( r ).not( m[3] );
+
+ // We can get a big speed boost by filtering by class here
+ else if ( m[1] == "." )
+ r = jQuery.classFilter(r, m[2], not);
+
+ else if ( m[1] == "[" ) {
+ var tmp = [], type = m[3];
+
+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
+ var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
+
+ if ( z == null || /href|src|selected/.test(m[2]) )
+ z = jQuery.attr(a,m[2]) || '';
+
+ if ( (type == "" && !!z ||
+ type == "=" && z == m[5] ||
+ type == "!=" && z != m[5] ||
+ type == "^=" && z && !z.indexOf(m[5]) ||
+ type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
+ (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
+ tmp.push( a );
+ }
+
+ r = tmp;
+
+ // We can get a speed boost by handling nth-child here
+ } else if ( m[1] == ":" && m[2] == "nth-child" ) {
+ var merge = {}, tmp = [],
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+ test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+ m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
+ !/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
+ // calculate the numbers (first)n+(last) including if they are negative
+ first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
+
+ // loop through all the elements left in the jQuery object
+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
+ var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
+
+ if ( !merge[id] ) {
+ var c = 1;
+
+ for ( var n = parentNode.firstChild; n; n = n.nextSibling )
+ if ( n.nodeType == 1 )
+ n.nodeIndex = c++;
+
+ merge[id] = true;
+ }
+
+ var add = false;
+
+ if ( first == 0 ) {
+ if ( node.nodeIndex == last )
+ add = true;
+ } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
+ add = true;
+
+ if ( add ^ not )
+ tmp.push( node );
+ }
+
+ r = tmp;
+
+ // Otherwise, find the expression to execute
+ } else {
+ var fn = jQuery.expr[ m[1] ];
+ if ( typeof fn == "object" )
+ fn = fn[ m[2] ];
+
+ if ( typeof fn == "string" )
+ fn = eval("false||function(a,i){return " + fn + ";}");
+
+ // Execute it against the current filter
+ r = jQuery.grep( r, function(elem, i){
+ return fn(elem, i, m, r);
+ }, not );
+ }
+ }
+
+ // Return an array of filtered elements (r)
+ // and the modified expression string (t)
+ return { r: r, t: t };
+ },
+
+ dir: function( elem, dir ){
+ var matched = [],
+ cur = elem[dir];
+ while ( cur && cur != document ) {
+ 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;
+ }
+});
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code orignated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+ // Bind an event to an element
+ // Original by Dean Edwards
+ add: function(elem, types, handler, data) {
+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
+ return;
+
+ // For whatever reason, IE has trouble passing the window object
+ // around, causing it to be cloned in the process
+ if ( jQuery.browser.msie && elem.setInterval )
+ elem = window;
+
+ // Make sure that the function being executed has a unique ID
+ if ( !handler.guid )
+ handler.guid = this.guid++;
+
+ // if data is passed, bind to handler
+ if( data != undefined ) {
+ // Create temporary function pointer to original handler
+ var fn = handler;
+
+ // Create unique handler function, wrapped around original handler
+ handler = this.proxy( fn, function() {
+ // Pass arguments and context to original handler
+ return fn.apply(this, arguments);
+ });
+
+ // Store data in unique handler
+ handler.data = data;
+ }
+
+ // Init the element's event structure
+ var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
+ handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
+ // Handle the second event of a trigger and when
+ // an event is called after a page has unloaded
+ if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
+ return jQuery.event.handle.apply(arguments.callee.elem, arguments);
+ });
+ // Add elem as a property of the handle function
+ // This is to prevent a memory leak with non-native
+ // event in IE.
+ handle.elem = elem;
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ jQuery.each(types.split(/\s+/), function(index, type) {
+ // Namespaced event handlers
+ var parts = type.split(".");
+ type = parts[0];
+ handler.type = parts[1];
+
+ // Get the current list of functions bound to this event
+ var handlers = events[type];
+
+ // Init the event handler queue
+ if (!handlers) {
+ handlers = events[type] = {};
+
+ // Check for a special event handler
+ // Only use addEventListener/attachEvent if the special
+ // events handler returns false
+ if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
+ // Bind the global event handler to the element
+ if (elem.addEventListener)
+ elem.addEventListener(type, handle, false);
+ else if (elem.attachEvent)
+ elem.attachEvent("on" + type, handle);
+ }
+ }
+
+ // Add the function to the element's handler list
+ handlers[handler.guid] = handler;
+
+ // Keep track of which events have been used, for global triggering
+ jQuery.event.global[type] = true;
+ });
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ guid: 1,
+ global: {},
+
+ // Detach an event or set of events from an element
+ remove: function(elem, types, handler) {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
+ return;
+
+ var events = jQuery.data(elem, "events"), ret, index;
+
+ if ( events ) {
+ // Unbind all events for the element
+ if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
+ for ( var type in events )
+ this.remove( elem, type + (types || "") );
+ else {
+ // types is actually an event object here
+ if ( types.type ) {
+ handler = types.handler;
+ types = types.type;
+ }
+
+ // Handle multiple events seperated by a space
+ // jQuery(...).unbind("mouseover mouseout", fn);
+ jQuery.each(types.split(/\s+/), function(index, type){
+ // Namespaced event handlers
+ var parts = type.split(".");
+ type = parts[0];
+
+ if ( events[type] ) {
+ // remove the given handler for the given type
+ if ( handler )
+ delete events[type][handler.guid];
+
+ // remove all handlers for the given type
+ else
+ for ( handler in events[type] )
+ // Handle the removal of namespaced events
+ if ( !parts[1] || events[type][handler].type == parts[1] )
+ delete events[type][handler];
+
+ // remove generic event handler if no more handlers exist
+ for ( ret in events[type] ) break;
+ if ( !ret ) {
+ if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
+ if (elem.removeEventListener)
+ elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
+ else if (elem.detachEvent)
+ elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
+ }
+ ret = null;
+ delete events[type];
+ }
+ }
+ });
+ }
+
+ // Remove the expando if it's no longer used
+ for ( ret in events ) break;
+ if ( !ret ) {
+ var handle = jQuery.data( elem, "handle" );
+ if ( handle ) handle.elem = null;
+ jQuery.removeData( elem, "events" );
+ jQuery.removeData( elem, "handle" );
+ }
+ }
+ },
+
+ trigger: function(type, data, elem, donative, extra) {
+ // Clone the incoming data, if any
+ data = jQuery.makeArray(data);
+
+ if ( type.indexOf("!") >= 0 ) {
+ type = type.slice(0, -1);
+ var exclusive = true;
+ }
+
+ // Handle a global trigger
+ if ( !elem ) {
+ // Only trigger if we've ever bound an event for it
+ if ( this.global[type] )
+ jQuery("*").add([window, document]).trigger(type, data);
+
+ // Handle triggering a single element
+ } else {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
+ return undefined;
+
+ var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
+ // Check to see if we need to provide a fake event, or not
+ event = !data[0] || !data[0].preventDefault;
+
+ // Pass along a fake event
+ if ( event ) {
+ data.unshift({
+ type: type,
+ target: elem,
+ preventDefault: function(){},
+ stopPropagation: function(){},
+ timeStamp: now()
+ });
+ data[0][expando] = true; // no need to fix fake event
+ }
+
+ // Enforce the right trigger type
+ data[0].type = type;
+ if ( exclusive )
+ data[0].exclusive = true;
+
+ // Trigger the event, it is assumed that "handle" is a function
+ var handle = jQuery.data(elem, "handle");
+ if ( handle )
+ val = handle.apply( elem, data );
+
+ // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
+ if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
+ val = false;
+
+ // Extra functions don't get the custom event object
+ if ( event )
+ data.shift();
+
+ // Handle triggering of extra function
+ if ( extra && jQuery.isFunction( extra ) ) {
+ // call the extra function and tack the current return value on the end for possible inspection
+ ret = extra.apply( elem, val == null ? data : data.concat( val ) );
+ // if anything is returned, give it precedence and have it overwrite the previous value
+ if (ret !== undefined)
+ val = ret;
+ }
+
+ // Trigger the native events (except for clicks on links)
+ if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
+ this.triggered = true;
+ try {
+ elem[ type ]();
+ // prevent IE from throwing an error for some hidden elements
+ } catch (e) {}
+ }
+
+ this.triggered = false;
+ }
+
+ return val;
+ },
+
+ handle: function(event) {
+ // returned undefined or false
+ var val, ret, namespace, all, handlers;
+
+ event = arguments[0] = jQuery.event.fix( event || window.event );
+
+ // Namespaced event handlers
+ namespace = event.type.split(".");
+ event.type = namespace[0];
+ namespace = namespace[1];
+ // Cache this now, all = true means, any handler
+ all = !namespace && !event.exclusive;
+
+ handlers = ( jQuery.data(this, "events") || {} )[event.type];
+
+ for ( var j in handlers ) {
+ var handler = handlers[j];
+
+ // Filter the functions by class
+ if ( all || handler.type == namespace ) {
+ // Pass in a reference to the handler function itself
+ // So that we can later remove it
+ event.handler = handler;
+ event.data = handler.data;
+
+ ret = handler.apply( this, arguments );
+
+ if ( val !== false )
+ val = ret;
+
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+
+ return val;
+ },
+
+ fix: function(event) {
+ if ( event[expando] == true )
+ return event;
+
+ // store a copy of the original event object
+ // and "clone" to set read-only properties
+ var originalEvent = event;
+ event = { originalEvent: originalEvent };
+ var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");
+ for ( var i=props.length; i; i-- )
+ event[ props[i] ] = originalEvent[ props[i] ];
+
+ // Mark it as fixed
+ event[expando] = true;
+
+ // add preventDefault and stopPropagation since
+ // they will not work on the clone
+ event.preventDefault = function() {
+ // if preventDefault exists run it on the original event
+ if (originalEvent.preventDefault)
+ originalEvent.preventDefault();
+ // otherwise set the returnValue property of the original event to false (IE)
+ originalEvent.returnValue = false;
+ };
+ event.stopPropagation = function() {
+ // if stopPropagation exists run it on the original event
+ if (originalEvent.stopPropagation)
+ originalEvent.stopPropagation();
+ // otherwise set the cancelBubble property of the original event to true (IE)
+ originalEvent.cancelBubble = true;
+ };
+
+ // Fix timeStamp
+ event.timeStamp = event.timeStamp || now();
+
+ // Fix target property, if necessary
+ if ( !event.target )
+ event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
+
+ // check if target is a textnode (safari)
+ if ( event.target.nodeType == 3 )
+ event.target = event.target.parentNode;
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement )
+ event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var doc = document.documentElement, body = document.body;
+ event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
+ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
+ }
+
+ // Add which for key events
+ if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
+ event.which = event.charCode || event.keyCode;
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey )
+ event.metaKey = event.ctrlKey;
+
+ // Add which for click: 1 == left; 2 == middle; 3 == right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button )
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+
+ return event;
+ },
+
+ proxy: function( fn, proxy ){
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
+ // So proxy can be declared as an argument
+ return proxy;
+ },
+
+ special: {
+ ready: {
+ setup: function() {
+ // Make sure the ready event is setup
+ bindReady();
+ return;
+ },
+
+ teardown: function() { return; }
+ },
+
+ mouseenter: {
+ setup: function() {
+ if ( jQuery.browser.msie ) return false;
+ jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
+ return true;
+ },
+
+ teardown: function() {
+ if ( jQuery.browser.msie ) return false;
+ jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
+ return true;
+ },
+
+ handler: function(event) {
+ // If we actually just moused on to a sub-element, ignore it
+ if ( withinElement(event, this) ) return true;
+ // Execute the right handlers by setting the event type to mouseenter
+ event.type = "mouseenter";
+ return jQuery.event.handle.apply(this, arguments);
+ }
+ },
+
+ mouseleave: {
+ setup: function() {
+ if ( jQuery.browser.msie ) return false;
+ jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
+ return true;
+ },
+
+ teardown: function() {
+ if ( jQuery.browser.msie ) return false;
+ jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
+ return true;
+ },
+
+ handler: function(event) {
+ // If we actually just moused on to a sub-element, ignore it
+ if ( withinElement(event, this) ) return true;
+ // Execute the right handlers by setting the event type to mouseleave
+ event.type = "mouseleave";
+ return jQuery.event.handle.apply(this, arguments);
+ }
+ }
+ }
+};
+
+jQuery.fn.extend({
+ bind: function( type, data, fn ) {
+ return type == "unload" ? this.one(type, data, fn) : this.each(function(){
+ jQuery.event.add( this, type, fn || data, fn && data );
+ });
+ },
+
+ one: function( type, data, fn ) {
+ var one = jQuery.event.proxy( fn || data, function(event) {
+ jQuery(this).unbind(event, one);
+ return (fn || data).apply( this, arguments );
+ });
+ return this.each(function(){
+ jQuery.event.add( this, type, one, fn && data);
+ });
+ },
+
+ unbind: function( type, fn ) {
+ return this.each(function(){
+ jQuery.event.remove( this, type, fn );
+ });
+ },
+
+ trigger: function( type, data, fn ) {
+ return this.each(function(){
+ jQuery.event.trigger( type, data, this, true, fn );
+ });
+ },
+
+ triggerHandler: function( type, data, fn ) {
+ return this[0] && jQuery.event.trigger( type, data, this[0], false, fn );
+ },
+
+ toggle: function( fn ) {
+ // Save reference to arguments for access in closure
+ var args = arguments, i = 1;
+
+ // link all the functions, so any of them can unbind this click handler
+ while( i < args.length )
+ jQuery.event.proxy( fn, args[i++] );
+
+ return this.click( jQuery.event.proxy( fn, function(event) {
+ // Figure out which function to execute
+ this.lastToggle = ( this.lastToggle || 0 ) % i;
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ this.lastToggle++ ].apply( this, arguments ) || false;
+ }));
+ },
+
+ hover: function(fnOver, fnOut) {
+ return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
+ },
+
+ ready: function(fn) {
+ // Attach the listeners
+ bindReady();
+
+ // If the DOM is already ready
+ if ( jQuery.isReady )
+ // Execute the function immediately
+ fn.call( document, jQuery );
+
+ // Otherwise, remember the function for later
+ else
+ // Add the function to the wait list
+ jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
+
+ return this;
+ }
+});
+
+jQuery.extend({
+ isReady: false,
+ readyList: [],
+ // Handle when the DOM is ready
+ ready: function() {
+ // Make sure that the DOM is not already loaded
+ if ( !jQuery.isReady ) {
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If there are functions bound, to execute
+ if ( jQuery.readyList ) {
+ // Execute all of them
+ jQuery.each( jQuery.readyList, function(){
+ this.call( document );
+ });
+
+ // Reset the list of functions
+ jQuery.readyList = null;
+ }
+
+ // Trigger any bound ready events
+ jQuery(document).triggerHandler("ready");
+ }
+ }
+});
+
+var readyBound = false;
+
+function bindReady(){
+ if ( readyBound ) return;
+ readyBound = true;
+
+ // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
+ if ( document.addEventListener && !jQuery.browser.opera)
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
+
+ // If IE is used and is not in a frame
+ // Continually check to see if the document is ready
+ if ( jQuery.browser.msie && window == top ) (function(){
+ 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( error ) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ // and execute any waiting functions
+ jQuery.ready();
+ })();
+
+ if ( jQuery.browser.opera )
+ document.addEventListener( "DOMContentLoaded", function () {
+ if (jQuery.isReady) return;
+ for (var i = 0; i < document.styleSheets.length; i++)
+ if (document.styleSheets[i].disabled) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ // and execute any waiting functions
+ jQuery.ready();
+ }, false);
+
+ if ( jQuery.browser.safari ) {
+ var numStyles;
+ (function(){
+ if (jQuery.isReady) return;
+ if ( document.readyState != "loaded" && document.readyState != "complete" ) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ if ( numStyles === undefined )
+ numStyles = jQuery("style, link[rel=stylesheet]").length;
+ if ( document.styleSheets.length != numStyles ) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ // and execute any waiting functions
+ jQuery.ready();
+ })();
+ }
+
+ // A fallback to window.onload, that will always work
+ jQuery.event.add( window, "load", jQuery.ready );
+}
+
+jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
+ "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
+ "submit,keydown,keypress,keyup,error").split(","), function(i, name){
+
+ // Handle event binding
+ jQuery.fn[name] = function(fn){
+ return fn ? this.bind(name, fn) : this.trigger(name);
+ };
+});
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function(event, elem) {
+ // Check if mouse(over|out) are still within the same parent element
+ var parent = event.relatedTarget;
+ // Traverse up the tree
+ while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }
+ // Return true if we actually just moused on to a sub-element
+ return parent == elem;
+};
+
+// Prevent memory leaks in IE
+// And prevent errors on refresh with events like mouseover in other browsers
+// Window isn't included so as not to unbind existing unload events
+jQuery(window).bind("unload", function() {
+ jQuery("*").add(document).unbind();
+});
+jQuery.fn.extend({
+ // Keep a copy of the old load
+ _load: jQuery.fn.load,
+
+ load: function( url, params, callback ) {
+ if ( typeof url != 'string' )
+ return this._load( url );
+
+ var off = url.indexOf(" ");
+ if ( off >= 0 ) {
+ var selector = url.slice(off, url.length);
+ url = url.slice(0, off);
+ }
+
+ callback = callback || function(){};
+
+ // 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 = null;
+
+ // Otherwise, build a param string
+ } else {
+ params = jQuery.param( params );
+ type = "POST";
+ }
+
+ var self = this;
+
+ // Request the remote document
+ jQuery.ajax({
+ url: url,
+ type: type,
+ dataType: "html",
+ data: params,
+ complete: function(res, status){
+ // If successful, inject the HTML into all the matched elements
+ if ( status == "success" || status == "notmodified" )
+ // See if a selector was specified
+ self.html( selector ?
+ // Create a dummy div to hold the results
+ jQuery("<div/>")
+ // inject the contents of the document in, removing the scripts
+ // to avoid any 'Permission Denied' errors in IE
+ .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
+
+ // Locate the specified elements
+ .find(selector) :
+
+ // If not, just inject the full result
+ res.responseText );
+
+ self.each( callback, [res.responseText, status, res] );
+ }
+ });
+ return this;
+ },
+
+ serialize: function() {
+ return jQuery.param(this.serializeArray());
+ },
+ serializeArray: function() {
+ return this.map(function(){
+ return jQuery.nodeName(this, "form") ?
+ jQuery.makeArray(this.elements) : this;
+ })
+ .filter(function(){
+ return this.name && !this.disabled &&
+ (this.checked || /select|textarea/i.test(this.nodeName) ||
+ /text|hidden|password/i.test(this.type));
+ })
+ .map(function(i, elem){
+ var val = jQuery(this).val();
+ return val == null ? null :
+ val.constructor == Array ?
+ jQuery.map( val, function(val, i){
+ return {name: elem.name, value: val};
+ }) :
+ {name: elem.name, value: val};
+ }).get();
+ }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
+ jQuery.fn[o] = function(f){
+ return this.bind(o, f);
+ };
+});
+
+var jsc = now();
+
+jQuery.extend({
+ get: function( url, data, callback, type ) {
+ // shift arguments if data argument was ommited
+ if ( jQuery.isFunction( data ) ) {
+ callback = data;
+ data = null;
+ }
+
+ return jQuery.ajax({
+ type: "GET",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get(url, null, callback, "script");
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get(url, data, callback, "json");
+ },
+
+ post: function( url, data, callback, type ) {
+ if ( jQuery.isFunction( data ) ) {
+ callback = data;
+ data = {};
+ }
+
+ return jQuery.ajax({
+ type: "POST",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ ajaxSetup: function( settings ) {
+ jQuery.extend( jQuery.ajaxSettings, settings );
+ },
+
+ ajaxSettings: {
+ url: location.href,
+ global: true,
+ type: "GET",
+ timeout: 0,
+ contentType: "application/x-www-form-urlencoded",
+ processData: true,
+ async: true,
+ data: null,
+ username: null,
+ password: null,
+ accepts: {
+ xml: "application/xml, text/xml",
+ html: "text/html",
+ script: "text/javascript, application/javascript",
+ json: "application/json, text/javascript",
+ text: "text/plain",
+ _default: "*/*"
+ }
+ },
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+
+ ajax: function( s ) {
+ // Extend the settings, but re-extend 's' so that it can be
+ // checked again later (in the test suite, specifically)
+ s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
+
+ var jsonp, jsre = /=\?(&|$)/g, status, data,
+ type = s.type.toUpperCase();
+
+ // convert data if not already a string
+ if ( s.data && s.processData && typeof s.data != "string" )
+ s.data = jQuery.param(s.data);
+
+ // Handle JSONP Parameter Callbacks
+ if ( s.dataType == "jsonp" ) {
+ if ( type == "GET" ) {
+ if ( !s.url.match(jsre) )
+ s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+ } else if ( !s.data || !s.data.match(jsre) )
+ s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+ s.dataType = "json";
+ }
+
+ // Build temporary JSONP function
+ if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
+ jsonp = "jsonp" + jsc++;
+
+ // Replace the =? sequence both in the query string and the data
+ if ( s.data )
+ s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+ s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+ // We need to make sure
+ // that a JSONP style response is executed properly
+ s.dataType = "script";
+
+ // Handle JSONP-style loading
+ window[ jsonp ] = function(tmp){
+ data = tmp;
+ success();
+ complete();
+ // Garbage collect
+ window[ jsonp ] = undefined;
+ try{ delete window[ jsonp ]; } catch(e){}
+ if ( head )
+ head.removeChild( script );
+ };
+ }
+
+ if ( s.dataType == "script" && s.cache == null )
+ s.cache = false;
+
+ if ( s.cache === false && type == "GET" ) {
+ var ts = now();
+ // try replacing _= if it is there
+ var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
+ // if nothing was replaced, add timestamp to the end
+ s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
+ }
+
+ // If data is available, append data to url for get requests
+ if ( s.data && type == "GET" ) {
+ s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
+
+ // IE likes to send both get and post data, prevent this
+ s.data = null;
+ }
+
+ // Watch for a new set of requests
+ if ( s.global && ! jQuery.active++ )
+ jQuery.event.trigger( "ajaxStart" );
+
+ // Matches an absolute URL, and saves the domain
+ var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;
+
+ // If we're requesting a remote document
+ // and trying to load JSON or Script with a GET
+ if ( s.dataType == "script" && type == "GET"
+ && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
+ var head = document.getElementsByTagName("head")[0];
+ var script = document.createElement("script");
+ script.src = s.url;
+ if (s.scriptCharset)
+ script.charset = s.scriptCharset;
+
+ // Handle Script loading
+ if ( !jsonp ) {
+ var done = false;
+
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function(){
+ if ( !done && (!this.readyState ||
+ this.readyState == "loaded" || this.readyState == "complete") ) {
+ done = true;
+ success();
+ complete();
+ head.removeChild( script );
+ }
+ };
+ }
+
+ head.appendChild(script);
+
+ // We handle everything using the script element injection
+ return undefined;
+ }
+
+ var requestDone = false;
+
+ // Create the request object; Microsoft failed to properly
+ // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
+ var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
+
+ // Open the socket
+ // Passing null username, generates a login popup on Opera (#2865)
+ if( s.username )
+ xhr.open(type, s.url, s.async, s.username, s.password);
+ else
+ xhr.open(type, s.url, s.async);
+
+ // Need an extra try/catch for cross domain requests in Firefox 3
+ try {
+ // Set the correct header, if data is being sent
+ if ( s.data )
+ xhr.setRequestHeader("Content-Type", s.contentType);
+
+ // Set the If-Modified-Since header, if ifModified mode.
+ if ( s.ifModified )
+ xhr.setRequestHeader("If-Modified-Since",
+ jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
+
+ // Set header so the called script knows that it's an XMLHttpRequest
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+
+ // Set the Accepts header for the server, depending on the dataType
+ xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
+ s.accepts[ s.dataType ] + ", */*" :
+ s.accepts._default );
+ } catch(e){}
+
+ // Allow custom headers/mimetypes
+ if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
+ // cleanup active request counter
+ s.global && jQuery.active--;
+ // close opended socket
+ xhr.abort();
+ return false;
+ }
+
+ if ( s.global )
+ jQuery.event.trigger("ajaxSend", [xhr, s]);
+
+ // Wait for a response to come back
+ var onreadystatechange = function(isTimeout){
+ // The transfer is complete and the data is available, or the request timed out
+ if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
+ requestDone = true;
+
+ // clear poll interval
+ if (ival) {
+ clearInterval(ival);
+ ival = null;
+ }
+
+ status = isTimeout == "timeout" && "timeout" ||
+ !jQuery.httpSuccess( xhr ) && "error" ||
+ s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" ||
+ "success";
+
+ if ( status == "success" ) {
+ // Watch for, and catch, XML document parse errors
+ try {
+ // process the data (runs the xml through httpData regardless of callback)
+ data = jQuery.httpData( xhr, s.dataType, s.dataFilter );
+ } catch(e) {
+ status = "parsererror";
+ }
+ }
+
+ // Make sure that the request was successful or notmodified
+ if ( status == "success" ) {
+ // Cache Last-Modified header, if ifModified mode.
+ var modRes;
+ try {
+ modRes = xhr.getResponseHeader("Last-Modified");
+ } catch(e) {} // swallow exception thrown by FF if header is not available
+
+ if ( s.ifModified && modRes )
+ jQuery.lastModified[s.url] = modRes;
+
+ // JSONP handles its own success callback
+ if ( !jsonp )
+ success();
+ } else
+ jQuery.handleError(s, xhr, status);
+
+ // Fire the complete handlers
+ complete();
+
+ // Stop memory leaks
+ if ( s.async )
+ xhr = null;
+ }
+ };
+
+ if ( s.async ) {
+ // don't attach the handler to the request, just poll it instead
+ var ival = setInterval(onreadystatechange, 13);
+
+ // Timeout checker
+ if ( s.timeout > 0 )
+ setTimeout(function(){
+ // Check to see if the request is still happening
+ if ( xhr ) {
+ // Cancel the request
+ xhr.abort();
+
+ if( !requestDone )
+ onreadystatechange( "timeout" );
+ }
+ }, s.timeout);
+ }
+
+ // Send the data
+ try {
+ xhr.send(s.data);
+ } catch(e) {
+ jQuery.handleError(s, xhr, null, e);
+ }
+
+ // firefox 1.5 doesn't fire statechange for sync requests
+ if ( !s.async )
+ onreadystatechange();
+
+ function success(){
+ // If a local callback was specified, fire it and pass it the data
+ if ( s.success )
+ s.success( data, status );
+
+ // Fire the global callback
+ if ( s.global )
+ jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
+ }
+
+ function complete(){
+ // Process result
+ if ( s.complete )
+ s.complete(xhr, status);
+
+ // The request was completed
+ if ( s.global )
+ jQuery.event.trigger( "ajaxComplete", [xhr, s] );
+
+ // Handle the global AJAX counter
+ if ( s.global && ! --jQuery.active )
+ jQuery.event.trigger( "ajaxStop" );
+ }
+
+ // return XMLHttpRequest to allow aborting the request etc.
+ return xhr;
+ },
+
+ handleError: function( s, xhr, status, e ) {
+ // If a local callback was specified, fire it
+ if ( s.error ) s.error( xhr, status, e );
+
+ // Fire the global callback
+ if ( s.global )
+ jQuery.event.trigger( "ajaxError", [xhr, s, e] );
+ },
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Determines if an XMLHttpRequest was successful or not
+ httpSuccess: function( xhr ) {
+ try {
+ // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
+ return !xhr.status && location.protocol == "file:" ||
+ ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
+ jQuery.browser.safari && xhr.status == undefined;
+ } catch(e){}
+ return false;
+ },
+
+ // Determines if an XMLHttpRequest returns NotModified
+ httpNotModified: function( xhr, url ) {
+ try {
+ var xhrRes = xhr.getResponseHeader("Last-Modified");
+
+ // Firefox always returns 200. check Last-Modified date
+ return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
+ jQuery.browser.safari && xhr.status == undefined;
+ } catch(e){}
+ return false;
+ },
+
+ httpData: function( xhr, type, filter ) {
+ var ct = xhr.getResponseHeader("content-type"),
+ xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
+ data = xml ? xhr.responseXML : xhr.responseText;
+
+ if ( xml && data.documentElement.tagName == "parsererror" )
+ throw "parsererror";
+
+ // Allow a pre-filtering function to sanitize the response
+ if( filter )
+ data = filter( data, type );
+
+ // If the type is "script", eval it in global context
+ if ( type == "script" )
+ jQuery.globalEval( data );
+
+ // Get the JavaScript object, if JSON is used.
+ if ( type == "json" )
+ data = eval("(" + data + ")");
+
+ return data;
+ },
+
+ // Serialize an array of form elements or a set of
+ // key/values into a query string
+ param: function( a ) {
+ var s = [];
+
+ // If an array was passed in, assume that it is an array
+ // of form elements
+ if ( a.constructor == Array || a.jquery )
+ // Serialize the form elements
+ jQuery.each( a, function(){
+ s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
+ });
+
+ // Otherwise, assume that it's an object of key/value pairs
+ else
+ // Serialize the key/values
+ for ( var j in a )
+ // If the value is an array then the key names need to be repeated
+ if ( a[j] && a[j].constructor == Array )
+ jQuery.each( a[j], function(){
+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
+ });
+ else
+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) );
+
+ // Return the resulting serialization
+ return s.join("&").replace(/%20/g, "+");
+ }
+
+});
+jQuery.fn.extend({
+ show: function(speed,callback){
+ return speed ?
+ this.animate({
+ height: "show", width: "show", opacity: "show"
+ }, speed, callback) :
+
+ this.filter(":hidden").each(function(){
+ this.style.display = this.oldblock || "";
+ if ( jQuery.css(this,"display") == "none" ) {
+ var elem = jQuery("<" + this.tagName + " />").appendTo("body");
+ this.style.display = elem.css("display");
+ // handle an edge condition where css is - div { display:none; } or similar
+ if (this.style.display == "none")
+ this.style.display = "block";
+ elem.remove();
+ }
+ }).end();
+ },
+
+ hide: function(speed,callback){
+ return speed ?
+ this.animate({
+ height: "hide", width: "hide", opacity: "hide"
+ }, speed, callback) :
+
+ this.filter(":visible").each(function(){
+ this.oldblock = this.oldblock || jQuery.css(this,"display");
+ this.style.display = "none";
+ }).end();
+ },
+
+ // Save the old toggle function
+ _toggle: jQuery.fn.toggle,
+
+ toggle: function( fn, fn2 ){
+ return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
+ this._toggle.apply( this, arguments ) :
+ fn ?
+ this.animate({
+ height: "toggle", width: "toggle", opacity: "toggle"
+ }, fn, fn2) :
+ this.each(function(){
+ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
+ });
+ },
+
+ slideDown: function(speed,callback){
+ return this.animate({height: "show"}, speed, callback);
+ },
+
+ slideUp: function(speed,callback){
+ return this.animate({height: "hide"}, speed, callback);
+ },
+
+ slideToggle: function(speed, callback){
+ return this.animate({height: "toggle"}, speed, callback);
+ },
+
+ fadeIn: function(speed, callback){
+ return this.animate({opacity: "show"}, speed, callback);
+ },
+
+ fadeOut: function(speed, callback){
+ return this.animate({opacity: "hide"}, speed, callback);
+ },
+
+ fadeTo: function(speed,to,callback){
+ return this.animate({opacity: to}, speed, callback);
+ },
+
+ animate: function( prop, speed, easing, callback ) {
+ var optall = jQuery.speed(speed, easing, callback);
+
+ return this[ optall.queue === false ? "each" : "queue" ](function(){
+ if ( this.nodeType != 1)
+ return false;
+
+ var opt = jQuery.extend({}, optall), p,
+ hidden = jQuery(this).is(":hidden"), self = this;
+
+ for ( p in prop ) {
+ if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
+ return opt.complete.call(this);
+
+ if ( p == "height" || p == "width" ) {
+ // Store display property
+ opt.display = jQuery.css(this, "display");
+
+ // Make sure that nothing sneaks out
+ opt.overflow = this.style.overflow;
+ }
+ }
+
+ if ( opt.overflow != null )
+ this.style.overflow = "hidden";
+
+ opt.curAnim = jQuery.extend({}, prop);
+
+ jQuery.each( prop, function(name, val){
+ var e = new jQuery.fx( self, opt, name );
+
+ if ( /toggle|show|hide/.test(val) )
+ e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+ else {
+ var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
+ start = e.cur(true) || 0;
+
+ if ( parts ) {
+ var end = parseFloat(parts[2]),
+ unit = parts[3] || "px";
+
+ // We need to compute starting value
+ if ( unit != "px" ) {
+ self.style[ name ] = (end || 1) + unit;
+ start = ((end || 1) / e.cur(true)) * start;
+ self.style[ name ] = start + unit;
+ }
+
+ // If a +=/-= token was provided, we're doing a relative animation
+ if ( parts[1] )
+ end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
+
+ e.custom( start, end, unit );
+ } else
+ e.custom( start, val, "" );
+ }
+ });
+
+ // For JS strict compliance
+ return true;
+ });
+ },
+
+ queue: function(type, fn){
+ if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
+ fn = type;
+ type = "fx";
+ }
+
+ if ( !type || (typeof type == "string" && !fn) )
+ return queue( this[0], type );
+
+ return this.each(function(){
+ if ( fn.constructor == Array )
+ queue(this, type, fn);
+ else {
+ queue(this, type).push( fn );
+
+ if ( queue(this, type).length == 1 )
+ fn.call(this);
+ }
+ });
+ },
+
+ stop: function(clearQueue, gotoEnd){
+ var timers = jQuery.timers;
+
+ if (clearQueue)
+ this.queue([]);
+
+ this.each(function(){
+ // go in reverse order so anything added to the queue during the loop is ignored
+ for ( var i = timers.length - 1; i >= 0; i-- )
+ if ( timers[i].elem == this ) {
+ if (gotoEnd)
+ // force the next step to be the last
+ timers[i](true);
+ timers.splice(i, 1);
+ }
+ });
+
+ // start the next in the queue if the last step wasn't forced
+ if (!gotoEnd)
+ this.dequeue();
+
+ return this;
+ }
+
+});
+
+var queue = function( elem, type, array ) {
+ if ( elem ){
+
+ type = type || "fx";
+
+ var q = jQuery.data( elem, type + "queue" );
+
+ if ( !q || array )
+ q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
+
+ }
+ return q;
+};
+
+jQuery.fn.dequeue = function(type){
+ type = type || "fx";
+
+ return this.each(function(){
+ var q = queue(this, type);
+
+ q.shift();
+
+ if ( q.length )
+ q[0].call( this );
+ });
+};
+
+jQuery.extend({
+
+ speed: function(speed, easing, fn) {
+ var opt = speed && speed.constructor == Object ? speed : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && easing.constructor != Function && easing
+ };
+
+ opt.duration = (opt.duration && opt.duration.constructor == Number ?
+ opt.duration :
+ jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
+
+ // Queueing
+ opt.old = opt.complete;
+ opt.complete = function(){
+ if ( opt.queue !== false )
+ jQuery(this).dequeue();
+ if ( jQuery.isFunction( opt.old ) )
+ opt.old.call( this );
+ };
+
+ return opt;
+ },
+
+ easing: {
+ linear: function( p, n, firstNum, diff ) {
+ return firstNum + diff * p;
+ },
+ swing: function( p, n, firstNum, diff ) {
+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+ }
+ },
+
+ timers: [],
+ timerId: null,
+
+ fx: function( elem, options, prop ){
+ this.options = options;
+ this.elem = elem;
+ this.prop = prop;
+
+ if ( !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)( this );
+
+ // Set display property to block for height/width animations
+ if ( this.prop == "height" || this.prop == "width" )
+ this.elem.style.display = "block";
+ },
+
+ // Get the current size
+ cur: function(force){
+ if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
+ return this.elem[ this.prop ];
+
+ var r = parseFloat(jQuery.css(this.elem, this.prop, force));
+ return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
+ },
+
+ // Start an animation from one number to another
+ custom: function(from, to, unit){
+ this.startTime = now();
+ this.start = from;
+ this.end = to;
+ this.unit = unit || this.unit || "px";
+ this.now = this.start;
+ this.pos = this.state = 0;
+ this.update();
+
+ var self = this;
+ function t(gotoEnd){
+ return self.step(gotoEnd);
+ }
+
+ t.elem = this.elem;
+
+ jQuery.timers.push(t);
+
+ if ( jQuery.timerId == null ) {
+ jQuery.timerId = setInterval(function(){
+ var timers = jQuery.timers;
+
+ for ( var i = 0; i < timers.length; i++ )
+ if ( !timers[i]() )
+ timers.splice(i--, 1);
+
+ if ( !timers.length ) {
+ clearInterval( jQuery.timerId );
+ jQuery.timerId = null;
+ }
+ }, 13);
+ }
+ },
+
+ // Simple 'show' function
+ show: function(){
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+ this.options.show = true;
+
+ // Begin the animation
+ this.custom(0, this.cur());
+
+ // Make sure that we start at a small width/height to avoid any
+ // flash of content
+ if ( this.prop == "width" || this.prop == "height" )
+ this.elem.style[this.prop] = "1px";
+
+ // 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 later
+ this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
+ this.options.hide = true;
+
+ // Begin the animation
+ this.custom(this.cur(), 0);
+ },
+
+ // Each step of an animation
+ step: function(gotoEnd){
+ var t = now();
+
+ if ( gotoEnd || t > this.options.duration + this.startTime ) {
+ this.now = this.end;
+ this.pos = this.state = 1;
+ this.update();
+
+ this.options.curAnim[ this.prop ] = true;
+
+ var done = true;
+ for ( var i in this.options.curAnim )
+ if ( this.options.curAnim[i] !== true )
+ done = false;
+
+ if ( done ) {
+ if ( this.options.display != null ) {
+ // Reset the overflow
+ this.elem.style.overflow = this.options.overflow;
+
+ // Reset the display
+ this.elem.style.display = this.options.display;
+ if ( jQuery.css(this.elem, "display") == "none" )
+ this.elem.style.display = "block";
+ }
+
+ // Hide the element if the "hide" operation was done
+ if ( this.options.hide )
+ this.elem.style.display = "none";
+
+ // Reset the properties, if the item has been hidden or shown
+ if ( this.options.hide || this.options.show )
+ for ( var p in this.options.curAnim )
+ jQuery.attr(this.elem.style, p, this.options.orig[p]);
+ }
+
+ if ( done )
+ // Execute the complete function
+ this.options.complete.call( this.elem );
+
+ return false;
+ } else {
+ var n = t - this.startTime;
+ this.state = n / this.options.duration;
+
+ // Perform the easing function, defaults to swing
+ this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
+ this.now = this.start + ((this.end - this.start) * this.pos);
+
+ // Perform the next step of the animation
+ this.update();
+ }
+
+ return true;
+ }
+
+};
+
+jQuery.extend( jQuery.fx, {
+ speeds:{
+ slow: 600,
+ fast: 200,
+ // Default speed
+ def: 400
+ },
+ step: {
+ scrollLeft: function(fx){
+ fx.elem.scrollLeft = fx.now;
+ },
+
+ scrollTop: function(fx){
+ fx.elem.scrollTop = fx.now;
+ },
+
+ opacity: function(fx){
+ jQuery.attr(fx.elem.style, "opacity", fx.now);
+ },
+
+ _default: function(fx){
+ fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+ }
+ }
+});
+// The Offset Method
+// Originally By Brandon Aaron, part of the Dimension Plugin
+// http://jquery.com/plugins/project/dimensions
+jQuery.fn.offset = function() {
+ var left = 0, top = 0, elem = this[0], results;
+
+ if ( elem ) with ( jQuery.browser ) {
+ var parent = elem.parentNode,
+ offsetChild = elem,
+ offsetParent = elem.offsetParent,
+ doc = elem.ownerDocument,
+ safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
+ css = jQuery.curCSS,
+ fixed = css(elem, "position") == "fixed";
+
+ // Use getBoundingClientRect if available
+ if ( elem.getBoundingClientRect ) {
+ var box = elem.getBoundingClientRect();
+
+ // Add the document scroll offsets
+ add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
+ box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
+
+ // IE adds the HTML element's border, by default it is medium which is 2px
+ // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }
+ // IE 7 standards mode, the border is always 2px
+ // This border/offset is typically represented by the clientLeft and clientTop properties
+ // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS
+ // Therefore this method will be off by 2px in IE while in quirksmode
+ add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
+
+ // Otherwise loop through the offsetParents and parentNodes
+ } else {
+
+ // Initial element offsets
+ add( elem.offsetLeft, elem.offsetTop );
+
+ // Get parent offsets
+ while ( offsetParent ) {
+ // Add offsetParent offsets
+ add( offsetParent.offsetLeft, offsetParent.offsetTop );
+
+ // Mozilla and Safari > 2 does not include the border on offset parents
+ // However Mozilla adds the border for table or table cells
+ if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
+ border( offsetParent );
+
+ // Add the document scroll offsets if position is fixed on any offsetParent
+ if ( !fixed && css(offsetParent, "position") == "fixed" )
+ fixed = true;
+
+ // Set offsetChild to previous offsetParent unless it is the body element
+ offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
+ // Get next offsetParent
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ // Get parent scroll offsets
+ while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
+ // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug
+ if ( !/^inline|table.*$/i.test(css(parent, "display")) )
+ // Subtract parent scroll offsets
+ add( -parent.scrollLeft, -parent.scrollTop );
+
+ // Mozilla does not add the border for a parent that has overflow != visible
+ if ( mozilla && css(parent, "overflow") != "visible" )
+ border( parent );
+
+ // Get next parent
+ parent = parent.parentNode;
+ }
+
+ // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild
+ // Mozilla doubles body offsets with a non-absolutely positioned offsetChild
+ if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
+ (mozilla && css(offsetChild, "position") != "absolute") )
+ add( -doc.body.offsetLeft, -doc.body.offsetTop );
+
+ // Add the document scroll offsets if position is fixed
+ if ( fixed )
+ add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
+ Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
+ }
+
+ // Return an object with top and left properties
+ results = { top: top, left: left };
+ }
+
+ function border(elem) {
+ add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );
+ }
+
+ function add(l, t) {
+ left += parseInt(l, 10) || 0;
+ top += parseInt(t, 10) || 0;
+ }
+
+ return results;
+};
+
+
+jQuery.fn.extend({
+ position: function() {
+ var left = 0, top = 0, results;
+
+ if ( this[0] ) {
+ // Get *real* offsetParent
+ var offsetParent = this.offsetParent(),
+
+ // Get correct offsets
+ offset = this.offset(),
+ parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+ // Subtract element margins
+ // note: when an element has margin: auto the offsetLeft and marginLeft
+ // are the same in Safari causing offset.left to incorrectly be 0
+ offset.top -= num( this, 'marginTop' );
+ offset.left -= num( this, 'marginLeft' );
+
+ // Add offsetParent borders
+ parentOffset.top += num( offsetParent, 'borderTopWidth' );
+ parentOffset.left += num( offsetParent, 'borderLeftWidth' );
+
+ // Subtract the two offsets
+ results = {
+ top: offset.top - parentOffset.top,
+ left: offset.left - parentOffset.left
+ };
+ }
+
+ return results;
+ },
+
+ offsetParent: function() {
+ var offsetParent = this[0].offsetParent;
+ while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
+ offsetParent = offsetParent.offsetParent;
+ return jQuery(offsetParent);
+ }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ['Left', 'Top'], function(i, name) {
+ var method = 'scroll' + name;
+
+ jQuery.fn[ method ] = function(val) {
+ if (!this[0]) return;
+
+ return val != undefined ?
+
+ // Set the scroll offset
+ this.each(function() {
+ this == window || this == document ?
+ window.scrollTo(
+ !i ? val : jQuery(window).scrollLeft(),
+ i ? val : jQuery(window).scrollTop()
+ ) :
+ this[ method ] = val;
+ }) :
+
+ // Return the scroll offset
+ this[0] == window || this[0] == document ?
+ self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
+ jQuery.boxModel && document.documentElement[ method ] ||
+ document.body[ method ] :
+ this[0][ method ];
+ };
+});
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function(i, name){
+
+ var tl = i ? "Left" : "Top", // top or left
+ br = i ? "Right" : "Bottom"; // bottom or right
+
+ // innerHeight and innerWidth
+ jQuery.fn["inner" + name] = function(){
+ return this[ name.toLowerCase() ]() +
+ num(this, "padding" + tl) +
+ num(this, "padding" + br);
+ };
+
+ // outerHeight and outerWidth
+ jQuery.fn["outer" + name] = function(margin) {
+ return this["inner" + name]() +
+ num(this, "border" + tl + "Width") +
+ num(this, "border" + br + "Width") +
+ (margin ?
+ num(this, "margin" + tl) + num(this, "margin" + br) : 0);
+ };
+
+});})();
--- /dev/null
+/*!\r
+ SoundManager 2: Javascript Sound for the Web\r
+ --------------------------------------------\r
+ http://schillmania.com/projects/soundmanager2/\r
+\r
+ Copyright (c) 2008, Scott Schiller. All rights reserved.\r
+ Code licensed under the BSD License:\r
+ http://schillmania.com/projects/soundmanager2/license.txt\r
+\r
+ V2.90a.20081028\r
+*/\r
+\r
+function SoundManager(smURL,smID) {\r
+ \r
+ this.flashVersion = 8; // version of flash to require, either 8 or 9. Some API features require Flash 9.\r
+ this.debugMode = true; // enable debugging output (div#soundmanager-debug, OR console if available + configured)\r
+ this.useConsole = true; // use firebug/safari console.log()-type debug console if available\r
+ this.consoleOnly = false; // if console is being used, do not create/write to #soundmanager-debug\r
+ this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r
+ this.nullURL = 'null.mp3'; // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only)\r
+ this.allowPolling = true; // allow flash to poll for status update (required for "while playing", peak, sound spectrum functions to work.)\r
+ this.useMovieStar = false; // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio + video formats (AAC, M4V, FLV, MOV etc.)\r
+ this.useHighPerformance = true; // flash positioning trick, improves JS/flash callback speed, minimizes delay\r
+ this.bgColor = '#ffffff'; // movie (.swf) background color, useful if showing on-screen for video etc.\r
+\r
+ this.defaultOptions = {\r
+ 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r
+ 'stream': true, // allows playing before entire file has loaded (recommended)\r
+ 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true)\r
+ 'onid3': null, // callback function for "ID3 data is added/available"\r
+ 'onload': null, // callback function for "load finished"\r
+ 'whileloading': null, // callback function for "download progress update" (X of Y bytes received)\r
+ 'onplay': null, // callback for "play" start\r
+ 'onpause': null, // callback for "pause"\r
+ 'onresume': null, // callback for "resume" (pause toggle)\r
+ 'whileplaying': null, // callback during play (position update)\r
+ 'onstop': null, // callback for "user stop"\r
+ 'onfinish': null, // callback function for "sound finished playing"\r
+ 'onbeforefinish': null, // callback for "before sound finished playing (at [time])"\r
+ 'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second)\r
+ 'onbeforefinishcomplete':null, // function to call when said sound finishes playing\r
+ 'onjustbeforefinish':null, // callback for [n] msec before end of current sound\r
+ 'onjustbeforefinishtime':200, // [n] - if not using, set to 0 (or null handler) and event will not fire.\r
+ 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r
+ 'position': null, // offset (milliseconds) to seek to within loaded sound data.\r
+ 'pan': 0, // "pan" settings, left-to-right, -100 to 100\r
+ 'volume': 100 // self-explanatory. 0-100, the latter being the max.\r
+ };\r
+\r
+ this.flash9Options = { // flash 9-only options, merged into defaultOptions if flash 9 is being used\r
+ 'isMovieStar': null, // "MovieStar" MPEG4 audio/video mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r
+ 'usePeakData': false, // enable left/right channel peak (level) data\r
+ 'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire.\r
+ 'useEQData': false // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.\r
+ };\r
+\r
+ this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio/video options, merged into defaultOptions if flash 9 + movieStar mode is enabled\r
+ 'onmetadata': null, // callback for when video width/height etc. are received\r
+ 'useVideo': false // if loading movieStar content, whether to show video\r
+ }\r
+\r
+ this.flashBlockHelper = {\r
+ 'enabled': false, // experimental, removed with >v2.80\r
+ 'message': [] // "nag bar" to show when messaging the user, if SM2 fails on firefox etc.\r
+ };\r
+\r
+ var _s = this; \r
+ this.version = null;\r
+ this.versionNumber = 'V2.90a.20081028';\r
+ this.movieURL = null;\r
+ this.url = null;\r
+ this.altURL = null;\r
+ this.swfLoaded = false;\r
+ this.enabled = false;\r
+ this.o = null;\r
+ this.id = (smID||'sm2movie');\r
+ this.oMC = null;\r
+ this.sounds = [];\r
+ this.soundIDs = [];\r
+ this.muted = false;\r
+ this.isIE = (navigator.userAgent.match(/MSIE/i));\r
+ this.isSafari = (navigator.userAgent.match(/safari/i));\r
+ this.isGecko = (navigator.userAgent.match(/gecko/i));\r
+ this.debugID = 'soundmanager-debug';\r
+ this._debugOpen = true;\r
+ this._didAppend = false;\r
+ this._appendSuccess = false;\r
+ this._didInit = false;\r
+ this._disabled = false;\r
+ this._windowLoaded = false;\r
+ this._hasConsole = (typeof console != 'undefined' && typeof console.log != 'undefined');\r
+ this._debugLevels = ['log','info','warn','error'];\r
+ this._defaultFlashVersion = 8;\r
+ this.filePatterns = {\r
+ flash8: /\.(mp3)/i,\r
+ flash9: /\.(mp3)/i\r
+ };\r
+ this.netStreamTypes = ['aac','flv','mov','mp4','m4v','f4v','m4a','mp4v','3gp','3g2']; // Flash v9.0r115+ "moviestar" formats\r
+ this.netStreamPattern = new RegExp('.('+this.netStreamTypes.join('|')+')','i');\r
+ this.filePattern = null;\r
+ this.features = {\r
+ peakData: false,\r
+ waveformData: false,\r
+ eqData: false\r
+ };\r
+\r
+ this.sandbox = {\r
+ 'type': null,\r
+ 'types': {\r
+ 'remote': 'remote (domain-based) rules',\r
+ 'localWithFile': 'local with file access (no internet access)',\r
+ 'localWithNetwork': 'local with network (internet access only, no local access)',\r
+ 'localTrusted': 'local, trusted (local + internet access)'\r
+ },\r
+ 'description': null,\r
+ 'noRemote': null,\r
+ 'noLocal': null\r
+ };\r
+\r
+ this._setVersionInfo = function() {\r
+ if (_s.flashVersion != 8 && _s.flashVersion != 9) {\r
+ alert('soundManager.flashVersion must be 8 or 9. "'+_s.flashVersion+'" is invalid. Reverting to '+_s._defaultFlashVersion+'.');\r
+ _s.flashVersion = _s._defaultFlashVersion;\r
+ }\r
+ _s.version = _s.versionNumber+(_s.flashVersion==9?' (AS3/Flash 9)':' (AS2/Flash 8)');\r
+ // set up default options\r
+ if (_s.flashVersion > 8) {\r
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.flash9Options);\r
+ }\r
+ if (_s.flashVersion > 8 && _s.useMovieStar) {\r
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.movieStarOptions);\r
+ _s.filePatterns.flash9 = new RegExp('.(mp3|'+_s.netStreamTypes.join('|')+')','i');\r
+ } else {\r
+ _s.useMovieStar = false;\r
+ }\r
+ _s.filePattern = _s.filePatterns[(_s.flashVersion!=8?'flash9':'flash8')];\r
+ _s.movieURL = (_s.flashVersion==8?'soundmanager2.swf':'soundmanager2_flash9.swf');\r
+ _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_s.flashVersion==9);\r
+ }\r
+\r
+ this._overHTTP = (document.location?document.location.protocol.match(/http/i):null);\r
+ this._waitingforEI = false;\r
+ this._initPending = false;\r
+ this._tryInitOnFocus = (this.isSafari && typeof document.hasFocus == 'undefined');\r
+ this._isFocused = (typeof document.hasFocus != 'undefined'?document.hasFocus():null);\r
+ this._okToDisable = !this._tryInitOnFocus;\r
+\r
+ this.useAltURL = !this._overHTTP; // use altURL if not "online"\r
+\r
+ var flashCPLink = 'http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html';\r
+\r
+ // --- public methods ---\r
+ \r
+ this.supported = function() {\r
+ return (_s._didInit && !_s._disabled);\r
+ };\r
+\r
+ this.getMovie = function(smID) {\r
+ return _s.isIE?window[smID]:(_s.isSafari?document.getElementById(smID)||document[smID]:document.getElementById(smID));\r
+ };\r
+\r
+ this.loadFromXML = function(sXmlUrl) {\r
+ try {\r
+ _s.o._loadFromXML(sXmlUrl);\r
+ } catch(e) {\r
+ _s._failSafely();\r
+ return true;\r
+ };\r
+ };\r
+\r
+ this.createSound = function(oOptions) {\r
+ if (!_s._didInit) throw new Error('soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods');\r
+ if (arguments.length==2) {\r
+ // function overloading in JS! :) ..assume simple createSound(id,url) use case\r
+ var oOptions = {'id':arguments[0],'url':arguments[1]};\r
+ };\r
+ var thisOptions = _s._mergeObjects(oOptions); // inherit SM2 defaults\r
+ var _tO = thisOptions; // alias\r
+ _s._wD('soundManager.createSound(): '+_tO.id+' ('+_tO.url+')',1);\r
+ if (_s._idCheck(_tO.id,true)) {\r
+ _s._wD('soundManager.createSound(): '+_tO.id+' exists',1);\r
+ return _s.sounds[_tO.id];\r
+ };\r
+ if (_s.flashVersion > 8 && _s.useMovieStar) {\r
+ if (_tO.isMovieStar == null) {\r
+ _tO.isMovieStar = (_tO.url.match(_s.netStreamPattern)?true:false);\r
+ }\r
+ if (_tO.isMovieStar) {\r
+ _s._wD('soundManager.createSound(): using MovieStar handling');\r
+ }\r
+ if (_tO.isMovieStar && (_tO.usePeakData || _tO.useWaveformData || _tO.useEQData)) {\r
+ _s._wD('Warning: peak/waveform/eqData features unsupported for non-MP3 formats');\r
+ _tO.usePeakData = false;\r
+ _tO.useWaveformData = false;\r
+ _tO.useEQData = false;\r
+ }\r
+ };\r
+ _s.sounds[_tO.id] = new SMSound(_tO);\r
+ _s.soundIDs[_s.soundIDs.length] = _tO.id;\r
+ // AS2:\r
+ if (_s.flashVersion == 8) {\r
+ _s.o._createSound(_tO.id,_tO.onjustbeforefinishtime);\r
+ } else {\r
+ _s.o._createSound(_tO.id,_tO.url,_tO.onjustbeforefinishtime,_tO.usePeakData,_tO.useWaveformData,_tO.useEQData,_tO.isMovieStar,(_tO.isMovieStar?_tO.useVideo:false));\r
+ };\r
+ if (_tO.autoLoad || _tO.autoPlay) {\r
+ window.setTimeout(function() {\r
+ if (_s.sounds[_tO.id]) {\r
+ _s.sounds[_tO.id].load(_tO);\r
+ }\r
+ },20);\r
+ }\r
+ if (_tO.autoPlay) {\r
+ if (_s.flashVersion == 8) {\r
+ _s.sounds[_tO.id].playState = 1; // we can only assume this sound will be playing soon.\r
+ } else {\r
+ _s.sounds[_tO.id].play(); \r
+ }\r
+ }\r
+ return _s.sounds[_tO.id];\r
+ };\r
+\r
+ this.createVideo = function(oOptions) {\r
+ if (arguments.length==2) {\r
+ var oOptions = {'id':arguments[0],'url':arguments[1]};\r
+ };\r
+ if (_s.flashVersion >= 9) {\r
+ oOptions.isMovieStar = true;\r
+ oOptions.useVideo = true;\r
+ } else {\r
+ _s._wD('soundManager.createVideo(): flash 9 required for video. Exiting.',2);\r
+ return false;\r
+ }\r
+ if (!_s.useMovieStar) {\r
+ _s._wD('soundManager.createVideo(): MovieStar mode not enabled. Exiting.',2);\r
+ }\r
+ return _s.createSound(oOptions);\r
+ }\r
+\r
+ this.destroySound = function(sID,bFromSound) {\r
+ // explicitly destroy a sound before normal page unload, etc.\r
+ if (!_s._idCheck(sID)) return false;\r
+ for (var i=0; i<_s.soundIDs.length; i++) {\r
+ if (_s.soundIDs[i] == sID) {\r
+ _s.soundIDs.splice(i,1);\r
+ continue;\r
+ };\r
+ };\r
+ // conservative option: avoid crash with ze flash 8\r
+ // calling destroySound() within a sound onload() might crash firefox, certain flavours of winXP + flash 8??\r
+ // if (_s.flashVersion != 8) {\r
+ _s.sounds[sID].unload();\r
+ // }\r
+ if (!bFromSound) {\r
+ // ignore if being called from SMSound instance\r
+ _s.sounds[sID].destruct();\r
+ };\r
+ delete _s.sounds[sID];\r
+ };\r
+\r
+ this.destroyVideo = this.destroySound;\r
+\r
+ this.load = function(sID,oOptions) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].load(oOptions);\r
+ };\r
+\r
+ this.unload = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].unload();\r
+ };\r
+\r
+ this.play = function(sID,oOptions) {\r
+ if (!_s._idCheck(sID)) {\r
+ if (typeof oOptions != 'Object') oOptions = {url:oOptions}; // overloading use case: play('mySound','/path/to/some.mp3');\r
+ if (oOptions && oOptions.url) {\r
+ // overloading use case, creation + playing of sound: .play('someID',{url:'/path/to.mp3'});\r
+ _s._wD('soundController.play(): attempting to create "'+sID+'"',1);\r
+ oOptions.id = sID;\r
+ _s.createSound(oOptions);\r
+ } else {\r
+ return false;\r
+ };\r
+ };\r
+ _s.sounds[sID].play(oOptions);\r
+ };\r
+\r
+ this.start = this.play; // just for convenience\r
+\r
+ this.setPosition = function(sID,nMsecOffset) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ nMsecOffset = Math.min((nMsecOffset||0),_s.duration); // don't allow seek past loaded duration\r
+ _s.sounds[sID].setPosition(nMsecOffset);\r
+ };\r
+\r
+ this.stop = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.stop('+sID+')',1);\r
+ _s.sounds[sID].stop(); \r
+ };\r
+\r
+ this.stopAll = function() {\r
+ _s._wD('soundManager.stopAll()',1);\r
+ for (var oSound in _s.sounds) {\r
+ if (_s.sounds[oSound] instanceof SMSound) _s.sounds[oSound].stop(); // apply only to sound objects\r
+ };\r
+ };\r
+\r
+ this.pause = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].pause();\r
+ };\r
+\r
+ this.pauseAll = function() {\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].pause();\r
+ }\r
+ };\r
+\r
+ this.resume = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].resume();\r
+ };\r
+\r
+ this.resumeAll = function() {\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].resume();\r
+ }\r
+ };\r
+\r
+ this.togglePause = function(sID) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].togglePause();\r
+ };\r
+\r
+ this.setPan = function(sID,nPan) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].setPan(nPan);\r
+ };\r
+\r
+ this.setVolume = function(sID,nVol) {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s.sounds[sID].setVolume(nVol);\r
+ };\r
+\r
+ this.mute = function(sID) {\r
+ if (typeof sID != 'string') sID = null;\r
+ if (!sID) {\r
+ var o = null;\r
+ _s._wD('soundManager.mute(): Muting all sounds');\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].mute();\r
+ }\r
+ _s.muted = true;\r
+ } else {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.mute(): Muting "'+sID+'"');\r
+ _s.sounds[sID].mute();\r
+ }\r
+ };\r
+\r
+ this.muteAll = function() {\r
+ _s.mute();\r
+ };\r
+\r
+ this.unmute = function(sID) {\r
+ if (typeof sID != 'string') sID = null;\r
+ if (!sID) {\r
+ var o = null;\r
+ _s._wD('soundManager.unmute(): Unmuting all sounds');\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].unmute();\r
+ }\r
+ _s.muted = false;\r
+ } else {\r
+ if (!_s._idCheck(sID)) return false;\r
+ _s._wD('soundManager.unmute(): Unmuting "'+sID+'"');\r
+ _s.sounds[sID].unmute();\r
+ }\r
+ };\r
+\r
+ this.unmuteAll = function() {\r
+ _s.unmute();\r
+ };\r
+\r
+ this.setPolling = function(bPolling) {\r
+ if (!_s.o || !_s.allowPolling) return false;\r
+ // _s._wD('soundManager.setPolling('+bPolling+')');\r
+ _s.o._setPolling(bPolling);\r
+ };\r
+\r
+ this.disable = function(bUnload) {\r
+ // destroy all functions\r
+ if (_s._disabled) return false;\r
+ _s._disabled = true;\r
+ _s._wD('soundManager.disable(): Disabling all functions - future calls will return false.',1);\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s._disableObject(_s.sounds[_s.soundIDs[i]]);\r
+ };\r
+ _s.initComplete(); // fire "complete", despite fail\r
+ _s._disableObject(_s);\r
+ };\r
+\r
+ this.handleFlashBlock = function(bForce) {\r
+ // experimental, removed with >v2.80.\r
+ return false;\r
+ };\r
+\r
+ this.canPlayURL = function(sURL) {\r
+ return (sURL?(sURL.match(_s.filePattern)?true:false):null); \r
+ };\r
+\r
+ this.getSoundById = function(sID,suppressDebug) {\r
+ if (!sID) throw new Error('SoundManager.getSoundById(): sID is null/undefined');\r
+ var result = _s.sounds[sID];\r
+ if (!result && !suppressDebug) {\r
+ _s._wD('"'+sID+'" is an invalid sound ID.',2);\r
+ // soundManager._wD('trace: '+arguments.callee.caller);\r
+ };\r
+ return result;\r
+ };\r
+\r
+ this.onload = function() {\r
+ // window.onload() equivalent for SM2, ready to create sounds etc.\r
+ // this is a stub - you can override this in your own external script, eg. soundManager.onload = function() {}\r
+ soundManager._wD('<em>Warning</em>: soundManager.onload() is undefined.',2);\r
+ };\r
+\r
+ this.onerror = function() {\r
+ // stub for user handler, called when SM2 fails to load/init\r
+ };\r
+\r
+ // --- "private" methods ---\r
+\r
+ this._idCheck = this.getSoundById;\r
+\r
+ this._disableObject = function(o) {\r
+ for (var oProp in o) {\r
+ if (typeof o[oProp] == 'function' && typeof o[oProp]._protected == 'undefined') o[oProp] = function(){return false;};\r
+ };\r
+ oProp = null;\r
+ };\r
+\r
+ this._failSafely = function() {\r
+ // exception handler for "object doesn't support this property or method" or general failure\r
+ var fpgssTitle = 'You may need to whitelist this location/domain eg. file:///C:/ or C:/ or mysite.com, or set ALWAYS ALLOW under the Flash Player Global Security Settings page. The latter is probably less-secure.';\r
+ var flashCPL = '<a href="'+flashCPLink+'" title="'+fpgssTitle+'">view/edit</a>';\r
+ var FPGSS = '<a href="'+flashCPLink+'" title="Flash Player Global Security Settings">FPGSS</a>';\r
+ if (!_s._disabled) {\r
+ _s._wD('soundManager: Failed to initialise.',2);\r
+ _s.disable();\r
+ };\r
+ };\r
+ \r
+ this._normalizeMovieURL = function(smURL) {\r
+ if (smURL) {\r
+ if (smURL.match(/\.swf/)) {\r
+ smURL = smURL.substr(0,smURL.lastIndexOf('.swf'));\r
+ }\r
+ if (smURL.lastIndexOf('/') != smURL.length-1) {\r
+ smURL = smURL+'/';\r
+ }\r
+ }\r
+ return(smURL && smURL.lastIndexOf('/')!=-1?smURL.substr(0,smURL.lastIndexOf('/')+1):'./')+_s.movieURL;\r
+ };\r
+\r
+ this._getDocument = function() {\r
+ return (document.body?document.body:(document.documentElement?document.documentElement:document.getElementsByTagName('div')[0]));\r
+ };\r
+\r
+ this._getDocument._protected = true;\r
+\r
+ this._createMovie = function(smID,smURL) {\r
+ if (_s._didAppend && _s._appendSuccess) return false; // ignore if already succeeded\r
+ if (window.location.href.indexOf('debug=1')+1) _s.debugMode = true; // allow force of debug mode via URL\r
+ _s._didAppend = true;\r
+ \r
+ // safety check for legacy (change to Flash 9 URL)\r
+ _s._setVersionInfo();\r
+ var remoteURL = (smURL?smURL:_s.url);\r
+ var localURL = (_s.altURL?_s.altURL:remoteURL);\r
+ _s.url = _s._normalizeMovieURL(_s._overHTTP?remoteURL:localURL);\r
+ smURL = _s.url;\r
+\r
+ var htmlEmbed = '<embed name="'+smID+'" id="'+smID+'" src="'+smURL+'" width="100%" height="100%" quality="high" allowScriptAccess="always" quality="high" '+(_s.useHighPerformance && !_s.useMovieStar?'wmode="transparent" ':'')+'bgcolor="'+_s.bgColor+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed>';\r
+ var htmlObject = '<object id="'+smID+'" data="'+smURL+'" type="application/x-shockwave-flash" width="100%" height="100%"><param name="movie" value="'+smURL+'" /><param name="AllowScriptAccess" value="always" /><param name="quality" value="high" />'+(_s.useHighPerformance && !_s.useMovieStar?'<param name="wmode" value="transparent" /> ':'')+'<param name="bgcolor" value="'+_s.bgColor+'" /><!-- --></object>';\r
+ var html = (!_s.isIE?htmlEmbed:htmlObject);\r
+\r
+ var toggleElement = '<div id="'+_s.debugID+'-toggle" style="position:fixed;_position:absolute;right:0px;bottom:0px;_top:0px;width:1.2em;height:1.2em;line-height:1.2em;margin:2px;padding:0px;text-align:center;border:1px solid #999;cursor:pointer;background:#fff;color:#333;z-index:10001" title="Toggle SM2 debug console" onclick="soundManager._toggleDebug()">-</div>';\r
+ var debugHTML = '<div id="'+_s.debugID+'" style="display:'+(_s.debugMode && ((!_s._hasConsole||!_s.useConsole)||(_s.useConsole && _s._hasConsole && !_s.consoleOnly))?'block':'none')+';opacity:0.85"></div>';\r
+ var appXHTML = 'soundManager._createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.';\r
+\r
+ var oTarget = _s._getDocument();\r
+ if (oTarget) {\r
+ \r
+ _s.oMC = document.getElementById('sm2-container')?document.getElementById('sm2-container'):document.createElement('div');\r
+ if (!_s.oMC.id) {\r
+ _s.oMC.id = 'sm2-container';\r
+ _s.oMC.className = 'movieContainer';\r
+ // "hide" flash movie\r
+ var s = null;\r
+ if (_s.useHighPerformance) {\r
+ s = {\r
+ position: 'fixed',\r
+ width: '8px',\r
+ height: '8px', // must be at least 6px for flash to run fast. odd? yes.\r
+ bottom: '0px',\r
+ left: '0px',\r
+ zIndex:-1 // sit behind everything else\r
+ }\r
+ } else {\r
+ s = {\r
+ position: 'absolute',\r
+ width: '1px',\r
+ height: '1px',\r
+ bottom: '0px',\r
+ left: '0px'\r
+ }\r
+ }\r
+ var x = null;\r
+ for (x in s) {\r
+ _s.oMC.style[x] = s[x];\r
+ }\r
+ try {\r
+ oTarget.appendChild(_s.oMC);\r
+ _s.oMC.innerHTML = html;\r
+ _s._appendSuccess = true;\r
+ } catch(e) {\r
+ throw new Error(appXHTML);\r
+ }\r
+ } else {\r
+ // it's already in the document.\r
+ _s.oMC.innerHTML = html;\r
+ _s._appendSuccess = true;\r
+ }\r
+ if (!document.getElementById(_s.debugID) && ((!_s._hasConsole||!_s.useConsole)||(_s.useConsole && _s._hasConsole && !_s.consoleOnly))) {\r
+ var oDebug = document.createElement('div');\r
+ oDebug.id = _s.debugID;\r
+ oDebug.style.display = (_s.debugMode?'block':'none');\r
+ if (_s.debugMode) {\r
+ try {\r
+ var oD = document.createElement('div');\r
+ oTarget.appendChild(oD);\r
+ oD.innerHTML = toggleElement;\r
+ } catch(e) {\r
+ throw new Error(appXHTML);\r
+ };\r
+ };\r
+ oTarget.appendChild(oDebug);\r
+ };\r
+ oTarget = null;\r
+ };\r
+ _s._wD('-- SoundManager 2 '+_s.version+(_s.useMovieStar?', MovieStar mode':'')+(_s._wD?', high performance mode':'')+' --',1);\r
+ _s._wD('soundManager._createMovie(): Trying to load '+smURL+(!_s._overHTTP && _s.altURL?'(alternate URL)':''),1);\r
+ };\r
+\r
+ // aliased to this._wD()\r
+ this._writeDebug = function(sText,sType,bTimestamp) {\r
+ if (!_s.debugMode) return false;\r
+ if (typeof bTimestamp != 'undefined' && bTimestamp) {\r
+ sText = sText + ' | '+new Date().getTime();\r
+ };\r
+ if (_s._hasConsole && _s.useConsole) {\r
+ var sMethod = _s._debugLevels[sType];\r
+ if (typeof console[sMethod] != 'undefined') {\r
+ console[sMethod](sText);\r
+ } else {\r
+ console.log(sText);\r
+ };\r
+ if (_s.useConsoleOnly) return true;\r
+ };\r
+ var sDID = 'soundmanager-debug';\r
+ try {\r
+ var o = document.getElementById(sDID);\r
+ if (!o) return false;\r
+ var oItem = document.createElement('div');\r
+ sText = sText.replace(/\n/g,'<br />');\r
+ if (typeof sType == 'undefined') {\r
+ var sType = 0;\r
+ } else {\r
+ sType = parseInt(sType);\r
+ };\r
+ oItem.innerHTML = sText;\r
+ if (sType) {\r
+ if (sType >= 2) oItem.style.fontWeight = 'bold';\r
+ if (sType == 3) oItem.style.color = '#ff3333';\r
+ };\r
+ // o.appendChild(oItem); // top-to-bottom\r
+ o.insertBefore(oItem,o.firstChild); // bottom-to-top\r
+ } catch(e) {\r
+ // oh well\r
+ };\r
+ o = null;\r
+ };\r
+ this._writeDebug._protected = true;\r
+ this._wD = this._writeDebug;\r
+\r
+ this._wDAlert = function(sText) { alert(sText); };\r
+\r
+ if (window.location.href.indexOf('debug=alert')+1 && _s.debugMode) {\r
+ _s._wD = _s._wDAlert;\r
+ };\r
+\r
+ this._toggleDebug = function() {\r
+ var o = document.getElementById(_s.debugID);\r
+ var oT = document.getElementById(_s.debugID+'-toggle');\r
+ if (!o) return false;\r
+ if (_s._debugOpen) {\r
+ // minimize\r
+ oT.innerHTML = '+';\r
+ o.style.display = 'none';\r
+ } else {\r
+ oT.innerHTML = '-';\r
+ o.style.display = 'block';\r
+ };\r
+ _s._debugOpen = !_s._debugOpen;\r
+ };\r
+\r
+ this._toggleDebug._protected = true;\r
+\r
+ this._debug = function() {\r
+ _s._wD('--- soundManager._debug(): Current sound objects ---',1);\r
+ for (var i=0,j=_s.soundIDs.length; i<j; i++) {\r
+ _s.sounds[_s.soundIDs[i]]._debug();\r
+ };\r
+ };\r
+\r
+ this._mergeObjects = function(oMain,oAdd) {\r
+ // non-destructive merge\r
+ var o1 = {}; // clone o1\r
+ for (var i in oMain) {\r
+ o1[i] = oMain[i];\r
+ }\r
+ var o2 = (typeof oAdd == 'undefined'?_s.defaultOptions:oAdd);\r
+ for (var o in o2) {\r
+ if (typeof o1[o] == 'undefined') o1[o] = o2[o];\r
+ };\r
+ return o1;\r
+ };\r
+\r
+ this.createMovie = function(sURL) {\r
+ if (sURL) _s.url = sURL;\r
+ _s._initMovie();\r
+ };\r
+\r
+ this.go = this.createMovie; // nice alias\r
+\r
+ this._initMovie = function() {\r
+ // attempt to get, or create, movie\r
+ if (_s.o) return false; // pre-init may have fired this function before window.onload(), may already exist\r
+ _s.o = _s.getMovie(_s.id); // try to get flash movie (inline markup)\r
+ if (!_s.o) {\r
+ // try to create\r
+ _s._createMovie(_s.id,_s.url);\r
+ _s.o = _s.getMovie(_s.id);\r
+ };\r
+ if (_s.o) {\r
+ _s._wD('soundManager._initMovie(): Got '+_s.o.nodeName+' element ('+(_s._didAppend?'created via JS':'static HTML')+')',1);\r
+ _s._wD('soundManager._initMovie(): Waiting for ExternalInterface call from Flash..');\r
+ };\r
+ };\r
+\r
+ this.waitForExternalInterface = function() {\r
+ if (_s._waitingForEI) return false;\r
+ _s._waitingForEI = true;\r
+ if (_s._tryInitOnFocus && !_s._isFocused) {\r
+ _s._wD('soundManager: Special case: Flash may not have started due to non-focused tab (Safari is lame), and/or focus cannot be detected. Waiting for focus-related event..');\r
+ return false;\r
+ };\r
+ if (!_s._didInit) {\r
+ _s._wD('soundManager: Getting impatient, still waiting for Flash.. ;)');\r
+ };\r
+ setTimeout(function() {\r
+ if (!_s._didInit) {\r
+ _s._wD('soundManager: No Flash response within reasonable time after document load.\nPossible causes: Flash version under 8, no support, or Flash security denying JS-Flash communication.',2);\r
+ if (!_s._overHTTP) {\r
+ _s._wD('soundManager: Loading this page from local/network file system (not over HTTP?) Flash security likely restricting JS-Flash access. Consider adding current URL to "trusted locations" in the Flash player security settings manager at '+flashCPLink+', or simply serve this content over HTTP.',2);\r
+ };\r
+ };\r
+ // if still not initialized and no other options, give up\r
+ if (!_s._didInit && _s._okToDisable) _s._failSafely();\r
+ },750);\r
+ };\r
+\r
+ this.handleFocus = function() {\r
+ if (_s._isFocused || !_s._tryInitOnFocus) return true;\r
+ _s._okToDisable = true;\r
+ _s._isFocused = true;\r
+ _s._wD('soundManager.handleFocus()');\r
+ if (_s._tryInitOnFocus) {\r
+ // giant Safari 3.1 hack - assume window in focus if mouse is moving, since document.hasFocus() not currently implemented.\r
+ window.removeEventListener('mousemove',_s.handleFocus,false);\r
+ };\r
+ // allow init to restart\r
+ _s._waitingForEI = false;\r
+ setTimeout(_s.waitForExternalInterface,500);\r
+ // detach event\r
+ if (window.removeEventListener) {\r
+ window.removeEventListener('focus',_s.handleFocus,false);\r
+ } else if (window.detachEvent) {\r
+ window.detachEvent('onfocus',_s.handleFocus);\r
+ };\r
+ };\r
+\r
+ this.initComplete = function() {\r
+ if (_s._didInit) return false;\r
+ _s._didInit = true;\r
+ _s._wD('-- SoundManager 2 '+(_s._disabled?'failed to load':'loaded')+' ('+(_s._disabled?'security/load error':'OK')+') --',1);\r
+ if (_s._disabled) {\r
+ _s._wD('soundManager.initComplete(): calling soundManager.onerror()',1);\r
+ _s.onerror.apply(window);\r
+ return false;\r
+ };\r
+ if (_s.waitForWindowLoad && !_s._windowLoaded) {\r
+ _s._wD('soundManager: Waiting for window.onload()');\r
+ if (window.addEventListener) {\r
+ window.addEventListener('load',_s.initUserOnload,false);\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('onload',_s.initUserOnload);\r
+ };\r
+ return false;\r
+ } else {\r
+ if (_s.waitForWindowLoad && _s._windowLoaded) {\r
+ _s._wD('soundManager: Document already loaded');\r
+ };\r
+ _s.initUserOnload();\r
+ };\r
+ };\r
+\r
+ this.initUserOnload = function() {\r
+ _s._wD('soundManager.initComplete(): calling soundManager.onload()',1);\r
+ // call user-defined "onload", scoped to window\r
+ //try {\r
+ _s.onload.apply(window);\r
+ /*\r
+ } catch(e) {\r
+ // something broke (likely JS error in user function)\r
+ _s._wD('soundManager.onload() threw an exception: '+e.message,2);\r
+ setTimeout(function(){throw new Error(e)},20);\r
+ return false;\r
+ };\r
+ */\r
+ _s._wD('soundManager.onload() complete',1);\r
+ };\r
+\r
+ this.init = function() {\r
+ _s._wD('-- soundManager.init() --');\r
+ // called after onload()\r
+ _s._initMovie();\r
+ if (_s._didInit) {\r
+ _s._wD('soundManager.init(): Already called?');\r
+ return false;\r
+ };\r
+ // event cleanup\r
+ if (window.removeEventListener) {\r
+ window.removeEventListener('load',_s.beginDelayedInit,false);\r
+ } else if (window.detachEvent) {\r
+ window.detachEvent('onload',_s.beginDelayedInit);\r
+ };\r
+ try {\r
+ _s._wD('Attempting to call JS -> Flash..');\r
+ _s.o._externalInterfaceTest(false); // attempt to talk to Flash\r
+ // _s._wD('Flash ExternalInterface call (JS-Flash) OK',1);\r
+ if (!_s.allowPolling) {\r
+ _s._wD('Polling (whileloading/whileplaying support) is disabled.',1);\r
+ }\r
+ _s.setPolling(true);\r
+ if (!_s.debugMode) _s.o._disableDebug();\r
+ _s.enabled = true;\r
+ } catch(e) {\r
+ _s._failSafely();\r
+ _s.initComplete();\r
+ return false;\r
+ };\r
+ _s.initComplete();\r
+ };\r
+\r
+ this.beginDelayedInit = function() {\r
+ _s._wD('soundManager.beginDelayedInit(): Document loaded');\r
+ _s._windowLoaded = true;\r
+ setTimeout(_s.waitForExternalInterface,500);\r
+ setTimeout(_s.beginInit,20);\r
+ };\r
+\r
+ this.beginInit = function() {\r
+ if (_s._initPending) return false;\r
+ _s.createMovie(); // ensure creation if not already done\r
+ _s._initMovie();\r
+ _s._initPending = true;\r
+ return true;\r
+ };\r
+\r
+ this.domContentLoaded = function() {\r
+ _s._wD('soundManager.domContentLoaded()');\r
+ if (document.removeEventListener) document.removeEventListener('DOMContentLoaded',_s.domContentLoaded,false);\r
+ _s.go();\r
+ };\r
+\r
+ this._externalInterfaceOK = function() {\r
+ // callback from flash for confirming that movie loaded, EI is working etc.\r
+ if (_s.swfLoaded) return false;\r
+ _s._wD('soundManager._externalInterfaceOK()');\r
+ _s.swfLoaded = true;\r
+ _s._tryInitOnFocus = false;\r
+ if (_s.isIE) {\r
+ // IE needs a timeout OR delay until window.onload - may need TODO: investigating\r
+ setTimeout(_s.init,100);\r
+ } else {\r
+ _s.init();\r
+ };\r
+ };\r
+\r
+ this._setSandboxType = function(sandboxType) {\r
+ var sb = _s.sandbox;\r
+ sb.type = sandboxType;\r
+ sb.description = sb.types[(typeof sb.types[sandboxType] != 'undefined'?sandboxType:'unknown')];\r
+ _s._wD('Flash security sandbox type: '+sb.type);\r
+ if (sb.type == 'localWithFile') {\r
+ sb.noRemote = true;\r
+ sb.noLocal = false;\r
+ _s._wD('Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',2);\r
+ } else if (sb.type == 'localWithNetwork') {\r
+ sb.noRemote = false;\r
+ sb.noLocal = true;\r
+ } else if (sb.type == 'localTrusted') {\r
+ sb.noRemote = false;\r
+ sb.noLocal = false;\r
+ };\r
+ };\r
+\r
+ this.destruct = function() {\r
+ _s._wD('soundManager.destruct()');\r
+ _s.disable(true);\r
+ };\r
+ \r
+ // SMSound (sound object)\r
+ \r
+ function SMSound(oOptions) {\r
+ var _t = this;\r
+ this.sID = oOptions.id;\r
+ this.url = oOptions.url;\r
+ this.options = _s._mergeObjects(oOptions);\r
+ this.instanceOptions = this.options; // per-play-instance-specific options\r
+ this._iO = this.instanceOptions; // short alias\r
+\r
+ this._debug = function() {\r
+ if (_s.debugMode) {\r
+ var stuff = null;\r
+ var msg = [];\r
+ var sF = null;\r
+ var sfBracket = null;\r
+ var maxLength = 64; // # of characters of function code to show before truncating\r
+ for (stuff in _t.options) {\r
+ if (_t.options[stuff] != null) {\r
+ if (_t.options[stuff] instanceof Function) {\r
+ // handle functions specially\r
+ sF = _t.options[stuff].toString();\r
+ sF = sF.replace(/\s\s+/g,' '); // normalize spaces\r
+ sfBracket = sF.indexOf('{');\r
+ msg[msg.length] = ' '+stuff+': {'+sF.substr(sfBracket+1,(Math.min(Math.max(sF.indexOf('\n')-1,maxLength),maxLength))).replace(/\n/g,'')+'... }';\r
+ } else {\r
+ msg[msg.length] = ' '+stuff+': '+_t.options[stuff];\r
+ };\r
+ };\r
+ };\r
+ _s._wD('SMSound() merged options: {\n'+msg.join(', \n')+'\n}');\r
+ };\r
+ };\r
+\r
+ this._debug();\r
+\r
+ this.id3 = {\r
+ /* \r
+ Name/value pairs set via Flash when available - see reference for names:\r
+ http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001567.html\r
+ (eg., this.id3.songname or this.id3['songname'])\r
+ */\r
+ };\r
+\r
+ this.resetProperties = function(bLoaded) {\r
+ _t.bytesLoaded = null;\r
+ _t.bytesTotal = null;\r
+ _t.position = null;\r
+ _t.duration = null;\r
+ _t.durationEstimate = null;\r
+ _t.loaded = false;\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r
+ _t.muted = false;\r
+ _t.didBeforeFinish = false;\r
+ _t.didJustBeforeFinish = false;\r
+ _t.instanceOptions = {};\r
+ _t.instanceCount = 0;\r
+ _t.peakData = {\r
+ left: 0,\r
+ right: 0\r
+ };\r
+ _t.waveformData = [];\r
+ _t.eqData = [];\r
+ };\r
+\r
+ _t.resetProperties();\r
+\r
+ // --- public methods ---\r
+\r
+ this.load = function(oOptions) {\r
+ if (typeof oOptions != 'undefined') {\r
+ _t._iO = _s._mergeObjects(oOptions);\r
+ _t.instanceOptions = _t._iO;\r
+ } else {\r
+ var oOptions = _t.options;\r
+ _t._iO = oOptions;\r
+ _t.instanceOptions = _t._iO;\r
+ } \r
+ if (typeof _t._iO.url == 'undefined') _t._iO.url = _t.url;\r
+ _s._wD('soundManager.load(): '+_t._iO.url,1);\r
+ if (_t._iO.url == _t.url && _t.readyState != 0 && _t.readyState != 2) {\r
+ _s._wD('soundManager.load(): current URL already assigned.',1);\r
+ return false;\r
+ }\r
+ _t.loaded = false;\r
+ _t.readyState = 1;\r
+ _t.playState = (oOptions.autoPlay?1:0); // if autoPlay, assume "playing" is true (no way to detect when it actually starts in Flash unless onPlay is watched?)\r
+ try {\r
+ if (_s.flashVersion==8) {\r
+ _s.o._load(_t.sID,_t._iO.url,_t._iO.stream,_t._iO.autoPlay,(_t._iO.whileloading?1:0));\r
+ } else {\r
+ _s.o._load(_t.sID,_t._iO.url,_t._iO.stream?true:false,_t._iO.autoPlay?true:false); // ,(_tO.whileloading?true:false)\r
+ if (_t._iO.isMovieStar && _t._iO.autoLoad && !_t._iO.autoPlay) {\r
+ // special case: MPEG4 content must start playing to load, then pause to prevent playing.\r
+ _t.pause();\r
+ }\r
+ };\r
+ } catch(e) {\r
+ _s._wD('SMSound.load(): Exception: JS-Flash communication failed, or JS error.',2);\r
+ _s.onerror();\r
+ _s.disable();\r
+ };\r
+ };\r
+\r
+ this.unload = function() {\r
+ // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3\r
+ // Flash 9/AS3: Close stream, preventing further load\r
+ if (_t.readyState != 0) {\r
+ _s._wD('SMSound.unload(): "'+_t.sID+'"');\r
+ if (_t.readyState != 2) { // reset if not error\r
+ _t.setPosition(0); // reset current sound positioning\r
+ }\r
+ _s.o._unload(_t.sID,_s.nullURL);\r
+ // reset load/status flags\r
+ _t.resetProperties();\r
+ }\r
+ };\r
+\r
+ this.destruct = function() {\r
+ // kill sound within Flash\r
+ _s._wD('SMSound.destruct(): "'+_t.sID+'"');\r
+ _s.o._destroySound(_t.sID);\r
+ _s.destroySound(_t.sID,true); // ensure deletion from controller\r
+ }\r
+\r
+ this.play = function(oOptions) {\r
+ if (!oOptions) oOptions = {};\r
+ _t._iO = _s._mergeObjects(oOptions,_t._iO);\r
+ _t._iO = _s._mergeObjects(_t._iO,_t.options);\r
+ _t.instanceOptions = _t._iO;\r
+ if (_t.playState == 1) {\r
+ var allowMulti = _t._iO.multiShot;\r
+ if (!allowMulti) {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" already playing (one-shot)',1);\r
+ return false;\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" already playing (multi-shot)',1);\r
+ };\r
+ };\r
+ if (!_t.loaded) {\r
+ if (_t.readyState == 0) {\r
+ _s._wD('SMSound.play(): Attempting to load "'+_t.sID+'"',1);\r
+ // try to get this sound playing ASAP\r
+ _t._iO.stream = true;\r
+ _t._iO.autoPlay = true;\r
+ // TODO: need to investigate when false, double-playing\r
+ // if (typeof oOptions.autoPlay=='undefined') _tO.autoPlay = true; // only set autoPlay if unspecified here\r
+ _t.load(_t._iO); // try to get this sound playing ASAP\r
+ } else if (_t.readyState == 2) {\r
+ _s._wD('SMSound.play(): Could not load "'+_t.sID+'" - exiting',2);\r
+ return false;\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" is loading - attempting to play..',1);\r
+ };\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'"');\r
+ };\r
+ if (_t.paused) {\r
+ _t.resume();\r
+ } else {\r
+ _t.playState = 1;\r
+ if (!_t.instanceCount || _s.flashVersion == 9) _t.instanceCount++;\r
+ _t.position = (typeof _t._iO.position != 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0);\r
+ if (_t._iO.onplay) _t._iO.onplay.apply(_t);\r
+ _t.setVolume(_t._iO.volume);\r
+ _t.setPan(_t._iO.pan);\r
+ _s.o._start(_t.sID,_t._iO.loop||1,(_s.flashVersion==9?_t.position:_t.position/1000));\r
+ };\r
+ };\r
+\r
+ this.start = this.play; // just for convenience\r
+\r
+ this.stop = function(bAll) {\r
+ if (_t.playState == 1) {\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ // if (_s.defaultOptions.onstop) _s.defaultOptions.onstop.apply(_s);\r
+ if (_t._iO.onstop) _t._iO.onstop.apply(_t);\r
+ _s.o._stop(_t.sID,bAll);\r
+ _t.instanceCount = 0;\r
+ _t._iO = {};\r
+ // _t.instanceOptions = _t._iO;\r
+ };\r
+ };\r
+\r
+ this.setPosition = function(nMsecOffset) {\r
+ _t._iO.position = nMsecOffset;\r
+ _s._wD('SMSound.setPosition('+nMsecOffset+')');\r
+ _s.o._setPosition(_t.sID,(_s.flashVersion==9?_t._iO.position:_t._iO.position/1000),(_t.paused||!_t.playState)); // if paused or not playing, will not resume (by playing)\r
+ };\r
+\r
+ this.pause = function() {\r
+ if (_t.paused || _t.playState == 0) return false;\r
+ _s._wD('SMSound.pause()');\r
+ _t.paused = true;\r
+ _s.o._pause(_t.sID);\r
+ if (_t._iO.onpause) _t._iO.onpause.apply(_t);\r
+ };\r
+\r
+ this.resume = function() {\r
+ if (!_t.paused || _t.playState == 0) return false;\r
+ _s._wD('SMSound.resume()');\r
+ _t.paused = false;\r
+ _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume)\r
+ if (_t._iO.onresume) _t._iO.onresume.apply(_t);\r
+ };\r
+\r
+ this.togglePause = function() {\r
+ _s._wD('SMSound.togglePause()');\r
+ if (!_t.playState) {\r
+ _t.play({position:(_s.flashVersion==9?_t.position:_t.position/1000)});\r
+ return false;\r
+ };\r
+ if (_t.paused) {\r
+ _t.resume();\r
+ } else {\r
+ _t.pause();\r
+ };\r
+ };\r
+\r
+ this.setPan = function(nPan) {\r
+ if (typeof nPan == 'undefined') nPan = 0;\r
+ _s.o._setPan(_t.sID,nPan);\r
+ _t._iO.pan = nPan;\r
+ };\r
+\r
+ this.setVolume = function(nVol) {\r
+ if (typeof nVol == 'undefined') nVol = 100;\r
+ _s.o._setVolume(_t.sID,(_s.muted&&!_t.muted)||_t.muted?0:nVol);\r
+ _t._iO.volume = nVol;\r
+ };\r
+\r
+ this.mute = function() {\r
+ _t.muted = true;\r
+ _s.o._setVolume(_t.sID,0);\r
+ };\r
+\r
+ this.unmute = function() {\r
+ _t.muted = false;\r
+ _s.o._setVolume(_t.sID,typeof _t._iO.volume != 'undefined'?_t._iO.volume:_t.options.volume);\r
+ };\r
+\r
+ // --- "private" methods called by Flash ---\r
+\r
+ this._whileloading = function(nBytesLoaded,nBytesTotal,nDuration) {\r
+ if (!_t._iO.isMovieStar) {\r
+ _t.bytesLoaded = nBytesLoaded;\r
+ _t.bytesTotal = nBytesTotal;\r
+ _t.duration = Math.floor(nDuration);\r
+ _t.durationEstimate = parseInt((_t.bytesTotal/_t.bytesLoaded)*_t.duration); // estimate total time (will only be accurate with CBR MP3s.)\r
+ if (_t.readyState != 3 && _t._iO.whileloading) _t._iO.whileloading.apply(_t);\r
+ } else {\r
+ _t.bytesLoaded = nBytesLoaded;\r
+ _t.bytesTotal = nBytesTotal;\r
+ _t.duration = Math.floor(nDuration);\r
+ _t.durationEstimate = _t.duration;\r
+ if (_t.readyState != 3 && _t._iO.whileloading) _t._iO.whileloading.apply(_t);\r
+ }\r
+ };\r
+\r
+ this._onid3 = function(oID3PropNames,oID3Data) {\r
+ // oID3PropNames: string array (names)\r
+ // ID3Data: string array (data)\r
+ _s._wD('SMSound._onid3(): "'+this.sID+'" ID3 data received.');\r
+ var oData = [];\r
+ for (var i=0,j=oID3PropNames.length; i<j; i++) {\r
+ oData[oID3PropNames[i]] = oID3Data[i];\r
+ // _s._wD(oID3PropNames[i]+': '+oID3Data[i]);\r
+ };\r
+ _t.id3 = _s._mergeObjects(_t.id3,oData);\r
+ if (_t._iO.onid3) _t._iO.onid3.apply(_t);\r
+ };\r
+\r
+ this._whileplaying = function(nPosition,oPeakData,oWaveformData,oEQData) {\r
+ if (isNaN(nPosition) || nPosition == null) return false; // Flash may return NaN at times\r
+ _t.position = nPosition;\r
+ if (_t._iO.usePeakData && typeof oPeakData != 'undefined' && oPeakData) {\r
+ _t.peakData = {\r
+ left: oPeakData.leftPeak,\r
+ right: oPeakData.rightPeak\r
+ };\r
+ };\r
+ if (_t._iO.useWaveformData && typeof oWaveformData != 'undefined' && oWaveformData) {\r
+ _t.waveformData = oWaveformData;\r
+ /*\r
+ _t.spectrumData = {\r
+ left: oSpectrumData.left.split(','),\r
+ right: oSpectrumData.right.split(',')\r
+ }\r
+ */\r
+ };\r
+ if (_t._iO.useEQData && typeof oEQData != 'undefined' && oEQData) {\r
+ _t.eqData = oEQData;\r
+ };\r
+ if (_t.playState == 1) {\r
+ if (_t._iO.whileplaying) {\r
+ _t._iO.whileplaying.apply(_t); // flash may call after actual finish\r
+ };\r
+ if (_t.loaded && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration-_t.position <= _t._iO.onbeforefinishtime) {\r
+ _s._wD('duration-position <= onbeforefinishtime: '+_t.duration+' - '+_t.position+' <= '+_t._iO.onbeforefinishtime+' ('+(_t.duration-_t.position)+')');\r
+ _t._onbeforefinish();\r
+ };\r
+ };\r
+ };\r
+\r
+ this._onload = function(bSuccess) {\r
+ bSuccess = (bSuccess==1?true:false);\r
+ _s._wD('SMSound._onload(): "'+_t.sID+'"'+(bSuccess?' loaded.':' failed to load? - '+_t.url));\r
+ if (!bSuccess) {\r
+ if (_s.sandbox.noRemote == true) {\r
+ _s._wD('SMSound._onload(): Reminder: Flash security is denying network/internet access',1);\r
+ };\r
+ if (_s.sandbox.noLocal == true) {\r
+ _s._wD('SMSound._onload(): Reminder: Flash security is denying local access',1);\r
+ };\r
+ };\r
+ _t.loaded = bSuccess;\r
+ _t.readyState = bSuccess?3:2;\r
+ if (_t._iO.onload) {\r
+ _t._iO.onload.apply(_t);\r
+ };\r
+ };\r
+\r
+ this._onbeforefinish = function() {\r
+ if (!_t.didBeforeFinish) {\r
+ _t.didBeforeFinish = true;\r
+ if (_t._iO.onbeforefinish) {\r
+ _s._wD('SMSound._onbeforefinish(): "'+_t.sID+'"');\r
+ _t._iO.onbeforefinish.apply(_t);\r
+ }\r
+ };\r
+ };\r
+\r
+ this._onjustbeforefinish = function(msOffset) {\r
+ // msOffset: "end of sound" delay actual value (eg. 200 msec, value at event fire time was 187)\r
+ if (!_t.didJustBeforeFinish) {\r
+ _t.didJustBeforeFinish = true;\r
+ if (_t._iO.onjustbeforefinish) {\r
+ _s._wD('SMSound._onjustbeforefinish(): "'+_t.sID+'"');\r
+ _t._iO.onjustbeforefinish.apply(_t);\r
+ }\r
+ };\r
+ };\r
+\r
+ this._onfinish = function() {\r
+ // sound has finished playing\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ if (_t._iO.onfinish) {\r
+ _s._wD('SMSound._onfinish(): "'+_t.sID+'"');\r
+ _t._iO.onfinish.apply(_t);\r
+ }\r
+ if (_t._iO.onbeforefinishcomplete) _t._iO.onbeforefinishcomplete.apply(_t);\r
+ // reset some state items\r
+ _t.setPosition(0);\r
+ _t.didBeforeFinish = false;\r
+ _t.didJustBeforeFinish = false;\r
+ if (_t.instanceCount) {\r
+ _t.instanceCount--;\r
+ if (!_t.instanceCount) {\r
+ // reset instance options\r
+ _t.instanceCount = 0;\r
+ _t.instanceOptions = {};\r
+ }\r
+ }\r
+ };\r
+\r
+ this._onmetadata = function(oMetaData) {\r
+ // movieStar mode only\r
+ _s._wD('SMSound.onmetadata()');\r
+ // Contains a subset of metadata. Note that files may have their own unique metadata.\r
+ // http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000267.html\r
+ if (!oMetaData.width && !oMetaData.height) {\r
+ _s._wD('No width/height given, assuming defaults');\r
+ oMetaData.width = 320;\r
+ oMetaData.height = 240;\r
+ };\r
+ _t.metadata = oMetaData; // potentially-large object from flash\r
+ _t.width = oMetaData.width;\r
+ _t.height = oMetaData.height;\r
+ if (_t._iO.onmetadata) {\r
+ _s._wD('SMSound._onmetadata(): "'+_t.sID+'"');\r
+ _t._iO.onmetadata.apply(_t);\r
+ }\r
+ _s.wD('SMSound.onmetadata() complete');\r
+ };\r
+\r
+ }; // SMSound()\r
+\r
+ // register a few event handlers\r
+ if (window.addEventListener) {\r
+ window.addEventListener('focus',_s.handleFocus,false);\r
+ window.addEventListener('load',_s.beginDelayedInit,false);\r
+ window.addEventListener('unload',_s.destruct,false);\r
+ if (_s._tryInitOnFocus) window.addEventListener('mousemove',_s.handleFocus,false); // massive Safari focus hack\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('onfocus',_s.handleFocus);\r
+ window.attachEvent('onload',_s.beginDelayedInit);\r
+ window.attachEvent('unload',_s.destruct);\r
+ } else {\r
+ // no add/attachevent support - safe to assume no JS -> Flash either.\r
+ soundManager.onerror();\r
+ soundManager.disable();\r
+ };\r
+\r
+ if (document.addEventListener) document.addEventListener('DOMContentLoaded',_s.domContentLoaded,false);\r
+\r
+}; // SoundManager()\r
+\r
+var soundManager = new SoundManager();\r
--- /dev/null
+/* This notice must be untouched at all times.\r
+\r
+wz_jsgraphics.js v. 3.03\r
+The latest version is available at\r
+http://www.walterzorn.com\r
+or http://www.devira.com\r
+or http://www.walterzorn.de\r
+\r
+Copyright (c) 2002-2004 Walter Zorn. All rights reserved.\r
+Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )\r
+Last modified: 28. 1. 2008\r
+\r
+Performance optimizations for Internet Explorer\r
+by Thomas Frank and John Holdsworth.\r
+fillPolygon method implemented by Matthieu Haller.\r
+\r
+High Performance JavaScript Graphics Library.\r
+Provides methods\r
+- to draw lines, rectangles, ellipses, polygons\r
+ with specifiable line thickness,\r
+- to fill rectangles, polygons, ellipses and arcs\r
+- to draw text.\r
+NOTE: Operations, functions and branching have rather been optimized\r
+to efficiency and speed than to shortness of source code.\r
+\r
+LICENSE: LGPL\r
+\r
+This library is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU Lesser General Public\r
+License (LGPL) as published by the Free Software Foundation; either\r
+version 2.1 of the License, or (at your option) any later version.\r
+\r
+This library is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+Lesser General Public License for more details.\r
+\r
+You should have received a copy of the GNU Lesser General Public\r
+License along with this library; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA,\r
+or see http://www.gnu.org/copyleft/lesser.html\r
+*/\r
+\r
+\r
+var jg_ok, jg_ie, jg_fast, jg_dom, jg_moz;\r
+\r
+\r
+function _chkDHTM(x, i)\r
+{\r
+ x = document.body || null;\r
+ jg_ie = x && typeof x.insertAdjacentHTML != "undefined" && document.createElement;\r
+ jg_dom = (x && !jg_ie &&\r
+ typeof x.appendChild != "undefined" &&\r
+ typeof document.createRange != "undefined" &&\r
+ typeof (i = document.createRange()).setStartBefore != "undefined" &&\r
+ typeof i.createContextualFragment != "undefined");\r
+ jg_fast = jg_ie && document.all && !window.opera;\r
+ jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";\r
+ jg_ok = !!(jg_ie || jg_dom);\r
+}\r
+\r
+function _pntCnvDom()\r
+{\r
+ var x = this.wnd.document.createRange();\r
+ x.setStartBefore(this.cnv);\r
+ x = x.createContextualFragment(jg_fast? this._htmRpc() : this.htm);\r
+ if(this.cnv) this.cnv.appendChild(x);\r
+ this.htm = "";\r
+}\r
+\r
+function _pntCnvIe()\r
+{\r
+ if(this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this._htmRpc() : this.htm);\r
+ this.htm = "";\r
+}\r
+\r
+function _pntDoc()\r
+{\r
+ this.wnd.document.write(jg_fast? this._htmRpc() : this.htm);\r
+ this.htm = '';\r
+}\r
+\r
+function _pntN()\r
+{\r
+ ;\r
+}\r
+\r
+function _mkDiv(x, y, w, h)\r
+{\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:' + w + 'px;'+\r
+ 'height:' + h + 'px;'+\r
+ 'clip:rect(0,'+w+'px,'+h+'px,0);'+\r
+ 'background-color:' + this.color +\r
+ (!jg_moz? ';overflow:hidden' : '')+\r
+ ';"><\/div>';\r
+}\r
+\r
+function _mkDivIe(x, y, w, h)\r
+{\r
+ this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';\r
+}\r
+\r
+function _mkDivPrt(x, y, w, h)\r
+{\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'border-left:' + w + 'px solid ' + this.color + ';'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:0px;'+\r
+ 'height:' + h + 'px;'+\r
+ 'clip:rect(0,'+w+'px,'+h+'px,0);'+\r
+ 'background-color:' + this.color +\r
+ (!jg_moz? ';overflow:hidden' : '')+\r
+ ';"><\/div>';\r
+}\r
+\r
+var _regex = /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;\r
+function _htmRpc()\r
+{\r
+ return this.htm.replace(\r
+ _regex,\r
+ '<div style="overflow:hidden;position:absolute;background-color:'+\r
+ '$1;left:$2;top:$3;width:$4;height:$5"></div>\n');\r
+}\r
+\r
+function _htmPrtRpc()\r
+{\r
+ return this.htm.replace(\r
+ _regex,\r
+ '<div style="overflow:hidden;position:absolute;background-color:'+\r
+ '$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n');\r
+}\r
+\r
+function _mkLin(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1;\r
+\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx,\r
+ ox = x;\r
+ while(dx > 0)\r
+ {--dx;\r
+ ++x;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(ox, y, x-ox, 1);\r
+ y += yIncr;\r
+ p += pru;\r
+ ox = x;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(ox, y, x2-ox+1, 1);\r
+ }\r
+\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy,\r
+ oy = y;\r
+ if(y2 <= y1)\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, y, 1, oy-y+1);\r
+ y += yIncr;\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ y += yIncr;\r
+ p += pr;\r
+ }\r
+ }\r
+ this._mkDiv(x2, y2, 1, oy-y2+1);\r
+ }\r
+ else\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, oy, 1, y-oy);\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(x2, oy, 1, y2-oy+1);\r
+ }\r
+ }\r
+}\r
+\r
+function _mkLin2D(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1;\r
+\r
+ var s = this.stroke;\r
+ if(dx >= dy)\r
+ {\r
+ if(dx > 0 && s-3 > 0)\r
+ {\r
+ var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;\r
+ _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;\r
+ }\r
+ else var _s = s;\r
+ var ad = Math.ceil(s/2);\r
+\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx,\r
+ ox = x;\r
+ while(dx > 0)\r
+ {--dx;\r
+ ++x;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(ox, y, x-ox+ad, _s);\r
+ y += yIncr;\r
+ p += pru;\r
+ ox = x;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(ox, y, x2-ox+ad+1, _s);\r
+ }\r
+\r
+ else\r
+ {\r
+ if(s-3 > 0)\r
+ {\r
+ var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;\r
+ _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;\r
+ }\r
+ else var _s = s;\r
+ var ad = Math.round(s/2);\r
+\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy,\r
+ oy = y;\r
+ if(y2 <= y1)\r
+ {\r
+ ++ad;\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, y, _s, oy-y+ad);\r
+ y += yIncr;\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ y += yIncr;\r
+ p += pr;\r
+ }\r
+ }\r
+ this._mkDiv(x2, y2, _s, oy-y2+ad);\r
+ }\r
+ else\r
+ {\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ this._mkDiv(x++, oy, _s, y-oy+ad);\r
+ p += pru;\r
+ oy = y;\r
+ }\r
+ else p += pr;\r
+ }\r
+ this._mkDiv(x2, oy, _s, y2-oy+ad+1);\r
+ }\r
+ }\r
+}\r
+\r
+function _mkLinDott(x1, y1, x2, y2)\r
+{\r
+ if(x1 > x2)\r
+ {\r
+ var _x2 = x2;\r
+ var _y2 = y2;\r
+ x2 = x1;\r
+ y2 = y1;\r
+ x1 = _x2;\r
+ y1 = _y2;\r
+ }\r
+ var dx = x2-x1, dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ yIncr = (y1 > y2)? -1 : 1,\r
+ drw = true;\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1),\r
+ p = pr-dx;\r
+ while(dx > 0)\r
+ {--dx;\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+ drw = !drw;\r
+ if(p > 0)\r
+ {\r
+ y += yIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ ++x;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1),\r
+ p = pr-dy;\r
+ while(dy > 0)\r
+ {--dy;\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+ drw = !drw;\r
+ y += yIncr;\r
+ if(p > 0)\r
+ {\r
+ ++x;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ }\r
+ }\r
+ if(drw) this._mkDiv(x, y, 1, 1);\r
+}\r
+\r
+function _mkOv(left, top, width, height)\r
+{\r
+ var a = (++width)>>1, b = (++height)>>1,\r
+ wod = width&1, hod = height&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ ox = 0, oy = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ w, h;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ w = x-ox;\r
+ h = oy-y;\r
+ if((w&2) && (h&2))\r
+ {\r
+ this._mkOvQds(cx, cy, x-2, y+2, 1, 1, wod, hod);\r
+ this._mkOvQds(cx, cy, x-1, y+1, 1, 1, wod, hod);\r
+ }\r
+ else this._mkOvQds(cx, cy, x-1, oy, w, h, wod, hod);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ w = a-ox+1;\r
+ h = (oy<<1)+hod;\r
+ y = cy-oy;\r
+ this._mkDiv(cx-a, y, w, h);\r
+ this._mkDiv(cx+ox+wod-1, y, w, h);\r
+}\r
+\r
+function _mkOv2D(left, top, width, height)\r
+{\r
+ var s = this.stroke;\r
+ width += s+1;\r
+ height += s+1;\r
+ var a = width>>1, b = height>>1,\r
+ wod = width&1, hod = height&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1);\r
+\r
+ if(s-4 < 0 && (!(s-2) || width-51 > 0 && height-51 > 0))\r
+ {\r
+ var ox = 0, oy = b,\r
+ w, h,\r
+ pxw;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ w = x-ox;\r
+ h = oy-y;\r
+\r
+ if(w-1)\r
+ {\r
+ pxw = w+1+(s&1);\r
+ h = s;\r
+ }\r
+ else if(h-1)\r
+ {\r
+ pxw = s;\r
+ h += 1+(s&1);\r
+ }\r
+ else pxw = h = s;\r
+ this._mkOvQds(cx, cy, x-1, oy, pxw, h, wod, hod);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);\r
+ this._mkDiv(cx+a+wod-s, cy-oy, s, (oy<<1)+hod);\r
+ }\r
+\r
+ else\r
+ {\r
+ var _a = (width-(s<<1))>>1,\r
+ _b = (height-(s<<1))>>1,\r
+ _x = 0, _y = _b,\r
+ _aa2 = (_a*_a)<<1, _aa4 = _aa2<<1, _bb2 = (_b*_b)<<1, _bb4 = _bb2<<1,\r
+ _st = (_aa2>>1)*(1-(_b<<1)) + _bb2,\r
+ _tt = (_bb2>>1) - _aa2*((_b<<1)-1),\r
+\r
+ pxl = new Array(),\r
+ pxt = new Array(),\r
+ _pxb = new Array();\r
+ pxl[0] = 0;\r
+ pxt[0] = b;\r
+ _pxb[0] = _b-1;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ pxl[pxl.length] = x;\r
+ pxt[pxt.length] = y;\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ pxl[pxl.length] = x;\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ pxt[pxt.length] = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+\r
+ if(_y > 0)\r
+ {\r
+ if(_st < 0)\r
+ {\r
+ _st += _bb2*((_x<<1)+3);\r
+ _tt += _bb4*(++_x);\r
+ _pxb[_pxb.length] = _y-1;\r
+ }\r
+ else if(_tt < 0)\r
+ {\r
+ _st += _bb2*((_x<<1)+3) - _aa4*(_y-1);\r
+ _tt += _bb4*(++_x) - _aa2*(((_y--)<<1)-3);\r
+ _pxb[_pxb.length] = _y-1;\r
+ }\r
+ else\r
+ {\r
+ _tt -= _aa2*((_y<<1)-3);\r
+ _st -= _aa4*(--_y);\r
+ _pxb[_pxb.length-1]--;\r
+ }\r
+ }\r
+ }\r
+\r
+ var ox = -wod, oy = b,\r
+ _oy = _pxb[0],\r
+ l = pxl.length,\r
+ w, h;\r
+ for(var i = 0; i < l; i++)\r
+ {\r
+ if(typeof _pxb[i] != "undefined")\r
+ {\r
+ if(_pxb[i] < _oy || pxt[i] < oy)\r
+ {\r
+ x = pxl[i];\r
+ this._mkOvQds(cx, cy, x, oy, x-ox, oy-_oy, wod, hod);\r
+ ox = x;\r
+ oy = pxt[i];\r
+ _oy = _pxb[i];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ x = pxl[i];\r
+ this._mkDiv(cx-x, cy-oy, 1, (oy<<1)+hod);\r
+ this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);\r
+ ox = x;\r
+ oy = pxt[i];\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);\r
+ this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);\r
+ }\r
+}\r
+\r
+function _mkOvDott(left, top, width, height)\r
+{\r
+ var a = (++width)>>1, b = (++height)>>1,\r
+ wod = width&1, hod = height&1, hodu = hod^1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ drw = true;\r
+ while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ if(drw && y >= hodu) this._mkOvQds(cx, cy, x, y, 1, 1, wod, hod);\r
+ drw = !drw;\r
+ }\r
+}\r
+\r
+function _mkRect(x, y, w, h)\r
+{\r
+ var s = this.stroke;\r
+ this._mkDiv(x, y, w, s);\r
+ this._mkDiv(x+w, y, s, h);\r
+ this._mkDiv(x, y+h, w+s, s);\r
+ this._mkDiv(x, y+s, s, h-s);\r
+}\r
+\r
+function _mkRectDott(x, y, w, h)\r
+{\r
+ this.drawLine(x, y, x+w, y);\r
+ this.drawLine(x+w, y, x+w, y+h);\r
+ this.drawLine(x, y+h, x+w, y+h);\r
+ this.drawLine(x, y, x, y+h);\r
+}\r
+\r
+function jsgFont()\r
+{\r
+ this.PLAIN = 'font-weight:normal;';\r
+ this.BOLD = 'font-weight:bold;';\r
+ this.ITALIC = 'font-style:italic;';\r
+ this.ITALIC_BOLD = this.ITALIC + this.BOLD;\r
+ this.BOLD_ITALIC = this.ITALIC_BOLD;\r
+}\r
+var Font = new jsgFont();\r
+\r
+function jsgStroke()\r
+{\r
+ this.DOTTED = -1;\r
+}\r
+var Stroke = new jsgStroke();\r
+\r
+function jsGraphics(cnv, wnd)\r
+{\r
+ this.setColor = function(x)\r
+ {\r
+ this.color = x.toLowerCase();\r
+ };\r
+\r
+ this.setStroke = function(x)\r
+ {\r
+ this.stroke = x;\r
+ if(!(x+1))\r
+ {\r
+ this.drawLine = _mkLinDott;\r
+ this._mkOv = _mkOvDott;\r
+ this.drawRect = _mkRectDott;\r
+ }\r
+ else if(x-1 > 0)\r
+ {\r
+ this.drawLine = _mkLin2D;\r
+ this._mkOv = _mkOv2D;\r
+ this.drawRect = _mkRect;\r
+ }\r
+ else\r
+ {\r
+ this.drawLine = _mkLin;\r
+ this._mkOv = _mkOv;\r
+ this.drawRect = _mkRect;\r
+ }\r
+ };\r
+\r
+ this.setPrintable = function(arg)\r
+ {\r
+ this.printable = arg;\r
+ if(jg_fast)\r
+ {\r
+ this._mkDiv = _mkDivIe;\r
+ this._htmRpc = arg? _htmPrtRpc : _htmRpc;\r
+ }\r
+ else this._mkDiv = arg? _mkDivPrt : _mkDiv;\r
+ };\r
+\r
+ this.setFont = function(fam, sz, sty)\r
+ {\r
+ this.ftFam = fam;\r
+ this.ftSz = sz;\r
+ this.ftSty = sty || Font.PLAIN;\r
+ };\r
+\r
+ this.drawPolyline = this.drawPolyLine = function(x, y)\r
+ {\r
+ for (var i=x.length - 1; i;)\r
+ {--i;\r
+ this.drawLine(x[i], y[i], x[i+1], y[i+1]);\r
+ }\r
+ };\r
+\r
+ this.fillRect = function(x, y, w, h)\r
+ {\r
+ this._mkDiv(x, y, w, h);\r
+ };\r
+\r
+ this.drawPolygon = function(x, y)\r
+ {\r
+ this.drawPolyline(x, y);\r
+ this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);\r
+ };\r
+\r
+ this.drawEllipse = this.drawOval = function(x, y, w, h)\r
+ {\r
+ this._mkOv(x, y, w, h);\r
+ };\r
+\r
+ this.fillEllipse = this.fillOval = function(left, top, w, h)\r
+ {\r
+ var a = w>>1, b = h>>1,\r
+ wod = w&1, hod = h&1,\r
+ cx = left+a, cy = top+b,\r
+ x = 0, y = b, oy = b,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ xl, dw, dh;\r
+ if(w) while(y > 0)\r
+ {\r
+ if(st < 0)\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0)\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ xl = cx-x;\r
+ dw = (x<<1)+wod;\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ dh = oy-y;\r
+ this._mkDiv(xl, cy-oy, dw, dh);\r
+ this._mkDiv(xl, cy+y+hod, dw, dh);\r
+ oy = y;\r
+ }\r
+ else\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ }\r
+ }\r
+ this._mkDiv(cx-a, cy-oy, w, (oy<<1)+hod);\r
+ };\r
+\r
+ this.fillArc = function(iL, iT, iW, iH, fAngA, fAngZ)\r
+ {\r
+ var a = iW>>1, b = iH>>1,\r
+ iOdds = (iW&1) | ((iH&1) << 16),\r
+ cx = iL+a, cy = iT+b,\r
+ x = 0, y = b, ox = x, oy = y,\r
+ aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,\r
+ st = (aa2>>1)*(1-(b<<1)) + bb2,\r
+ tt = (bb2>>1) - aa2*((b<<1)-1),\r
+ // Vars for radial boundary lines\r
+ xEndA, yEndA, xEndZ, yEndZ,\r
+ iSects = (1 << (Math.floor((fAngA %= 360.0)/180.0) << 3))\r
+ | (2 << (Math.floor((fAngZ %= 360.0)/180.0) << 3))\r
+ | ((fAngA >= fAngZ) << 16),\r
+ aBndA = new Array(b+1), aBndZ = new Array(b+1);\r
+ \r
+ // Set up radial boundary lines\r
+ fAngA *= Math.PI/180.0;\r
+ fAngZ *= Math.PI/180.0;\r
+ xEndA = cx+Math.round(a*Math.cos(fAngA));\r
+ yEndA = cy+Math.round(-b*Math.sin(fAngA));\r
+ _mkLinVirt(aBndA, cx, cy, xEndA, yEndA);\r
+ xEndZ = cx+Math.round(a*Math.cos(fAngZ));\r
+ yEndZ = cy+Math.round(-b*Math.sin(fAngZ));\r
+ _mkLinVirt(aBndZ, cx, cy, xEndZ, yEndZ);\r
+\r
+ while(y > 0)\r
+ {\r
+ if(st < 0) // Advance x\r
+ {\r
+ st += bb2*((x<<1)+3);\r
+ tt += bb4*(++x);\r
+ }\r
+ else if(tt < 0) // Advance x and y\r
+ {\r
+ st += bb2*((x<<1)+3) - aa4*(y-1);\r
+ ox = x;\r
+ tt += bb4*(++x) - aa2*(((y--)<<1)-3);\r
+ this._mkArcDiv(ox, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ oy = y;\r
+ }\r
+ else // Advance y\r
+ {\r
+ tt -= aa2*((y<<1)-3);\r
+ st -= aa4*(--y);\r
+ if(y && (aBndA[y] != aBndA[y-1] || aBndZ[y] != aBndZ[y-1]))\r
+ {\r
+ this._mkArcDiv(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ ox = x;\r
+ oy = y;\r
+ }\r
+ }\r
+ }\r
+ this._mkArcDiv(x, 0, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);\r
+ if(iOdds >> 16) // Odd height\r
+ {\r
+ if(iSects >> 16) // Start-angle > end-angle\r
+ {\r
+ var xl = (yEndA <= cy || yEndZ > cy)? (cx - x) : cx;\r
+ this._mkDiv(xl, cy, x + cx - xl + (iOdds & 0xffff), 1);\r
+ }\r
+ else if((iSects & 0x01) && yEndZ > cy)\r
+ this._mkDiv(cx - x, cy, x, 1);\r
+ }\r
+ };\r
+\r
+/* fillPolygon method, implemented by Matthieu Haller.\r
+This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.\r
+C source of GD 1.8.4 found at http://www.boutell.com/gd/\r
+\r
+THANKS to Kirsten Schulz for the polygon fixes!\r
+\r
+The intersection finding technique of this code could be improved\r
+by remembering the previous intertersection, and by using the slope.\r
+That could help to adjust intersections to produce a nice\r
+interior_extrema. */\r
+ this.fillPolygon = function(array_x, array_y)\r
+ {\r
+ var i;\r
+ var y;\r
+ var miny, maxy;\r
+ var x1, y1;\r
+ var x2, y2;\r
+ var ind1, ind2;\r
+ var ints;\r
+\r
+ var n = array_x.length;\r
+ if(!n) return;\r
+\r
+ miny = array_y[0];\r
+ maxy = array_y[0];\r
+ for(i = 1; i < n; i++)\r
+ {\r
+ if(array_y[i] < miny)\r
+ miny = array_y[i];\r
+\r
+ if(array_y[i] > maxy)\r
+ maxy = array_y[i];\r
+ }\r
+ for(y = miny; y <= maxy; y++)\r
+ {\r
+ var polyInts = new Array();\r
+ ints = 0;\r
+ for(i = 0; i < n; i++)\r
+ {\r
+ if(!i)\r
+ {\r
+ ind1 = n-1;\r
+ ind2 = 0;\r
+ }\r
+ else\r
+ {\r
+ ind1 = i-1;\r
+ ind2 = i;\r
+ }\r
+ y1 = array_y[ind1];\r
+ y2 = array_y[ind2];\r
+ if(y1 < y2)\r
+ {\r
+ x1 = array_x[ind1];\r
+ x2 = array_x[ind2];\r
+ }\r
+ else if(y1 > y2)\r
+ {\r
+ y2 = array_y[ind1];\r
+ y1 = array_y[ind2];\r
+ x2 = array_x[ind1];\r
+ x1 = array_x[ind2];\r
+ }\r
+ else continue;\r
+\r
+ // Modified 11. 2. 2004 Walter Zorn\r
+ if((y >= y1) && (y < y2))\r
+ polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);\r
+\r
+ else if((y == maxy) && (y > y1) && (y <= y2))\r
+ polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);\r
+ }\r
+ polyInts.sort(_CompInt);\r
+ for(i = 0; i < ints; i+=2)\r
+ this._mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);\r
+ }\r
+ };\r
+\r
+ this.drawString = function(txt, x, y)\r
+ {\r
+ this.htm += '<div style="position:absolute;white-space:nowrap;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'font-family:' + this.ftFam + ';'+\r
+ 'font-size:' + this.ftSz + ';'+\r
+ 'color:' + this.color + ';' + this.ftSty + '">'+\r
+ txt +\r
+ '<\/div>';\r
+ };\r
+\r
+/* drawStringRect() added by Rick Blommers.\r
+Allows to specify the size of the text rectangle and to align the\r
+text both horizontally (e.g. right) and vertically within that rectangle */\r
+ this.drawStringRect = function(txt, x, y, width, halign)\r
+ {\r
+ this.htm += '<div style="position:absolute;overflow:hidden;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ 'width:'+width +'px;'+\r
+ 'text-align:'+halign+';'+\r
+ 'font-family:' + this.ftFam + ';'+\r
+ 'font-size:' + this.ftSz + ';'+\r
+ 'color:' + this.color + ';' + this.ftSty + '">'+\r
+ txt +\r
+ '<\/div>';\r
+ };\r
+\r
+ this.drawImage = function(imgSrc, x, y, w, h, a)\r
+ {\r
+ this.htm += '<div style="position:absolute;'+\r
+ 'left:' + x + 'px;'+\r
+ 'top:' + y + 'px;'+\r
+ // w (width) and h (height) arguments are now optional.\r
+ // Added by Mahmut Keygubatli, 14.1.2008\r
+ (w? ('width:' + w + 'px;') : '') +\r
+ (h? ('height:' + h + 'px;'):'')+'">'+\r
+ '<img src="' + imgSrc +'"'+ (w ? (' width="' + w + '"'):'')+ (h ? (' height="' + h + '"'):'') + (a? (' '+a) : '') + '>'+\r
+ '<\/div>';\r
+ };\r
+\r
+ this.clear = function()\r
+ {\r
+ this.htm = "";\r
+ if(this.cnv) this.cnv.innerHTML = "";\r
+ };\r
+\r
+ this._mkOvQds = function(cx, cy, x, y, w, h, wod, hod)\r
+ {\r
+ var xl = cx - x, xr = cx + x + wod - w, yt = cy - y, yb = cy + y + hod - h;\r
+ if(xr > xl+w)\r
+ {\r
+ this._mkDiv(xr, yt, w, h);\r
+ this._mkDiv(xr, yb, w, h);\r
+ }\r
+ else\r
+ w = xr - xl + w;\r
+ this._mkDiv(xl, yt, w, h);\r
+ this._mkDiv(xl, yb, w, h);\r
+ };\r
+ \r
+ this._mkArcDiv = function(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects)\r
+ {\r
+ var xrDef = cx + x + (iOdds & 0xffff), y2, h = oy - y, xl, xr, w;\r
+\r
+ if(!h) h = 1;\r
+ x = cx - x;\r
+\r
+ if(iSects & 0xff0000) // Start-angle > end-angle\r
+ {\r
+ y2 = cy - y - h;\r
+ if(iSects & 0x00ff)\r
+ {\r
+ if(iSects & 0x02)\r
+ {\r
+ xl = Math.max(x, aBndZ[y]);\r
+ w = xrDef - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0x01)\r
+ {\r
+ xr = Math.min(xrDef, aBndA[y]);\r
+ w = xr - x;\r
+ if(w > 0) this._mkDiv(x, y2, w, h);\r
+ }\r
+ }\r
+ else\r
+ this._mkDiv(x, y2, xrDef - x, h);\r
+ y2 = cy + y + (iOdds >> 16);\r
+ if(iSects & 0xff00)\r
+ {\r
+ if(iSects & 0x0100)\r
+ {\r
+ xl = Math.max(x, aBndA[y]);\r
+ w = xrDef - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0x0200)\r
+ {\r
+ xr = Math.min(xrDef, aBndZ[y]);\r
+ w = xr - x;\r
+ if(w > 0) this._mkDiv(x, y2, w, h);\r
+ }\r
+ }\r
+ else\r
+ this._mkDiv(x, y2, xrDef - x, h);\r
+ }\r
+ else\r
+ {\r
+ if(iSects & 0x00ff)\r
+ {\r
+ if(iSects & 0x02)\r
+ xl = Math.max(x, aBndZ[y]);\r
+ else\r
+ xl = x;\r
+ if(iSects & 0x01)\r
+ xr = Math.min(xrDef, aBndA[y]);\r
+ else\r
+ xr = xrDef;\r
+ y2 = cy - y - h;\r
+ w = xr - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ if(iSects & 0xff00)\r
+ {\r
+ if(iSects & 0x0100)\r
+ xl = Math.max(x, aBndA[y]);\r
+ else\r
+ xl = x;\r
+ if(iSects & 0x0200)\r
+ xr = Math.min(xrDef, aBndZ[y]);\r
+ else\r
+ xr = xrDef;\r
+ y2 = cy + y + (iOdds >> 16);\r
+ w = xr - xl;\r
+ if(w > 0) this._mkDiv(xl, y2, w, h);\r
+ }\r
+ }\r
+ };\r
+\r
+ this.setStroke(1);\r
+ this.setFont("verdana,geneva,helvetica,sans-serif", "12px", Font.PLAIN);\r
+ this.color = "#000000";\r
+ this.htm = "";\r
+ this.wnd = wnd || window;\r
+\r
+ if(!jg_ok) _chkDHTM();\r
+ if(jg_ok)\r
+ {\r
+ if(cnv)\r
+ {\r
+ if(typeof(cnv) == "string")\r
+ this.cont = document.all? (this.wnd.document.all[cnv] || null)\r
+ : document.getElementById? (this.wnd.document.getElementById(cnv) || null)\r
+ : null;\r
+ else if(cnv == window.document)\r
+ this.cont = document.getElementsByTagName("body")[0];\r
+ // If cnv is a direct reference to a canvas DOM node\r
+ // (option suggested by Andreas Luleich)\r
+ else this.cont = cnv;\r
+ // Create new canvas inside container DIV. Thus the drawing and clearing\r
+ // methods won't interfere with the container's inner html.\r
+ // Solution suggested by Vladimir.\r
+ this.cnv = this.wnd.document.createElement("div");\r
+ this.cnv.style.fontSize=0;\r
+ this.cont.appendChild(this.cnv);\r
+ this.paint = jg_dom? _pntCnvDom : _pntCnvIe;\r
+ }\r
+ else\r
+ this.paint = _pntDoc;\r
+ }\r
+ else\r
+ this.paint = _pntN;\r
+\r
+ this.setPrintable(false);\r
+}\r
+\r
+function _mkLinVirt(aLin, x1, y1, x2, y2)\r
+{\r
+ var dx = Math.abs(x2-x1), dy = Math.abs(y2-y1),\r
+ x = x1, y = y1,\r
+ xIncr = (x1 > x2)? -1 : 1,\r
+ yIncr = (y1 > y2)? -1 : 1,\r
+ p,\r
+ i = 0;\r
+ if(dx >= dy)\r
+ {\r
+ var pr = dy<<1,\r
+ pru = pr - (dx<<1);\r
+ p = pr-dx;\r
+ while(dx > 0)\r
+ {--dx;\r
+ if(p > 0) // Increment y\r
+ {\r
+ aLin[i++] = x;\r
+ y += yIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ x += xIncr;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ var pr = dx<<1,\r
+ pru = pr - (dy<<1);\r
+ p = pr-dy;\r
+ while(dy > 0)\r
+ {--dy;\r
+ y += yIncr;\r
+ aLin[i++] = x;\r
+ if(p > 0) // Increment x\r
+ {\r
+ x += xIncr;\r
+ p += pru;\r
+ }\r
+ else p += pr;\r
+ }\r
+ }\r
+ for(var len = aLin.length, i = len-i; i;)\r
+ aLin[len-(i--)] = x;\r
+};\r
+\r
+function _CompInt(x, y)\r
+{\r
+ return(x - y);\r
+}\r
+\r
--- /dev/null
+.ts-skin-lab .ts-player {
+ background: #3c4251;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border: dotted #b2b2b2 1px;
+}
+
+.ts-skin-lab .ts-player .ts-viewer {
+ margin: 0 12px 10px 12px;
+ border: solid 1px white;
+}
+
+.ts-skin-lab .ts-player .ts-viewer .ts-marker {
+ color: white;
+ background: #7290bc;
+}
+
+.ts-skin-lab .ts-player .ts-viewer a.ts-marker, .ts-skin-lab .ts-player .ts-viewer a.ts-pointer {
+ text-decoration: none;
+ line-height: 13px;
+}
+
+.ts-skin-lab .ts-player .ts-viewer .ts-pointer {
+ color: #3c4251;
+ background: #e7e7e7;
+}
+
+.ts-skin-lab .ts-player .ts-ruler .ts-section .ts-label {
+ color: #c3c2cc;
+ background: #2a3242;
+ padding-bottom: 1px;
+ padding-left: 2px;
+ line-height: 13px;
+}
+
+.ts-skin-lab .ts-player .ts-ruler .ts-section .ts-lines {
+ background: #384051;
+ color: #9498a1;
+ border-bottom: solid 1px white;
+ line-height: 13px;
+}
+
+.ts-skin-lab .ts-player .ts-wave .ts-image {
+ background: #090e0d ;
+}
+
+.ts-skin-lab .ts-player .ts-control {
+ background: url('img/controlbg.png');
+ height: 28px;
+ border-top: dotted #b2b2b2 1px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-layout {
+ margin-left: 12px;
+ margin-right: 12px;
+ padding-top: 4px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback a {
+ display: block;
+ float: left;
+ width: 21px;
+ padding: 21px 0 0 0;
+ overflow: hidden;
+ height: 0px !important;
+ height /**/:21px; /* for IE5/Win only */
+ margin-right: 1px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback a:hover {
+ background-position: 0 -21px;
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-play {
+ background-image: url('img/play.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-pause {
+ background-image: url('img/pause.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-rewind {
+ background-image: url('img/rewind.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-forward {
+ background-image: url('img/forward.png');
+}
+
+.ts-skin-lab .ts-player .ts-control .ts-playback .ts-set-marker {
+ background-image: url('img/setmarker.png');
+}
+
+/* unused */
+.ts-skin-lab .ts-player .ts-marker-control .ts-set-marker {
+ display: block;
+ width: 89px;
+ padding: 21px 0 0 0;
+ overflow: hidden;
+ height: 0px !important;
+ height /**/:21px; /* for IE5/Win only */
+ background-image: url('img/setmarker.gif');
+ margin: 5px auto 0 auto;
+}
+
+/* unused */
+.ts-skin-lab .ts-player .ts-marker-control .ts-set-marker:hover {
+ background-position: 0 -21px;
+}
+
+.ts-skin-lab .ts-player .ts-marker-control {
+ border-top: dotted #b2b2b2 1px;
+ border-bottom: dotted #b2b2b2 1px;
+ height: 30px;
+}
+
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N) {
+
+$N.Class.create("Controller", $N.Core, {
+
+ initialize: function($super, cfg) {
+ $super();
+ this.configure(cfg, {
+ player: null,
+ soundProvider: null,
+ map: null
+ });
+ if (this.cfg.player && !$N.isInstanceOf(this.cfg.player, 'Player')) {
+ this.cfg.player = new $N.Player(this.cfg.player);
+ }
+ this._setupPlayer();
+ },
+
+ _setupPlayer: function() {
+ this.cfg.player
+ .setSoundProvider(this.cfg.soundProvider)
+ .setMarkerMap(this.cfg.map)
+ .observe('play', $N.attachFunction(this.cfg.soundProvider, this.cfg.soundProvider.play))
+ .observe('pause', $N.attachFunction(this.cfg.soundProvider, this.cfg.soundProvider.pause))
+ .observe('move', this.attach(this._onMove))
+ .observe('markeradd', this.attach(this._onMarkerAdd))
+ .observe('markermove', this.attach(this._onMarkerMove))
+ .draw();
+ },
+
+ _onMove: function(e, data) {
+ this.cfg.soundProvider.seek(data.offset);
+ },
+
+ _onMarkerMove: function(e, data) {
+ if (this.cfg.map) {
+ this.cfg.map.move(this.cfg.map.byId(data.id), data.offset);
+ }
+ },
+
+ _onMarkerAdd: function(e, data) {
+ if (this.cfg.map) {
+ this.cfg.map.add(data.offset, 'marker at ' + data.offset);
+ }
+ }
+
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.extend = function(destination, source) {
+ for (var property in source)
+ destination[property] = source[property];
+ return destination;
+};
+
+$N.objectKeys = function(object) {
+ var keys = [];
+ for (var property in object)
+ keys.push(property);
+ return keys;
+};
+
+$N.argumentNames = function(method) {
+ var names = method.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
+ .replace(/\s+/g, '').split(',');
+ return names.length == 1 && !names[0] ? [] : names;
+};
+
+$N.argsToArray = function(args) {
+ var length = args.length || 0, result = new Array(length);
+ while (length--) result[length] = args[length];
+ return result;
+};
+
+$N.wrapFunction = function(wrapper, method) {
+ return function() {
+ var args = $N.argsToArray(arguments);
+ return wrapper.apply(this, [$N.attachFunction(this, method)].concat(args));
+ }
+};
+
+$N.attachFunction = function() {
+ if (arguments.length < 3 && (typeof arguments[1] == 'undefined')) return arguments[0];
+ var args = $N.argsToArray(arguments);
+ var object = args.shift();
+ var method = args.shift();
+ return function() {
+ var _args = $N.argsToArray(arguments);
+ return method.apply(object, args.concat(_args));
+ }
+};
+
+$N.attachAsEventListener = function() {
+ var args = $N.argsToArray(arguments), object = args.shift();
+ var method = args.shift();
+ return function(event) {
+ return method.apply(object, [event || window.event].concat(args));
+ }
+};
+
+$N.isInstanceOf = function(obj, className) {
+ if (typeof obj == 'object' && obj.__class__) {
+ var c = obj.__class__;
+ if (c.__name__ == className) {
+ return true;
+ }
+ while (c = c.__super__) {
+ if (c.__name__ == className) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+$N.Class = {
+ create: function() {
+ var parent = null, className = null;
+ var properties = $N.argsToArray(arguments)
+ if (typeof properties[0] == "string")
+ className = properties.shift();
+ if (typeof properties[0] == "function")
+ parent = properties.shift();
+
+ function klass() {
+ this.initialize.apply(this, arguments);
+ }
+
+ $N.extend(klass, $N.Class.Methods);
+ klass.__name__ = className;
+ klass.__super__ = parent;
+ klass.__subclasses__ = [];
+
+ if (parent) {
+ var subclass = function() { };
+ subclass.prototype = parent.prototype;
+ klass.prototype = new subclass;
+ parent.__subclasses__.push(klass);
+ }
+
+ klass.prototype.__class__ = klass;
+ for (var i = 0; i < properties.length; i++)
+ klass.addMethods(properties[i]);
+
+ if (!klass.prototype.initialize)
+ klass.prototype.initialize = function () {};
+
+ klass.prototype.constructor = klass;
+
+ if (className) {
+ $N[className] = klass;
+ }
+ return klass;
+ }
+};
+
+$N.Class.Methods = {
+ addMethods: function(source) {
+ var ancestor = this.__super__ && this.__super__.prototype;
+ var properties = $N.objectKeys(source);
+
+ if (!$N.objectKeys({ toString: true }).length)
+ properties.push("toString", "valueOf");
+
+ for (var i = 0, length = properties.length; i < length; i++) {
+ var property = properties[i], value = source[property];
+ if (ancestor && (typeof value == 'function') &&
+ $N.argumentNames(value)[0] == "$super") {
+ var method = value;
+ value = $N.wrapFunction(method, (function(m) {
+ return function() { return ancestor[m].apply(this, arguments) };
+ })(property));
+
+ value.valueOf = $N.attachFunction(method, method.valueOf);
+ value.toString = $N.attachFunction(method, method.toString);
+ }
+ this.prototype[property] = value;
+ }
+
+ return this;
+ }
+};
+
+$N.Core = $N.Class.create("Core", {
+ eventContainer: null,
+ eventPrefix: '',
+ cfg: {},
+
+ initialize: function() {
+ this.debug("new instance");
+ $N.registerInstance(this);
+ this.eventContainer = $J('<div/>');
+ this.forwardEvent = this.attach(this._forwardEvent);
+ },
+
+ free: function() {
+ this.eventContainer = null;
+ },
+
+ configure: function(config, defaults) {
+ if (!config)
+ config = {};
+ for (k in defaults) {
+ var value = null, flags = [];
+
+ if (defaults[k] && typeof defaults[k][0] !== 'undefined') {
+ value = defaults[k][0];
+ if (defaults[k][1]) {
+ flags = defaults[k][1].split(",");
+ }
+ } else {
+ value = defaults[k];
+ }
+
+ if (typeof config[k] !== 'undefined')
+ value = config[k];
+
+ var source = this;
+ $J(flags).each(function(i, flag) {
+ switch (flag) {
+ case 'required':
+ if (value === null)
+ throw new $N.RequiredOptionError(source, k);
+ break;
+ /*
+ case 'element':
+ value = $J(value);
+ break;
+ */
+
+ }
+ });
+
+ this.cfg[k] = value;
+ }
+ return this;
+ },
+
+ observe: function(eventName, handler) {
+ this.eventContainer.bind(this.eventPrefix + eventName, handler);
+ return this;
+ },
+
+ fire: function(eventName, data) {
+ if (!data)
+ data = {};
+ this.eventContainer.trigger(this.eventPrefix + eventName, data);
+ return this;
+ },
+
+ _forwardEvent: function(e, data) {
+ if (!data)
+ data = {};
+ this.eventContainer.trigger(e.type, data);
+ return this;
+ },
+
+ _textWidth: function(text, fontSize) {
+ var ratio = 3/5;
+ return text.length * ratio * fontSize;
+ },
+
+ debug: function(message) {
+ if ($N.debugging && typeof console != 'undefined' && console.log) {
+ console.log('TimeSide.' + this.__class__.__name__ + ': ' + message);
+ }
+ },
+
+ attach: function(method) {
+ return $N.attachFunction(this, method);
+ },
+
+ attachWithEvent: function(method) {
+ return $N.attachAsEventListener(this, method);
+ },
+
+ uniqid: function() {
+ d = new Date();
+ return new String(d.getTime() + '' + Math.floor(Math.random() * 1000000)).substr(0, 18);
+ }
+});
+
+$N.Class.create("Exception", {
+ _source: null,
+ _message: null,
+
+ initialize: function(source, message) {
+ this._source = source;
+ this._message = message;
+ },
+ toString: function() {
+ return this.__class__.__name__ + " from TimeSide." + this._source.__class__.__name__
+ + ": " + this._message;
+ }
+});
+
+$N.Class.create("RequiredOptionError", $N.Exception, {
+ initialize: function($super, source, optionName) {
+ $super(source, "missing '" + optionName + "' required option");
+ }
+});
+
+$N.Class.create("RequiredArgumentError", $N.Exception, {
+ initialize: function($super, source, optionName) {
+ $super(source, "missing '" + optionName + "' required argument");
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Class.create("Marker", $N.Core, {
+ id: null,
+ painter: null,
+ visible: false,
+ position: 0,
+ label: null,
+ blinking: false,
+ nodes: null,
+ mouseDown: false,
+ blinkAnimation: null,
+
+ initialize: function($super, cfg) {
+ $super();
+ this.configure(cfg, {
+ rulerLayout: [null, 'required'],
+ viewer: [null, 'required'],
+ fontSize: 10,
+ zIndex: null,
+ className: [null, 'required'],
+ id: null,
+ tooltip: null
+ });
+ this.cfg.rulerLayout = $J(this.cfg.rulerLayout);
+ this.cfg.viewer = $J(this.cfg.viewer);
+
+ this.id = cfg.id;
+ this.width = this.cfg.viewer.width();
+ this.painter = new jsGraphics(this.cfg.viewer.get(0));
+ this._create();
+ this._observeMouseEvents();
+ },
+
+ free: function($super) {
+ this.cfg.rulerLayout = null;
+ this.cfg.viewer = null;
+ $super();
+ },
+
+ clear: function() {
+ this.painter.clear();
+ $J(this.painter.cnv).remove();
+ this.label.remove();
+ return this;
+ },
+
+ _create: function() {
+ this.debug('create marker');
+ var y = this.cfg.rulerLayout.find('.' + $N.cssPrefix + 'label').outerHeight();
+ this.label = $J('<a/>')
+ .css({
+ display: 'block',
+ width: '10px',
+ textAlign: 'center',
+ position: 'absolute',
+ fontSize: this.cfg.fontSize + 'px',
+ fontFamily: 'monospace',
+ top: y + 'px'
+ })
+ .attr('href', '#')
+ .addClass($N.cssPrefix + this.cfg.className)
+ .append('<span />')
+ .hide();
+
+ if (this.cfg.tooltip)
+ this.label.attr('title', this.cfg.tooltip);
+
+ this.cfg.rulerLayout.append(this.label);
+
+ var height = this.cfg.viewer.height();
+ var x = 0;
+ this.painter.drawLine(x, 0, x, height);
+ x = [-4, 4, 0];
+ var y = [0, 0, 4];
+ this.painter.fillPolygon(x, y);
+ this.painter.paint();
+ this.nodes = $J(this.painter.cnv).children();
+
+ var style = {};
+ if (this.cfg.zIndex) {
+ style.zIndex = this.cfg.zIndex;
+ this.label.css(style);
+ }
+ style.backgroundColor = '';
+
+ this.nodes.hide().css(style).addClass($N.cssPrefix + this.cfg.className)
+ .each(function(i, node) {
+ node.originalPosition = parseInt($J(node).css('left'));
+ });
+ },
+
+ setText: function(text) {
+ if (this.label) {
+ text += '';
+ var labelWidth = this._textWidth(text, this.cfg.fontSize) + 10;
+ labelWidth += 'px';
+ if (this.label.css('width') != labelWidth) {
+ this.label.css({ width: labelWidth });
+ }
+ this.label.find('span').html(text);
+ }
+ return this;
+ },
+
+ move: function(pixelOffset) {
+ if (this.position != pixelOffset) {
+ if (pixelOffset < 0) {
+ pixelOffset = 0;
+ } else if (pixelOffset >= this.width) {
+ pixelOffset = this.width - 1;
+ }
+ this.nodes.each(function(i, node) {
+ $J(node).css('left', Math.round(node.originalPosition + pixelOffset) + 'px');
+ });
+ var labelWidth = this.label.width();
+ var labelPixelOffset = pixelOffset - labelWidth / 2;
+ if (labelPixelOffset < 0)
+ labelPixelOffset = 0;
+ else if (labelPixelOffset + labelWidth > this.width)
+ labelPixelOffset = this.width - labelWidth;
+ this.label.css({left: Math.round(labelPixelOffset) + 'px'});
+ this.position = pixelOffset;
+ }
+ return this;
+ },
+
+ show: function(offset) {
+ if (!this.visible) {
+ this.nodes.show();
+ this.label.show();
+ this.visible = true;
+ }
+ return this;
+ },
+
+ hide: function() {
+ this.nodes.hide();
+ this.label.hide();
+ this.visible = false;
+ return this;
+ },
+
+ isVisible: function() {
+ return this.visible;
+ },
+
+ blink: function(state) {
+ var speed = 200;
+ if (this.label && this.blinking != state) {
+ var span = this.label.find('span');
+
+ span.stop();
+
+ function fade(on) {
+ if (on) {
+ span.animate({opacity: 1}, speed, null,
+ function() { fade(false) });
+ } else {
+ span.animate({opacity: 0.4}, speed, null,
+ function() { fade(true) })
+ }
+ }
+
+ if (state) {
+ fade();
+ } else {
+ span.animate({opacity: 1}, speed);
+ }
+
+ this.blinking = state;
+ }
+ return this;
+ },
+
+ _onMouseDown: function(evt) {
+ this.mouseDown = true;
+ this._onMouseMove(evt);
+ return false;
+ },
+
+ _onMouseMove: function(evt) {
+ if (this.mouseDown) {
+ var offset = (evt.pageX - this.cfg.rulerLayout.offset().left);
+ this.move(offset);
+ this.fire('move', {offset: this.position, finish: false});
+ return false;
+ }
+ },
+
+ _onMouseUp: function(evt) {
+ if (this.mouseDown) {
+ this.mouseDown = false;
+ this.fire('move', {id: this.id, offset: this.position, finish: true});
+ return false;
+ }
+ },
+
+ _observeMouseEvents: function() {
+ this.label.mousedown(this.attachWithEvent(this._onMouseDown))
+ .bind('click dragstart', function() {return false;});
+ this.cfg.rulerLayout.mousemove(this.attachWithEvent(this._onMouseMove));
+ this.cfg.rulerLayout.mouseup(this.attachWithEvent(this._onMouseUp));
+ $J(document).mouseup(this.attachWithEvent(this._onMouseUp));
+ }
+
+
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N) {
+
+$N.Class.create("MarkerList", $N.Core, {
+ initialize: function($super, cfg) {
+ $super();
+ this.cfg = this.configure(cfg, {
+ container: null,
+ map: null
+ });
+ },
+
+ _buildItem: function(marker) {
+ var dt = new Element('dt');
+ var time = $N.Util.makeTimeLabel(marker.offset);
+
+
+ },
+
+ _setupInterface: function() {
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Class.create("MarkerMap", $N.Core, {
+ markers: null,
+
+ initialize: function($super, markers) {
+ $super();
+ if (!markers)
+ markers = [];
+ this.markers = markers;
+ },
+
+ toArray: function() {
+ return [].concat(this.markers);
+ },
+
+ byIndex: function(index) {
+ return this.markers[index];
+ },
+
+ byId: function(id) {
+ var marker = null;
+ for (var i in this.markers) {
+ if (this.markers[i].id == id) {
+ marker = this.markers[i];
+ break;
+ }
+ }
+ return marker;
+ },
+
+ indexOf: function(marker) {
+ var index = null;
+ for (var i in this.markers) {
+ if (this.markers[i].id == marker.id) {
+ index = parseInt(i);
+ break;
+ }
+ }
+ return index;
+ },
+
+ _reorder: function() {
+ this.markers.sort(this.compare);
+ for (var i in this.markers) {
+ this.fire('indexchange', {marker: this.markers[i], index: parseInt(i)});
+ }
+ },
+
+ add: function(offset, desc) {
+ var id = this.uniqid();
+ var marker = {id: id, offset: offset, desc: desc};
+ var i = this.markers.push(marker) - 1;
+ this.fire('add', {marker: marker, index: i});
+ this._reorder();
+ return marker;
+ },
+
+ remove: function(marker) {
+ if (marker) {
+ var i = this.indexOf(marker);
+ this.markers.splice(i, 1);
+ this.fire('remove', {marker: marker});
+ this._reorder();
+ }
+ return marker;
+ },
+
+ compare: function(marker1, marker2) {
+ if (marker1.offset > marker2.offset)
+ return 1;
+ if (marker1.offset < marker2.offset)
+ return -1;
+ return 0;
+ },
+
+ move: function(marker, offset) {
+ oldMarkers = [].concat(this.markers);
+ marker.offset = offset;
+ this._reorder();
+ },
+
+ getPrevious: function(offset, skip) {
+ var marker = null;
+ if (!skip) skip = 0;
+ markers = [].concat(this.markers).reverse();
+ $J(markers).each(function(i, m) {
+ if (offset > m.offset && !(skip--)) {
+ marker = m;
+ return false;
+ }
+ });
+ return marker;
+ },
+
+ getNext: function(offset, skip) {
+ var marker = null;
+ if (!skip) skip = 0;
+ $J(this.markers).each(function(i, m) {
+ if (offset < m.offset && !(skip--)) {
+ marker = m;
+ return false;
+ }
+ });
+ return marker;
+ },
+
+ each: function(callback) {
+ $J(this.markers).each(callback);
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Class.create("Player", $N.Core, {
+ skeleton: {
+ 'div.viewer': {
+ 'div.ruler': {},
+ 'div.wave': {
+ 'div.image-canvas': {},
+ 'div.image-container': ['img.image']
+ }
+ },
+ 'div.control': {
+ 'div.layout': {
+ 'div.playback': ['a.play', 'a.pause', 'a.rewind', 'a.forward', 'a.set-marker']
+ }
+ }/*,
+ 'div.marker-control': ['a.set-marker']*/
+ },
+ defaultContents: {
+ play: 'Play',
+ pause: 'Pause',
+ rewind: 'Rewind',
+ forward: 'Forward',
+ 'set-marker': 'Set marker'
+ },
+ elements: {},
+ ruler: null,
+ soundProvider: null,
+ map: null,
+ container: null,
+ imageWidth: null,
+ imageHeight: null,
+
+ initialize: function($super, container, cfg) {
+ $super();
+ if (!container)
+ throw new $N.RequiredArgumentError(this, 'container');
+ this.container = $J(container);
+ this.configure(cfg, {
+ image: null
+ });
+ },
+
+ free: function($super) {
+ this.elements = null;
+ this.container = null;
+ $super();
+ },
+
+ setSoundProvider: function(soundProvider) {
+ this.soundProvider = soundProvider;
+ return this;
+ },
+
+ setMarkerMap: function(map) {
+ this.map = map;
+ return this;
+ },
+
+ setImage: function(expr) {
+ this.cfg.image = expr;
+ this.refreshImage();
+ },
+
+ refreshImage: function() {
+ var src = null;
+ if (typeof this.cfg.image == 'function') {
+ src = this.cfg.image(this.imageWidth, this.imageHeight);
+ } else if (typeof this.cfg.image == 'string') {
+ src = this.cfg.image;
+ }
+
+ if (src)
+ this.elements.image.attr('src', src);
+ },
+
+ draw: function() {
+ this.debug('drawing');
+ $N.domReady(this.attach(this._setupInterface));
+ return this;
+ },
+
+ _setupInterface: function() {
+ this.elements = $N.Util.loadUI(this.container, this.skeleton, this.defaultContents);
+
+ // IE apparently doesn't send the second mousedown on double click:
+ var jump = $J.browser.msie ? 'mousedown dblclick' : 'mousedown';
+ this.elements.rewind.attr('href', '#').bind(jump, this.attach(this._onRewind))
+ .click(function() {return false; });
+ this.elements.forward.attr('href', '#').bind(jump, this.attach(this._onForward))
+ .click(function() {return false; });
+ this.elements.pause.attr('href', '#').bind('click', this.attach(this._onPause));
+ this.elements.play.attr('href', '#').bind('click', this.attach(this._onPlay));
+ this.elements.control.find('a').add(this.elements.setMarker)
+ .attr('href', '#')
+ .each(function(i, a){
+ a = $J(a);
+ if (!a.attr('title'))
+ a.attr('title', a.text());
+ });
+
+ //this.elements.markerControl.find('a').attr('href', '#');
+ if (this.map) {
+ this.elements.setMarker.bind('click', this.attach(this._onSetMarker));
+ } else {
+ this.elements.setMarker.remove();
+ }
+ this.ruler = new $N.Ruler({
+ viewer: this.elements.viewer,
+ map: this.map,
+ soundProvider: this.soundProvider
+ });
+ this.ruler
+ .observe('markermove', this.forwardEvent)
+ .observe('markeradd', this.forwardEvent)
+ .observe('move', this.forwardEvent)
+ .draw();
+ this.refreshImage();
+ this.resize();
+ var resizeTimer = null;
+ $J(window).resize(this.attach(function() {
+ if (resizeTimer)
+ clearTimeout(resizeTimer);
+ resizeTimer = setTimeout(this.attach(this.resize), 100);
+ }));
+ //this.container.resize(this.attach(this.resize)); // Can loop ?
+ },
+
+ resize: function(overrideHeight) {
+ this.debug("resizing");
+ var height;
+ if (overrideHeight === true) {
+ this.debug("override height");
+ height = this.elements.image.css('height', 'auto').height();
+ } else {
+ height = this.elements.wave.height();
+ this.debug("wave height:" + height);
+ if (!height) {
+ this.elements.image.one('load', this.attach(function() {
+ this.resize(true);
+ this.debug("image loaded");
+ }));
+ height = this.elements.image.height();
+ }
+ }
+
+ var elements = this.elements.image
+ .add(this.elements.imageContainer)
+ .add(this.elements.imageCanvas);
+
+ elements.css('width', 'auto'); // for IE6
+
+ if (!height)
+ height = 200;
+ var style = {
+ width: this.elements.wave.width(),
+ height: height
+ }
+ elements.css(style);
+ this.imageWidth = style.width;
+ this.imageHeight = style.height;
+ this.refreshImage();
+ this.ruler.resize();
+ return this;
+ },
+
+ _onRewind: function() {
+ var offset = 0;
+ if (this.map) {
+ var position = this.soundProvider.getPosition();
+ var marker = this.map.getPrevious(position);
+ if (marker && this.soundProvider.isPlaying()
+ && position - marker.offset < this.ruler.getUnitDuration())
+ marker = this.map.getPrevious(marker.offset)
+ if (marker) {
+ offset = marker.offset;
+ }
+ }
+ this.fire('move', {offset: offset});
+ return false;
+ },
+
+ _onForward: function() {
+ var offset = this.soundProvider.getDuration();
+ if (this.map) {
+ var marker = this.map.getNext(this.soundProvider.getPosition());
+ if (marker) {
+ offset = marker.offset;
+ }
+ }
+ this.fire('move', {offset: offset});
+ return false;
+ },
+
+ _onPlay: function() {
+ this.fire('play');
+ return false;
+ },
+
+ _onPause: function() {
+ this.fire('pause');
+ return false;
+ },
+
+ _onSetMarker: function() {
+ if (this.map) {
+ this.fire('markeradd', {offset: this.soundProvider.getPosition()});
+ }
+ return false;
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Class.create("Ruler", $N.Core, {
+
+ fullSectionDuration: 60,
+ sectionSubDivision: 10,
+ sectionSteps: [[5, 1], [10, 1], [20, 2], [30, 5], [60, 10], [120, 20], [300, 30],
+ [600, 60], [1800, 300], [3600, 600]],
+ sectionsNum: 0,
+ timeLabelWidth: 0,
+ pointerPos: 0,
+ layout: null,
+ width: null,
+ mouseDown: false,
+ pointer: null,
+ markers: new Array(),
+ duration: 0,
+ container: null,
+ waveContainer: null,
+
+ initialize: function($super, cfg) {
+ $super();
+ this.configure(cfg, {
+ viewer: [null, 'required'],
+ fontSize: 10,
+ map: null,
+ soundProvider: [null, 'required']
+ });
+ this.cfg.viewer = $J(this.cfg.viewer);
+ this.container = this.cfg.viewer.find('.' + $N.cssPrefix + 'ruler');
+ this.waveContainer = this.cfg.viewer.find('.' + $N.cssPrefix + 'image-canvas');
+ this._setDuration(this.cfg.soundProvider.getDuration());
+ var imgContainer = this.cfg.viewer.find('.' + $N.cssPrefix + 'image-container'); // for IE
+ this._observeMouseEvents(this.waveContainer.add(imgContainer));
+ if (this.cfg.map) {
+ this.cfg.map
+ .observe('add', this.attach(this._onMapAdd))
+ .observe('remove', this.attach(this._onMapRemove))
+ .observe('indexchange', this.attach(this._onMapIndexChange));
+ }
+ this.cfg.soundProvider.observe('update', this.attach(this._onSoundProviderUpdate));
+ },
+
+ free: function($super) {
+ this.layout = null;
+ this.container = null;
+ this.waveContainer = null;
+ this.cfg.viewer = null;
+ $super();
+ },
+
+ _computeLayout: function() {
+ this.width = this.waveContainer.width();
+
+ this.debug('container width: ' + this.width);
+ var i, ii = this.sectionSteps.length;
+ this.timeLabelWidth = this._textWidth('00:00', this.cfg.fontSize);
+ for (i = 0; i < ii; i++) {
+ var duration = this.sectionSteps[i][0];
+ var subDivision = this.sectionSteps[i][1];
+ var labelsNum = Math.floor(this.duration / duration);
+ if ((i == ii - 1) || (this.width / labelsNum > this.timeLabelWidth * 2)) {
+ this.fullSectionDuration = duration;
+ this.sectionSubDivision = subDivision;
+ this.sectionsNum = Math.floor(this.duration / this.fullSectionDuration);
+ break;
+ }
+ }
+ },
+
+ getUnitDuration: function() {
+ return this.sectionSubDivision;
+ },
+
+ resize: function() {
+ var pointerVisible = this.pointer && this.pointer.isVisible();
+ this._computeLayout();
+ this.draw();
+ if (pointerVisible) {
+ this.setPosition(this.cfg.soundProvider.getPosition());
+ this.setBuffering(this.cfg.soundProvider.isBuffering() && this.cfg.soundProvider.isPlaying());
+ this.pointer.show();
+ }
+ },
+
+ _setDuration: function(duration) {
+ this.duration = duration;
+ this._computeLayout();
+ },
+
+ setDuration: function(duration) {
+ if (duration == 0)
+ duration = 60;
+ if (this.duration != duration) {
+ this._setDuration(duration);
+ this.draw();
+ }
+ },
+
+ _createSection: function(timeOffset, pixelWidth) {
+ var section = $J('<div/>')
+ .addClass($N.cssPrefix + 'section')
+ .css({
+ fontSize: this.cfg.fontSize + 'px',
+ fontFamily: 'monospace',
+ width: pixelWidth,
+ overflow: 'hidden'
+ })
+ .append($J('<div />').addClass($N.cssPrefix + 'canvas'));
+
+ var topDiv = $J('<div/>')
+ .addClass($N.cssPrefix + 'label')
+ .appendTo(section);
+ var bottomDiv = $J('<div/>')
+ .addClass($N.cssPrefix + 'lines')
+ .appendTo(section);
+ var empty = $J('<span/>').css({visibility: 'hidden'}).text(' ');
+ if (pixelWidth > this.timeLabelWidth) {
+ var text = $J('<span/>')
+ .text($N.Util.makeTimeLabel(timeOffset))
+ .bind('mousedown selectstart', function() {return false;});
+ } else {
+ var text = empty.clone();
+ }
+ topDiv.append(text);
+ bottomDiv.append(empty);
+ return section;
+ },
+
+ _drawSectionRuler: function(section, drawFirstMark) {
+ var j;
+ var jg = new jsGraphics(section.find('.' + $N.cssPrefix + 'canvas').get(0));
+ jg.setColor(this.layout.find('.' + $N.cssPrefix + 'lines').css('color'));
+ var height = section.height();
+ var ypos;
+ for (j = 0; j < section.duration; j += this.sectionSubDivision) {
+ if (j == 0) {
+ if (drawFirstMark) {
+ ypos = 0;
+ } else {
+ continue;
+ }
+ } else {
+ ypos = (j == section.duration / 2) ? 1/2 + 1/8 : 3/4;
+ }
+ var x = j / this.duration * this.width;
+ jg.drawLine(x, height * ypos, x, height - 1);
+ }
+ jg.paint();
+ },
+
+ getHeight: function() {
+ return this.container.find('' + $N.cssPrefix + '.section').height();
+ },
+
+ draw: function() {
+ if (!this.duration) {
+ this.debug("Can't draw ruler with a duration of 0");
+ return;
+ }
+ this.debug("draw ruler, duration: " + this.duration);
+ if (this.layout)
+ this.layout.remove();
+ this.layout = $J('<div/>')
+ .addClass($N.cssPrefix + 'layout')
+ .css({position: 'relative'}) // bugs on IE when resizing
+ .bind('dblclick', this.attachWithEvent(this._onDoubleClick))
+ //.bind('resize', this.attachWithEvent(this.resize)) // Can loop ?
+ .appendTo(this.container);
+
+ //this.container.html(this.layout);
+
+ var sections = new Array();
+ var currentWidth = 0;
+ var i;
+ for (i = 0; i <= this.sectionsNum; i++) {
+ if (i < this.sectionsNum) {
+ var duration = this.fullSectionDuration;
+ var width = Math.floor(duration / this.duration * this.width);
+ } else {
+ var duration = this.duration - i * this.fullSectionDuration;
+ var width = this.width - currentWidth;
+
+ }
+ var section = this._createSection(i * this.fullSectionDuration, width);
+ if (i > 0) {
+ section.css({left: currentWidth, top: 0, position: 'absolute'});
+ }
+ section.duration = duration;
+ this.layout.append(section);
+ currentWidth += section.width();
+ sections[i] = section;
+ }
+
+ for (i = 0; i <= this.sectionsNum; i++) {
+ this._drawSectionRuler(sections[i], (i > 0));
+ }
+
+ this._createPointer();
+ this._drawMarkers();
+ },
+
+ _createPointer: function() {
+ if (this.pointer) {
+ this.pointer.clear();
+ }
+ this.pointer = new $N.Marker({
+ rulerLayout: this.layout.get(0),
+ viewer: this.waveContainer,
+ fontSize: this.cfg.fontSize,
+ zIndex: 1000,
+ className: 'pointer',
+ tooltip: 'Move head'
+ });
+ this.pointer
+ .setText($N.Util.makeTimeLabel(0))
+ .observe('move', this.attach(this._onPointerMove));
+ },
+
+ _drawMarkers: function() {
+ if (this.cfg.map) {
+ $J(this.markers).each(function(i, m) {m.clear();});
+ this.markers = new Array();
+ this.cfg.map.each(this.attach(function(i, m) {
+ this.markers.push(this._drawMarker(m, i));
+ }));
+ }
+ },
+
+ _movePointer: function(offset) {
+ if (offset < 0)
+ offset = 0;
+ else if (offset > this.duration)
+ offset = this.duration;
+
+ pixelOffset = offset / this.duration * this.width;
+ if (this.pointer) {
+ this.pointer.move(pixelOffset);
+ this.pointer.setText($N.Util.makeTimeLabel(offset));
+ }
+ this.pointerPos = offset;
+ },
+
+ _setPosition: function(offset) {
+ this._movePointer(offset);
+ if (this.pointer) {
+ this.pointer.show();
+ }
+ },
+
+ setPosition: function(offset) {
+ if (!this.mouseDown) {
+ this._setPosition(offset);
+ }
+ },
+
+ shiftPosition: function(delta) {
+ this.setPosition(this.pointerPos + delta);
+ },
+
+ hidePointer: function() {
+ if (this.pointer)
+ this.pointer.hide();
+ },
+
+ setBuffering: function(state) {
+ if (this.pointer) {
+ this.pointer.blink(state);
+ }
+ },
+/*
+ _onClick: function(evt) {
+ var offset = (evt.pageX - this.container.offset().left)
+ / this.width * this.duration;
+ this._setPosition(offset);
+ this.fire('move', {offset: offset});
+ },
+*/
+ _onMouseDown: function(evt) {
+ this.mouseDown = true;
+ this._onMouseMove(evt);
+ evt.preventDefault();
+ },
+
+ _onPointerMove: function(evt, data) {
+ this.mouseDown = true;
+ this._setPosition(data.offset / this.width * this.duration);
+ if(data.finish) {
+ this.fire('move', {offset: this.pointerPos});
+ this.mouseDown = false;
+ }
+ return false;
+ },
+
+ _onMouseMove: function(evt) {
+ if (this.mouseDown) {
+ var pixelOffset = evt.pageX - this.container.offset().left;
+ this._setPosition(pixelOffset / this.width * this.duration);
+ return false;
+ }
+ },
+
+ _onMouseUp: function(evt) {
+ if (this.mouseDown) {
+ this.mouseDown = false;
+ this.fire('move', {offset: this.pointerPos});
+ return false;
+ }
+ },
+
+ _observeMouseEvents: function(element) {
+ element
+ .bind('click dragstart', function() {return false;})
+ .bind('mousedown', this.attachWithEvent(this._onMouseDown))
+ .bind('mousemove', this.attachWithEvent(this._onMouseMove))
+ .bind('mouseup', this.attachWithEvent(this._onMouseUp));
+ $J(document)
+ .bind('mousemove', this.attachWithEvent(this._onMouseMove));
+ },
+
+ _drawMarker: function(marker, index) {
+ if (marker.offset < 0)
+ marker.offset = 0;
+ else if (marker.offset > this.duration)
+ marker.offset = this.duration;
+
+ pixelOffset = marker.offset / this.duration * this.width;
+
+ m = new $N.Marker({
+ rulerLayout: this.layout.get(0),
+ viewer: this.waveContainer,
+ fontSize: this.cfg.fontSize,
+ className: 'marker',
+ id: marker.id,
+ tooltip: 'Move marker'
+ });
+ m.observe('move', this.attach(this._onMarkerMove))
+ .setText(index + 1)
+ .move(pixelOffset)
+ .show();
+ return m;
+ },
+
+ _onMarkerMove: function(e, data) {
+ if (data.finish) {
+ var offset = data.offset / this.width * this.duration;
+ this.fire('markermove', {id: data.id, offset: offset});
+ }
+ },
+
+ _onMapAdd: function(e, data) {
+ this.markers.push(this._drawMarker(data.marker, data.index));
+ },
+
+
+ _onMapRemove: function(e, data) {
+ $J(this.markers).each(this.attach(function(i, m) {
+ if (m.id == data.marker.id) {
+ m.clear();
+ this.markers.splice(i, 1);
+ }
+ }));
+ },
+
+ _onMapIndexChange: function(e, data) {
+ $J(this.markers).each(this.attach(function(i, m) {
+ if (m.id == data.marker.id) {
+ m.setText(data.index + 1);
+ return false;
+ }
+ }));
+ },
+
+ _onDoubleClick: function(evt) {
+ if (this.cfg.map) {
+ var offset = (evt.pageX - this.container.offset().left)
+ / this.width * this.duration;
+ this.fire('markeradd', {offset: offset});
+ }
+ },
+
+ _onSoundProviderUpdate: function(e) {
+ this.setDuration(this.cfg.soundProvider.getDuration());
+ this.setPosition(this.cfg.soundProvider.getPosition());
+ this.setBuffering(this.cfg.soundProvider.isBuffering() && this.cfg.soundProvider.isPlaying());
+ }
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N) {
+
+$N.Class.create("SoundProvider", $N.Core, {
+ sound: null,
+ timer: null,
+ buggyPosition: null,
+ isDurationForced: false,
+ state: {
+ position: null,
+ duration: null,
+ playing: false,
+ buffering: false
+ },
+ lastState: null,
+
+ initialize: function($super, cfg) {
+ $super();
+ this.configure(cfg, {
+ source: null,
+ duration: null
+ });
+ this.sound = this.cfg.source;
+ if (this.cfg.duration) {
+ this.forceDuration(this.cfg.duration);
+ }
+ this.state.position = 0;
+ this.update = this.attach(this._update);
+ this.timer = setInterval(this.update, 43);
+ },
+
+ free: function($super) {
+ this.sound = null;
+ $super();
+ },
+
+ play: function() {
+ if (this.sound) {
+ if (!this.sound.playState) {
+ this.sound.play();
+ } else if (this.sound.paused) {
+ this.sound.resume();
+ }
+ }
+ return this;
+ },
+
+ pause: function() {
+ if (this.sound)
+ this.sound.pause();
+ return this;
+ },
+
+ seek: function(offset) {
+ if (this.sound) {
+ this.sound.setPosition(offset * 1000);
+ if (!this.state.playing) {
+ this.buggyPosition = this.sound.position / 1000;
+ this.state.position = offset;
+ }
+ }
+ return this;
+ },
+
+ isPlaying: function() {
+ return this.state.playing;
+ },
+
+ getPosition: function() {
+ if (this.state.position == null)
+ this._retrieveState();
+ return this.state.position;
+ },
+
+ getDuration: function() {
+ if (this.state.duration == null)
+ this._retrieveState();
+ return this.state.duration;
+ },
+
+ forceDuration: function(duration) {
+ this.state.duration = duration;
+ this.isDurationForced = true;
+ },
+
+ isBuffering: function() {
+ return this.state.buffering;
+ },
+
+ _retrieveState: function() {
+ if (this.sound) {
+ this.state.playing = (this.sound.playState && !this.sound.paused);
+ if (this.state.playing) {
+ var position = this.sound.position / 1000;
+ if (position != this.buggyPosition) {
+ this.state.position = position;
+ this.buggyPosition = null;
+ }
+ }
+ if (!this.isDurationForced) {
+ if (this.sound.readyState == 1) {
+ this.state.duration = this.sound.durationEstimate / 1000;
+ } else {
+ this.state.duration = this.sound.duration / 1000;
+ }
+ }
+ this.state.buffering = (this.sound.readyState == 1 && this.state.position > this.sound.duration / 1000);
+ }
+ },
+
+ _update: function() {
+ this._retrieveState();
+ var updated = false;
+ if (this.lastState) {
+ for (k in this.state) {
+ if (this.state[k] != this.lastState[k]) {
+ updated = true;
+ break;
+ }
+ }
+ } else {
+ this.lastState = {};
+ updated = true;
+ }
+ if (updated) {
+ for (k in this.state) {
+ this.lastState[k] = this.state[k];
+ }
+ this.fire('update');
+ }
+ },
+
+ setSource: function(source) {
+ this.debug("setting source");
+ this.sound = source;
+ return this;
+ }
+
+});
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+var TimeSide = function() {
+ if (arguments[0]) {
+ var toolkit = null;
+ if (typeof jQuery != 'undefined')
+ toolkit = jQuery;
+ (arguments[0])(TimeSide, toolkit)
+ }
+};
+
+TimeSide(function($N, $J) {
+
+$N.isDomLoaded = false;
+$N.isLoaded = false;
+$N.isLoading = false;
+$N.onLoadCallbacks = [];
+$N.cssPrefix = 'ts-';
+$N.debugging = false;
+
+$J(document).ready(function () {
+ $N.isDomLoaded = true;
+});
+
+$N.domReady = function(callback) {
+ // simply calling jQuery.ready() *after* the DOM is loaded doesn't work reliably,
+ // at least with jQuery 1.2.6
+ if ($N.isDomLoaded)
+ callback();
+ else
+ $J(document).ready(callback);
+}
+
+$N.instances = [];
+$N.registerInstance = function(obj) {
+ $N.instances.push(obj);
+}
+
+$N.free = function() {
+ $J($N.instances).each(function(i, obj) {
+ obj.free();
+ });
+}
+
+$J(window).unload($N.free);
+
+$N.loadScriptsNum = 0;
+$N.loadScriptsCallback = null;
+$N.loadScripts = function(root, scripts, callback) {
+ if ($N.loadScriptsCallback) {
+ throw "Timeside loader error: concurrent script loading";
+ }
+
+ $N.loadScriptsNum = scripts.length;
+ $N.loadScriptsCallback = callback;
+
+ var head= document.getElementsByTagName('head')[0];
+ for (i = 0; i < scripts.length; i++) {
+
+ var script = document.createElement('script');
+ script.type = 'text/javascript';
+ var debug = $N.debugging ? '?rand=' + Math.random() : '';
+ script.src = root + scripts[i] + debug;
+ head.appendChild(script);
+ }
+}
+
+$N.notifyScriptLoad = function() {
+ if (--$N.loadScriptsNum == 0 && $N.loadScriptsCallback) {
+ var callback = $N.loadScriptsCallback;
+ $N.loadScriptsCallback = null;
+ callback();
+ }
+}
+
+$N.debug = function(state) {
+ $N.debugging = state;
+}
+
+$N.load = function(callback) {
+ $N.domReady(function() {
+ if ($N.isLoaded) {
+ if (callback)
+ callback();
+ } else {
+ if (callback)
+ $N.onLoadCallbacks.push(callback);
+
+ if (!$N.isLoading) {
+ $N.isLoading = true;
+ var re = /(.*)timeside.js/;
+ var root = '';
+ $J('head script').each(function(i, e) {
+ if (match = re.exec(e.src)) {
+ root = match[1];
+ }
+ });
+
+ $N.loadScripts(root, ['core.js'], function() {
+ $N.loadScripts(root, ['util.js'], function() {
+ var scripts = ['controller.js', 'marker.js', 'markerlist.js',
+ 'markermap.js', 'player.js', 'ruler.js',
+ 'soundprovider.js'];
+
+ $N.loadScripts(root, scripts, function() {
+ $N.isLoaded = true;
+ $N.isLoading = false;
+ $J($N.onLoadCallbacks).each(function(i, callback) {
+ callback();
+ });
+ });
+ });
+ });
+ }
+ }
+ });
+}
+
+});
--- /dev/null
+/**
+ * TimeSide - Web Audio Components
+ * Copyright (c) 2008-2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: GNU General Public License version 2.0
+ */
+
+TimeSide(function($N, $J) {
+
+$N.Util = {
+ _loadChild: function(container, tag, className, index, contents) {
+ var p = $N.cssPrefix;
+ var element = container.find('.' + p + className);
+ if (!element.length) {
+ element = $J(document.createElement(tag)).addClass(p + className);
+ if (contents[className]) {
+ element.text(contents[className]);
+ }
+ var children = container.children();
+ if (index < children.length) {
+ children.eq(index).before(element);
+ } else {
+ container.append(element);
+ }
+ }
+ return element;
+ },
+
+ _loadUI: function(container, skeleton, contents) {
+ var i = 0;
+ var elements = {};
+ with ($N.Util) {
+ if (skeleton[0]) {
+ $J(skeleton).each((function(i, selector) {
+ var s = selector.split('.');
+ elements[$N.Util.camelize(s[1])] = _loadChild(container, s[0], s[1], i++, contents);
+ }));
+ } else {
+ for (key in skeleton) {
+ var s = key.split('.');
+ var e = _loadChild(container, s[0], s[1], i++, contents);
+ elements[$N.Util.camelize(s[1])] = e;
+ $N.extend(elements, _loadUI(e, skeleton[key], contents));
+
+ }
+ }
+ }
+ return elements;
+ },
+
+ loadUI: function(container, skeleton, contents) {
+ return $N.Util._loadUI($J(container), skeleton, contents);
+ },
+
+ makeTimeLabel: function(offset) {
+ var minutes = Math.floor(offset / 60);
+ if (minutes < 10)
+ minutes = '0' + minutes;
+ var seconds = Math.floor(offset % 60);
+ if (seconds < 10)
+ seconds = '0' + seconds;
+ return minutes + ':' + seconds;
+ },
+
+ camelize: function(str) {
+ var parts = str.split('-'), len = parts.length;
+ if (len == 1) return parts[0];
+
+ var camelized = str.charAt(0) == '-'
+ ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+ : parts[0];
+
+ for (var i = 1; i < len; i++)
+ camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+ return camelized;
+ }
+
+}
+
+$N.notifyScriptLoad();
+
+});
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007 Samalyse SARL
+#
+# Copyright (c) 2007-2009 Guillaume Pellerin <yomguy@parisson.com>
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+#
+# Author: Olivier Guilyardi <olivier@samalyse.com>
+
+from django.conf.urls.defaults import *
+from telemeta.models import MediaItem, MediaCollection
+from telemeta.web.base import WebView
+import os.path
+import telemeta.config
+
+telemeta.config.check()
+
+# initialization
+web_view = WebView()
+
+# query sets for Django generic views
+all_items = { 'queryset': MediaItem.objects.enriched(), }
+all_collections = { 'queryset': MediaCollection.objects.enriched(), }
+
+# ID's regular expressions
+export_extensions = "|".join(web_view.list_export_extensions())
+
+htdocs = os.path.dirname(__file__) + '/htdocs'
+
+urlpatterns = patterns('',
+ url(r'^$', web_view.index, name="telemeta-home"),
+
+ # items
+ url(r'^items/$', 'django.views.generic.list_detail.object_list',
+ dict(all_items, paginate_by=20, template_name="telemeta/mediaitem_list.html"),
+ name="telemeta-items"),
+ url(r'^items/(?P<public_id>[A-Z0-9_]+)/$', web_view.item_detail,
+ name="telemeta-item-detail"),
+ url(r'^items/(?P<public_id>[A-Z0-9_]+)/dc/$', web_view.item_detail,
+ {'template': 'telemeta/mediaitem_detail_dc.html'},
+ name="telemeta-item-dublincore"),
+ url(r'^items/(?P<public_id>[A-Z0-9_]+)/dc/xml/$', web_view.item_detail,
+ {'format': 'dublin_core_xml'},
+ name="telemeta-item-dublincore-xml"),
+ url(r'^items/download/(?P<public_id>[A-Z0-9_]+)\.(?P<extension>'
+ + export_extensions + ')$',
+ web_view.item_export,
+ name="telemeta-item-export"),
+ url(r'^items/(?P<public_id>[A-Z0-9_]+)/visualize/(?P<visualizer_id>[0-9a-z_]+)/(?P<width>[0-9A-Z]+)x(?P<height>[0-9A-Z]+)/$',
+ web_view.item_visualize,
+ name="telemeta-item-visualize"),
+ url(r'^items/(?P<public_id>[A-Z0-9_]+)/analyze/(?P<analyzer_id>[0-9a-z_]+)/$',
+ web_view.item_analyze,
+ name="telemeta-item-analyze"),
+ url(r'^items/(?P<public_id>[A-Z0-9_]+)/item_xspf.xml$',
+ web_view.item_playlist,
+ dict(template="telemeta/mediaitem_xspf.xml", mimetype="application/xspf+xml"),
+ name="telemeta-item-xspf"),
+
+ # collections
+ url(r'^collections/$', 'django.views.generic.list_detail.object_list',
+ dict(all_collections, paginate_by=20,
+ template_name="telemeta/collection_list.html"),
+ name="telemeta-collections"),
+ url(r'^collections/?page=(?P<page>[0-9]+)$',
+ 'django.views.generic.list_detail.object_list',
+ dict(all_collections, paginate_by=20)),
+ url(r'^collections/(?P<public_id>[A-Z0-9_]+)/$', web_view.collection_detail,
+ dict(template="telemeta/collection_detail.html"), name="telemeta-collection-detail"),
+ url(r'^collections/(?P<public_id>[A-Z0-9_]+)/dc/$', web_view.collection_detail,
+ dict(template="telemeta/collection_detail_dc.html"), name="telemeta-collection-dublincore"),
+ url(r'^collections/(?P<public_id>[A-Z0-9_]+)/collection_xspf.xml$',
+ web_view.collection_playlist,
+ dict(template="telemeta/collection_xspf.xml", mimetype="application/xspf+xml"),
+ name="telemeta-collection-xspf"),
+ url(r'^collections/(?P<public_id>[A-Z0-9_]+)/collection.m3u$',
+ web_view.collection_playlist,
+ dict(template="telemeta/collection.m3u", mimetype="audio/mpegurl"),
+ name="telemeta-collection-m3u"),
+
+ # search
+ url(r'^search/$', web_view.search, name="telemeta-search"),
+ url(r'^search/collections/$', web_view.search, {'type': 'collections'},
+ name="telemeta-search-collections"),
+ url(r'^search/items/$', web_view.search, {'type': 'items'},
+ name="telemeta-search-items"),
+ url(r'^search/criteria/$', web_view.edit_search, name="telemeta-search-criteria"),
+ url(r'^complete_location/$', web_view.complete_location, name="telemeta-complete-location"),
+
+ # administration
+ url(r'^admin/$', web_view.admin_index, name="telemeta-admin"),
+
+ # enumerations administration
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/$',
+ web_view.edit_enumeration ,
+ name="telemeta-enumeration-edit"),
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/add/$',
+ web_view.add_to_enumeration,
+ name="telemeta-enumeration-add"),
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/update/$',
+ web_view.update_enumeration,
+ name="telemeta-enumeration-update"),
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/'
+ + r'(?P<value_id>[0-9]+)/$',
+ web_view.edit_enumeration_value,
+ name="telemeta-enumeration-record-edit"),
+ url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/'
+ + r'(?P<value_id>[0-9]+)/update/$',
+ web_view.update_enumeration_value,
+ name="telemeta-enumeration-record-update"),
+
+ # Geographic browsing
+ url(r'^geo/$', web_view.list_continents, name="telemeta-geo-continents"),
+ url(r'^geo/(?P<continent>[a-z_]+)/$', web_view.list_countries,
+ name="telemeta-geo-countries"),
+ url(r'^geo/collections/(?P<continent>[a-z_]+)/(?P<country>[a-z_]+)/$',
+ web_view.list_country_collections,
+ name="telemeta-geo-country-collections"),
+ url(r'^geo/items/(?P<continent>[a-z_]+)/(?P<country>[a-z_]+)/$',
+ web_view.list_country_items,
+ name="telemeta-geo-country-items"),
+ url(r'^geo/country_info/(?P<id>[0-9A-Z]+)/$',
+ web_view.country_info, name="telemeta-country-info"),
+
+ # CSS+Images (FIXME: for developement only)
+ url(r'^css/(?P<path>.*)$', 'django.views.static.serve',
+ {'document_root': htdocs+'/css'},
+ name="telemeta-css"),
+ url(r'^images/(?P<path>.*)$', 'django.views.static.serve',
+ {'document_root': htdocs+'/images'},
+ name="telemeta-images"),
+ url(r'^js/(?P<path>.*)$', 'django.views.static.serve',
+ {'document_root': htdocs+'/js'},
+ name="telemeta-js"),
+ url(r'^swf/(?P<path>.*)$', 'django.views.static.serve',
+ {'document_root': htdocs+'/swf'},
+ name="telemeta-swf"),
+ url(r'^timeside/(?P<path>.*)$', 'django.views.static.serve',
+ {'document_root': htdocs+'/timeside'},
+ name="telemeta-timeside"),
+
+ # Flat pages
+ url(r'^page/(?P<path>.*)$', web_view.render_flatpage, name="telemeta-flatpage"),
+
+ # OAI-PMH Data Provider
+ url(r'^oai/.*$', web_view.handle_oai_request, name="telemeta-oai"),
+
+ # Authentication
+ url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'telemeta/login.html'},
+ name="telemeta-login"),
+ url(r'^logout/$', web_view.logout, name="telemeta-logout"),
+)
--- /dev/null
+from telemeta.util import *
--- /dev/null
+
+import logging
+
+class Logger:
+ """A logging object"""
+
+ def __init__(self, file):
+ self.logger = logging.getLogger('myapp')
+ self.hdlr = logging.FileHandler(file)
+ self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
+ self.hdlr.setFormatter(self.formatter)
+ self.logger.addHandler(self.hdlr)
+ self.logger.setLevel(logging.INFO)
+
+ def write_info(self, message):
+ self.logger.info(message)
+
+ def write_error(self, message):
+ self.logger.error(message)
+
+ def debug(self, msg):
+ self.logger.error(message)
+
--- /dev/null
+# This file by Fredrik Lundh from:
+# http://effbot.org/zone/unicode-convert.htm
+# http://effbot.python-hosting.com/file/stuff/sandbox/text/unaccent.py
+
+# use a dynamically populated translation dictionary to remove accents
+# from a string
+
+import unicodedata, sys
+
+CHAR_REPLACEMENT = {
+ # latin-1 characters that don't have a unicode decomposition
+ 0xc6: u"AE", # LATIN CAPITAL LETTER AE
+ 0xd0: u"D", # LATIN CAPITAL LETTER ETH
+ 0xd8: u"OE", # LATIN CAPITAL LETTER O WITH STROKE
+ 0xde: u"Th", # LATIN CAPITAL LETTER THORN
+ 0xdf: u"ss", # LATIN SMALL LETTER SHARP S
+ 0xe6: u"ae", # LATIN SMALL LETTER AE
+ 0xf0: u"d", # LATIN SMALL LETTER ETH
+ 0xf8: u"oe", # LATIN SMALL LETTER O WITH STROKE
+ 0xfe: u"th", # LATIN SMALL LETTER THORN
+ }
+
+##
+# Translation dictionary. Translation entries are added to this
+# dictionary as needed.
+
+class UnaccentedMap(dict):
+
+ ##
+ # Maps a unicode character code (the key) to a replacement code
+ # (either a character code or a unicode string).
+
+ def mapchar(self, key):
+ ch = self.get(key)
+ if ch is not None:
+ return ch
+ de = unicodedata.decomposition(unichr(key))
+ if de:
+ try:
+ ch = int(de.split(None, 1)[0], 16)
+ except (IndexError, ValueError):
+ ch = key
+ else:
+ ch = CHAR_REPLACEMENT.get(key, key)
+ self[key] = ch
+ return ch
+
+ if sys.version >= "2.5":
+ # use __missing__ where available
+ __missing__ = mapchar
+ else:
+ # otherwise, use standard __getitem__ hook (this is slower,
+ # since it's called for each character)
+ __getitem__ = mapchar
+
+
+_map = UnaccentedMap()
+
+def unaccent(str):
+ return str.translate(_map)
+
+def unaccent_icmp(str1, str2):
+ str1 = unaccent(str1).lower()
+ str2 = unaccent(str2).lower()
+ if str1 > str2:
+ return 1
+
+ if str1 < str2:
+ return -1
+
+ return 0
--- /dev/null
+#import telemeta.web.base
+#import telemeta.web.pages
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007 Samalyse SARL
+
+# This software is a computer program whose purpose is to backup, analyse,
+# transcode and stream any audio content with its metadata over a web frontend.
+
+# This software is governed by the CeCILL license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# "http://www.cecill.info".
+
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+
+# In this respect, the user's attention is drawn to the risks associated
+# with loading, using, modifying and/or developing or reproducing the
+# software by the user in light of its specific status of free software,
+# that may mean that it is complicated to manipulate, and that also
+# therefore means that it is reserved for developers and experienced
+# professionals having in-depth computer knowledge. Users are therefore
+# encouraged to load and test the software's suitability as regards their
+# requirements in conditions enabling the security of their systems and/or
+# data to be ensured and, more generally, to use and operate it in the
+# same conditions as regards security.
+
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL license and that you accept its terms.
+
+# Author: Olivier Guilyardi <olivier@samalyse.com>
+
+import re
+import os
+import sys
+import datetime
+import timeside
+
+from django.template import RequestContext, loader
+from django import template
+from django.http import HttpResponse
+from django.http import Http404
+from django.shortcuts import render_to_response, redirect
+from django.views.generic import list_detail
+from django.conf import settings
+from django.contrib import auth
+from django.contrib.auth.decorators import login_required
+
+from telemeta.models import MediaItem, Location, MediaCollection, EthnicGroup
+from telemeta.models import dublincore, Enumeration
+import telemeta.interop.oai as oai
+from telemeta.interop.oaidatasource import TelemetaOAIDataSource
+from django.core.exceptions import ObjectDoesNotExist
+from telemeta.util.unaccent import unaccent
+from telemeta.util.unaccent import unaccent_icmp
+from telemeta.util.logger import Logger
+import telemeta.web.pages as pages
+
+def render(request, template, data = None, mimetype = None):
+ return render_to_response(template, data, context_instance=RequestContext(request),
+ mimetype=mimetype)
+
+def stream_from_file(file):
+ chunk_size = 0x1000
+ f = open(file, 'r')
+ while True:
+ _chunk = f.read(chunk_size)
+ if not len(_chunk):
+ break
+ yield _chunk
+ f.close()
+
+def stream_from_processor(decoder, processor):
+ while True:
+ frames, eod = decoder.process()
+ buffer, eod_proc = processor.process(frames, eod)
+ yield buffer
+ if eod_proc:
+ break
+
+
+class WebView:
+ """Provide web UI methods"""
+
+ graphers = timeside.core.processors(timeside.api.IGrapher)
+ decoders = timeside.core.processors(timeside.api.IDecoder)
+ encoders= timeside.core.processors(timeside.api.IEncoder)
+ analyzers = timeside.core.processors(timeside.api.IAnalyzer)
+ logger = Logger('/tmp/telemeta.log')
+
+ def index(self, request):
+ """Render the homepage"""
+
+ template = loader.get_template('telemeta/index.html')
+ ids = [id for id in MediaItem.objects.all().values_list('id', flat=True).order_by('?')[0:4]]
+ items = MediaItem.objects.enriched().filter(pk__in=ids)
+
+ context = RequestContext(request, {
+ 'page_content': pages.get_page_content(request, 'parts/home', ignore_slash_issue=True),
+ 'items': items})
+ return HttpResponse(template.render(context))
+
+ def collection_detail(self, request, public_id, template=''):
+ collection = MediaCollection.objects.get(public_id=public_id)
+ return render(request, template, {'collection': collection})
+
+
+ def item_detail(self, request, public_id, template='telemeta/mediaitem_detail.html'):
+ """Show the details of a given item"""
+ item = MediaItem.objects.get(public_id=public_id)
+
+ formats = []
+ for encoder in self.encoders:
+ formats.append({'name': encoder.format(), 'extension': encoder.file_extension()})
+
+ graphers = []
+ for grapher in self.graphers:
+ graphers.append({'name':grapher.name(), 'id': grapher.id()})
+ if request.REQUEST.has_key('grapher_id'):
+ grapher_id = request.REQUEST['grapher_id']
+ else:
+ grapher_id = 'waveform'
+
+ analyzers = [{'name':'','id':'','unit':'','value':''}]
+ # TODO: override timeside analyzer process when caching : write results to XML file in data/
+ self.analyzer_mode = 1
+
+ if self.analyzer_mode:
+ analyzers_sub = []
+ if item.file:
+ audio = os.path.join(os.path.dirname(__file__), item.file.path)
+ decoder = timeside.decoder.FileDecoder(audio)
+ self.pipe = decoder
+ for analyzer in self.analyzers:
+ subpipe = analyzer()
+ analyzers_sub.append(subpipe)
+ self.pipe = self.pipe | subpipe
+ self.pipe.run()
+
+ for analyzer in analyzers_sub:
+ if item.file:
+ value = analyzer.result()
+ if analyzer.id() == 'duration':
+ approx_value = int(round(value))
+ item.approx_duration = approx_value
+ item.save()
+ value = datetime.timedelta(0,value)
+ else:
+ value = 'N/A'
+
+ analyzers.append({'name':analyzer.name(),
+ 'id':analyzer.id(),
+ 'unit':analyzer.unit(),
+ 'value':str(value)})
+
+ return render(request, template,
+ {'item': item, 'export_formats': formats,
+ 'visualizers': graphers, 'visualizer_id': grapher_id,'analysers': analyzers,
+ 'audio_export_enabled': getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', False)
+ })
+
+ def item_analyze(self, request, public_id):
+ # TODO: return an XML stream of the analyzed metadata
+ # response = HttpResponse(stream_from_file(media), mimetype = mime_type)
+ # return response
+ pass
+
+ def item_visualize(self, request, public_id, visualizer_id, width, height):
+ mime_type = 'image/png'
+ grapher_id = visualizer_id
+ for grapher in self.graphers:
+ if grapher.id() == grapher_id:
+ break
+
+ if grapher.id() != grapher_id:
+ raise Http404
+
+ media = settings.TELEMETA_DATA_CACHE_DIR + \
+ os.sep + '_'.join([public_id, grapher_id, width, height]) + '.png'
+
+ #graph.set_colors((255,255,255), 'purple')
+
+ if not os.path.exists(media):
+ item = MediaItem.objects.get(public_id=public_id)
+ audio = os.path.join(os.path.dirname(__file__), item.file.path)
+ decoder = timeside.decoder.FileDecoder(audio)
+ graph = grapher(width=int(width), height=int(height))
+ pipe = decoder | graph
+ pipe.run()
+ graph.render(media)
+
+ response = HttpResponse(stream_from_file(media), mimetype = mime_type)
+ return response
+
+ def list_export_extensions(self):
+ "Return the recognized item export file extensions, as a list"
+ list = []
+ for encoder in self.encoders:
+ list.append(encoder.file_extension())
+ return list
+
+ def item_export(self, request, public_id, extension):
+ """Export a given media item in the specified format (OGG, FLAC, ...)"""
+
+ if extension != 'mp3' and not getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', False):
+ raise Http404 # FIXME: should be some sort of permissions denied error
+
+ for encoder in self.encoders:
+ if encoder.file_extension() == extension:
+ break
+
+ if encoder.file_extension() != extension:
+ raise Http404('Unknown export file extension: %s' % extension)
+
+ mime_type = encoder.mime_type()
+ cache_dir = settings.TELEMETA_EXPORT_CACHE_DIR
+ media = cache_dir + os.sep + public_id + '.' + encoder.file_extension()
+
+ item = MediaItem.objects.get(public_id=public_id)
+ audio = os.path.join(os.path.dirname(__file__), item.file.path)
+ decoder = timeside.decoder.FileDecoder(audio)
+# print decoder.format(), mime_type
+ if decoder.format() == mime_type:
+ # source > stream
+ response = HttpResponse(stream_from_file(audio), mimetype = mime_type)
+ else:
+ if not os.path.exists(media):
+ # source > encoder > stream
+ decoder.setup()
+ proc = encoder(media)
+ proc.setup(decoder.channels(), decoder.samplerate())
+ #metadata = dublincore.express_item(item).to_list()
+ #enc.set_metadata(metadata)
+ response = HttpResponse(stream_from_processor(decoder, proc), mimetype = mime_type)
+ else:
+ response = HttpResponse(stream_from_file(media), mimetype = mime_type)
+
+ response['Content-Disposition'] = 'attachment'
+ return response
+
+ def edit_search(self, request, criteria=None):
+ year_min, year_max = MediaCollection.objects.all().recording_year_range()
+ rec_years = year_min and year_max and range(year_min, year_max + 1) or []
+ year_min, year_max = MediaCollection.objects.all().publishing_year_range()
+ pub_years = year_min and year_max and range(year_min, year_max + 1) or []
+ return render(request, 'telemeta/search_criteria.html', {
+ 'rec_years': rec_years,
+ 'pub_years': pub_years,
+ 'ethnic_groups': MediaItem.objects.all().ethnic_groups(),
+ 'criteria': criteria
+ })
+
+ def complete_location(self, request, with_items=True):
+ input = request.REQUEST
+
+ token = input['q']
+ limit = int(input['limit'])
+ if with_items:
+ locations = MediaItem.objects.all().locations()
+ else:
+ locations = Location.objects.all()
+
+ locations = locations.filter(name__istartswith=token).order_by('name')[:limit]
+ data = [unicode(l) + " (%d items)" % l.items().count() for l in locations]
+
+ return HttpResponse("\n".join(data))
+
+ def search(self, request, type = None):
+ """Perform a search through collections and items metadata"""
+ collections = MediaCollection.objects.enriched()
+ items = MediaItem.objects.enriched()
+ input = request.REQUEST
+ criteria = {}
+
+ switch = {
+ 'pattern': lambda value: (
+ collections.quick_search(value),
+ items.quick_search(value)),
+ 'title': lambda value: (
+ collections.word_search('title', value),
+ items.by_title(value)),
+ 'location': lambda value: (
+ collections.by_location(Location.objects.get(name=value)),
+ items.by_location(Location.objects.get(name=value))),
+ 'continent': lambda value: (
+ collections.by_continent(value),
+ items.filter(continent = value)),
+ 'ethnic_group': lambda value: (
+ collections.by_ethnic_group(value),
+ items.filter(ethnic_group = value),
+ EthnicGroup.objects.get(pk=value)),
+ 'creator': lambda value: (
+ collections.word_search('creator', value),
+ items.word_search('collection__creator', value)),
+ 'collector': lambda value: (
+ collections.by_fuzzy_collector(value),
+ items.by_fuzzy_collector(value)),
+ 'rec_year_from': lambda value: (
+ collections.by_recording_year(int(value), int(input.get('rec_year_to', value))),
+ items.by_recording_date(datetime.date(int(value), 1, 1),
+ datetime.date(int(input.get('rec_year_to', value)), 12, 31))),
+ 'rec_year_to': lambda value: (collections, items),
+ 'pub_year_from': lambda value: (
+ collections.by_publish_year(int(value), int(input.get('pub_year_to', value))),
+ items.by_publish_year(int(value), int(input.get('pub_year_to', value)))),
+ 'pub_year_to': lambda value: (collections, items),
+ }
+
+ for key, value in input.items():
+ func = switch.get(key)
+ if func and value and value != "0":
+ try:
+ res = func(value)
+ if len(res) > 2:
+ collections, items, value = res
+ else:
+ collections, items = res
+ except ObjectDoesNotExist:
+ collections = collections.none()
+ items = items.none()
+
+ criteria[key] = value
+
+ if type is None:
+ if collections.count() and not items.count():
+ type = 'collections'
+ else:
+ type = 'items'
+
+ if type == 'items':
+ objects = items
+ else:
+ objects = collections
+
+ return list_detail.object_list(request, objects,
+ template_name='telemeta/search_results.html', paginate_by=20,
+ extra_context={'criteria': criteria, 'collections_num': collections.count(),
+ 'items_num': items.count(), 'type' : type})
+
+ def __get_enumerations_list(self):
+ from django.db.models import get_models
+ models = get_models(telemeta.models)
+
+ enumerations = []
+ for model in models:
+ if issubclass(model, Enumeration):
+ enumerations.append({"name": model._meta.verbose_name,
+ "id": model._meta.module_name})
+
+ cmp = lambda obj1, obj2: unaccent_icmp(obj1['name'], obj2['name'])
+ enumerations.sort(cmp)
+ return enumerations
+
+ def __get_admin_context_vars(self):
+ return {"enumerations": self.__get_enumerations_list()}
+
+ @login_required
+ def admin_index(self, request):
+ return render(request, 'telemeta/admin.html', self. __get_admin_context_vars())
+
+ def __get_enumeration(self, id):
+ from django.db.models import get_models
+ models = get_models(telemeta.models)
+ for model in models:
+ if model._meta.module_name == id:
+ break
+
+ if model._meta.module_name != id:
+ return None
+
+ return model
+
+ @login_required
+ def edit_enumeration(self, request, enumeration_id):
+
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
+ raise Http404
+
+ vars = self.__get_admin_context_vars()
+ vars["enumeration_id"] = enumeration._meta.module_name
+ vars["enumeration_name"] = enumeration._meta.verbose_name
+ vars["enumeration_values"] = enumeration.objects.all()
+ return render(request, 'telemeta/enumeration_edit.html', vars)
+
+ @login_required
+ def add_to_enumeration(self, request, enumeration_id):
+
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
+ raise Http404
+
+ enumeration_value = enumeration(value=request.POST['value'])
+ enumeration_value.save()
+
+ return self.edit_enumeration(request, enumeration_id)
+
+ @login_required
+ def update_enumeration(self, request, enumeration_id):
+
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
+ raise Http404
+
+ if request.POST.has_key("remove"):
+ enumeration.objects.filter(id__in=request.POST.getlist('sel')).delete()
+
+ return self.edit_enumeration(request, enumeration_id)
+
+ @login_required
+ def edit_enumeration_value(self, request, enumeration_id, value_id):
+
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
+ raise Http404
+
+ vars = self.__get_admin_context_vars()
+ vars["enumeration_id"] = enumeration._meta.module_name
+ vars["enumeration_name"] = enumeration._meta.verbose_name
+ vars["enumeration_record"] = enumeration.objects.get(id__exact=value_id)
+ return render(request, 'telemeta/enumeration_edit_value.html', vars)
+
+ @login_required
+ def update_enumeration_value(self, request, enumeration_id, value_id):
+
+ if request.POST.has_key("save"):
+ enumeration = self.__get_enumeration(enumeration_id)
+ if enumeration == None:
+ raise Http404
+
+ record = enumeration.objects.get(id__exact=value_id)
+ record.value = request.POST["value"]
+ record.save()
+
+ return self.edit_enumeration(request, enumeration_id)
+
+ def collection_playlist(self, request, public_id, template, mimetype):
+ try:
+ collection = MediaCollection.objects.get(public_id=public_id)
+ except ObjectDoesNotExist:
+ raise Http404
+
+ template = loader.get_template(template)
+ context = RequestContext(request, {'collection': collection, 'host': request.META['HTTP_HOST']})
+ return HttpResponse(template.render(context), mimetype=mimetype)
+
+ def item_playlist(self, request, public_id, template, mimetype):
+ try:
+ item = MediaItem.objects.get(public_id=public_id)
+ except ObjectDoesNotExist:
+ raise Http404
+
+ template = loader.get_template(template)
+ context = RequestContext(request, {'item': item, 'host': request.META['HTTP_HOST']})
+ return HttpResponse(template.render(context), mimetype=mimetype)
+
+ def list_continents(self, request):
+ continents = MediaItem.objects.all().countries(group_by_continent=True)
+ return render(request, 'telemeta/geo_continents.html',
+ {'continents': continents, 'gmap_key': settings.TELEMETA_GMAP_KEY })
+
+ def country_info(self, request, id):
+ country = Location.objects.get(pk=id)
+ return render(request, 'telemeta/country_info.html', {
+ 'country': country, 'continent': country.continents()[0]})
+
+ def list_countries(self, request, continent):
+ continent = Location.objects.by_flatname(continent)[0]
+ countries = MediaItem.objects.by_location(continent).countries()
+
+ return render(request, 'telemeta/geo_countries.html', {
+ 'continent': continent,
+ 'countries': countries
+ })
+
+ def list_country_collections(self, request, continent, country):
+ continent = Location.objects.by_flatname(continent)[0]
+ country = Location.objects.by_flatname(country)[0]
+ objects = MediaCollection.objects.enriched().by_location(country)
+ return list_detail.object_list(request, objects,
+ template_name='telemeta/geo_country_collections.html', paginate_by=20,
+ extra_context={'country': country, 'continent': continent})
+
+ def list_country_items(self, request, continent, country):
+ continent = Location.objects.by_flatname(continent)[0]
+ country = Location.objects.by_flatname(country)[0]
+ objects = MediaItem.objects.enriched().by_location(country)
+ return list_detail.object_list(request, objects,
+ template_name='telemeta/geo_country_items.html', paginate_by=20,
+ extra_context={'country': country, 'continent': continent})
+
+ def handle_oai_request(self, request):
+ url = 'http://' + request.META['HTTP_HOST'] + request.path
+ datasource = TelemetaOAIDataSource()
+ admin = settings.ADMINS[0][1]
+ provider = oai.DataProvider(datasource, "Telemeta", url, admin)
+ args = request.GET.copy()
+ args.update(request.POST)
+ return HttpResponse(provider.handle(args), mimetype='text/xml')
+
+ def render_flatpage(self, request, path):
+ try:
+ content = pages.get_page_content(request, path)
+ except pages.MalformedPagePath:
+ return redirect(request.path + '/')
+
+ if isinstance(content, pages.PageAttachment):
+ return HttpResponse(content, content.mimetype())
+ else:
+ return render(request, 'telemeta/flatpage.html', {'page_content': content })
+
+ def logout(self, request):
+ auth.logout(request)
+ return redirect('telemeta-home')
--- /dev/null
+from django.conf import settings
+import re
+import os
+import telemeta
+import mimetypes
+
+PAGES_ROOT = os.path.join(os.path.dirname(telemeta.__file__), 'pages')
+
+class PageTextContent(object):
+ def __init__(self, filename, path):
+ self.filename = filename
+ self.path = path
+
+ def __iter__(self):
+ file = open(self.filename, 'r')
+ for line in file:
+ yield line.rstrip('\r\n')
+ file.close()
+
+ def __unicode__(self):
+ file = open(self.filename, 'r')
+ data = file.read()
+ file.close()
+ return data
+
+class PageAttachment(object):
+ def __init__(self, filename, path):
+ self.filename = filename
+ self.path = path
+
+ def mimetype(self):
+ type, encoding = mimetypes.guess_type(self.filename)
+ return type
+
+ def __iter__(self):
+ file = open(self.filename, 'rb')
+ buffer_size = 0x10000
+ while True:
+ chunk = file.read(buffer_size)
+ yield chunk
+ if len(chunk) < buffer_size:
+ break
+
+ file.close()
+
+def language_code(request=None):
+ code = (request and getattr(request, 'LANGUAGE_CODE', None)) or settings.LANGUAGE_CODE
+ cut = re.split('[_-]', code)
+ code = cut[0]
+ return code.lower()
+
+def project_dir():
+ import settings as settings_mod
+ if '__init__.py' in settings_mod.__file__:
+ p = os.path.dirname(settings_mod.__file__)
+ else:
+ p = settings_mod.__file__
+ project_directory, settings_filename = os.path.split(p)
+ if project_directory == os.curdir or not project_directory:
+ project_directory = os.getcwd()
+
+ return project_directory
+
+def resolve_page_file(root, relative_path, ignore_slash_issue=False):
+ root = os.path.realpath(root)
+ filename = None
+ current = root
+ is_attachment = False
+ for node in relative_path.split('/'):
+ if not node:
+ continue
+ current = os.path.join(current, node)
+ rst = current + '.rst'
+ if os.path.isfile(rst):
+ filename = rst
+ break
+ elif os.path.isfile(current):
+ filename = current
+ is_attachment = True
+ elif not os.path.isdir(current):
+ break
+
+ if not filename and os.path.isdir(current):
+ rst = os.path.join(current, 'index.rst')
+ if os.path.isfile(rst):
+ if not ignore_slash_issue and relative_path[-1:] != '/':
+ raise MalformedPagePath("The relative page os.path must end with a slash when "
+ "resolving an implicit directory index")
+ filename = rst
+
+ if filename:
+ filename = os.path.realpath(filename)
+ if filename.index(root) != 0:
+ filename = None
+
+ if filename:
+ if is_attachment:
+ return PageAttachment(filename, relative_path)
+ else:
+ return PageTextContent(filename, relative_path)
+
+ return None
+
+def get_page_content(request, relative_path, ignore_slash_issue=False):
+ lang = language_code(request)
+ userroot = os.path.join(project_dir(), 'telemeta-pages')
+ rootlist = [os.path.join(userroot, lang), os.path.join(userroot, 'default'),
+ os.path.join(PAGES_ROOT, lang), os.path.join(PAGES_ROOT, 'default')]
+ for root in rootlist:
+ content = resolve_page_file(root, relative_path, ignore_slash_issue=ignore_slash_issue)
+ if content:
+ return content
+
+ return None
+
+class MalformedPagePath(Exception):
+ pass
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007 Parisson SARL
+# Copyright (c) 2006-2007 Guillaume Pellerin <pellerin@parisson.com>
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://svn.parisson.org/telemeta/TelemetaLicense.
+#
+# Author: Guillaume Pellerin <pellerin@parisson.com>
+
+import os
+
+from telemeta.export import *
+from telemeta.core import *
+from telemeta.core import ComponentManager
+
+cache_dir = 'cache/'
+source = 'samples/wav/sweep.wav'
+item_id = '10'
+metadata = {'identifier': 'Test', #collection
+ 'title': 'Sweep',
+ 'creator': 'YomGuy',
+ 'type': 'Techno',
+ 'date': '2008',
+ 'publisher': 'Parisson',
+ }
+options = {'verbose': '1'}
+
+class ExportTest(Component):
+
+ exporters = ExtensionPoint(IExporter)
+
+ def run(self):
+ for exporter in self.exporters:
+ format = exporter.get_format()
+ if options['verbose'] != '0':
+ print "\n+------------------------------------------"
+ print '| Testing exporter format: ' + format
+ print "+------------------------------------------"
+ exporter.set_cache_dir(cache_dir)
+ stream = exporter.process(item_id,source,metadata,options)
+
+ for chunk in stream:
+ pass
+ #print chunk
+
+compmgr = ComponentManager()
+test = ExportTest(compmgr)
+test.run()
+
--- /dev/null
+../telemeta/
\ No newline at end of file
--- /dev/null
+from telemeta.analysis.vamp.core import *
+a = VampCoreAnalyzer()
+print a.get_plugins_list()
+print a.render(['qm-vamp-plugins', 'qm-tempotracker', 'beats'],'/home/momo/dev/telemeta/telemeta/tests/samples/wav/Cellar-ShowMe-02.wav')
+
--- /dev/null
+eztelemeta (0.1)
+ * Initial release
+
+ -- Olivier Guilyardi <olivier {at} samalyse {dot} com> Thu, 16 Apr 2009 16:02:17 +0200
--- /dev/null
+
+CeCILL FREE SOFTWARE LICENSE AGREEMENT
+
+
+ Notice
+
+This Agreement is a Free Software license agreement that is the result
+of discussions between its authors in order to ensure compliance with
+the two main principles guiding its drafting:
+
+ * firstly, compliance with the principles governing the distribution
+ of Free Software: access to source code, broad rights granted to
+ users,
+ * secondly, the election of a governing law, French law, with which
+ it is conformant, both as regards the law of torts and
+ intellectual property law, and the protection that it offers to
+ both authors and holders of the economic rights over software.
+
+The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
+license are:
+
+Commissariat à l'Energie Atomique - CEA, a public scientific, technical
+and industrial research establishment, having its principal place of
+business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.
+
+Centre National de la Recherche Scientifique - CNRS, a public scientific
+and technological establishment, having its principal place of business
+at 3 rue Michel-Ange, 75794 Paris cedex 16, France.
+
+Institut National de Recherche en Informatique et en Automatique -
+INRIA, a public scientific and technological establishment, having its
+principal place of business at Domaine de Voluceau, Rocquencourt, BP
+105, 78153 Le Chesnay cedex, France.
+
+
+ Preamble
+
+The purpose of this Free Software license agreement is to grant users
+the right to modify and redistribute the software governed by this
+license within the framework of an open source distribution model.
+
+The exercising of these rights is conditional upon certain obligations
+for users so as to preserve this status for all subsequent redistributions.
+
+In consideration of access to the source code and the rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty and the software's author, the holder of the
+economic rights, and the successive licensors only have limited liability.
+
+In this respect, the risks associated with loading, using, modifying
+and/or developing or reproducing the software by the user are brought to
+the user's attention, given its Free Software status, which may make it
+complicated to use, with the result that its use is reserved for
+developers and experienced professionals having in-depth computer
+knowledge. Users are therefore encouraged to load and test the
+suitability of the software as regards their requirements in conditions
+enabling the security of their systems and/or data to be ensured and,
+more generally, to use and operate it in the same conditions of
+security. This Agreement may be freely reproduced and published,
+provided it is not altered, and that no provisions are either added or
+removed herefrom.
+
+This Agreement may apply to any or all software for which the holder of
+the economic rights decides to submit the use thereof to its provisions.
+
+
+ Article 1 - DEFINITIONS
+
+For the purpose of this Agreement, when the following expressions
+commence with a capital letter, they shall have the following meaning:
+
+Agreement: means this license agreement, and its possible subsequent
+versions and annexes.
+
+Software: means the software in its Object Code and/or Source Code form
+and, where applicable, its documentation, "as is" when the Licensee
+accepts the Agreement.
+
+Initial Software: means the Software in its Source Code and possibly its
+Object Code form and, where applicable, its documentation, "as is" when
+it is first distributed under the terms and conditions of the Agreement.
+
+Modified Software: means the Software modified by at least one
+Contribution.
+
+Source Code: means all the Software's instructions and program lines to
+which access is required so as to modify the Software.
+
+Object Code: means the binary files originating from the compilation of
+the Source Code.
+
+Holder: means the holder(s) of the economic rights over the Initial
+Software.
+
+Licensee: means the Software user(s) having accepted the Agreement.
+
+Contributor: means a Licensee having made at least one Contribution.
+
+Licensor: means the Holder, or any other individual or legal entity, who
+distributes the Software under the Agreement.
+
+Contribution: means any or all modifications, corrections, translations,
+adaptations and/or new functions integrated into the Software by any or
+all Contributors, as well as any or all Internal Modules.
+
+Module: means a set of sources files including their documentation that
+enables supplementary functions or services in addition to those offered
+by the Software.
+
+External Module: means any or all Modules, not derived from the
+Software, so that this Module and the Software run in separate address
+spaces, with one calling the other when they are run.
+
+Internal Module: means any or all Module, connected to the Software so
+that they both execute in the same address space.
+
+GNU GPL: means the GNU General Public License version 2 or any
+subsequent version, as published by the Free Software Foundation Inc.
+
+Parties: mean both the Licensee and the Licensor.
+
+These expressions may be used both in singular and plural form.
+
+
+ Article 2 - PURPOSE
+
+The purpose of the Agreement is the grant by the Licensor to the
+Licensee of a non-exclusive, transferable and worldwide license for the
+Software as set forth in Article 5 hereinafter for the whole term of the
+protection granted by the rights over said Software.
+
+
+ Article 3 - ACCEPTANCE
+
+3.1 The Licensee shall be deemed as having accepted the terms and
+conditions of this Agreement upon the occurrence of the first of the
+following events:
+
+ * (i) loading the Software by any or all means, notably, by
+ downloading from a remote server, or by loading from a physical
+ medium;
+ * (ii) the first time the Licensee exercises any of the rights
+ granted hereunder.
+
+3.2 One copy of the Agreement, containing a notice relating to the
+characteristics of the Software, to the limited warranty, and to the
+fact that its use is restricted to experienced users has been provided
+to the Licensee prior to its acceptance as set forth in Article 3.1
+hereinabove, and the Licensee hereby acknowledges that it has read and
+understood it.
+
+
+ Article 4 - EFFECTIVE DATE AND TERM
+
+
+ 4.1 EFFECTIVE DATE
+
+The Agreement shall become effective on the date when it is accepted by
+the Licensee as set forth in Article 3.1.
+
+
+ 4.2 TERM
+
+The Agreement shall remain in force for the entire legal term of
+protection of the economic rights over the Software.
+
+
+ Article 5 - SCOPE OF RIGHTS GRANTED
+
+The Licensor hereby grants to the Licensee, who accepts, the following
+rights over the Software for any or all use, and for the term of the
+Agreement, on the basis of the terms and conditions set forth hereinafter.
+
+Besides, if the Licensor owns or comes to own one or more patents
+protecting all or part of the functions of the Software or of its
+components, the Licensor undertakes not to enforce the rights granted by
+these patents against successive Licensees using, exploiting or
+modifying the Software. If these patents are transferred, the Licensor
+undertakes to have the transferees subscribe to the obligations set
+forth in this paragraph.
+
+
+ 5.1 RIGHT OF USE
+
+The Licensee is authorized to use the Software, without any limitation
+as to its fields of application, with it being hereinafter specified
+that this comprises:
+
+ 1. permanent or temporary reproduction of all or part of the Software
+ by any or all means and in any or all form.
+
+ 2. loading, displaying, running, or storing the Software on any or
+ all medium.
+
+ 3. entitlement to observe, study or test its operation so as to
+ determine the ideas and principles behind any or all constituent
+ elements of said Software. This shall apply when the Licensee
+ carries out any or all loading, displaying, running, transmission
+ or storage operation as regards the Software, that it is entitled
+ to carry out hereunder.
+
+
+ 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS
+
+The right to make Contributions includes the right to translate, adapt,
+arrange, or make any or all modifications to the Software, and the right
+to reproduce the resulting software.
+
+The Licensee is authorized to make any or all Contributions to the
+Software provided that it includes an explicit notice that it is the
+author of said Contribution and indicates the date of the creation thereof.
+
+
+ 5.3 RIGHT OF DISTRIBUTION
+
+In particular, the right of distribution includes the right to publish,
+transmit and communicate the Software to the general public on any or
+all medium, and by any or all means, and the right to market, either in
+consideration of a fee, or free of charge, one or more copies of the
+Software by any means.
+
+The Licensee is further authorized to distribute copies of the modified
+or unmodified Software to third parties according to the terms and
+conditions set forth hereinafter.
+
+
+ 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION
+
+The Licensee is authorized to distribute true copies of the Software in
+Source Code or Object Code form, provided that said distribution
+complies with all the provisions of the Agreement and is accompanied by:
+
+ 1. a copy of the Agreement,
+
+ 2. a notice relating to the limitation of both the Licensor's
+ warranty and liability as set forth in Articles 8 and 9,
+
+and that, in the event that only the Object Code of the Software is
+redistributed, the Licensee allows future Licensees unhindered access to
+the full Source Code of the Software by indicating how to access it, it
+being understood that the additional cost of acquiring the Source Code
+shall not exceed the cost of transferring the data.
+
+
+ 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE
+
+When the Licensee makes a Contribution to the Software, the terms and
+conditions for the distribution of the resulting Modified Software
+become subject to all the provisions of this Agreement.
+
+The Licensee is authorized to distribute the Modified Software, in
+source code or object code form, provided that said distribution
+complies with all the provisions of the Agreement and is accompanied by:
+
+ 1. a copy of the Agreement,
+
+ 2. a notice relating to the limitation of both the Licensor's
+ warranty and liability as set forth in Articles 8 and 9,
+
+and that, in the event that only the object code of the Modified
+Software is redistributed, the Licensee allows future Licensees
+unhindered access to the full source code of the Modified Software by
+indicating how to access it, it being understood that the additional
+cost of acquiring the source code shall not exceed the cost of
+transferring the data.
+
+
+ 5.3.3 DISTRIBUTION OF EXTERNAL MODULES
+
+When the Licensee has developed an External Module, the terms and
+conditions of this Agreement do not apply to said External Module, that
+may be distributed under a separate license agreement.
+
+
+ 5.3.4 COMPATIBILITY WITH THE GNU GPL
+
+The Licensee can include a code that is subject to the provisions of one
+of the versions of the GNU GPL in the Modified or unmodified Software,
+and distribute that entire code under the terms of the same version of
+the GNU GPL.
+
+The Licensee can include the Modified or unmodified Software in a code
+that is subject to the provisions of one of the versions of the GNU GPL,
+and distribute that entire code under the terms of the same version of
+the GNU GPL.
+
+
+ Article 6 - INTELLECTUAL PROPERTY
+
+
+ 6.1 OVER THE INITIAL SOFTWARE
+
+The Holder owns the economic rights over the Initial Software. Any or
+all use of the Initial Software is subject to compliance with the terms
+and conditions under which the Holder has elected to distribute its work
+and no one shall be entitled to modify the terms and conditions for the
+distribution of said Initial Software.
+
+The Holder undertakes that the Initial Software will remain ruled at
+least by this Agreement, for the duration set forth in Article 4.2.
+
+
+ 6.2 OVER THE CONTRIBUTIONS
+
+The Licensee who develops a Contribution is the owner of the
+intellectual property rights over this Contribution as defined by
+applicable law.
+
+
+ 6.3 OVER THE EXTERNAL MODULES
+
+The Licensee who develops an External Module is the owner of the
+intellectual property rights over this External Module as defined by
+applicable law and is free to choose the type of agreement that shall
+govern its distribution.
+
+
+ 6.4 JOINT PROVISIONS
+
+The Licensee expressly undertakes:
+
+ 1. not to remove, or modify, in any manner, the intellectual property
+ notices attached to the Software;
+
+ 2. to reproduce said notices, in an identical manner, in the copies
+ of the Software modified or not.
+
+The Licensee undertakes not to directly or indirectly infringe the
+intellectual property rights of the Holder and/or Contributors on the
+Software and to take, where applicable, vis-à-vis its staff, any and all
+measures required to ensure respect of said intellectual property rights
+of the Holder and/or Contributors.
+
+
+ Article 7 - RELATED SERVICES
+
+7.1 Under no circumstances shall the Agreement oblige the Licensor to
+provide technical assistance or maintenance services for the Software.
+
+However, the Licensor is entitled to offer this type of services. The
+terms and conditions of such technical assistance, and/or such
+maintenance, shall be set forth in a separate instrument. Only the
+Licensor offering said maintenance and/or technical assistance services
+shall incur liability therefor.
+
+7.2 Similarly, any Licensor is entitled to offer to its licensees, under
+its sole responsibility, a warranty, that shall only be binding upon
+itself, for the redistribution of the Software and/or the Modified
+Software, under terms and conditions that it is free to decide. Said
+warranty, and the financial terms and conditions of its application,
+shall be subject of a separate instrument executed between the Licensor
+and the Licensee.
+
+
+ Article 8 - LIABILITY
+
+8.1 Subject to the provisions of Article 8.2, the Licensee shall be
+entitled to claim compensation for any direct loss it may have suffered
+from the Software as a result of a fault on the part of the relevant
+Licensor, subject to providing evidence thereof.
+
+8.2 The Licensor's liability is limited to the commitments made under
+this Agreement and shall not be incurred as a result of in particular:
+(i) loss due the Licensee's total or partial failure to fulfill its
+obligations, (ii) direct or consequential loss that is suffered by the
+Licensee due to the use or performance of the Software, and (iii) more
+generally, any consequential loss. In particular the Parties expressly
+agree that any or all pecuniary or business loss (i.e. loss of data,
+loss of profits, operating loss, loss of customers or orders,
+opportunity cost, any disturbance to business activities) or any or all
+legal proceedings instituted against the Licensee by a third party,
+shall constitute consequential loss and shall not provide entitlement to
+any or all compensation from the Licensor.
+
+
+ Article 9 - WARRANTY
+
+9.1 The Licensee acknowledges that the scientific and technical
+state-of-the-art when the Software was distributed did not enable all
+possible uses to be tested and verified, nor for the presence of
+possible defects to be detected. In this respect, the Licensee's
+attention has been drawn to the risks associated with loading, using,
+modifying and/or developing and reproducing the Software which are
+reserved for experienced users.
+
+The Licensee shall be responsible for verifying, by any or all means,
+the suitability of the product for its requirements, its good working
+order, and for ensuring that it shall not cause damage to either persons
+or properties.
+
+9.2 The Licensor hereby represents, in good faith, that it is entitled
+to grant all the rights over the Software (including in particular the
+rights set forth in Article 5).
+
+9.3 The Licensee acknowledges that the Software is supplied "as is" by
+the Licensor without any other express or tacit warranty, other than
+that provided for in Article 9.2 and, in particular, without any warranty
+as to its commercial value, its secured, safe, innovative or relevant
+nature.
+
+Specifically, the Licensor does not warrant that the Software is free
+from any error, that it will operate without interruption, that it will
+be compatible with the Licensee's own equipment and software
+configuration, nor that it will meet the Licensee's requirements.
+
+9.4 The Licensor does not either expressly or tacitly warrant that the
+Software does not infringe any third party intellectual property right
+relating to a patent, software or any other property right. Therefore,
+the Licensor disclaims any and all liability towards the Licensee
+arising out of any or all proceedings for infringement that may be
+instituted in respect of the use, modification and redistribution of the
+Software. Nevertheless, should such proceedings be instituted against
+the Licensee, the Licensor shall provide it with technical and legal
+assistance for its defense. Such technical and legal assistance shall be
+decided on a case-by-case basis between the relevant Licensor and the
+Licensee pursuant to a memorandum of understanding. The Licensor
+disclaims any and all liability as regards the Licensee's use of the
+name of the Software. No warranty is given as regards the existence of
+prior rights over the name of the Software or as regards the existence
+of a trademark.
+
+
+ Article 10 - TERMINATION
+
+10.1 In the event of a breach by the Licensee of its obligations
+hereunder, the Licensor may automatically terminate this Agreement
+thirty (30) days after notice has been sent to the Licensee and has
+remained ineffective.
+
+10.2 A Licensee whose Agreement is terminated shall no longer be
+authorized to use, modify or distribute the Software. However, any
+licenses that it may have granted prior to termination of the Agreement
+shall remain valid subject to their having been granted in compliance
+with the terms and conditions hereof.
+
+
+ Article 11 - MISCELLANEOUS
+
+
+ 11.1 EXCUSABLE EVENTS
+
+Neither Party shall be liable for any or all delay, or failure to
+perform the Agreement, that may be attributable to an event of force
+majeure, an act of God or an outside cause, such as defective
+functioning or interruptions of the electricity or telecommunications
+networks, network paralysis following a virus attack, intervention by
+government authorities, natural disasters, water damage, earthquakes,
+fire, explosions, strikes and labor unrest, war, etc.
+
+11.2 Any failure by either Party, on one or more occasions, to invoke
+one or more of the provisions hereof, shall under no circumstances be
+interpreted as being a waiver by the interested Party of its right to
+invoke said provision(s) subsequently.
+
+11.3 The Agreement cancels and replaces any or all previous agreements,
+whether written or oral, between the Parties and having the same
+purpose, and constitutes the entirety of the agreement between said
+Parties concerning said purpose. No supplement or modification to the
+terms and conditions hereof shall be effective as between the Parties
+unless it is made in writing and signed by their duly authorized
+representatives.
+
+11.4 In the event that one or more of the provisions hereof were to
+conflict with a current or future applicable act or legislative text,
+said act or legislative text shall prevail, and the Parties shall make
+the necessary amendments so as to comply with said act or legislative
+text. All other provisions shall remain effective. Similarly, invalidity
+of a provision of the Agreement, for any reason whatsoever, shall not
+cause the Agreement as a whole to be invalid.
+
+
+ 11.5 LANGUAGE
+
+The Agreement is drafted in both French and English and both versions
+are deemed authentic.
+
+
+ Article 12 - NEW VERSIONS OF THE AGREEMENT
+
+12.1 Any person is authorized to duplicate and distribute copies of this
+Agreement.
+
+12.2 So as to ensure coherence, the wording of this Agreement is
+protected and may only be modified by the authors of the License, who
+reserve the right to periodically publish updates or new versions of the
+Agreement, each with a separate number. These subsequent versions may
+address new issues encountered by Free Software.
+
+12.3 Any Software distributed under a given version of the Agreement may
+only be subsequently distributed under the same version of the Agreement
+or a subsequent version, subject to the provisions of Article 5.3.4.
+
+
+ Article 13 - GOVERNING LAW AND JURISDICTION
+
+13.1 The Agreement is governed by French law. The Parties agree to
+endeavor to seek an amicable solution to any disagreements or disputes
+that may arise during the performance of the Agreement.
+
+13.2 Failing an amicable solution within two (2) months as from their
+occurrence, and unless emergency proceedings are necessary, the
+disagreements or disputes shall be referred to the Paris Courts having
+jurisdiction, by the more diligent Party.
+
+
+Version 2.0 dated 2006-09-05.
--- /dev/null
+
+CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL
+
+
+ Avertissement
+
+Ce contrat est une licence de logiciel libre issue d'une concertation
+entre ses auteurs afin que le respect de deux grands principes préside à
+sa rédaction:
+
+ * d'une part, le respect des principes de diffusion des logiciels
+ libres: accès au code source, droits étendus conférés aux
+ utilisateurs,
+ * d'autre part, la désignation d'un droit applicable, le droit
+ français, auquel elle est conforme, tant au regard du droit de la
+ responsabilité civile que du droit de la propriété intellectuelle
+ et de la protection qu'il offre aux auteurs et titulaires des
+ droits patrimoniaux sur un logiciel.
+
+Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel]
+L[ibre]) sont:
+
+Commissariat à l'Energie Atomique - CEA, établissement public de
+recherche à caractère scientifique, technique et industriel, dont le
+siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris.
+
+Centre National de la Recherche Scientifique - CNRS, établissement
+public à caractère scientifique et technologique, dont le siège est
+situé 3 rue Michel-Ange, 75794 Paris cedex 16.
+
+Institut National de Recherche en Informatique et en Automatique -
+INRIA, établissement public à caractère scientifique et technologique,
+dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153
+Le Chesnay cedex.
+
+
+ Préambule
+
+Ce contrat est une licence de logiciel libre dont l'objectif est de
+conférer aux utilisateurs la liberté de modification et de
+redistribution du logiciel régi par cette licence dans le cadre d'un
+modèle de diffusion en logiciel libre.
+
+L'exercice de ces libertés est assorti de certains devoirs à la charge
+des utilisateurs afin de préserver ce statut au cours des
+redistributions ultérieures.
+
+L'accessibilité au code source et les droits de copie, de modification
+et de redistribution qui en découlent ont pour contrepartie de n'offrir
+aux utilisateurs qu'une garantie limitée et de ne faire peser sur
+l'auteur du logiciel, le titulaire des droits patrimoniaux et les
+concédants successifs qu'une responsabilité restreinte.
+
+A cet égard l'attention de l'utilisateur est attirée sur les risques
+associés au chargement, à l'utilisation, à la modification et/ou au
+développement et à la reproduction du logiciel par l'utilisateur étant
+donné sa spécificité de logiciel libre, qui peut le rendre complexe à
+manipuler et qui le réserve donc à des développeurs ou des
+professionnels avertis possédant des connaissances informatiques
+approfondies. Les utilisateurs sont donc invités à charger et tester
+l'adéquation du logiciel à leurs besoins dans des conditions permettant
+d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus
+généralement, à l'utiliser et l'exploiter dans les mêmes conditions de
+sécurité. Ce contrat peut être reproduit et diffusé librement, sous
+réserve de le conserver en l'état, sans ajout ni suppression de clauses.
+
+Ce contrat est susceptible de s'appliquer à tout logiciel dont le
+titulaire des droits patrimoniaux décide de soumettre l'exploitation aux
+dispositions qu'il contient.
+
+
+ Article 1 - DEFINITIONS
+
+Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une
+lettre capitale, auront la signification suivante:
+
+Contrat: désigne le présent contrat de licence, ses éventuelles versions
+postérieures et annexes.
+
+Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code
+Source et le cas échéant sa documentation, dans leur état au moment de
+l'acceptation du Contrat par le Licencié.
+
+Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et
+éventuellement de Code Objet et le cas échéant sa documentation, dans
+leur état au moment de leur première diffusion sous les termes du Contrat.
+
+Logiciel Modifié: désigne le Logiciel modifié par au moins une
+Contribution.
+
+Code Source: désigne l'ensemble des instructions et des lignes de
+programme du Logiciel et auquel l'accès est nécessaire en vue de
+modifier le Logiciel.
+
+Code Objet: désigne les fichiers binaires issus de la compilation du
+Code Source.
+
+Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur
+sur le Logiciel Initial.
+
+Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le
+Contrat.
+
+Contributeur: désigne le Licencié auteur d'au moins une Contribution.
+
+Concédant: désigne le Titulaire ou toute personne physique ou morale
+distribuant le Logiciel sous le Contrat.
+
+Contribution: désigne l'ensemble des modifications, corrections,
+traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans
+le Logiciel par tout Contributeur, ainsi que tout Module Interne.
+
+Module: désigne un ensemble de fichiers sources y compris leur
+documentation qui permet de réaliser des fonctionnalités ou services
+supplémentaires à ceux fournis par le Logiciel.
+
+Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce
+Module et le Logiciel s'exécutent dans des espaces d'adressage
+différents, l'un appelant l'autre au moment de leur exécution.
+
+Module Interne: désigne tout Module lié au Logiciel de telle sorte
+qu'ils s'exécutent dans le même espace d'adressage.
+
+GNU GPL: désigne la GNU General Public License dans sa version 2 ou
+toute version ultérieure, telle que publiée par Free Software Foundation
+Inc.
+
+Parties: désigne collectivement le Licencié et le Concédant.
+
+Ces termes s'entendent au singulier comme au pluriel.
+
+
+ Article 2 - OBJET
+
+Le Contrat a pour objet la concession par le Concédant au Licencié d'une
+licence non exclusive, cessible et mondiale du Logiciel telle que
+définie ci-après à l'article 5 pour toute la durée de protection des droits
+portant sur ce Logiciel.
+
+
+ Article 3 - ACCEPTATION
+
+3.1 L'acceptation par le Licencié des termes du Contrat est réputée
+acquise du fait du premier des faits suivants:
+
+ * (i) le chargement du Logiciel par tout moyen notamment par
+ téléchargement à partir d'un serveur distant ou par chargement à
+ partir d'un support physique;
+ * (ii) le premier exercice par le Licencié de l'un quelconque des
+ droits concédés par le Contrat.
+
+3.2 Un exemplaire du Contrat, contenant notamment un avertissement
+relatif aux spécificités du Logiciel, à la restriction de garantie et à
+la limitation à un usage par des utilisateurs expérimentés a été mis à
+disposition du Licencié préalablement à son acceptation telle que
+définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris
+connaissance.
+
+
+ Article 4 - ENTREE EN VIGUEUR ET DUREE
+
+
+ 4.1 ENTREE EN VIGUEUR
+
+Le Contrat entre en vigueur à la date de son acceptation par le Licencié
+telle que définie en 3.1.
+
+
+ 4.2 DUREE
+
+Le Contrat produira ses effets pendant toute la durée légale de
+protection des droits patrimoniaux portant sur le Logiciel.
+
+
+ Article 5 - ETENDUE DES DROITS CONCEDES
+
+Le Concédant concède au Licencié, qui accepte, les droits suivants sur
+le Logiciel pour toutes destinations et pour la durée du Contrat dans
+les conditions ci-après détaillées.
+
+Par ailleurs, si le Concédant détient ou venait à détenir un ou
+plusieurs brevets d'invention protégeant tout ou partie des
+fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas
+opposer les éventuels droits conférés par ces brevets aux Licenciés
+successifs qui utiliseraient, exploiteraient ou modifieraient le
+Logiciel. En cas de cession de ces brevets, le Concédant s'engage à
+faire reprendre les obligations du présent alinéa aux cessionnaires.
+
+
+ 5.1 DROIT D'UTILISATION
+
+Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant
+aux domaines d'application, étant ci-après précisé que cela comporte:
+
+ 1. la reproduction permanente ou provisoire du Logiciel en tout ou
+ partie par tout moyen et sous toute forme.
+
+ 2. le chargement, l'affichage, l'exécution, ou le stockage du
+ Logiciel sur tout support.
+
+ 3. la possibilité d'en observer, d'en étudier, ou d'en tester le
+ fonctionnement afin de déterminer les idées et principes qui sont
+ à la base de n'importe quel élément de ce Logiciel; et ceci,
+ lorsque le Licencié effectue toute opération de chargement,
+ d'affichage, d'exécution, de transmission ou de stockage du
+ Logiciel qu'il est en droit d'effectuer en vertu du Contrat.
+
+
+ 5.2 DROIT D'APPORTER DES CONTRIBUTIONS
+
+Le droit d'apporter des Contributions comporte le droit de traduire,
+d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel
+et le droit de reproduire le logiciel en résultant.
+
+Le Licencié est autorisé à apporter toute Contribution au Logiciel sous
+réserve de mentionner, de façon explicite, son nom en tant qu'auteur de
+cette Contribution et la date de création de celle-ci.
+
+
+ 5.3 DROIT DE DISTRIBUTION
+
+Le droit de distribution comporte notamment le droit de diffuser, de
+transmettre et de communiquer le Logiciel au public sur tout support et
+par tout moyen ainsi que le droit de mettre sur le marché à titre
+onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé.
+
+Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou
+non, à des tiers dans les conditions ci-après détaillées.
+
+
+ 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION
+
+Le Licencié est autorisé à distribuer des copies conformes du Logiciel,
+sous forme de Code Source ou de Code Objet, à condition que cette
+distribution respecte les dispositions du Contrat dans leur totalité et
+soit accompagnée:
+
+ 1. d'un exemplaire du Contrat,
+
+ 2. d'un avertissement relatif à la restriction de garantie et de
+ responsabilité du Concédant telle que prévue aux articles 8
+ et 9,
+
+et que, dans le cas où seul le Code Objet du Logiciel est redistribué,
+le Licencié permette aux futurs Licenciés d'accéder facilement au Code
+Source complet du Logiciel en indiquant les modalités d'accès, étant
+entendu que le coût additionnel d'acquisition du Code Source ne devra
+pas excéder le simple coût de transfert des données.
+
+
+ 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE
+
+Lorsque le Licencié apporte une Contribution au Logiciel, les conditions
+de distribution du Logiciel Modifié en résultant sont alors soumises à
+l'intégralité des dispositions du Contrat.
+
+Le Licencié est autorisé à distribuer le Logiciel Modifié, sous forme de
+code source ou de code objet, à condition que cette distribution
+respecte les dispositions du Contrat dans leur totalité et soit
+accompagnée:
+
+ 1. d'un exemplaire du Contrat,
+
+ 2. d'un avertissement relatif à la restriction de garantie et de
+ responsabilité du Concédant telle que prévue aux articles 8
+ et 9,
+
+et que, dans le cas où seul le code objet du Logiciel Modifié est
+redistribué, le Licencié permette aux futurs Licenciés d'accéder
+facilement au code source complet du Logiciel Modifié en indiquant les
+modalités d'accès, étant entendu que le coût additionnel d'acquisition
+du code source ne devra pas excéder le simple coût de transfert des données.
+
+
+ 5.3.3 DISTRIBUTION DES MODULES EXTERNES
+
+Lorsque le Licencié a développé un Module Externe les conditions du
+Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué
+sous un contrat de licence différent.
+
+
+ 5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL
+
+Le Licencié peut inclure un code soumis aux dispositions d'une des
+versions de la licence GNU GPL dans le Logiciel modifié ou non et
+distribuer l'ensemble sous les conditions de la même version de la
+licence GNU GPL.
+
+Le Licencié peut inclure le Logiciel modifié ou non dans un code soumis
+aux dispositions d'une des versions de la licence GNU GPL et distribuer
+l'ensemble sous les conditions de la même version de la licence GNU GPL.
+
+
+ Article 6 - PROPRIETE INTELLECTUELLE
+
+
+ 6.1 SUR LE LOGICIEL INITIAL
+
+Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel
+Initial. Toute utilisation du Logiciel Initial est soumise au respect
+des conditions dans lesquelles le Titulaire a choisi de diffuser son
+oeuvre et nul autre n'a la faculté de modifier les conditions de
+diffusion de ce Logiciel Initial.
+
+Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi
+par le Contrat et ce, pour la durée visée à l'article 4.2.
+
+
+ 6.2 SUR LES CONTRIBUTIONS
+
+Le Licencié qui a développé une Contribution est titulaire sur celle-ci
+des droits de propriété intellectuelle dans les conditions définies par
+la législation applicable.
+
+
+ 6.3 SUR LES MODULES EXTERNES
+
+Le Licencié qui a développé un Module Externe est titulaire sur celui-ci
+des droits de propriété intellectuelle dans les conditions définies par
+la législation applicable et reste libre du choix du contrat régissant
+sa diffusion.
+
+
+ 6.4 DISPOSITIONS COMMUNES
+
+Le Licencié s'engage expressément:
+
+ 1. à ne pas supprimer ou modifier de quelque manière que ce soit les
+ mentions de propriété intellectuelle apposées sur le Logiciel;
+
+ 2. à reproduire à l'identique lesdites mentions de propriété
+ intellectuelle sur les copies du Logiciel modifié ou non.
+
+Le Licencié s'engage à ne pas porter atteinte, directement ou
+indirectement, aux droits de propriété intellectuelle du Titulaire et/ou
+des Contributeurs sur le Logiciel et à prendre, le cas échéant, à
+l'égard de son personnel toutes les mesures nécessaires pour assurer le
+respect des dits droits de propriété intellectuelle du Titulaire et/ou
+des Contributeurs.
+
+
+ Article 7 - SERVICES ASSOCIES
+
+7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de
+prestations d'assistance technique ou de maintenance du Logiciel.
+
+Cependant le Concédant reste libre de proposer ce type de services. Les
+termes et conditions d'une telle assistance technique et/ou d'une telle
+maintenance seront alors déterminés dans un acte séparé. Ces actes de
+maintenance et/ou assistance technique n'engageront que la seule
+responsabilité du Concédant qui les propose.
+
+7.2 De même, tout Concédant est libre de proposer, sous sa seule
+responsabilité, à ses licenciés une garantie, qui n'engagera que lui,
+lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce,
+dans les conditions qu'il souhaite. Cette garantie et les modalités
+financières de son application feront l'objet d'un acte séparé entre le
+Concédant et le Licencié.
+
+
+ Article 8 - RESPONSABILITE
+
+8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la
+faculté, sous réserve de prouver la faute du Concédant concerné, de
+solliciter la réparation du préjudice direct qu'il subirait du fait du
+Logiciel et dont il apportera la preuve.
+
+8.2 La responsabilité du Concédant est limitée aux engagements pris en
+application du Contrat et ne saurait être engagée en raison notamment:
+(i) des dommages dus à l'inexécution, totale ou partielle, de ses
+obligations par le Licencié, (ii) des dommages directs ou indirects
+découlant de l'utilisation ou des performances du Logiciel subis par le
+Licencié et (iii) plus généralement d'un quelconque dommage indirect. En
+particulier, les Parties conviennent expressément que tout préjudice
+financier ou commercial (par exemple perte de données, perte de
+bénéfices, perte d'exploitation, perte de clientèle ou de commandes,
+manque à gagner, trouble commercial quelconque) ou toute action dirigée
+contre le Licencié par un tiers, constitue un dommage indirect et
+n'ouvre pas droit à réparation par le Concédant.
+
+
+ Article 9 - GARANTIE
+
+9.1 Le Licencié reconnaît que l'état actuel des connaissances
+scientifiques et techniques au moment de la mise en circulation du
+Logiciel ne permet pas d'en tester et d'en vérifier toutes les
+utilisations ni de détecter l'existence d'éventuels défauts. L'attention
+du Licencié a été attirée sur ce point sur les risques associés au
+chargement, à l'utilisation, la modification et/ou au développement et à
+la reproduction du Logiciel qui sont réservés à des utilisateurs avertis.
+
+Il relève de la responsabilité du Licencié de contrôler, par tous
+moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et
+de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens.
+
+9.2 Le Concédant déclare de bonne foi être en droit de concéder
+l'ensemble des droits attachés au Logiciel (comprenant notamment les
+droits visés à l'article 5).
+
+9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le
+Concédant sans autre garantie, expresse ou tacite, que celle prévue à
+l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale,
+son caractère sécurisé, innovant ou pertinent.
+
+En particulier, le Concédant ne garantit pas que le Logiciel est exempt
+d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible
+avec l'équipement du Licencié et sa configuration logicielle ni qu'il
+remplira les besoins du Licencié.
+
+9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le
+Logiciel ne porte pas atteinte à un quelconque droit de propriété
+intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout
+autre droit de propriété. Ainsi, le Concédant exclut toute garantie au
+profit du Licencié contre les actions en contrefaçon qui pourraient être
+diligentées au titre de l'utilisation, de la modification, et de la
+redistribution du Logiciel. Néanmoins, si de telles actions sont
+exercées contre le Licencié, le Concédant lui apportera son aide
+technique et juridique pour sa défense. Cette aide technique et
+juridique est déterminée au cas par cas entre le Concédant concerné et
+le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage
+toute responsabilité quant à l'utilisation de la dénomination du
+Logiciel par le Licencié. Aucune garantie n'est apportée quant à
+l'existence de droits antérieurs sur le nom du Logiciel et sur
+l'existence d'une marque.
+
+
+ Article 10 - RESILIATION
+
+10.1 En cas de manquement par le Licencié aux obligations mises à sa
+charge par le Contrat, le Concédant pourra résilier de plein droit le
+Contrat trente (30) jours après notification adressée au Licencié et
+restée sans effet.
+
+10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à
+utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les
+licences qu'il aura concédées antérieurement à la résiliation du Contrat
+resteront valides sous réserve qu'elles aient été effectuées en
+conformité avec le Contrat.
+
+
+ Article 11 - DISPOSITIONS DIVERSES
+
+
+ 11.1 CAUSE EXTERIEURE
+
+Aucune des Parties ne sera responsable d'un retard ou d'une défaillance
+d'exécution du Contrat qui serait dû à un cas de force majeure, un cas
+fortuit ou une cause extérieure, telle que, notamment, le mauvais
+fonctionnement ou les interruptions du réseau électrique ou de
+télécommunication, la paralysie du réseau liée à une attaque
+informatique, l'intervention des autorités gouvernementales, les
+catastrophes naturelles, les dégâts des eaux, les tremblements de terre,
+le feu, les explosions, les grèves et les conflits sociaux, l'état de
+guerre...
+
+11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou
+plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du
+Contrat, ne pourra en aucun cas impliquer renonciation par la Partie
+intéressée à s'en prévaloir ultérieurement.
+
+11.3 Le Contrat annule et remplace toute convention antérieure, écrite
+ou orale, entre les Parties sur le même objet et constitue l'accord
+entier entre les Parties sur cet objet. Aucune addition ou modification
+aux termes du Contrat n'aura d'effet à l'égard des Parties à moins
+d'être faite par écrit et signée par leurs représentants dûment habilités.
+
+11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat
+s'avèrerait contraire à une loi ou à un texte applicable, existants ou
+futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les
+amendements nécessaires pour se conformer à cette loi ou à ce texte.
+Toutes les autres dispositions resteront en vigueur. De même, la
+nullité, pour quelque raison que ce soit, d'une des dispositions du
+Contrat ne saurait entraîner la nullité de l'ensemble du Contrat.
+
+
+ 11.5 LANGUE
+
+Le Contrat est rédigé en langue française et en langue anglaise, ces
+deux versions faisant également foi.
+
+
+ Article 12 - NOUVELLES VERSIONS DU CONTRAT
+
+12.1 Toute personne est autorisée à copier et distribuer des copies de
+ce Contrat.
+
+12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé
+et ne peut être modifié que par les auteurs de la licence, lesquels se
+réservent le droit de publier périodiquement des mises à jour ou de
+nouvelles versions du Contrat, qui posséderont chacune un numéro
+distinct. Ces versions ultérieures seront susceptibles de prendre en
+compte de nouvelles problématiques rencontrées par les logiciels libres.
+
+12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra
+faire l'objet d'une diffusion ultérieure que sous la même version du
+Contrat ou une version postérieure, sous réserve des dispositions de
+l'article 5.3.4.
+
+
+ Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE
+
+13.1 Le Contrat est régi par la loi française. Les Parties conviennent
+de tenter de régler à l'amiable les différends ou litiges qui
+viendraient à se produire par suite ou à l'occasion du Contrat.
+
+13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter
+de leur survenance et sauf situation relevant d'une procédure d'urgence,
+les différends ou litiges seront portés par la Partie la plus diligente
+devant les Tribunaux compétents de Paris.
+
+
+Version 2.0 du 2006-09-05.
--- /dev/null
+PACKAGE = eztelemeta
+VERSION = 0.1
+
+DOCS = VERSION ChangeLog doc/README.fr doc/README.fr.html doc/doc.css doc/README.fr.latex \
+ doc/README.fr.pdf doc/player.png LICENCE LICENCE.fr
+
+SETTINGS = \
+ settings/content.ini.append \
+ settings/design.ini.append \
+ settings/site.ini.append \
+ settings/override.ini.append
+
+TEMPLATES = \
+ design/standard/templates/content/datatype/view/eztelemetaitem.tpl \
+ design/standard/templates/content/datatype/edit/eztelemetaitem.tpl \
+ design/standard/templates/eztelemeta_head.tpl \
+ design/standard/override/templates/embed/eztelemetaitem.tpl \
+ design/standard/override/templates/full/eztelemetaitem.tpl
+
+HTDOCS = \
+ design/standard/stylesheets/eztelemeta.css \
+ design/standard/javascript/soundmanager2.js \
+ design/standard/javascript/soundmanager2-nodebug-jsmin.js \
+ design/standard/javascript/eztelemeta-player.js \
+ design/standard/swf/soundmanager2_flash9.swf \
+ design/standard/swf/soundmanager2.swf \
+ design/standard/images/play.gif \
+ design/standard/images/stop.gif
+
+PHP = datatypes/eztelemetaitem/eztelemetaitemtype.php \
+ autoloads/eztelemetadata.php \
+ autoloads/eztemplateautoload.php
+
+I18N = translations/fre-FR/translation.ts
+
+DISTFILES = $(DOCS) $(SETTINGS) $(TEMPLATES) $(HTDOCS) $(PHP) $(I18N)
+
+DISTPKG = $(PACKAGE)-$(VERSION).tar.gz
+
+dist: $(DISTPKG)
+
+$(DISTPKG): doc $(DISTFILES)
+ tar -czf $@ --transform 's|^|eztelemeta/|' $(DISTFILES)
+
+.PHONY: doc
+doc: VERSION
+ $(MAKE) -C doc
+
+.PHONY: clean
+clean:
+ $(MAKE) -C doc clean
+ rm VERSION
+
+VERSION:
+ echo $(VERSION) > $@
+
+.PHONY: list
+list: doc $(DISTFILES)
+ @echo "------------------"
+ @echo "Distributed files:"
+ @echo "------------------"
+ @echo $(DISTFILES) | tr ' ' '\n' > cmp.tmp
+ @cat cmp.tmp
+ @echo
+ @echo "--------------------"
+ @echo "Undistributed files:"
+ @echo "--------------------"
+ @find -type f | grep -v svn | grep -v 'swp$$' | sed 's/^\.\///' >> cmp.tmp
+ @cat cmp.tmp | sort | uniq -u | grep -v 'cmp.tmp'
+ @rm cmp.tmp
+
+# vim: set noexpandtab: ts=2: sw=2:
--- /dev/null
+<?php
+/*
+ * eZTelemeta page data handling
+ *
+ * Note: this is a simplified version of the eZPageData utility from ezwebin (GPL)
+ *
+ * Copyright (c) 1999-2009 eZ Systems AS, 2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: CeCILL Free Software License Agreement
+ */
+
+/*
+ Template operator to speed up page settings and style init time
+ Gets its parameters directly from template.
+ module_result.path | content_info | persistant_variable | menu.ini ++
+ are all used to generate page data, what menues to show
+ and so on.
+
+*/
+
+class eZTelemetaData
+{
+ function eZTelemetaData()
+ {
+ }
+
+ function operatorList()
+ {
+ return array( 'eztelemetadata_set', 'eztelemetadata_append' );
+ }
+
+ function namedParameterPerOperator()
+ {
+ return true;
+ }
+
+ function namedParameterList()
+ {
+ return array( 'eztelemetadata_set' => array(
+ 'key' => array( 'type' => 'string',
+ 'required' => true,
+ 'default' => false ),
+ 'value' => array( 'type' => 'mixed',
+ 'required' => true,
+ 'default' => false ) ),
+ 'eztelemetadata_append' => array(
+ 'key' => array( 'type' => 'string',
+ 'required' => true,
+ 'default' => false ),
+ 'value' => array( 'type' => 'mixed',
+ 'required' => true,
+ 'default' => false ) ) );
+ }
+
+ function modify( $tpl, $operatorName, $operatorParameters, $rootNamespace, $currentNamespace, &$operatorValue, $namedParameters )
+ {
+ switch ( $operatorName )
+ {
+ // note: these functions are not cache-block safe
+ // as in: if called inside a cache-block then they will not be called when cache is used.
+ case 'eztelemetadata_set':
+ case 'eztelemetadata_append':
+ {
+ self::setPersistentVariable( $namedParameters['key'], $namedParameters['value'], $tpl, $operatorName === 'eztelemetadata_append' );
+ }break;
+ }
+ }
+
+ // reusable function for setting persistent_variable
+ static public function setPersistentVariable( $key, $value, $tpl, $append = false )
+ {
+ $persistentVariable = array();
+ if ( $tpl->hasVariable('persistent_variable') && is_array( $tpl->variable('persistent_variable') ) )
+ {
+ $persistentVariable = $tpl->variable('persistent_variable');
+ }
+ else if ( self::$persistentVariable !== null && is_array( self::$persistentVariable ) )
+ {
+ $persistentVariable = self::$persistentVariable;
+ }
+
+ if ( $append )
+ {
+ if ( isset( $persistentVariable[ $key ] ) && is_array( $persistentVariable[ $key ] ) )
+ {
+ $persistentVariable[ $key ][] = $value;
+ }
+ else
+ {
+ $persistentVariable[ $key ] = array( $value );
+ }
+ }
+ else
+ {
+ $persistentVariable[ $key ] = $value;
+ }
+
+ // set the finnished array in the template
+ $tpl->setVariable('persistent_variable', $persistentVariable);
+
+ // storing the value internally as well in case this is not a view that supports persistent_variable (eztelemetadata will look for it)
+ self::$persistentVariable = $persistentVariable;
+ }
+
+ // reusable function for getting persistent_variable
+ static public function getPersistentVariable( $key = null )
+ {
+ if ( $key !== null )
+ {
+ if ( isset( self::$persistentVariable[ $key ] ) )
+ return self::$persistentVariable[ $key ];
+ return null;
+ }
+ return self::$persistentVariable;
+ }
+
+ // Internal version of the $persistent_variable used on view that don't support it
+ static protected $persistentVariable = null;
+
+}
+
+?>
--- /dev/null
+<?php
+/*
+ * eZTelemeta page data handling
+ *
+ * Copyright (c) 2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: CeCILL Free Software License Agreement
+ */
+
+$eZTemplateOperatorArray = array();
+$eZTemplateOperatorArray[] = array( 'script' => 'extension/eztelemeta/autoloads/eztelemetadata.php',
+ 'class' => 'eZTelemetaData',
+ 'operator_names' => array( 'eztelemetadata_set', 'eztelemetadata_append' ) );
+?>
--- /dev/null
+<?php
+/**
+ * Definition of the Telemeta Item datatype
+ *
+ * @package eztelemeta
+ * @author Olivier Guilyardi <olivier samalyse com>
+ * @copyright 2009 Samalyse
+ * @license CeCILL Free Software License Agreement
+ */
+
+/**
+ * Class definining the Telemeta Item datatype
+ *
+ * @package eztelemeta
+ * @author Olivier Guilyardi
+ * @copyright 2009 Samalyse
+ * @license CeCILL Free Software License Agreement
+ */
+class eZTelemetaItemType extends eZDataType
+{
+ const DATA_TYPE_STRING = 'eztelemetaitem';
+
+ public function __construct()
+ {
+ parent::__construct(self::DATA_TYPE_STRING, 'Telemeta Item');
+ }
+
+ function validateObjectAttributeHTTPInput($http, $base, $attribute)
+ {
+ $idvar = "{$base}_itemid_" . $attribute->attribute('id');
+ $urlvar = "{$base}_url_" . $attribute->attribute('id');
+ if ($http->hasPostVariable($idvar)) {
+ $itemId = trim($http->postVariable($idvar));
+ $url = trim($http->postVariable($urlvar));
+ $classAttribute = $attribute->contentClassAttribute();
+ if ($classAttribute->attribute("is_required")) {
+ if (!$itemId) {
+ $attribute->setValidationError(ezi18n('content/datatypes',
+ "A valid Telemeta Item identifier is required",
+ __CLASS__));
+ return eZInputValidator::STATE_INVALID;
+ }
+ if (!$url) {
+ $attribute->setValidationError(ezi18n('content/datatypes',
+ "A valid Telemeta URL is required",
+ __CLASS__));
+ return eZInputValidator::STATE_INVALID;
+ }
+ }
+ $item = $this->initItem($url, $itemId);
+ try {
+ $this->fetchItem($item);
+ } catch (eZTelemetaError $e) {
+ $attribute->setValidationError(ezi18n('content/datatypes', $e->getMessage(), __CLASS__));
+ return eZInputValidator::STATE_INVALID;
+ }
+ }
+ return eZInputValidator::STATE_ACCEPTED;
+ }
+
+ function initItem($url, $itemId)
+ {
+ return array(
+ 'id' => $itemId,
+ 'url' => $url,
+ 'title' => '',
+ 'creator' => '',
+ 'description' => '',
+ 'rights' => '',
+ 'mp3' => '',
+ 'duration' => 0,
+ 'duration_str' => ''
+ );
+ }
+
+ function fetchItem($item)
+ {
+ $url = $item['url'];
+ if (!ereg('^http://', $url)) {
+ $url = "http://$url";
+ }
+ $url = ereg_replace('/*$', '', $url);
+ $encodedId = urlencode($item['id']);
+ $request = "$url/oai/?verb=GetRecord&identifier=item:$encodedId&metadataPrefix=oai_dc";
+
+ $doc = new DOMDocument();
+ if (!@$doc->load($request)) {
+ throw new eZTelemetaError("The Telemeta server couldn't be reached or returned malformed XML (request: $request)");
+ }
+
+ $root = $doc->getElementsByTagName('OAI-PMH');
+ if (!$root->length)
+ throw new eZTelemetaError("Retrieved XML document isn't a valid OAI-PMH response");
+
+ $root = $root->item(0);
+ $error = $root->getElementsByTagName('error');
+ if ($error->length) {
+ $msg = $error->item(0)->firstChild->nodeValue;
+ throw new eZTelemetaError("Telemeta OAI-PMH error: $msg");
+ }
+
+ $record = $root->getElementsByTagName('GetRecord');
+ if (!$record->length) {
+ throw new eZTelemetaError("Retrieved XML document isn't a valid OAI-PMH response (missing GetRecord tag)");
+ }
+
+ $dc = $record->item(0)->getElementsByTagNameNS('*', 'dc')->item(0);
+ $result = $this->initItem($item['url'], $item['id']);
+ foreach ($dc->childNodes as $element) {
+ if ($element->nodeType == XML_ELEMENT_NODE) {
+ $tag = str_replace('dc:', '', $element->tagName);
+ $value = $element->childNodes->length ? trim($element->firstChild->nodeValue) : '';
+ if ($tag == 'format' and ereg('^([0-9]{2}):([0-9]{2}):([0-9]{2})$', $value, $regs)) {
+ $tag = 'duration';
+ $value = $regs[1] * 3600 + $regs[2] * 60 + $regs[3];
+ }
+ if (array_key_exists($tag, $result) and empty($result[$tag])) {
+ $result[$tag] = $value;
+ }
+ }
+ }
+
+ if (!$result['title']) {
+ throw new eZTelemetaError("The retrieved item has no title");
+ }
+
+ if ($result['duration']) {
+ $d = $result['duration'];
+ $result['duration_str'] = sprintf("%02d:%02d:%02d", $d / 3600, $d % 3600 / 60, $d % 3600 % 60);
+ } else {
+ throw new eZTelemetaError("The retrieved item has no duration (no sound file?)");
+ }
+
+ $result['mp3'] = "$url/items/download/$encodedId.mp3";
+
+ return array_merge($item, $result);
+ }
+
+ function fetchObjectAttributeHTTPInput($http, $base, $attribute)
+ {
+ $idvar = "{$base}_itemid_" . $attribute->attribute('id');
+ $urlvar = "{$base}_url_" . $attribute->attribute('id');
+ if ($http->hasPostVariable($idvar)) {
+ $itemId = trim($http->postVariable($idvar));
+ $url = trim($http->postVariable($urlvar));
+ $item = $this->initItem($url, $itemId);
+ try {
+ $item = $this->fetchItem($item);
+ } catch (eZTelemetaError $e) {
+ }
+ $attribute->setAttribute("data_text", serialize($item));
+ }
+ return true;
+ }
+
+ function objectAttributeContent($attribute)
+ {
+ $item = unserialize($attribute->attribute("data_text"));
+ try {
+ $filled = $this->fetchItem($item);
+ return $filled;
+ } catch (eZTelemetaError $e) {
+ return $item;
+ }
+ }
+
+ function metaData($attribute)
+ {
+ $data = unserialize($attribute->attribute("data_text"));
+ $words = array();
+ $src = $data['title'] . ' ' . $data['description'];
+ $cut = split('[ =+()[{}_,.:;\\/"\'*#%!?&-]+', $src);
+ foreach ($cut as $w) {
+ if (strlen($w) >= 3) {
+ $words[] = $w;
+ }
+ }
+ $words = join(" ", $words);
+ file_put_contents("/tmp/c{$data['id']}", $words);
+ return $words;
+ }
+
+ function title($attribute, $name = null)
+ {
+ $item = $this->objectAttributeContent($attribute);
+ if (!$item['title'])
+ return 'untitled';
+ return $item['title'];
+ }
+
+ function isIndexable()
+ {
+ return true;
+ }
+
+}
+
+class eZTelemetaError extends ezcBaseException
+{
+ public function __construct($msg)
+ {
+ parent::__construct($msg);
+ }
+
+}
+
+eZDataType::register(eZTelemetaItemType::DATA_TYPE_STRING, "eztelemetaitemtype");
--- /dev/null
+/*
+ * eZTelemeta web audio player
+ *
+ * Copyright (c) 2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: CeCILL Free Software License Agreement
+ */
+
+function TelemetaPlayer(cfg)
+{
+ var that = this;
+ var soundManager = null;
+ var sound = null;
+ var currentLink = null;
+
+ this.init = function() {
+ var sounds = this.byClass(document, 'dd', 'telemeta-sound');
+ var i;
+ for (i in sounds) {
+ if (typeof(sounds[i].getElementsByTagName) != 'undefined') {
+ link = sounds[i].getElementsByTagName('a')[0];
+ link.onclick = this.togglePlayback;
+ }
+ }
+ }
+
+ this.findContainer = function(link) {
+ var e = link;
+ while (e) {
+ e = e.parentNode;
+ if (this.hasClass(e, 'telemeta-item'))
+ break;
+ if (e == document)
+ e = null;
+ }
+ return e;
+ }
+
+ this.setStateStyle = function(link, state) {
+ var container = this.findContainer(link);
+ if (state == 'stopped') {
+ if (this.hasClass(container, 'telemeta-playing'))
+ container.className = container.className.replace('telemeta-playing', '');
+ }
+
+ if (state == 'stopped' || state == 'playing') {
+ if (this.hasClass(container, 'telemeta-loading'))
+ container.className = container.className.replace('telemeta-loading', '');
+ }
+
+ if (state == 'playing' || state == 'loading') {
+ if (!this.hasClass(container, 'telemeta-playing'))
+ container.className += ' telemeta-playing';
+ if (state == 'loading') {
+ if (!this.hasClass(container, 'telemeta-loading'))
+ container.className += ' telemeta-loading';
+ }
+ }
+ }
+
+ this.togglePlayback = function() {
+ var link = this;
+ if (that.soundManager) {
+ if (that.sound)
+ that.sound.stop();
+ if (that.currentLink) {
+ that.setStateStyle(that.currentLink, 'stopped');
+ that.updatePosition(0);
+ }
+ if (!that.currentLink || that.currentLink != link) {
+ that.sound = that.soundManager.createSound({
+ id: 'telemeta_sound',
+ url: link.href,
+ whileplaying: function() { that.update(); },
+ onbufferchange: function() { that.update(); }
+ });
+ that.currentLink = link;
+ that.sound.play();
+ that.setStateStyle(link, 'loading');
+ that.updatePosition(0);
+ } else {
+ that.currentLink = null;
+ }
+ }
+ return false;
+ }
+
+ this.updatePosition = function(position)
+ {
+ var container = that.findContainer(that.currentLink)
+ var positionContainer = that.byClass(container, 'span', 'telemeta-position')[0];
+
+ function format(i) { i = '' + parseInt(i); return i.length < 2 ? '0' + i : i; }
+
+ var hours = format(position / 3600);
+ var mins = format(position % 3600 / 60);
+ var secs = format(position % 3600 % 60);
+ positionContainer.firstChild.nodeValue = hours + ':' + mins + ':' + secs;
+ }
+
+ this.update = function()
+ {
+ that.updatePosition(that.sound.position / 1000);
+ if (that.sound.isBuffering) {
+ that.setStateStyle(that.currentLink, 'loading');
+ } else {
+ that.setStateStyle(that.currentLink, 'playing');
+ }
+ }
+
+ this.hasClass = function(element, className) {
+ if (typeof(element.className) != 'undefined')
+ return new RegExp('(^|\\s)' + className + '(\\s|$)').test(element.className);
+
+ return false;
+ }
+
+ this.byClass = function(root, tag, className) {
+ var result = [];
+ var nodes = root.getElementsByTagName(tag);
+ var i;
+ for (i = 0; i < nodes.length; i++) {
+ if (this.hasClass(nodes[i], className))
+ result.push(nodes[i]);
+ }
+ return result;
+ }
+
+ this.setSoundManager = function(soundManager) {
+ this.soundManager = soundManager;
+ }
+
+ TelemetaDom.ready(function() { that.init(cfg); });
+}
+
+(function(){
+
+ var DomReady = window.TelemetaDom = {};
+
+ // Everything that has to do with properly supporting our document ready event. Brought over from the most awesome jQuery.
+
+ var userAgent = navigator.userAgent.toLowerCase();
+
+ // Figure out what browser is being used
+ var browser = {
+ version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
+ safari: /webkit/.test(userAgent),
+ opera: /opera/.test(userAgent),
+ msie: (/msie/.test(userAgent)) && (!/opera/.test( userAgent )),
+ mozilla: (/mozilla/.test(userAgent)) && (!/(compatible|webkit)/.test(userAgent))
+ };
+
+ var readyBound = false;
+ var isReady = false;
+ var readyList = [];
+
+ // Handle when the DOM is ready
+ function domReady() {
+ // Make sure that the DOM is not already loaded
+ if(!isReady) {
+ // Remember that the DOM is ready
+ isReady = true;
+
+ if(readyList) {
+ for(var fn = 0; fn < readyList.length; fn++) {
+ readyList[fn].call(window, []);
+ }
+
+ readyList = [];
+ }
+ }
+ };
+
+ // From Simon Willison. A safe way to fire onload w/o screwing up everyone else.
+ function addLoadEvent(func) {
+ var oldonload = window.onload;
+ if (typeof window.onload != 'function') {
+ window.onload = func;
+ } else {
+ window.onload = function() {
+ if (oldonload) {
+ oldonload();
+ }
+ func();
+ }
+ }
+ };
+
+ // does the heavy work of working through the browsers idiosyncracies (let's call them that) to hook onload.
+ function bindReady() {
+ if(readyBound) {
+ return;
+ }
+
+ readyBound = true;
+
+ // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
+ if (document.addEventListener && !browser.opera) {
+ // Use the handy event callback
+ document.addEventListener("DOMContentLoaded", domReady, false);
+ }
+
+ // If IE is used and is not in a frame
+ // Continually check to see if the document is ready
+ if (browser.msie && window == top) (function(){
+ if (isReady) return;
+ try {
+ // If IE is used, use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ document.documentElement.doScroll("left");
+ } catch(error) {
+ setTimeout(arguments.callee, 0);
+ return;
+ }
+ // and execute any waiting functions
+ domReady();
+ })();
+
+ if(browser.opera) {
+ document.addEventListener( "DOMContentLoaded", function () {
+ if (isReady) return;
+ for (var i = 0; i < document.styleSheets.length; i++)
+ if (document.styleSheets[i].disabled) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ // and execute any waiting functions
+ domReady();
+ }, false);
+ }
+
+ if(browser.safari) {
+ var numStyles;
+ (function(){
+ if (isReady) return;
+ if (document.readyState != "loaded" && document.readyState != "complete") {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+ if (numStyles === undefined) {
+ var links = document.getElementsByTagName("link");
+ for (var i=0; i < links.length; i++) {
+ if(links[i].getAttribute('rel') == 'stylesheet') {
+ numStyles++;
+ }
+ }
+ var styles = document.getElementsByTagName("style");
+ numStyles += styles.length;
+ }
+ if (document.styleSheets.length != numStyles) {
+ setTimeout( arguments.callee, 0 );
+ return;
+ }
+
+ // and execute any waiting functions
+ domReady();
+ })();
+ }
+
+ // A fallback to window.onload, that will always work
+ addLoadEvent(domReady);
+ };
+
+ // This is the public function that people can use to hook up ready.
+ DomReady.ready = function(fn, args) {
+ // Attach the listeners
+ bindReady();
+
+ // If the DOM is already ready
+ if (isReady) {
+ // Execute the function immediately
+ fn.call(window, []);
+ } else {
+ // Add the function to the wait list
+ readyList.push( function() { return fn.call(window, []); } );
+ }
+ };
+
+ bindReady();
+
+})();
--- /dev/null
+/*\r
+ SoundManager 2: Javascript Sound for the Web\r
+ --------------------------------------------\r
+ http://schillmania.com/projects/soundmanager2/\r
+\r
+ Copyright (c) 2008, Scott Schiller. All rights reserved.\r
+ Code licensed under the BSD License:\r
+ http://schillmania.com/projects/soundmanager2/license.txt\r
+\r
+ V2.94a.20090206\r
+*/\r
+var soundManager=null;function SoundManager(b,a){this.flashVersion=8;this.debugMode=true;this.useConsole=true;this.consoleOnly=false;this.waitForWindowLoad=false;this.nullURL="null.mp3";this.allowPolling=true;this.useMovieStar=false;this.bgColor="#ffffff";this.useHighPerformance=false;this.flashLoadTimeout=750;this.defaultOptions={autoLoad:false,stream:true,autoPlay:false,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onstop:null,onfinish:null,onbeforefinish:null,onbeforefinishtime:5000,onbeforefinishcomplete:null,onjustbeforefinish:null,onjustbeforefinishtime:200,multiShot:true,position:null,pan:0,volume:100};this.flash9Options={onbufferchange:null,isMovieStar:null,usePeakData:false,useWaveformData:false,useEQData:false};this.movieStarOptions={onmetadata:null,useVideo:false};var f=null;var e=this;this.version=null;this.versionNumber="V2.94a.20090206";this.movieURL=null;this.url=null;this.altURL=null;this.swfLoaded=false;this.enabled=false;this.o=null;this.id=(a||"sm2movie");this.oMC=null;this.sounds={};this.soundIDs=[];this.muted=false;this.wmode=null;this.isIE=(navigator.userAgent.match(/MSIE/i));this.isSafari=(navigator.userAgent.match(/safari/i));this.isGecko=(navigator.userAgent.match(/gecko/i));this.debugID="soundmanager-debug";this._debugOpen=true;this._didAppend=false;this._appendSuccess=false;this._didInit=false;this._disabled=false;this._windowLoaded=false;this._hasConsole=(typeof console!="undefined"&&typeof console.log!="undefined");this._debugLevels=["log","info","warn","error"];this._defaultFlashVersion=8;this._oRemoved=null;this._oRemovedHTML=null;var g=function(h){return document.getElementById(h)};this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.netStreamTypes=["aac","flv","mov","mp4","m4v","f4v","m4a","mp4v","3gp","3g2"];this.netStreamPattern=new RegExp("\\.("+this.netStreamTypes.join("|")+")(\\?.*)?$","i");this.filePattern=null;this.features={buffering:false,peakData:false,waveformData:false,eqData:false,movieStar:false};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local + internet access)"},description:null,noRemote:null,noLocal:null};this._setVersionInfo=function(){if(e.flashVersion!=8&&e.flashVersion!=9){alert('soundManager.flashVersion must be 8 or 9. "'+e.flashVersion+'" is invalid. Reverting to '+e._defaultFlashVersion+".");e.flashVersion=e._defaultFlashVersion}e.version=e.versionNumber+(e.flashVersion==9?" (AS3/Flash 9)":" (AS2/Flash 8)");if(e.flashVersion>8){e.defaultOptions=e._mergeObjects(e.defaultOptions,e.flash9Options);e.features.buffering=true}if(e.flashVersion>8&&e.useMovieStar){e.defaultOptions=e._mergeObjects(e.defaultOptions,e.movieStarOptions);e.filePatterns.flash9=new RegExp("\\.(mp3|"+e.netStreamTypes.join("|")+")(\\?.*)?$","i");e.features.movieStar=true}else{e.useMovieStar=false;e.features.movieStar=false}e.filePattern=e.filePatterns[(e.flashVersion!=8?"flash9":"flash8")];e.movieURL=(e.flashVersion==8?"soundmanager2.swf":"soundmanager2_flash9.swf");e.features.peakData=e.features.waveformData=e.features.eqData=(e.flashVersion==9)};this._overHTTP=(document.location?document.location.protocol.match(/http/i):null);this._waitingforEI=false;this._initPending=false;this._tryInitOnFocus=(this.isSafari&&typeof document.hasFocus=="undefined");this._isFocused=(typeof document.hasFocus!="undefined"?document.hasFocus():null);this._okToDisable=!this._tryInitOnFocus;this.useAltURL=!this._overHTTP;var d="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html";this.supported=function(){return(e._didInit&&!e._disabled)};this.getMovie=function(h){return e.isIE?window[h]:(e.isSafari?g(h)||document[h]:g(h))};this.loadFromXML=function(h){try{e.o._loadFromXML(h)}catch(i){e._failSafely();return true}};this.createSound=function(i){if(!e._didInit){throw new Error("soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods")}if(arguments.length==2){i={id:arguments[0],url:arguments[1]}}var j=e._mergeObjects(i);var h=j;if(e._idCheck(h.id,true)){return e.sounds[h.id]}if(e.flashVersion>8&&e.useMovieStar){if(h.isMovieStar===null){h.isMovieStar=(h.url.match(e.netStreamPattern)?true:false)}if(h.isMovieStar&&(h.usePeakData||h.useWaveformData||h.useEQData)){h.usePeakData=false;h.useWaveformData=false;h.useEQData=false}}e.sounds[h.id]=new f(h);e.soundIDs[e.soundIDs.length]=h.id;if(e.flashVersion==8){e.o._createSound(h.id,h.onjustbeforefinishtime)}else{e.o._createSound(h.id,h.url,h.onjustbeforefinishtime,h.usePeakData,h.useWaveformData,h.useEQData,h.isMovieStar,(h.isMovieStar?h.useVideo:false))}if(h.autoLoad||h.autoPlay){if(e.sounds[h.id]){e.sounds[h.id].load(h)}}if(h.autoPlay){e.sounds[h.id].play()}return e.sounds[h.id]};this.createVideo=function(h){if(arguments.length==2){h={id:arguments[0],url:arguments[1]}}if(e.flashVersion>=9){h.isMovieStar=true;h.useVideo=true}else{return false}return e.createSound(h)};this.destroySound=function(j,h){if(!e._idCheck(j)){return false}for(var k=0;k<e.soundIDs.length;k++){if(e.soundIDs[k]==j){e.soundIDs.splice(k,1);continue}}e.sounds[j].unload();if(!h){e.sounds[j].destruct()}delete e.sounds[j]};this.destroyVideo=this.destroySound;this.load=function(h,i){if(!e._idCheck(h)){return false}e.sounds[h].load(i)};this.unload=function(h){if(!e._idCheck(h)){return false}e.sounds[h].unload()};this.play=function(h,i){if(!e._idCheck(h)){if(typeof i!="Object"){i={url:i}}if(i&&i.url){i.id=h;e.createSound(i)}else{return false}}e.sounds[h].play(i)};this.start=this.play;this.setPosition=function(h,i){if(!e._idCheck(h)){return false}e.sounds[h].setPosition(i)};this.stop=function(h){if(!e._idCheck(h)){return false}e.sounds[h].stop()};this.stopAll=function(){for(var h in e.sounds){if(e.sounds[h] instanceof f){e.sounds[h].stop()}}};this.pause=function(h){if(!e._idCheck(h)){return false}e.sounds[h].pause()};this.pauseAll=function(){for(var h=e.soundIDs.length;h--;){e.sounds[e.soundIDs[h]].pause()}};this.resume=function(h){if(!e._idCheck(h)){return false}e.sounds[h].resume()};this.resumeAll=function(){for(var h=e.soundIDs.length;h--;){e.sounds[e.soundIDs[h]].resume()}};this.togglePause=function(h){if(!e._idCheck(h)){return false}e.sounds[h].togglePause()};this.setPan=function(h,i){if(!e._idCheck(h)){return false}e.sounds[h].setPan(i)};this.setVolume=function(i,h){if(!e._idCheck(i)){return false}e.sounds[i].setVolume(h)};this.mute=function(h){if(typeof h!="string"){h=null}if(!h){for(var j=e.soundIDs.length;j--;){e.sounds[e.soundIDs[j]].mute()}e.muted=true}else{if(!e._idCheck(h)){return false}e.sounds[h].mute()}};this.muteAll=function(){e.mute()};this.unmute=function(h){if(typeof h!="string"){h=null}if(!h){for(var j=e.soundIDs.length;j--;){e.sounds[e.soundIDs[j]].unmute()}e.muted=false}else{if(!e._idCheck(h)){return false}e.sounds[h].unmute()}};this.unmuteAll=function(){e.unmute()};this.getMemoryUse=function(){if(e.flashVersion==8){return 0}if(e.o){return parseInt(e.o._getMemoryUse(),10)}};this.setPolling=function(h){if(!e.o||!e.allowPolling){return false}e.o._setPolling(h)};this.disable=function(j){if(typeof j=="undefined"){j=false}if(e._disabled){return false}e._disabled=true;for(var h=e.soundIDs.length;h--;){e._disableObject(e.sounds[e.soundIDs[h]])}e.initComplete(j)};this.canPlayURL=function(h){return(h?(h.match(e.filePattern)?true:false):null)};this.getSoundById=function(i,j){if(!i){throw new Error("SoundManager.getSoundById(): sID is null/undefined")}var h=e.sounds[i];return h};this.onload=function(){soundManager._wD("<em>Warning</em>: soundManager.onload() is undefined.",2)};this.onerror=function(){};this._idCheck=this.getSoundById;var c=function(){return false};c._protected=true;this._disableObject=function(i){for(var h in i){if(typeof i[h]=="function"&&typeof i[h]._protected=="undefined"){i[h]=c}}h=null};this._failSafely=function(h){if(typeof h=="undefined"){h=false}if(!e._disabled||h){e.disable(h)}};this._normalizeMovieURL=function(h){var i=null;if(h){if(h.match(/\.swf(\?.*)?$/i)){i=h.substr(h.toLowerCase().lastIndexOf(".swf?")+4);if(i){return h}}else{if(h.lastIndexOf("/")!=h.length-1){h=h+"/"}}}return(h&&h.lastIndexOf("/")!=-1?h.substr(0,h.lastIndexOf("/")+1):"./")+e.movieURL};this._getDocument=function(){return(document.body?document.body:(document.documentElement?document.documentElement:document.getElementsByTagName("div")[0]))};this._getDocument._protected=true;this._createMovie=function(n,l){if(e._didAppend&&e._appendSuccess){return false}if(window.location.href.indexOf("debug=1")+1){e.debugMode=true}e._didAppend=true;e._setVersionInfo();var u=(l?l:e.url);var k=(e.altURL?e.altURL:u);e.url=e._normalizeMovieURL(e._overHTTP?u:k);l=e.url;var m=null;if(e.useHighPerformance&&e.useMovieStar){m="Note: disabling highPerformance, not applicable with movieStar mode on";e.useHighPerformance=false}e.wmode=(e.useHighPerformance&&!e.useMovieStar?"transparent":"");var t={name:n,id:n,src:l,width:"100%",height:"100%",quality:"high",allowScriptAccess:"always",bgcolor:e.bgColor,pluginspage:"http://www.macromedia.com/go/getflashplayer",type:"application/x-shockwave-flash",wmode:e.wmode};var w={id:n,data:l,type:"application/x-shockwave-flash",width:"100%",height:"100%",wmode:e.wmode};var o={movie:l,AllowScriptAccess:"always",quality:"high",bgcolor:e.bgColor,wmode:e.wmode};var j=null;var r=null;if(e.isIE){j=document.createElement("div");var h='<object id="'+n+'" data="'+l+'" type="application/x-shockwave-flash" width="100%" height="100%"><param name="movie" value="'+l+'" /><param name="AllowScriptAccess" value="always" /><param name="quality" value="high" />'+(e.useHighPerformance&&!e.useMovieStar?'<param name="wmode" value="'+e.wmode+'" /> ':"")+'<param name="bgcolor" value="'+e.bgColor+'" /><!-- --></object>'}else{j=document.createElement("embed");for(r in t){if(t.hasOwnProperty(r)){j.setAttribute(r,t[r])}}}var q="soundManager._createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.";var i=e._getDocument();if(i){e.oMC=g("sm2-container")?g("sm2-container"):document.createElement("div");if(!e.oMC.id){e.oMC.id="sm2-container";e.oMC.className="movieContainer";var z=null;var p=null;if(e.useHighPerformance){z={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px"}}else{z={position:"absolute",width:"1px",height:"1px",top:"-999px",left:"-999px"}}var y=null;for(y in z){if(z.hasOwnProperty(y)){e.oMC.style[y]=z[y]}}try{if(!e.isIE){e.oMC.appendChild(j)}i.appendChild(e.oMC);if(e.isIE){p=e.oMC.appendChild(document.createElement("div"));p.className="sm2-object-box";p.innerHTML=h}e._appendSuccess=true}catch(v){throw new Error(q)}}else{e.oMC.appendChild(j);if(e.isIE){p=e.oMC.appendChild(document.createElement("div"));p.className="sm2-object-box";p.innerHTML=h}e._appendSuccess=true}}};this._writeDebug=function(h,j,i){};this._writeDebug._protected=true;this._wdCount=0;this._wdCount._protected=true;this._wD=this._writeDebug;this._toggleDebug=function(){};this._toggleDebug._protected=true;this._debug=function(){};this._debugTS=function(j,h,i){};this._debugTS._protected=true;this._mergeObjects=function(j,h){var m={};for(var k in j){if(j.hasOwnProperty(k)){m[k]=j[k]}}var l=(typeof h=="undefined"?e.defaultOptions:h);for(var n in l){if(l.hasOwnProperty(n)&&typeof m[n]=="undefined"){m[n]=l[n]}}return m};this.createMovie=function(h){if(h){e.url=h}e._initMovie()};this.go=this.createMovie;this._initMovie=function(){if(e.o){return false}e.o=e.getMovie(e.id);if(!e.o){if(!e.oRemoved){e._createMovie(e.id,e.url)}else{if(!e.isIE){e.oMC.appendChild(e.oRemoved)}else{e.oMC.innerHTML=e.oRemovedHTML}e.oRemoved=null;e._didAppend=true}e.o=e.getMovie(e.id)}};this.waitForExternalInterface=function(){if(e._waitingForEI){return false}e._waitingForEI=true;if(e._tryInitOnFocus&&!e._isFocused){return false}if(e.flashLoadTimeout>0){setTimeout(function(){if(!e._didInit&&e._okToDisable){e._failSafely(true)}},e.flashLoadTimeout)}};this.handleFocus=function(){if(e._isFocused||!e._tryInitOnFocus){return true}e._okToDisable=true;e._isFocused=true;if(e._tryInitOnFocus){window.removeEventListener("mousemove",e.handleFocus,false)}e._waitingForEI=false;setTimeout(e.waitForExternalInterface,500);if(window.removeEventListener){window.removeEventListener("focus",e.handleFocus,false)}else{if(window.detachEvent){window.detachEvent("onfocus",e.handleFocus)}}};this.initComplete=function(h){if(e._didInit){return false}e._didInit=true;if(e._disabled||h){e.onerror.apply(window);return false}else{}if(e.waitForWindowLoad&&!e._windowLoaded){if(window.addEventListener){window.addEventListener("load",e.initUserOnload,false)}else{if(window.attachEvent){window.attachEvent("onload",e.initUserOnload)}}return false}else{e.initUserOnload()}};this.initUserOnload=function(){e.onload.apply(window)};this.init=function(){e._initMovie();if(e._didInit){return false}if(window.removeEventListener){window.removeEventListener("load",e.beginDelayedInit,false)}else{if(window.detachEvent){window.detachEvent("onload",e.beginDelayedInit)}}try{e.o._externalInterfaceTest(false);e.setPolling(true);if(!e.debugMode){e.o._disableDebug()}e.enabled=true}catch(h){e._failSafely(true);e.initComplete();return false}e.initComplete()};this.beginDelayedInit=function(){e._windowLoaded=true;setTimeout(e.waitForExternalInterface,500);setTimeout(e.beginInit,20)};this.beginInit=function(){if(e._initPending){return false}e.createMovie();e._initMovie();e._initPending=true;return true};this.domContentLoaded=function(){if(document.removeEventListener){document.removeEventListener("DOMContentLoaded",e.domContentLoaded,false)}e.go()};this._externalInterfaceOK=function(){if(e.swfLoaded){return false}e.swfLoaded=true;e._tryInitOnFocus=false;if(e.isIE){setTimeout(e.init,100)}else{e.init()}};this._setSandboxType=function(h){var i=e.sandbox;i.type=h;i.description=i.types[(typeof i.types[h]!="undefined"?h:"unknown")];if(i.type=="localWithFile"){i.noRemote=true;i.noLocal=false}else{if(i.type=="localWithNetwork"){i.noRemote=false;i.noLocal=true}else{if(i.type=="localTrusted"){i.noRemote=false;i.noLocal=false}}}};this.reboot=function(){if(e.soundIDs.length){}for(var h=e.soundIDs.length;h--;){e.sounds[e.soundIDs[h]].destruct()}try{if(e.isIE){e.oRemovedHTML=e.o.innerHTML}e.oRemoved=e.o.parentNode.removeChild(e.o)}catch(j){}e.enabled=false;e._didInit=false;e._waitingForEI=false;e._initPending=false;e._didInit=false;e._didAppend=false;e._appendSuccess=false;e._didInit=false;e._disabled=false;e._waitingforEI=true;e.swfLoaded=false;e.soundIDs={};e.sounds=[];e.o=null;window.setTimeout(function(){soundManager.beginDelayedInit()},20)};this.destruct=function(){e.disable(true)};f=function(h){var i=this;this.sID=h.id;this.url=h.url;this.options=e._mergeObjects(h);this.instanceOptions=this.options;this._iO=this.instanceOptions;this.pan=this.options.pan;this.volume=this.options.volume;this._debug=function(){if(e.debugMode){var l=null;var n=[];var k=null;var m=null;var j=64;for(l in i.options){if(i.options[l]!==null){if(i.options[l] instanceof Function){k=i.options[l].toString();k=k.replace(/\s\s+/g," ");m=k.indexOf("{");n[n.length]=" "+l+": {"+k.substr(m+1,(Math.min(Math.max(k.indexOf("\n")-1,j),j))).replace(/\n/g,"")+"... }"}else{n[n.length]=" "+l+": "+i.options[l]}}}}};this._debug();this.id3={};this.resetProperties=function(j){i.bytesLoaded=null;i.bytesTotal=null;i.position=null;i.duration=null;i.durationEstimate=null;i.loaded=false;i.playState=0;i.paused=false;i.readyState=0;i.muted=false;i.didBeforeFinish=false;i.didJustBeforeFinish=false;i.isBuffering=false;i.instanceOptions={};i.instanceCount=0;i.peakData={left:0,right:0};i.waveformData=[];i.eqData=[]};i.resetProperties();this.load=function(j){if(typeof j!="undefined"){i._iO=e._mergeObjects(j);i.instanceOptions=i._iO}else{j=i.options;i._iO=j;i.instanceOptions=i._iO}if(typeof i._iO.url=="undefined"){i._iO.url=i.url}if(i._iO.url==i.url&&i.readyState!==0&&i.readyState!=2){return false}i.loaded=false;i.readyState=1;i.playState=0;try{if(e.flashVersion==8){e.o._load(i.sID,i._iO.url,i._iO.stream,i._iO.autoPlay,(i._iO.whileloading?1:0))}else{e.o._load(i.sID,i._iO.url,i._iO.stream?true:false,i._iO.autoPlay?true:false);if(i._iO.isMovieStar&&i._iO.autoLoad&&!i._iO.autoPlay){i.pause()}}}catch(k){e.onerror();e.disable()}};this.unload=function(){if(i.readyState!==0){if(i.readyState!=2){i.setPosition(0,true)}e.o._unload(i.sID,e.nullURL);i.resetProperties()}};this.destruct=function(){e.o._destroySound(i.sID);e.destroySound(i.sID,true)};this.play=function(k){if(!k){k={}}i._iO=e._mergeObjects(k,i._iO);i._iO=e._mergeObjects(i._iO,i.options);i.instanceOptions=i._iO;if(i.playState==1){var j=i._iO.multiShot;if(!j){return false}}if(!i.loaded){if(i.readyState===0){i._iO.stream=true;i._iO.autoPlay=true;i.load(i._iO)}else{if(i.readyState==2){return false}}}if(i.paused){i.resume()}else{i.playState=1;if(!i.instanceCount||e.flashVersion==9){i.instanceCount++}i.position=(typeof i._iO.position!="undefined"&&!isNaN(i._iO.position)?i._iO.position:0);if(i._iO.onplay){i._iO.onplay.apply(i)}i.setVolume(i._iO.volume,true);i.setPan(i._iO.pan,true);e.o._start(i.sID,i._iO.loop||1,(e.flashVersion==9?i.position:i.position/1000))}};this.start=this.play;this.stop=function(j){if(i.playState==1){i.playState=0;i.paused=false;if(i._iO.onstop){i._iO.onstop.apply(i)}e.o._stop(i.sID,j);i.instanceCount=0;i._iO={}}};this.setPosition=function(k,j){if(typeof k=="undefined"){k=0}var l=Math.min(i.duration,Math.max(k,0));i._iO.position=l;e.o._setPosition(i.sID,(e.flashVersion==9?i._iO.position:i._iO.position/1000),(i.paused||!i.playState))};this.pause=function(){if(i.paused||i.playState===0){return false}i.paused=true;e.o._pause(i.sID);if(i._iO.onpause){i._iO.onpause.apply(i)}};this.resume=function(){if(!i.paused||i.playState===0){return false}i.paused=false;e.o._pause(i.sID);if(i._iO.onresume){i._iO.onresume.apply(i)}};this.togglePause=function(){if(!i.playState){i.play({position:(e.flashVersion==9?i.position:i.position/1000)});return false}if(i.paused){i.resume()}else{i.pause()}};this.setPan=function(k,j){if(typeof k=="undefined"){k=0}if(typeof j=="undefined"){j=false}e.o._setPan(i.sID,k);i._iO.pan=k;if(!j){i.pan=k}};this.setVolume=function(j,k){if(typeof j=="undefined"){j=100}if(typeof k=="undefined"){k=false}e.o._setVolume(i.sID,(e.muted&&!i.muted)||i.muted?0:j);i._iO.volume=j;if(!k){i.volume=j}};this.mute=function(){i.muted=true;e.o._setVolume(i.sID,0)};this.unmute=function(){i.muted=false;var j=typeof i._iO.volume!="undefined";e.o._setVolume(i.sID,j?i._iO.volume:i.options.volume)};this._whileloading=function(j,k,l){if(!i._iO.isMovieStar){i.bytesLoaded=j;i.bytesTotal=k;i.duration=Math.floor(l);i.durationEstimate=parseInt((i.bytesTotal/i.bytesLoaded)*i.duration,10);if(i.readyState!=3&&i._iO.whileloading){i._iO.whileloading.apply(i)}}else{i.bytesLoaded=j;i.bytesTotal=k;i.duration=Math.floor(l);i.durationEstimate=i.duration;if(i.readyState!=3&&i._iO.whileloading){i._iO.whileloading.apply(i)}}};this._onid3=function(n,k){var o=[];for(var m=0,l=n.length;m<l;m++){o[n[m]]=k[m]}i.id3=e._mergeObjects(i.id3,o);if(i._iO.onid3){i._iO.onid3.apply(i)}};this._whileplaying=function(k,l,j,m){if(isNaN(k)||k===null){return false}i.position=k;if(i._iO.usePeakData&&typeof l!="undefined"&&l){i.peakData={left:l.leftPeak,right:l.rightPeak}}if(i._iO.useWaveformData&&typeof j!="undefined"&&j){i.waveformData=j}if(i._iO.useEQData&&typeof m!="undefined"&&m){i.eqData=m}if(i.playState==1){if(i._iO.whileplaying){i._iO.whileplaying.apply(i)}if(i.loaded&&i._iO.onbeforefinish&&i._iO.onbeforefinishtime&&!i.didBeforeFinish&&i.duration-i.position<=i._iO.onbeforefinishtime){i._onbeforefinish()}}};this._onload=function(j){j=(j==1?true:false);i.loaded=j;i.readyState=j?3:2;if(i._iO.onload){i._iO.onload.apply(i)}};this._onbeforefinish=function(){if(!i.didBeforeFinish){i.didBeforeFinish=true;if(i._iO.onbeforefinish){i._iO.onbeforefinish.apply(i)}}};this._onjustbeforefinish=function(j){if(!i.didJustBeforeFinish){i.didJustBeforeFinish=true;if(i._iO.onjustbeforefinish){i._iO.onjustbeforefinish.apply(i)}}};this._onfinish=function(){if(i._iO.onbeforefinishcomplete){i._iO.onbeforefinishcomplete.apply(i)}i.didBeforeFinish=false;i.didJustBeforeFinish=false;if(i.instanceCount){i.instanceCount--;if(!i.instanceCount){i.playState=0;i.paused=false;i.instanceCount=0;i.instanceOptions={};if(i._iO.onfinish){i._iO.onfinish.apply(i)}}}else{}};this._onmetadata=function(j){if(!j.width&&!j.height){j.width=320;j.height=240}i.metadata=j;i.width=j.width;i.height=j.height;if(i._iO.onmetadata){i._iO.onmetadata.apply(i)}};this._onbufferchange=function(j){if(j==i.isBuffering){return false}i.isBuffering=(j==1?true:false);if(i._iO.onbufferchange){i._iO.onbufferchange.apply(i)}}};if(window.addEventListener){window.addEventListener("focus",e.handleFocus,false);window.addEventListener("load",e.beginDelayedInit,false);window.addEventListener("unload",e.destruct,false);if(e._tryInitOnFocus){window.addEventListener("mousemove",e.handleFocus,false)}}else{if(window.attachEvent){window.attachEvent("onfocus",e.handleFocus);window.attachEvent("onload",e.beginDelayedInit);window.attachEvent("unload",e.destruct)}else{soundManager.onerror();soundManager.disable()}}if(document.addEventListener){document.addEventListener("DOMContentLoaded",e.domContentLoaded,false)}}soundManager=new SoundManager();
\ No newline at end of file
--- /dev/null
+/*!\r
+ SoundManager 2: Javascript Sound for the Web\r
+ --------------------------------------------\r
+ http://schillmania.com/projects/soundmanager2/\r
+\r
+ Copyright (c) 2008, Scott Schiller. All rights reserved.\r
+ Code licensed under the BSD License:\r
+ http://schillmania.com/projects/soundmanager2/license.txt\r
+\r
+ V2.94a.20090206\r
+*/\r
+\r
+var soundManager = null;\r
+\r
+function SoundManager(smURL,smID) {\r
+ \r
+ this.flashVersion = 8; // version of flash to require, either 8 or 9. Some API features require Flash 9.\r
+ this.debugMode = true; // enable debugging output (div#soundmanager-debug, OR console if available + configured)\r
+ this.useConsole = true; // use firebug/safari console.log()-type debug console if available\r
+ this.consoleOnly = false; // if console is being used, do not create/write to #soundmanager-debug\r
+ this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r
+ this.nullURL = 'null.mp3'; // path to "null" (empty) MP3 file, used to unload sounds (Flash 8 only)\r
+ this.allowPolling = true; // allow flash to poll for status update (required for "while playing", peak, sound spectrum functions to work.)\r
+ this.useMovieStar = false; // enable support for Flash 9.0r115+ (codename "MovieStar") MPEG4 audio + video formats (AAC, M4V, FLV, MOV etc.)\r
+ this.bgColor = '#ffffff'; // movie (.swf) background color, useful if showing on-screen for video etc.\r
+ this.useHighPerformance = false; // position:fixed flash movie gives increased js/flash speed\r
+ this.flashLoadTimeout = 750; // ms to wait for flash movie to load before failing (0 = infinity)\r
+\r
+ this.defaultOptions = {\r
+ 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r
+ 'stream': true, // allows playing before entire file has loaded (recommended)\r
+ 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true)\r
+ 'onid3': null, // callback function for "ID3 data is added/available"\r
+ 'onload': null, // callback function for "load finished"\r
+ 'whileloading': null, // callback function for "download progress update" (X of Y bytes received)\r
+ 'onplay': null, // callback for "play" start\r
+ 'onpause': null, // callback for "pause"\r
+ 'onresume': null, // callback for "resume" (pause toggle)\r
+ 'whileplaying': null, // callback during play (position update)\r
+ 'onstop': null, // callback for "user stop"\r
+ 'onfinish': null, // callback function for "sound finished playing"\r
+ 'onbeforefinish': null, // callback for "before sound finished playing (at [time])"\r
+ 'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second)\r
+ 'onbeforefinishcomplete':null, // function to call when said sound finishes playing\r
+ 'onjustbeforefinish':null, // callback for [n] msec before end of current sound\r
+ 'onjustbeforefinishtime':200, // [n] - if not using, set to 0 (or null handler) and event will not fire.\r
+ 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r
+ 'position': null, // offset (milliseconds) to seek to within loaded sound data.\r
+ 'pan': 0, // "pan" settings, left-to-right, -100 to 100\r
+ 'volume': 100 // self-explanatory. 0-100, the latter being the max.\r
+ };\r
+\r
+ this.flash9Options = { // flash 9-only options, merged into defaultOptions if flash 9 is being used\r
+ 'onbufferchange': null, // callback for "isBuffering" property change\r
+ 'isMovieStar': null, // "MovieStar" MPEG4 audio/video mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r
+ 'usePeakData': false, // enable left/right channel peak (level) data\r
+ 'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire.\r
+ 'useEQData': false // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.\r
+ };\r
+\r
+ this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio/video options, merged into defaultOptions if flash 9 + movieStar mode is enabled\r
+ 'onmetadata': null, // callback for when video width/height etc. are received\r
+ 'useVideo': false // if loading movieStar content, whether to show video\r
+ };\r
+\r
+ // jslint global declarations\r
+ /*global sm2Debugger, alert, console, document, navigator, setTimeout, window */\r
+\r
+ var SMSound = null; // defined later\r
+\r
+ var _s = this;\r
+ this.version = null;\r
+ this.versionNumber = 'V2.94a.20090206';\r
+ this.movieURL = null;\r
+ this.url = null;\r
+ this.altURL = null;\r
+ this.swfLoaded = false;\r
+ this.enabled = false;\r
+ this.o = null;\r
+ this.id = (smID||'sm2movie');\r
+ this.oMC = null;\r
+ this.sounds = {};\r
+ this.soundIDs = [];\r
+ this.muted = false;\r
+ this.wmode = null;\r
+ this.isIE = (navigator.userAgent.match(/MSIE/i));\r
+ this.isSafari = (navigator.userAgent.match(/safari/i));\r
+ this.isGecko = (navigator.userAgent.match(/gecko/i));\r
+ this.debugID = 'soundmanager-debug';\r
+ this._debugOpen = true;\r
+ this._didAppend = false;\r
+ this._appendSuccess = false;\r
+ this._didInit = false;\r
+ this._disabled = false;\r
+ this._windowLoaded = false;\r
+ this._hasConsole = (typeof console != 'undefined' && typeof console.log != 'undefined');\r
+ this._debugLevels = ['log','info','warn','error'];\r
+ this._defaultFlashVersion = 8;\r
+ this._oRemoved = null;\r
+ this._oRemovedHTML = null;\r
+\r
+ var _$ = function(sID) {\r
+ return document.getElementById(sID);\r
+ };\r
+\r
+ this.filePatterns = {\r
+ flash8: /\.mp3(\?.*)?$/i,\r
+ flash9: /\.mp3(\?.*)?$/i\r
+ };\r
+\r
+ this.netStreamTypes = ['aac','flv','mov','mp4','m4v','f4v','m4a','mp4v','3gp','3g2']; // Flash v9.0r115+ "moviestar" formats\r
+ this.netStreamPattern = new RegExp('\\.('+this.netStreamTypes.join('|')+')(\\?.*)?$','i');\r
+\r
+ this.filePattern = null;\r
+ this.features = {\r
+ buffering: false,\r
+ peakData: false,\r
+ waveformData: false,\r
+ eqData: false,\r
+ movieStar: false\r
+ };\r
+\r
+ this.sandbox = {\r
+ 'type': null,\r
+ 'types': {\r
+ 'remote': 'remote (domain-based) rules',\r
+ 'localWithFile': 'local with file access (no internet access)',\r
+ 'localWithNetwork': 'local with network (internet access only, no local access)',\r
+ 'localTrusted': 'local, trusted (local + internet access)'\r
+ },\r
+ 'description': null,\r
+ 'noRemote': null,\r
+ 'noLocal': null\r
+ };\r
+\r
+ this._setVersionInfo = function() {\r
+ if (_s.flashVersion != 8 && _s.flashVersion != 9) {\r
+ alert('soundManager.flashVersion must be 8 or 9. "'+_s.flashVersion+'" is invalid. Reverting to '+_s._defaultFlashVersion+'.');\r
+ _s.flashVersion = _s._defaultFlashVersion;\r
+ }\r
+ _s.version = _s.versionNumber+(_s.flashVersion==9?' (AS3/Flash 9)':' (AS2/Flash 8)');\r
+ // set up default options\r
+ if (_s.flashVersion > 8) {\r
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.flash9Options);\r
+ _s.features.buffering = true;\r
+ }\r
+ if (_s.flashVersion > 8 && _s.useMovieStar) {\r
+ // flash 9+ support for movieStar formats as well as MP3\r
+ _s.defaultOptions = _s._mergeObjects(_s.defaultOptions,_s.movieStarOptions);\r
+ _s.filePatterns.flash9 = new RegExp('\\.(mp3|'+_s.netStreamTypes.join('|')+')(\\?.*)?$','i');\r
+ _s.features.movieStar = true;\r
+ } else {\r
+ _s.useMovieStar = false;\r
+ _s.features.movieStar = false;\r
+ }\r
+ _s.filePattern = _s.filePatterns[(_s.flashVersion!=8?'flash9':'flash8')];\r
+ _s.movieURL = (_s.flashVersion==8?'soundmanager2.swf':'soundmanager2_flash9.swf');\r
+ _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_s.flashVersion==9);\r
+ };\r
+\r
+ this._overHTTP = (document.location?document.location.protocol.match(/http/i):null);\r
+ this._waitingforEI = false;\r
+ this._initPending = false;\r
+ this._tryInitOnFocus = (this.isSafari && typeof document.hasFocus == 'undefined');\r
+ this._isFocused = (typeof document.hasFocus != 'undefined'?document.hasFocus():null);\r
+ this._okToDisable = !this._tryInitOnFocus;\r
+\r
+ this.useAltURL = !this._overHTTP; // use altURL if not "online"\r
+\r
+ var flashCPLink = 'http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html';\r
+\r
+ // --- public methods ---\r
+ \r
+ this.supported = function() {\r
+ return (_s._didInit && !_s._disabled);\r
+ };\r
+\r
+ this.getMovie = function(smID) {\r
+ return _s.isIE?window[smID]:(_s.isSafari?_$(smID)||document[smID]:_$(smID));\r
+ };\r
+\r
+ this.loadFromXML = function(sXmlUrl) {\r
+ try {\r
+ _s.o._loadFromXML(sXmlUrl);\r
+ } catch(e) {\r
+ _s._failSafely();\r
+ return true;\r
+ }\r
+ };\r
+\r
+ this.createSound = function(oOptions) {\r
+ if (!_s._didInit) {\r
+ throw new Error('soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods');\r
+ }\r
+ if (arguments.length == 2) {\r
+ // function overloading in JS! :) ..assume simple createSound(id,url) use case\r
+ oOptions = {'id':arguments[0],'url':arguments[1]};\r
+ }\r
+ var thisOptions = _s._mergeObjects(oOptions); // inherit SM2 defaults\r
+ var _tO = thisOptions; // alias\r
+ _s._wD('soundManager.createSound(): '+_tO.id+' ('+_tO.url+')',1);\r
+ if (_s._idCheck(_tO.id,true)) {\r
+ _s._wD('soundManager.createSound(): '+_tO.id+' exists',1);\r
+ return _s.sounds[_tO.id];\r
+ }\r
+ if (_s.flashVersion > 8 && _s.useMovieStar) {\r
+ if (_tO.isMovieStar === null) {\r
+ _tO.isMovieStar = (_tO.url.match(_s.netStreamPattern)?true:false);\r
+ }\r
+ if (_tO.isMovieStar) {\r
+ _s._wD('soundManager.createSound(): using MovieStar handling');\r
+ }\r
+ if (_tO.isMovieStar && (_tO.usePeakData || _tO.useWaveformData || _tO.useEQData)) {\r
+ _s._wD('Warning: peak/waveform/eqData features unsupported for non-MP3 formats');\r
+ _tO.usePeakData = false;\r
+ _tO.useWaveformData = false;\r
+ _tO.useEQData = false;\r
+ }\r
+ }\r
+ _s.sounds[_tO.id] = new SMSound(_tO);\r
+ _s.soundIDs[_s.soundIDs.length] = _tO.id;\r
+ // AS2:\r
+ if (_s.flashVersion == 8) {\r
+ _s.o._createSound(_tO.id,_tO.onjustbeforefinishtime);\r
+ } else {\r
+ _s.o._createSound(_tO.id,_tO.url,_tO.onjustbeforefinishtime,_tO.usePeakData,_tO.useWaveformData,_tO.useEQData,_tO.isMovieStar,(_tO.isMovieStar?_tO.useVideo:false));\r
+ }\r
+ if (_tO.autoLoad || _tO.autoPlay) {\r
+ // TODO: does removing timeout here cause problems?\r
+ if (_s.sounds[_tO.id]) {\r
+ _s.sounds[_tO.id].load(_tO);\r
+ }\r
+ }\r
+ if (_tO.autoPlay) {\r
+ _s.sounds[_tO.id].play();\r
+ }\r
+ return _s.sounds[_tO.id];\r
+ };\r
+\r
+ this.createVideo = function(oOptions) {\r
+ if (arguments.length==2) {\r
+ oOptions = {'id':arguments[0],'url':arguments[1]};\r
+ }\r
+ if (_s.flashVersion >= 9) {\r
+ oOptions.isMovieStar = true;\r
+ oOptions.useVideo = true;\r
+ } else {\r
+ _s._wD('soundManager.createVideo(): flash 9 required for video. Exiting.',2);\r
+ return false;\r
+ }\r
+ if (!_s.useMovieStar) {\r
+ _s._wD('soundManager.createVideo(): MovieStar mode not enabled. Exiting.',2);\r
+ }\r
+ return _s.createSound(oOptions);\r
+ };\r
+\r
+ this.destroySound = function(sID,bFromSound) {\r
+ // explicitly destroy a sound before normal page unload, etc.\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ for (var i=0; i<_s.soundIDs.length; i++) {\r
+ if (_s.soundIDs[i] == sID) {\r
+ _s.soundIDs.splice(i,1);\r
+ continue;\r
+ }\r
+ }\r
+ // conservative option: avoid crash with ze flash 8\r
+ // calling destroySound() within a sound onload() might crash firefox, certain flavours of winXP + flash 8??\r
+ // if (_s.flashVersion != 8) {\r
+ _s.sounds[sID].unload();\r
+ // }\r
+ if (!bFromSound) {\r
+ // ignore if being called from SMSound instance\r
+ _s.sounds[sID].destruct();\r
+ }\r
+ delete _s.sounds[sID];\r
+ };\r
+\r
+ this.destroyVideo = this.destroySound;\r
+\r
+ this.load = function(sID,oOptions) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s.sounds[sID].load(oOptions);\r
+ };\r
+\r
+ this.unload = function(sID) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s.sounds[sID].unload();\r
+ };\r
+\r
+ this.play = function(sID,oOptions) {\r
+ if (!_s._idCheck(sID)) {\r
+ if (typeof oOptions != 'Object') {\r
+ oOptions = {url:oOptions}; // overloading use case: play('mySound','/path/to/some.mp3');\r
+ }\r
+ if (oOptions && oOptions.url) {\r
+ // overloading use case, creation + playing of sound: .play('someID',{url:'/path/to.mp3'});\r
+ _s._wD('soundController.play(): attempting to create "'+sID+'"',1);\r
+ oOptions.id = sID;\r
+ _s.createSound(oOptions);\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ _s.sounds[sID].play(oOptions);\r
+ };\r
+\r
+ this.start = this.play; // just for convenience\r
+\r
+ this.setPosition = function(sID,nMsecOffset) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s.sounds[sID].setPosition(nMsecOffset);\r
+ };\r
+\r
+ this.stop = function(sID) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s._wD('soundManager.stop('+sID+')',1);\r
+ _s.sounds[sID].stop(); \r
+ };\r
+\r
+ this.stopAll = function() {\r
+ _s._wD('soundManager.stopAll()',1);\r
+ for (var oSound in _s.sounds) {\r
+ if (_s.sounds[oSound] instanceof SMSound) {\r
+ _s.sounds[oSound].stop(); // apply only to sound objects\r
+ }\r
+ }\r
+ };\r
+\r
+ this.pause = function(sID) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s.sounds[sID].pause();\r
+ };\r
+\r
+ this.pauseAll = function() {\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].pause();\r
+ }\r
+ };\r
+\r
+ this.resume = function(sID) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s.sounds[sID].resume();\r
+ };\r
+\r
+ this.resumeAll = function() {\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].resume();\r
+ }\r
+ };\r
+\r
+ this.togglePause = function(sID) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s.sounds[sID].togglePause();\r
+ };\r
+\r
+ this.setPan = function(sID,nPan) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s.sounds[sID].setPan(nPan);\r
+ };\r
+\r
+ this.setVolume = function(sID,nVol) {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s.sounds[sID].setVolume(nVol);\r
+ };\r
+\r
+ this.mute = function(sID) {\r
+ if (typeof sID != 'string') {\r
+ sID = null;\r
+ }\r
+ if (!sID) {\r
+ _s._wD('soundManager.mute(): Muting all sounds');\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].mute();\r
+ }\r
+ _s.muted = true;\r
+ } else {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s._wD('soundManager.mute(): Muting "'+sID+'"');\r
+ _s.sounds[sID].mute();\r
+ }\r
+ };\r
+\r
+ this.muteAll = function() {\r
+ _s.mute();\r
+ };\r
+\r
+ this.unmute = function(sID) {\r
+ if (typeof sID != 'string') {\r
+ sID = null;\r
+ }\r
+ if (!sID) {\r
+ _s._wD('soundManager.unmute(): Unmuting all sounds');\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].unmute();\r
+ }\r
+ _s.muted = false;\r
+ } else {\r
+ if (!_s._idCheck(sID)) {\r
+ return false;\r
+ }\r
+ _s._wD('soundManager.unmute(): Unmuting "'+sID+'"');\r
+ _s.sounds[sID].unmute();\r
+ }\r
+ };\r
+\r
+ this.unmuteAll = function() {\r
+ _s.unmute();\r
+ };\r
+\r
+ this.getMemoryUse = function() {\r
+ if (_s.flashVersion == 8) {\r
+ // not supported in Flash 8\r
+ return 0;\r
+ }\r
+ if (_s.o) {\r
+ return parseInt(_s.o._getMemoryUse(),10);\r
+ }\r
+ };\r
+\r
+ this.setPolling = function(bPolling) {\r
+ if (!_s.o || !_s.allowPolling) {\r
+ return false;\r
+ }\r
+ _s.o._setPolling(bPolling);\r
+ };\r
+\r
+ this.disable = function(bNoDisable) {\r
+ // destroy all functions\r
+ if (typeof bNoDisable == 'undefined') {\r
+ bNoDisable = false;\r
+ }\r
+ if (_s._disabled) {\r
+ return false;\r
+ }\r
+ _s._disabled = true;\r
+ _s._wD('soundManager.disable(): Shutting down',1);\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s._disableObject(_s.sounds[_s.soundIDs[i]]);\r
+ }\r
+ _s.initComplete(bNoDisable); // fire "complete", despite fail\r
+ // _s._disableObject(_s); // taken out to allow reboot()\r
+ };\r
+\r
+ this.canPlayURL = function(sURL) {\r
+ return (sURL?(sURL.match(_s.filePattern)?true:false):null); \r
+ };\r
+\r
+ this.getSoundById = function(sID,suppressDebug) {\r
+ if (!sID) {\r
+ throw new Error('SoundManager.getSoundById(): sID is null/undefined');\r
+ }\r
+ var result = _s.sounds[sID];\r
+ if (!result && !suppressDebug) {\r
+ _s._wD('"'+sID+'" is an invalid sound ID.',2);\r
+ // soundManager._wD('trace: '+arguments.callee.caller);\r
+ }\r
+ return result;\r
+ };\r
+\r
+ this.onload = function() {\r
+ // window.onload() equivalent for SM2, ready to create sounds etc.\r
+ // this is a stub - you can override this in your own external script, eg. soundManager.onload = function() {}\r
+ soundManager._wD('<em>Warning</em>: soundManager.onload() is undefined.',2);\r
+ };\r
+\r
+ this.onerror = function() {\r
+ // stub for user handler, called when SM2 fails to load/init\r
+ };\r
+\r
+ // --- "private" methods ---\r
+\r
+ this._idCheck = this.getSoundById;\r
+\r
+ var _doNothing = function() {\r
+ return false;\r
+ };\r
+ _doNothing._protected = true;\r
+\r
+ this._disableObject = function(o) {\r
+ for (var oProp in o) {\r
+ if (typeof o[oProp] == 'function' && typeof o[oProp]._protected == 'undefined') {\r
+ o[oProp] = _doNothing;\r
+ }\r
+ }\r
+ oProp = null;\r
+ };\r
+\r
+ this._failSafely = function(bNoDisable) {\r
+ // general failure exception handler\r
+ if (typeof bNoDisable == 'undefined') {\r
+ bNoDisable = false;\r
+ }\r
+ if (!_s._disabled || bNoDisable) {\r
+ _s._wD('soundManager: Failed to initialise.',2);\r
+ _s.disable(bNoDisable);\r
+ }\r
+ };\r
+ \r
+ this._normalizeMovieURL = function(smURL) {\r
+ var urlParams = null;\r
+ if (smURL) {\r
+ if (smURL.match(/\.swf(\?.*)?$/i)) {\r
+ urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?')+4);\r
+ if (urlParams) {\r
+ return smURL; // assume user knows what they're doing\r
+ }\r
+ } else if (smURL.lastIndexOf('/') != smURL.length-1) {\r
+ smURL = smURL+'/';\r
+ }\r
+ }\r
+ return(smURL && smURL.lastIndexOf('/')!=-1?smURL.substr(0,smURL.lastIndexOf('/')+1):'./')+_s.movieURL;\r
+ };\r
+\r
+ this._getDocument = function() {\r
+ return (document.body?document.body:(document.documentElement?document.documentElement:document.getElementsByTagName('div')[0]));\r
+ };\r
+\r
+ this._getDocument._protected = true;\r
+\r
+ this._createMovie = function(smID,smURL) {\r
+ if (_s._didAppend && _s._appendSuccess) {\r
+ return false; // ignore if already succeeded\r
+ }\r
+ if (window.location.href.indexOf('debug=1')+1) {\r
+ _s.debugMode = true; // allow force of debug mode via URL\r
+ }\r
+ _s._didAppend = true;\r
+ \r
+ // safety check for legacy (change to Flash 9 URL)\r
+ _s._setVersionInfo();\r
+ var remoteURL = (smURL?smURL:_s.url);\r
+ var localURL = (_s.altURL?_s.altURL:remoteURL);\r
+ _s.url = _s._normalizeMovieURL(_s._overHTTP?remoteURL:localURL);\r
+ smURL = _s.url;\r
+\r
+ var specialCase = null;\r
+\r
+ if (_s.useHighPerformance && _s.useMovieStar) {\r
+ specialCase = 'Note: disabling highPerformance, not applicable with movieStar mode on';\r
+ _s.useHighPerformance = false;\r
+ }\r
+\r
+ _s.wmode = (_s.useHighPerformance && !_s.useMovieStar?'transparent':''); // wmode=opaque seems to break firefox/windows.\r
+\r
+ var oEmbed = {\r
+ name: smID,\r
+ id: smID,\r
+ src: smURL,\r
+ width: '100%',\r
+ height: '100%',\r
+ quality: 'high',\r
+ allowScriptAccess: 'always',\r
+ bgcolor: _s.bgColor,\r
+ pluginspage: 'http://www.macromedia.com/go/getflashplayer',\r
+ type: 'application/x-shockwave-flash',\r
+ wmode: _s.wmode\r
+ };\r
+\r
+ var oObject = {\r
+ id: smID,\r
+ data: smURL,\r
+ type: 'application/x-shockwave-flash',\r
+ width: '100%',\r
+ height: '100%',\r
+ wmode: _s.wmode\r
+ };\r
+\r
+ var oObjectParams = {\r
+ movie: smURL,\r
+ AllowScriptAccess: 'always',\r
+ quality: 'high',\r
+ bgcolor: _s.bgColor,\r
+ wmode: _s.wmode\r
+ };\r
+\r
+ var oMovie = null;\r
+ var tmp = null;\r
+\r
+ if (_s.isIE) {\r
+ // IE is "special".\r
+ oMovie = document.createElement('div');\r
+ var movieHTML = '<object id="'+smID+'" data="'+smURL+'" type="application/x-shockwave-flash" width="100%" height="100%"><param name="movie" value="'+smURL+'" /><param name="AllowScriptAccess" value="always" /><param name="quality" value="high" />'+(_s.useHighPerformance && !_s.useMovieStar?'<param name="wmode" value="'+_s.wmode+'" /> ':'')+'<param name="bgcolor" value="'+_s.bgColor+'" /><!-- --></object>';\r
+ } else {\r
+ oMovie = document.createElement('embed');\r
+ for (tmp in oEmbed) {\r
+ if (oEmbed.hasOwnProperty(tmp)) {\r
+ oMovie.setAttribute(tmp,oEmbed[tmp]);\r
+ }\r
+ }\r
+ }\r
+\r
+ var oD = document.createElement('div');\r
+ oD.id = _s.debugID+'-toggle';\r
+ var oToggle = {\r
+ position: 'fixed',\r
+ bottom: '0px',\r
+ right: '0px',\r
+ width: '1.2em',\r
+ height: '1.2em',\r
+ lineHeight: '1.2em',\r
+ margin: '2px',\r
+ textAlign: 'center',\r
+ border: '1px solid #999',\r
+ cursor: 'pointer',\r
+ background: '#fff',\r
+ color: '#333',\r
+ zIndex: 10001\r
+ };\r
+\r
+ oD.appendChild(document.createTextNode('-'));\r
+ oD.onclick = _s._toggleDebug;\r
+ oD.title = 'Toggle SM2 debug console';\r
+\r
+ if (navigator.userAgent.match(/msie 6/i)) {\r
+ oD.style.position = 'absolute';\r
+ oD.style.cursor = 'hand';\r
+ }\r
+\r
+ for (tmp in oToggle) {\r
+ if (oToggle.hasOwnProperty(tmp)) {\r
+ oD.style[tmp] = oToggle[tmp];\r
+ }\r
+ }\r
+\r
+ var appXHTML = 'soundManager._createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.';\r
+\r
+ var oTarget = _s._getDocument();\r
+\r
+ if (oTarget) {\r
+ \r
+ _s.oMC = _$('sm2-container')?_$('sm2-container'):document.createElement('div');\r
+\r
+ if (!_s.oMC.id) {\r
+ _s.oMC.id = 'sm2-container';\r
+ _s.oMC.className = 'movieContainer';\r
+ // "hide" flash movie\r
+ var s = null;\r
+ var oEl = null;\r
+ if (_s.useHighPerformance) {\r
+ s = {\r
+ position: 'fixed',\r
+ width: '8px',\r
+ height: '8px', // must be at least 6px for flash to run fast. odd? yes.\r
+ bottom: '0px',\r
+ left: '0px'\r
+ // zIndex:-1 // sit behind everything else - potentially dangerous/buggy?\r
+ };\r
+ } else {\r
+ s = {\r
+ position: 'absolute',\r
+ width: '1px',\r
+ height: '1px',\r
+ top: '-999px',\r
+ left: '-999px'\r
+ };\r
+ }\r
+ var x = null;\r
+ for (x in s) {\r
+ if (s.hasOwnProperty(x)) {\r
+ _s.oMC.style[x] = s[x];\r
+ }\r
+ }\r
+ try {\r
+ if (!_s.isIE) {\r
+ _s.oMC.appendChild(oMovie);\r
+ }\r
+ oTarget.appendChild(_s.oMC);\r
+ if (_s.isIE) {\r
+ oEl = _s.oMC.appendChild(document.createElement('div'));\r
+ oEl.className = 'sm2-object-box';\r
+ oEl.innerHTML = movieHTML;\r
+ }\r
+ _s._appendSuccess = true;\r
+ } catch(e) {\r
+ throw new Error(appXHTML);\r
+ }\r
+ } else {\r
+ // it's already in the document.\r
+ _s.oMC.appendChild(oMovie);\r
+ if (_s.isIE) {\r
+ oEl = _s.oMC.appendChild(document.createElement('div'));\r
+ oEl.className = 'sm2-object-box';\r
+ oEl.innerHTML = movieHTML;\r
+ }\r
+ _s._appendSuccess = true;\r
+ }\r
+\r
+ if (!_$(_s.debugID) && ((!_s._hasConsole||!_s.useConsole)||(_s.useConsole && _s._hasConsole && !_s.consoleOnly))) {\r
+ var oDebug = document.createElement('div');\r
+ oDebug.id = _s.debugID;\r
+ oDebug.style.display = (_s.debugMode?'block':'none');\r
+ if (_s.debugMode && !_$(oD.id)) {\r
+ try {\r
+ oTarget.appendChild(oD);\r
+ } catch(e2) {\r
+ throw new Error(appXHTML);\r
+ }\r
+ oTarget.appendChild(oDebug);\r
+ }\r
+ }\r
+ oTarget = null;\r
+ }\r
+\r
+ if (specialCase) {\r
+ _s._wD(specialCase);\r
+ }\r
+\r
+ _s._wD('-- SoundManager 2 '+_s.version+(_s.useMovieStar?', MovieStar mode':'')+(_s.useHighPerformance?', high performance mode':'')+' --',1);\r
+ _s._wD('soundManager._createMovie(): Trying to load '+smURL+(!_s._overHTTP && _s.altURL?'(alternate URL)':''),1);\r
+ };\r
+\r
+ // aliased to this._wD()\r
+ this._writeDebug = function(sText,sType,bTimestamp) {\r
+ if (!_s.debugMode) {\r
+ return false;\r
+ }\r
+ if (typeof bTimestamp != 'undefined' && bTimestamp) {\r
+ sText = sText + ' | '+new Date().getTime();\r
+ }\r
+ if (_s._hasConsole && _s.useConsole) {\r
+ var sMethod = _s._debugLevels[sType];\r
+ if (typeof console[sMethod] != 'undefined') {\r
+ console[sMethod](sText);\r
+ } else {\r
+ console.log(sText);\r
+ }\r
+ if (_s.useConsoleOnly) {\r
+ return true;\r
+ }\r
+ }\r
+ var sDID = 'soundmanager-debug';\r
+ try {\r
+ var o = _$(sDID);\r
+ if (!o) {\r
+ return false;\r
+ }\r
+ var oItem = document.createElement('div');\r
+ if (++_s._wdCount%2===0) {\r
+ oItem.className = 'sm2-alt';\r
+ }\r
+ // sText = sText.replace(/\n/g,'<br />');\r
+ if (typeof sType == 'undefined') {\r
+ sType = 0;\r
+ } else {\r
+ sType = parseInt(sType,10);\r
+ }\r
+ oItem.appendChild(document.createTextNode(sText));\r
+ if (sType) {\r
+ if (sType >= 2) {\r
+ oItem.style.fontWeight = 'bold';\r
+ }\r
+ if (sType == 3) {\r
+ oItem.style.color = '#ff3333';\r
+ }\r
+ }\r
+ // o.appendChild(oItem); // top-to-bottom\r
+ o.insertBefore(oItem,o.firstChild); // bottom-to-top\r
+ } catch(e) {\r
+ // oh well\r
+ }\r
+ o = null;\r
+ };\r
+ this._writeDebug._protected = true;\r
+ this._wdCount = 0;\r
+ this._wdCount._protected = true;\r
+ this._wD = this._writeDebug;\r
+\r
+ this._wDAlert = function(sText) { alert(sText); };\r
+\r
+ if (window.location.href.indexOf('debug=alert')+1 && _s.debugMode) {\r
+ _s._wD = _s._wDAlert;\r
+ }\r
+\r
+ this._toggleDebug = function() {\r
+ var o = _$(_s.debugID);\r
+ var oT = _$(_s.debugID+'-toggle');\r
+ if (!o) {\r
+ return false;\r
+ }\r
+ if (_s._debugOpen) {\r
+ // minimize\r
+ oT.innerHTML = '+';\r
+ o.style.display = 'none';\r
+ } else {\r
+ oT.innerHTML = '-';\r
+ o.style.display = 'block';\r
+ }\r
+ _s._debugOpen = !_s._debugOpen;\r
+ };\r
+\r
+ this._toggleDebug._protected = true;\r
+\r
+ this._debug = function() {\r
+ _s._wD('--- soundManager._debug(): Current sound objects ---',1);\r
+ for (var i=0,j=_s.soundIDs.length; i<j; i++) {\r
+ _s.sounds[_s.soundIDs[i]]._debug();\r
+ }\r
+ };\r
+\r
+ this._debugTS = function(sEventType,bSuccess,sMessage) {\r
+ // troubleshooter debug hooks\r
+ if (typeof sm2Debugger != 'undefined') {\r
+ try {\r
+ sm2Debugger.handleEvent(sEventType,bSuccess,sMessage);\r
+ } catch(e) {\r
+ // oh well \r
+ }\r
+ }\r
+ };\r
+\r
+ this._debugTS._protected = true;\r
+\r
+ this._mergeObjects = function(oMain,oAdd) {\r
+ // non-destructive merge\r
+ var o1 = {}; // clone o1\r
+ for (var i in oMain) {\r
+ if (oMain.hasOwnProperty(i)) {\r
+ o1[i] = oMain[i];\r
+ }\r
+ }\r
+ var o2 = (typeof oAdd == 'undefined'?_s.defaultOptions:oAdd);\r
+ for (var o in o2) {\r
+ if (o2.hasOwnProperty(o) && typeof o1[o] == 'undefined') {\r
+ o1[o] = o2[o];\r
+ }\r
+ }\r
+ return o1;\r
+ };\r
+\r
+ this.createMovie = function(sURL) {\r
+ if (sURL) {\r
+ _s.url = sURL;\r
+ }\r
+ _s._initMovie();\r
+ };\r
+\r
+ this.go = this.createMovie; // nice alias\r
+\r
+ this._initMovie = function() {\r
+ // attempt to get, or create, movie\r
+ if (_s.o) {\r
+ return false; // may already exist\r
+ }\r
+ _s.o = _s.getMovie(_s.id); // (inline markup)\r
+ if (!_s.o) {\r
+ if (!_s.oRemoved) {\r
+ // try to create\r
+ _s._createMovie(_s.id,_s.url);\r
+ } else {\r
+ // try to re-append removed movie after reboot()\r
+ if (!_s.isIE) {\r
+ _s.oMC.appendChild(_s.oRemoved);\r
+ } else {\r
+ _s.oMC.innerHTML = _s.oRemovedHTML;\r
+ }\r
+ _s.oRemoved = null;\r
+ _s._didAppend = true;\r
+ }\r
+ _s.o = _s.getMovie(_s.id);\r
+ }\r
+ if (_s.o) {\r
+ _s._wD('soundManager._initMovie(): Got '+_s.o.nodeName+' element ('+(_s._didAppend?'created via JS':'static HTML')+')',1);\r
+ if (_s.flashLoadTimeout>0) {\r
+ _s._wD('soundManager._initMovie(): Waiting for ExternalInterface call from Flash..');\r
+ }\r
+ }\r
+ };\r
+\r
+ this.waitForExternalInterface = function() {\r
+ if (_s._waitingForEI) {\r
+ return false;\r
+ }\r
+ _s._waitingForEI = true;\r
+ if (_s._tryInitOnFocus && !_s._isFocused) {\r
+ _s._wD('soundManager: Special case: Waiting for focus-related event..');\r
+ return false;\r
+ }\r
+ if (_s.flashLoadTimeout>0) {\r
+ if (!_s._didInit) {\r
+ _s._wD('soundManager: Getting impatient, still waiting for Flash.. ;)');\r
+ }\r
+ setTimeout(function() {\r
+ if (!_s._didInit) {\r
+ _s._wD('soundManager: No Flash response within reasonable time after document load.\nPossible causes: Flash version under 8, no support, or Flash security denying JS-Flash communication.',2);\r
+ if (!_s._overHTTP) {\r
+ _s._wD('soundManager: Loading this page from local/network file system (not over HTTP?) Flash security likely restricting JS-Flash access. Consider adding current URL to "trusted locations" in the Flash player security settings manager at '+flashCPLink+', or simply serve this content over HTTP.',2);\r
+ }\r
+ _s._debugTS('flashtojs',false,': Timed out'+(_s._overHTTP)?' (Check flash security)':' (No plugin/missing SWF?)');\r
+ }\r
+ // if still not initialized and no other options, give up\r
+ if (!_s._didInit && _s._okToDisable) {\r
+ _s._failSafely(true); // don't disable, for reboot()\r
+ }\r
+ },_s.flashLoadTimeout);\r
+ } else if (!_s.didInit) {\r
+ _s._wD('soundManager: Waiting indefinitely for Flash...');\r
+ }\r
+ };\r
+\r
+ this.handleFocus = function() {\r
+ if (_s._isFocused || !_s._tryInitOnFocus) {\r
+ return true;\r
+ }\r
+ _s._okToDisable = true;\r
+ _s._isFocused = true;\r
+ _s._wD('soundManager.handleFocus()');\r
+ if (_s._tryInitOnFocus) {\r
+ // giant Safari 3.1 hack - assume window in focus if mouse is moving, since document.hasFocus() not currently implemented.\r
+ window.removeEventListener('mousemove',_s.handleFocus,false);\r
+ }\r
+ // allow init to restart\r
+ _s._waitingForEI = false;\r
+ setTimeout(_s.waitForExternalInterface,500);\r
+ // detach event\r
+ if (window.removeEventListener) {\r
+ window.removeEventListener('focus',_s.handleFocus,false);\r
+ } else if (window.detachEvent) {\r
+ window.detachEvent('onfocus',_s.handleFocus);\r
+ }\r
+ };\r
+\r
+ this.initComplete = function(bNoDisable) {\r
+ if (_s._didInit) {\r
+ return false;\r
+ }\r
+ _s._didInit = true;\r
+ _s._wD('-- SoundManager 2 '+(_s._disabled?'failed to load':'loaded')+' ('+(_s._disabled?'security/load error':'OK')+') --',1);\r
+ if (_s._disabled || bNoDisable) {\r
+ _s._wD('soundManager.initComplete(): calling soundManager.onerror()',1);\r
+ _s._debugTS('onload',false);\r
+ _s.onerror.apply(window);\r
+ return false;\r
+ } else {\r
+ _s._debugTS('onload',true);\r
+ }\r
+ if (_s.waitForWindowLoad && !_s._windowLoaded) {\r
+ _s._wD('soundManager: Waiting for window.onload()');\r
+ if (window.addEventListener) {\r
+ window.addEventListener('load',_s.initUserOnload,false);\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('onload',_s.initUserOnload);\r
+ }\r
+ return false;\r
+ } else {\r
+ if (_s.waitForWindowLoad && _s._windowLoaded) {\r
+ _s._wD('soundManager: Document already loaded');\r
+ }\r
+ _s.initUserOnload();\r
+ }\r
+ };\r
+\r
+ this.initUserOnload = function() {\r
+ _s._wD('soundManager.initComplete(): calling soundManager.onload()',1);\r
+ // call user-defined "onload", scoped to window\r
+ _s.onload.apply(window);\r
+ _s._wD('soundManager.onload() complete',1);\r
+ };\r
+\r
+ this.init = function() {\r
+ _s._wD('-- soundManager.init() --');\r
+ // called after onload()\r
+ _s._initMovie();\r
+ if (_s._didInit) {\r
+ _s._wD('soundManager.init(): Already called?');\r
+ return false;\r
+ }\r
+ // event cleanup\r
+ if (window.removeEventListener) {\r
+ window.removeEventListener('load',_s.beginDelayedInit,false);\r
+ } else if (window.detachEvent) {\r
+ window.detachEvent('onload',_s.beginDelayedInit);\r
+ }\r
+ try {\r
+ _s._wD('Attempting to call Flash from JS..');\r
+ _s.o._externalInterfaceTest(false); // attempt to talk to Flash\r
+ // _s._wD('Flash ExternalInterface call (JS-Flash) OK',1);\r
+ if (!_s.allowPolling) {\r
+ _s._wD('Polling (whileloading/whileplaying support) is disabled.',1);\r
+ }\r
+ _s.setPolling(true);\r
+ if (!_s.debugMode) {\r
+ _s.o._disableDebug();\r
+ }\r
+ _s.enabled = true;\r
+ _s._debugTS('jstoflash',true);\r
+ } catch(e) {\r
+ _s._debugTS('jstoflash',false);\r
+ _s._failSafely(true); // don't disable, for reboot()\r
+ _s.initComplete();\r
+ return false;\r
+ }\r
+ _s.initComplete();\r
+ };\r
+\r
+ this.beginDelayedInit = function() {\r
+ _s._wD('soundManager.beginDelayedInit()');\r
+ _s._windowLoaded = true;\r
+ setTimeout(_s.waitForExternalInterface,500);\r
+ setTimeout(_s.beginInit,20);\r
+ };\r
+\r
+ this.beginInit = function() {\r
+ if (_s._initPending) {\r
+ return false;\r
+ }\r
+ _s.createMovie(); // ensure creation if not already done\r
+ _s._initMovie();\r
+ _s._initPending = true;\r
+ return true;\r
+ };\r
+\r
+ this.domContentLoaded = function() {\r
+ _s._wD('soundManager.domContentLoaded()');\r
+ if (document.removeEventListener) {\r
+ document.removeEventListener('DOMContentLoaded',_s.domContentLoaded,false);\r
+ }\r
+ _s.go();\r
+ };\r
+\r
+ this._externalInterfaceOK = function() {\r
+ // callback from flash for confirming that movie loaded, EI is working etc.\r
+ if (_s.swfLoaded) {\r
+ return false;\r
+ }\r
+ _s._wD('soundManager._externalInterfaceOK()');\r
+ _s._debugTS('swf',true);\r
+ _s._debugTS('flashtojs',true);\r
+ _s.swfLoaded = true;\r
+ _s._tryInitOnFocus = false;\r
+ if (_s.isIE) {\r
+ // IE needs a timeout OR delay until window.onload - may need TODO: investigating\r
+ setTimeout(_s.init,100);\r
+ } else {\r
+ _s.init();\r
+ }\r
+ };\r
+\r
+ this._setSandboxType = function(sandboxType) {\r
+ var sb = _s.sandbox;\r
+ sb.type = sandboxType;\r
+ sb.description = sb.types[(typeof sb.types[sandboxType] != 'undefined'?sandboxType:'unknown')];\r
+ _s._wD('Flash security sandbox type: '+sb.type);\r
+ if (sb.type == 'localWithFile') {\r
+ sb.noRemote = true;\r
+ sb.noLocal = false;\r
+ _s._wD('Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',2);\r
+ } else if (sb.type == 'localWithNetwork') {\r
+ sb.noRemote = false;\r
+ sb.noLocal = true;\r
+ } else if (sb.type == 'localTrusted') {\r
+ sb.noRemote = false;\r
+ sb.noLocal = false;\r
+ }\r
+ };\r
+\r
+ this.reboot = function() {\r
+ // attempt to reset and init SM2\r
+ _s._wD('soundManager.reboot()');\r
+ if (_s.soundIDs.length) {\r
+ _s._wD('Destroying '+_s.soundIDs.length+' SMSound objects...');\r
+ }\r
+ for (var i=_s.soundIDs.length; i--;) {\r
+ _s.sounds[_s.soundIDs[i]].destruct();\r
+ }\r
+ // trash ze flash\r
+ try {\r
+ if (_s.isIE) {\r
+ _s.oRemovedHTML = _s.o.innerHTML;\r
+ }\r
+ _s.oRemoved = _s.o.parentNode.removeChild(_s.o);\r
+ _s._wD('Flash movie removed.');\r
+ } catch(e) {\r
+ // uh-oh.\r
+ _s._wD('Warning: Failed to remove flash movie.',2);\r
+ }\r
+ _s.enabled = false;\r
+ _s._didInit = false;\r
+ _s._waitingForEI = false;\r
+ _s._initPending = false;\r
+ _s._didInit = false;\r
+ _s._didAppend = false;\r
+ _s._appendSuccess = false;\r
+ _s._didInit = false;\r
+ _s._disabled = false;\r
+ _s._waitingforEI = true;\r
+ _s.swfLoaded = false;\r
+ _s.soundIDs = {};\r
+ _s.sounds = [];\r
+ _s.o = null;\r
+ _s._wD('soundManager: Rebooting...');\r
+ window.setTimeout(function() {\r
+ soundManager.beginDelayedInit();\r
+ },20);\r
+ };\r
+\r
+ this.destruct = function() {\r
+ _s._wD('soundManager.destruct()');\r
+ _s.disable(true);\r
+ };\r
+ \r
+ // SMSound (sound object)\r
+ \r
+ SMSound = function(oOptions) {\r
+ var _t = this;\r
+ this.sID = oOptions.id;\r
+ this.url = oOptions.url;\r
+ this.options = _s._mergeObjects(oOptions);\r
+ this.instanceOptions = this.options; // per-play-instance-specific options\r
+ this._iO = this.instanceOptions; // short alias\r
+\r
+ // assign property defaults (volume, pan etc.)\r
+ this.pan = this.options.pan;\r
+ this.volume = this.options.volume;\r
+\r
+ this._debug = function() {\r
+ if (_s.debugMode) {\r
+ var stuff = null;\r
+ var msg = [];\r
+ var sF = null;\r
+ var sfBracket = null;\r
+ var maxLength = 64; // # of characters of function code to show before truncating\r
+ for (stuff in _t.options) {\r
+ if (_t.options[stuff] !== null) {\r
+ if (_t.options[stuff] instanceof Function) {\r
+ // handle functions specially\r
+ sF = _t.options[stuff].toString();\r
+ sF = sF.replace(/\s\s+/g,' '); // normalize spaces\r
+ sfBracket = sF.indexOf('{');\r
+ msg[msg.length] = ' '+stuff+': {'+sF.substr(sfBracket+1,(Math.min(Math.max(sF.indexOf('\n')-1,maxLength),maxLength))).replace(/\n/g,'')+'... }';\r
+ } else {\r
+ msg[msg.length] = ' '+stuff+': '+_t.options[stuff];\r
+ }\r
+ }\r
+ }\r
+ _s._wD('SMSound() merged options: {\n'+msg.join(', \n')+'\n}');\r
+ }\r
+ };\r
+\r
+ this._debug();\r
+\r
+ this.id3 = {\r
+ /* \r
+ Name/value pairs set via Flash when available - see reference for names:\r
+ http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001567.html\r
+ (eg., this.id3.songname or this.id3['songname'])\r
+ */\r
+ };\r
+\r
+ this.resetProperties = function(bLoaded) {\r
+ _t.bytesLoaded = null;\r
+ _t.bytesTotal = null;\r
+ _t.position = null;\r
+ _t.duration = null;\r
+ _t.durationEstimate = null;\r
+ _t.loaded = false;\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r
+ _t.muted = false;\r
+ _t.didBeforeFinish = false;\r
+ _t.didJustBeforeFinish = false;\r
+ _t.isBuffering = false;\r
+ _t.instanceOptions = {};\r
+ _t.instanceCount = 0;\r
+ _t.peakData = {\r
+ left: 0,\r
+ right: 0\r
+ };\r
+ _t.waveformData = [];\r
+ _t.eqData = [];\r
+ };\r
+\r
+ _t.resetProperties();\r
+\r
+ // --- public methods ---\r
+\r
+ this.load = function(oOptions) {\r
+ if (typeof oOptions != 'undefined') {\r
+ _t._iO = _s._mergeObjects(oOptions);\r
+ _t.instanceOptions = _t._iO;\r
+ } else {\r
+ oOptions = _t.options;\r
+ _t._iO = oOptions;\r
+ _t.instanceOptions = _t._iO;\r
+ } \r
+ if (typeof _t._iO.url == 'undefined') {\r
+ _t._iO.url = _t.url;\r
+ }\r
+ _s._wD('soundManager.load(): '+_t._iO.url,1);\r
+ if (_t._iO.url == _t.url && _t.readyState !== 0 && _t.readyState != 2) {\r
+ _s._wD('soundManager.load(): current URL already assigned.',1);\r
+ return false;\r
+ }\r
+ _t.loaded = false;\r
+ _t.readyState = 1;\r
+ _t.playState = 0; // (oOptions.autoPlay?1:0); // if autoPlay, assume "playing" is true (no way to detect when it actually starts in Flash unless onPlay is watched?)\r
+ try {\r
+ if (_s.flashVersion==8) {\r
+ _s.o._load(_t.sID,_t._iO.url,_t._iO.stream,_t._iO.autoPlay,(_t._iO.whileloading?1:0));\r
+ } else {\r
+ _s.o._load(_t.sID,_t._iO.url,_t._iO.stream?true:false,_t._iO.autoPlay?true:false); // ,(_tO.whileloading?true:false)\r
+ if (_t._iO.isMovieStar && _t._iO.autoLoad && !_t._iO.autoPlay) {\r
+ // special case: MPEG4 content must start playing to load, then pause to prevent playing.\r
+ _t.pause();\r
+ }\r
+ }\r
+ } catch(e) {\r
+ _s._wD('SMSound.load(): Exception: JS-Flash communication failed, or JS error.',2);\r
+ _s._debugTS('onload',false);\r
+ _s.onerror();\r
+ _s.disable();\r
+ }\r
+\r
+ };\r
+\r
+ this.unload = function() {\r
+ // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3\r
+ // Flash 9/AS3: Close stream, preventing further load\r
+ if (_t.readyState !== 0) {\r
+ _s._wD('SMSound.unload(): "'+_t.sID+'"');\r
+ if (_t.readyState != 2) { // reset if not error\r
+ _t.setPosition(0,true); // reset current sound positioning\r
+ }\r
+ _s.o._unload(_t.sID,_s.nullURL);\r
+ // reset load/status flags\r
+ _t.resetProperties();\r
+ }\r
+ };\r
+\r
+ this.destruct = function() {\r
+ // kill sound within Flash\r
+ _s._wD('SMSound.destruct(): "'+_t.sID+'"');\r
+ _s.o._destroySound(_t.sID);\r
+ _s.destroySound(_t.sID,true); // ensure deletion from controller\r
+ };\r
+\r
+ this.play = function(oOptions) {\r
+ if (!oOptions) {\r
+ oOptions = {};\r
+ }\r
+ _t._iO = _s._mergeObjects(oOptions,_t._iO);\r
+ _t._iO = _s._mergeObjects(_t._iO,_t.options);\r
+ _t.instanceOptions = _t._iO;\r
+ if (_t.playState == 1) {\r
+ var allowMulti = _t._iO.multiShot;\r
+ if (!allowMulti) {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" already playing (one-shot)',1);\r
+ return false;\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" already playing (multi-shot)',1);\r
+ }\r
+ }\r
+ if (!_t.loaded) {\r
+ if (_t.readyState === 0) {\r
+ _s._wD('SMSound.play(): Attempting to load "'+_t.sID+'"',1);\r
+ // try to get this sound playing ASAP\r
+ _t._iO.stream = true;\r
+ _t._iO.autoPlay = true;\r
+ // TODO: need to investigate when false, double-playing\r
+ // if (typeof oOptions.autoPlay=='undefined') _tO.autoPlay = true; // only set autoPlay if unspecified here\r
+ _t.load(_t._iO); // try to get this sound playing ASAP\r
+ } else if (_t.readyState == 2) {\r
+ _s._wD('SMSound.play(): Could not load "'+_t.sID+'" - exiting',2);\r
+ return false;\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'" is loading - attempting to play..',1);\r
+ }\r
+ } else {\r
+ _s._wD('SMSound.play(): "'+_t.sID+'"');\r
+ }\r
+ if (_t.paused) {\r
+ _t.resume();\r
+ } else {\r
+ _t.playState = 1;\r
+ if (!_t.instanceCount || _s.flashVersion == 9) {\r
+ _t.instanceCount++;\r
+ }\r
+ _t.position = (typeof _t._iO.position != 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0);\r
+ if (_t._iO.onplay) {\r
+ _t._iO.onplay.apply(_t);\r
+ }\r
+ _t.setVolume(_t._iO.volume,true); // restrict volume to instance options only\r
+ _t.setPan(_t._iO.pan,true);\r
+ _s.o._start(_t.sID,_t._iO.loop||1,(_s.flashVersion==9?_t.position:_t.position/1000));\r
+ }\r
+ };\r
+\r
+ this.start = this.play; // just for convenience\r
+\r
+ this.stop = function(bAll) {\r
+ if (_t.playState == 1) {\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ // if (_s.defaultOptions.onstop) _s.defaultOptions.onstop.apply(_s);\r
+ if (_t._iO.onstop) {\r
+ _t._iO.onstop.apply(_t);\r
+ }\r
+ _s.o._stop(_t.sID,bAll);\r
+ _t.instanceCount = 0;\r
+ _t._iO = {};\r
+ // _t.instanceOptions = _t._iO;\r
+ }\r
+ };\r
+\r
+ this.setPosition = function(nMsecOffset,bNoDebug) {\r
+ if (typeof nMsecOffset == 'undefined') {\r
+ nMsecOffset = 0;\r
+ }\r
+ var offset = Math.min(_t.duration,Math.max(nMsecOffset,0)); // position >= 0 and <= current available (loaded) duration\r
+ _t._iO.position = offset;\r
+ if (!bNoDebug) {\r
+ _s._wD('SMSound.setPosition('+nMsecOffset+')'+(nMsecOffset != offset?', corrected value: '+offset:''));\r
+ }\r
+ _s.o._setPosition(_t.sID,(_s.flashVersion==9?_t._iO.position:_t._iO.position/1000),(_t.paused||!_t.playState)); // if paused or not playing, will not resume (by playing)\r
+ };\r
+\r
+ this.pause = function() {\r
+ if (_t.paused || _t.playState === 0) {\r
+ return false;\r
+ }\r
+ _s._wD('SMSound.pause()');\r
+ _t.paused = true;\r
+ _s.o._pause(_t.sID);\r
+ if (_t._iO.onpause) {\r
+ _t._iO.onpause.apply(_t);\r
+ }\r
+ };\r
+\r
+ this.resume = function() {\r
+ if (!_t.paused || _t.playState === 0) {\r
+ return false;\r
+ }\r
+ _s._wD('SMSound.resume()');\r
+ _t.paused = false;\r
+ _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume)\r
+ if (_t._iO.onresume) {\r
+ _t._iO.onresume.apply(_t);\r
+ }\r
+ };\r
+\r
+ this.togglePause = function() {\r
+ _s._wD('SMSound.togglePause()');\r
+ if (!_t.playState) {\r
+ _t.play({position:(_s.flashVersion==9?_t.position:_t.position/1000)});\r
+ return false;\r
+ }\r
+ if (_t.paused) {\r
+ _t.resume();\r
+ } else {\r
+ _t.pause();\r
+ }\r
+ };\r
+\r
+ this.setPan = function(nPan,bInstanceOnly) {\r
+ if (typeof nPan == 'undefined') {\r
+ nPan = 0;\r
+ }\r
+ if (typeof bInstanceOnly == 'undefined') {\r
+ bInstanceOnly = false;\r
+ }\r
+ _s.o._setPan(_t.sID,nPan);\r
+ _t._iO.pan = nPan;\r
+ if (!bInstanceOnly) {\r
+ _t.pan = nPan;\r
+ }\r
+ };\r
+\r
+ this.setVolume = function(nVol,bInstanceOnly) {\r
+ if (typeof nVol == 'undefined') {\r
+ nVol = 100;\r
+ }\r
+ if (typeof bInstanceOnly == 'undefined') {\r
+ bInstanceOnly = false;\r
+ }\r
+ _s.o._setVolume(_t.sID,(_s.muted&&!_t.muted)||_t.muted?0:nVol);\r
+ _t._iO.volume = nVol;\r
+ if (!bInstanceOnly) {\r
+ _t.volume = nVol;\r
+ }\r
+ };\r
+\r
+ this.mute = function() {\r
+ _t.muted = true;\r
+ _s.o._setVolume(_t.sID,0);\r
+ };\r
+\r
+ this.unmute = function() {\r
+ _t.muted = false;\r
+ var hasIO = typeof _t._iO.volume != 'undefined';\r
+ _s.o._setVolume(_t.sID,hasIO?_t._iO.volume:_t.options.volume);\r
+ };\r
+\r
+ // --- "private" methods called by Flash ---\r
+\r
+ this._whileloading = function(nBytesLoaded,nBytesTotal,nDuration) {\r
+ if (!_t._iO.isMovieStar) {\r
+ _t.bytesLoaded = nBytesLoaded;\r
+ _t.bytesTotal = nBytesTotal;\r
+ _t.duration = Math.floor(nDuration);\r
+ _t.durationEstimate = parseInt((_t.bytesTotal/_t.bytesLoaded)*_t.duration,10); // estimate total time (will only be accurate with CBR MP3s.)\r
+ if (_t.readyState != 3 && _t._iO.whileloading) {\r
+ _t._iO.whileloading.apply(_t);\r
+ }\r
+ } else {\r
+ _t.bytesLoaded = nBytesLoaded;\r
+ _t.bytesTotal = nBytesTotal;\r
+ _t.duration = Math.floor(nDuration);\r
+ _t.durationEstimate = _t.duration;\r
+ if (_t.readyState != 3 && _t._iO.whileloading) {\r
+ _t._iO.whileloading.apply(_t);\r
+ }\r
+ }\r
+ };\r
+\r
+ this._onid3 = function(oID3PropNames,oID3Data) {\r
+ // oID3PropNames: string array (names)\r
+ // ID3Data: string array (data)\r
+ _s._wD('SMSound._onid3(): "'+this.sID+'" ID3 data received.');\r
+ var oData = [];\r
+ for (var i=0,j=oID3PropNames.length; i<j; i++) {\r
+ oData[oID3PropNames[i]] = oID3Data[i];\r
+ // _s._wD(oID3PropNames[i]+': '+oID3Data[i]);\r
+ }\r
+ _t.id3 = _s._mergeObjects(_t.id3,oData);\r
+ if (_t._iO.onid3) {\r
+ _t._iO.onid3.apply(_t);\r
+ }\r
+ };\r
+\r
+ this._whileplaying = function(nPosition,oPeakData,oWaveformData,oEQData) {\r
+ if (isNaN(nPosition) || nPosition === null) {\r
+ return false; // Flash may return NaN at times\r
+ }\r
+ _t.position = nPosition;\r
+ if (_t._iO.usePeakData && typeof oPeakData != 'undefined' && oPeakData) {\r
+ _t.peakData = {\r
+ left: oPeakData.leftPeak,\r
+ right: oPeakData.rightPeak\r
+ };\r
+ }\r
+ if (_t._iO.useWaveformData && typeof oWaveformData != 'undefined' && oWaveformData) {\r
+ _t.waveformData = oWaveformData;\r
+ /*\r
+ _t.spectrumData = {\r
+ left: oSpectrumData.left.split(','),\r
+ right: oSpectrumData.right.split(',')\r
+ }\r
+ */\r
+ }\r
+ if (_t._iO.useEQData && typeof oEQData != 'undefined' && oEQData) {\r
+ _t.eqData = oEQData;\r
+ }\r
+ if (_t.playState == 1) {\r
+ if (_t._iO.whileplaying) {\r
+ _t._iO.whileplaying.apply(_t); // flash may call after actual finish\r
+ }\r
+ if (_t.loaded && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration-_t.position <= _t._iO.onbeforefinishtime) {\r
+ _s._wD('duration-position <= onbeforefinishtime: '+_t.duration+' - '+_t.position+' <= '+_t._iO.onbeforefinishtime+' ('+(_t.duration-_t.position)+')');\r
+ _t._onbeforefinish();\r
+ }\r
+ }\r
+ };\r
+\r
+ this._onload = function(bSuccess) {\r
+ bSuccess = (bSuccess==1?true:false);\r
+ _s._wD('SMSound._onload(): "'+_t.sID+'"'+(bSuccess?' loaded.':' failed to load? - '+_t.url),(bSuccess?1:2));\r
+ if (!bSuccess) {\r
+ if (_s.sandbox.noRemote === true) {\r
+ _s._wD('SMSound._onload(): Reminder: Flash security is denying network/internet access',1);\r
+ }\r
+ if (_s.sandbox.noLocal === true) {\r
+ _s._wD('SMSound._onload(): Reminder: Flash security is denying local access',1);\r
+ }\r
+ }\r
+ _t.loaded = bSuccess;\r
+ _t.readyState = bSuccess?3:2;\r
+ if (_t._iO.onload) {\r
+ _t._iO.onload.apply(_t);\r
+ }\r
+ };\r
+\r
+ this._onbeforefinish = function() {\r
+ if (!_t.didBeforeFinish) {\r
+ _t.didBeforeFinish = true;\r
+ if (_t._iO.onbeforefinish) {\r
+ _s._wD('SMSound._onbeforefinish(): "'+_t.sID+'"');\r
+ _t._iO.onbeforefinish.apply(_t);\r
+ }\r
+ }\r
+ };\r
+\r
+ this._onjustbeforefinish = function(msOffset) {\r
+ // msOffset: "end of sound" delay actual value (eg. 200 msec, value at event fire time was 187)\r
+ if (!_t.didJustBeforeFinish) {\r
+ _t.didJustBeforeFinish = true;\r
+ if (_t._iO.onjustbeforefinish) {\r
+ _s._wD('SMSound._onjustbeforefinish(): "'+_t.sID+'"');\r
+ _t._iO.onjustbeforefinish.apply(_t);\r
+ }\r
+ }\r
+ };\r
+\r
+ this._onfinish = function() {\r
+ // sound has finished playing\r
+\r
+ // TODO: calling user-defined onfinish() should happen after setPosition(0)\r
+ // OR: onfinish() and then setPosition(0) is bad.\r
+\r
+ if (_t._iO.onbeforefinishcomplete) {\r
+ _t._iO.onbeforefinishcomplete.apply(_t);\r
+ }\r
+ // reset some state items\r
+ _t.didBeforeFinish = false;\r
+ _t.didJustBeforeFinish = false;\r
+ if (_t.instanceCount) {\r
+ _t.instanceCount--;\r
+ if (!_t.instanceCount) {\r
+ // reset instance options\r
+ // _t.setPosition(0);\r
+ _t.playState = 0;\r
+ _t.paused = false;\r
+ _t.instanceCount = 0;\r
+ _t.instanceOptions = {};\r
+ if (_t._iO.onfinish) {\r
+ _s._wD('SMSound._onfinish(): "'+_t.sID+'"');\r
+ _t._iO.onfinish.apply(_t);\r
+ }\r
+ }\r
+ } else {\r
+ // _t.setPosition(0);\r
+ }\r
+ };\r
+\r
+ this._onmetadata = function(oMetaData) {\r
+ // movieStar mode only\r
+ _s._wD('SMSound.onmetadata()');\r
+ // Contains a subset of metadata. Note that files may have their own unique metadata.\r
+ // http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000267.html\r
+ if (!oMetaData.width && !oMetaData.height) {\r
+ _s._wD('No width/height given, assuming defaults');\r
+ oMetaData.width = 320;\r
+ oMetaData.height = 240;\r
+ }\r
+ _t.metadata = oMetaData; // potentially-large object from flash\r
+ _t.width = oMetaData.width;\r
+ _t.height = oMetaData.height;\r
+ if (_t._iO.onmetadata) {\r
+ _s._wD('SMSound._onmetadata(): "'+_t.sID+'"');\r
+ _t._iO.onmetadata.apply(_t);\r
+ }\r
+ _s._wD('SMSound.onmetadata() complete');\r
+ };\r
+\r
+ this._onbufferchange = function(bIsBuffering) {\r
+ if (bIsBuffering == _t.isBuffering) {\r
+ // ignore initial "false" default, if matching\r
+ return false;\r
+ }\r
+ _t.isBuffering = (bIsBuffering==1?true:false);\r
+ if (_t._iO.onbufferchange) {\r
+ _s._wD('SMSound._onbufferchange(): '+bIsBuffering);\r
+ _t._iO.onbufferchange.apply(_t);\r
+ }\r
+ };\r
+\r
+ }; // SMSound()\r
+\r
+ // register a few event handlers\r
+ if (window.addEventListener) {\r
+ window.addEventListener('focus',_s.handleFocus,false);\r
+ window.addEventListener('load',_s.beginDelayedInit,false);\r
+ window.addEventListener('unload',_s.destruct,false);\r
+ if (_s._tryInitOnFocus) {\r
+ window.addEventListener('mousemove',_s.handleFocus,false); // massive Safari focus hack\r
+ }\r
+ } else if (window.attachEvent) {\r
+ window.attachEvent('onfocus',_s.handleFocus);\r
+ window.attachEvent('onload',_s.beginDelayedInit);\r
+ window.attachEvent('unload',_s.destruct);\r
+ } else {\r
+ // no add/attachevent support - safe to assume no JS -> Flash either.\r
+ _s._debugTS('onload',false);\r
+ soundManager.onerror();\r
+ soundManager.disable();\r
+ }\r
+\r
+ if (document.addEventListener) {\r
+ document.addEventListener('DOMContentLoaded',_s.domContentLoaded,false);\r
+ }\r
+\r
+} // SoundManager()\r
+\r
+soundManager = new SoundManager();
\ No newline at end of file
--- /dev/null
+{eztelemetadata_set('eztelemeta_player', true)}
+<div class="view-embed">
+ <div class="content-media">
+ {include uri="design:content/datatype/view/eztelemetaitem.tpl"
+ attribute=$object.data_map.item}
+ </div>
+</div>
+
--- /dev/null
+{* Telemeta Item - Full view *}
+
+<div class="content-view-full">
+ <div class="class-telemetaitem">
+
+ <h2>{$node.data_map.item.content.title|wash}</h2>
+
+ <div class="content-media">
+ {include uri="design:content/datatype/view/eztelemetaitem.tpl"
+ attribute=$node.data_map.item}
+ </div>
+
+ </div>
+</div>
--- /dev/null
+/*
+ * eZTelemeta default CSS rules
+ *
+ * Copyright (c) 2009 Samalyse
+ * Author: Olivier Guilyardi <olivier samalyse com>
+ * License: CeCILL Free Software License Agreement
+ */
+
+/* Core styles
+ *
+ * These style rules are quite neutral in regard to visual appearance, and
+ * are meant to provide basic ergonomic enhancements such as:
+ * - play/pause icons
+ * - sound load blinking
+ * - position hiding when stopped
+ */
+
+.telemeta-item { text-align: left; }
+
+.telemeta-item .telemeta-sound a {
+ display: block;
+ background: url('../images/play.gif') no-repeat left top;
+ padding-left: 29px;
+ height: 22px;
+ padding-top: 0.5ex;
+}
+.telemeta-item .telemeta-position, .telemeta-item .telemeta-separator { display: none; }
+.telemeta-playing .telemeta-sound a { background-image: url('../images/stop.gif'); }
+.telemeta-playing .telemeta-position, .telemeta-playing .telemeta-separator { display: inline; }
+.telemeta-loading .telemeta-position { text-decoration: blink; }
+
+/* Compact box styles
+ *
+ * While remaining quite visually neutral, these rules are meant to make telemeta
+ * items more appealing and compact, and may not fit with all designs.
+ */
+
+.telemeta-item {
+ position: relative;
+ background: #EEEEEE;
+ padding: 0.3ex 1.3ex 1.3ex 1.3ex;
+ border: solid 1px #DDDDDD;
+}
+
+.telemeta-item dd { margin-left: 0; }
+
+.telemeta-item dt.telemeta-sound, .telemeta-item dt.telemeta-duration,
+.telemeta-item dt.telemeta-description { display: none; }
+
+.telemeta-item .telemeta-sound { padding-right: 8.3em; }
+
+.telemeta-item .telemeta-sound a {
+ text-decoration: none;
+ font-weight: bold;
+ color: #000066;
+ outline: none;
+ padding-bottom: 0.6ex;
+}
+
+.telemeta-item dd.telemeta-duration {
+ position: absolute;
+ right: 0.7ex;
+ top: 1.4ex;
+ font-size: 80%;
+ color: #000066;
+ padding: 0.4ex 0.7ex 0.3ex 0.7ex;
+ border-bottom: solid 1px #E0E0E0;
+ border-top: solid 1px #DDDDDD;
+ font-weight: bold;
+}
+
+.telemeta-item .telemeta-sound a:hover, .telemeta-playing dd.telemeta-duration { color: #0000AA; }
+.telemeta-playing .telemeta-position { color: #AA0000; }
+.telemeta-item dd.telemeta-description { font-style: italic; margin-left: 0.2em; }
+.telemeta-item .telemeta-creator, .telemeta-item .telemeta-rights { font-size: 90%; margin-bottom: 1px; }
+
+.telemeta-item dt.telemeta-creator, .telemeta-item dt.telemeta-rights {
+ float: left;
+ padding-right: 1ex;
+ position: relative;
+ margin-left: 0.2em;
+}
+
+.telemeta-item .telemeta-clear { clear: both; }
+.telemeta-item .telemeta-position, .telemeta-item .telemeta-separator { display: inline; }
+
--- /dev/null
+{* DO NOT EDIT THIS FILE! Use an override template instead. *}
+{default attribute_base=ContentObjectAttribute}
+
+<div class="block">
+<label>{'Telemeta URL'|i18n( 'design/standard/content/datatype' )}:</label>
+<input class="box ezcc-{$attribute.object.content_class.identifier} ezcca-{$attribute.object.content_class.identifier}_{$attribute.contentclass_attribute_identifier}" type="text" name="{$attribute_base}_url_{$attribute.id}" value="{$attribute.content.url}" />
+</div>
+
+<div class="block">
+<label>{'Item Identifier'|i18n( 'design/standard/content/datatype' )}:</label>
+<input class="box ezcc-{$attribute.object.content_class.identifier} ezcca-{$attribute.object.content_class.identifier}_{$attribute.contentclass_attribute_identifier}" type="text" name="{$attribute_base}_itemid_{$attribute.id}" value="{$attribute.content.id}" />
+</div>
--- /dev/null
+{eztelemetadata_set('eztelemeta_player', true)}
+{def $item=$attribute.content}
+<div class="telemeta-item">
+ <dl>
+ <dt class="telemeta-sound">{'Sound'|i18n('eztelemeta')} :</dt>
+ <dd class="telemeta-sound"><a href="{$item.mp3}">{$item.title|wash}</a></dd>
+
+ <dt class="telemeta-duration">{'Duration'|i18n('eztelemeta')} :</dt>
+ <dd class="telemeta-duration">
+ <span class="telemeta-position">00:00:00</span>
+ <span class="telemeta-separator"> / </span>
+ {$item.duration_str}
+ </dd>
+
+ {if $item.description }
+ <dt class="telemeta-description">{'Description'|i18n('eztelemeta')} :</dt>
+ <dd class="telemeta-description">{$item.description|wash}</dd>
+ {/if}
+
+ {if $item.creator }
+ <dt class="telemeta-creator">{'Creator'|i18n('eztelemeta')} :</dt>
+ <dd class="telemeta-creator">{$item.creator|wash}</dd>
+ {/if}
+
+ {if $item.rights }
+ <dt class="telemeta-rights">{'Legal rights'|i18n('eztelemeta')} :</dt>
+ <dd class="telemeta-rights">{$item.rights|wash}</dd>
+ {/if}
+ </dl>
+ <div class="telemeta-clear"></div>
+</div>
+{undef}
--- /dev/null
+{if is_set( $module_result.content_info.persistent_variable.eztelemeta_player )}
+<style type="text/css">
+ @import url({"stylesheets/eztelemeta.css"|ezdesign});
+</style>
+<script language="JavaScript" type="text/javascript" src={"javascript/soundmanager2-nodebug-jsmin.js"|ezdesign}></script>
+<script language="JavaScript" type="text/javascript" src={"javascript/eztelemeta-player.js"|ezdesign}></script>
+<script language="JavaScript" type="text/javascript">
+/* SoundManager2 configuration */
+soundManager.url = {'swf/'|ezdesign};
+
+telemetaPlayer = new TelemetaPlayer();
+
+{literal}
+soundManager.onload = function() {
+ telemetaPlayer.setSoundManager(soundManager);
+}
+{/literal}
+</script>
+{/if}
--- /dev/null
+VERSION := $(shell cat ../VERSION)
+DOCS=README.fr.html README.fr.pdf README.fr README.fr.latex
+
+doc: $(DOCS)
+
+README.fr.html: README.fr doc.css player.png
+ cat README.fr | sed 's/:scale: .*/:scale: 100/' | \
+ rst2html -lfr --stylesheet=doc.css --link-stylesheet - $@
+
+README.fr.pdf: README.fr.latex
+ pdflatex $^
+ pdflatex $^ # Double run is sometimes needed
+
+README.fr.latex: README.fr player.png
+ rst2latex -lfr README.fr $@
+
+README.fr: README.fr.in ../VERSION
+ cat README.fr.in | sed "s/EZTVERSION/$(VERSION)/g" > $@
+
+clean:
+ rm -f $(DOCS) README.fr.aux README.fr.out README.fr.log
+
+# vim: set noexpandtab: ts=2: sw=2:
--- /dev/null
+=============================================
+eZTelemeta |version| - Mise en place et usage
+=============================================
+
+:Auteur: Olivier Guilyardi <olivier samalyse com>
+:Date: |today|
+
+.. contents:: **Table des matières**
+.. sectnum::
+
+----
+
+Introduction
+~~~~~~~~~~~~
+
+Le présent document décrit les procédures de mise en place et d'usage
+de l'extension eZPublish eZTelemeta |version|. Cette extension a pour but
+de permettre l'intégration dynamique d'éléments sonores en provenance
+du logiciel Telemeta.
+
+Pré-requis
+~~~~~~~~~~
+
+- Système Linux ou FreeBSD:
+- PHP version 5.2 ou supérieur
+- Apache version 1.3 ou supérieur
+- eZPublish 4.1.0
+- l'accès distant à une installation Telemeta
+
+Mise en place
+~~~~~~~~~~~~~
+
+Installation de l'extension
+---------------------------
+
+eZTelemeta |version| est distribuée sous la forme d'une archive .tar.gz,
+contenant le répertoire ``eztelemeta``, à placer dans le répertoire
+``extension`` de l'installation eZPublish.
+
+Puis activer l'extension dans l'administration, onglet Setup/Extensions,
+et régénerer les données de chargement automatique (``Regenerate
+autoload arrays for extensions``)
+
+Création de la classe principale
+--------------------------------
+
+eZTelemeta définit un nouveau type de données, appelé ``Telemeta
+Item``. Les utilisateur avancés de eZPublish peuvent envisager
+différents scénarios d'utilisation de ce type de données. La procédure
+décrite ici consiste à créer une classe qui ne contiendra qu'un
+seul attribut, de type ``Telemeta Item``. Il est fortement recommandé
+de procéder ainsi lors d'une première mise en place, notamment pour
+intégrer facilement le lecteur audio aux pages publiques.
+
+Dans l'administration, dans Setup/Classes, dans le groupe Media, créer
+une classe avec les paramètres suivants::
+
+ - Name: Telemeta Audio Item
+ - Identifier: telemetaitem
+ - Object name pattern: <item>
+
+Ajouter un attribut de type ``Telemeta Item``, avec pour paramètres (*respecter
+la casse*)::
+
+ - Name: Item
+ - Identifier: item
+ - Required: activé
+ - Searchable: activé
+
+Cliquer sur OK pour enregistrer la nouvelle classe.
+
+Réglage des permissions
+-----------------------
+
+Pour pouvoir afficher les items sur les pages publiques, il faut autoriser
+leur accès aux utilisateurs *anonymes*.
+
+Dans l'espace d'administration, onglet Setup, dans Roles and policies:
+
+1. Éditer le rôle ``Anonymous``
+2. Cliquer sur ``New policy``
+3. Choisir le module ``content`` puis cliquer sur ``Grant access to one function``
+4. Choisir la fonction ``read`` puis cliquer sur ``Grant limited access``
+5. Choisir la classe ``Telemeta Audio Item`` puis cliquer en bas de page sur OK
+6. De retour sur le role, cliquer à nouveau sur OK
+
+Création d'un objet de contenu
+------------------------------
+
+Il est maintenant possible de créer un objet de contenu (une instance)
+à partir de cette classe, par exemple dans l'onglet Media Library,
+dossier Multimedia, créer un objet de type Telemeta Audio Item avec
+pour paramètres::
+
+ - Telemeta URL: L'url de l'installation Telemeta distante.
+ (exemple: http://mucem.telemeta.org)
+
+ - Item Identifier: La cote de l'item. Celle-ci peut être trouvée
+ en accédant à l'interface web de Telemeta, sur
+ la page de l'item choisi.
+
+Puis enregistrer les modifications (``Send for publishing``).
+
+**Remarque**: au moment de l'enregistrement, eZTelemeta établit
+une connexion avec l'installation Telemeta distante, en utilisant le
+protocole OAI-PMH via HTTP. Si la cote de l'item est invalide, ou
+si la connexion HTTP ne peut-être établi à cause d'un mauvais URL,
+l'item ne sera pas enregistré, et une erreur s'affichera. Dans ce cas
+vérifiez bien votre saisie.
+
+Intégration de l'objet de contenu dans un article
+-------------------------------------------------
+
+Maintenant que nous disposons d'un objet de contenu Telemeta, il est facile
+de l'intégrer à un article. Pour ce faire, lors de l'édition d'un article:
+
+1. Cliquer sur l'icône représentant un *trombone* (``Insérer/modifier un objet``)
+2. Une fenêtre DHTML doit s'ouvrir, cliquer sur Parcourir, Media puis sur Multimedia
+3. Sélectionner l'item Telemeta à insérer, un aperçu (lien, titre, etc...) doit s'afficher
+4. Cliquer sur OK
+
+L'item doit maintenant être intégré au corps de l'article, sous la
+forme d'une liste de définition HTML (``<dl>...</dl>``), affichant le
+titre de l'item sous la forme d'un lien vers le fichier son hébergé
+sur le serveur Telemeta, la durée (HH:MM:SS) de l'item, et suivant les
+informations qui sont disponibles, un ou plusieurs éléments parmi les
+suivants: Auteur/Collecteur, Description, Droits d'usage.
+
+L'intégration sous la forme d'une liste de définition HTML a plusieurs avantages:
+
+- en terme de contenu, c'est la construction HTML la plus adaptée à une liste de méta-données
+- la présentation est facilement personnalisable avec des feuilles de styles CSS.
+- elle est accessible, facilitant par exemple la consultation à l'aide de périphériques de type lecteur
+ d'écran destinés aux mal-voyants
+
+Intégration du lecteur audio
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Remarques générales sur le lecteur
+----------------------------------
+
+eZTelemeta inclut un lecteur audio web employant javascript et flash de
+façon dîte *dégradable*: si flash ou javascript sont absents, le lien
+HTML vers le fichier son (mp3) est laissé intacte, et la lecture reste
+donc possible à l'aide d'un module externe au navigateur (Windows Media
+Player, iTunes, VLC, etc...).
+
+Cependant, la plupart des utilisateurs pourront profiter du lecteur audio
+permettant la lecture interactive du son sans quitter la page en cours,
+à la condition que le lecteur Adobe Flash 8 soit installé, et javascript
+activé, sous:
+
+- Internet Explorer 6 et 7
+- Firefox 2 et 3
+- Safari 3
+- Opera 9
+
+Voici un aperçu du lecteur :
+
+.. image:: player.png
+ :scale: 75
+
+Dans le respect des règles de l'art du web actuel, les routines
+javascript sont séparées de façon stricte du contenu HTML. L'affichage
+interactif du lecteur est entièrement personnalisable via CSS et/ou
+modification des templates eZPublish. Flash est utilisé de façon
+invisible, via la librairie SoundManager2, offrant une API javascript
+dédiée au son.
+
+Plusieurs items peuvent être placés arbitrairement dans la page,
+s'intégrant bien au flot du contenu HTML. Lorsqu'on clique sur
+l'un deux, si la lecture d'un autre item est déjà en cours, elle
+s'interrompt, de façon à éviter la lecture accidentelle simultanée
+de plusieurs sons.
+
+**Remarque :** Pour simplifier la mise en place du lecteur, il est
+recommandé d'utiliser une classe de contenu eZPublish dont l'identifiant
+est ``telemetaitem`` comme indiqué à la section `Création de la classe
+principale`_.
+
+Chargement des dépendances
+--------------------------
+
+Le lecteur possède des dépendances CSS et Javascript qui doivent êtres
+chargées dans la section ``<head/>`` des pages du site. Pour ce faire
+eZTelemeta contient un template qui doit être inclut dans cette section,
+en personnalisant le template ``pagelayout.tpl``, qui est utilisé
+par eZPublish pour construire toutes les pages.
+
+Pour ce faire, se rendre dans l'onglet Design de l'espace
+d'administration eZPublish, et (si ce n'est déjà fait) y créer
+un ``override`` du template ``pagelayout.tpl`` pour le ou les sites
+concernés. Il est également recommandé de créer un tel ``override``
+pour le template ``pagelayout.tpl`` de la partie administrative.
+
+Puis, dans chacun des templates ``pagelayout.tpl`` concernés, inclure
+le template d'initialisation en plaçant l'expression suivante dans la section
+``<head/>``::
+
+{include uri="design:eztelemeta_head.tpl"}
+
+Enfin, vider le cache eZPublish. Le lecteur audio doit maintenant être actif
+à la fois sur les pages publiques intégrant un item Telemeta, et lors de la
+pré-visualisation d'un article dans l'espace administratif.
+
+**Remarque**: le fait d'inclure le template ``eztelemeta_head.tpl`` dans toutes
+les pages du site via la personnalisation de ``pagelayout.tpl``, n'alourdit pas
+inutilement le chargement des pages. Les dépendances CSS, JS et Flash ne sont
+chargées que si la page en cours contient effectivement un item Telemeta.
+
+Personnalisation à l'aide de feuilles de style
+----------------------------------------------
+
+Comme indiqué à la section `Remarques générales sur le lecteur`_
+l'apparence du lecteur audio repose intégralement sur HTML et CSS,
+contrairement à un lecteur possédant une interface utilisateur flash,
+et peut donc facilement être personnalisée.
+
+Dans la majorité des cas, la personnalisation peut être effectuée à l'aide règles
+de style CSS.
+
+Par défaut, l'affichage d'un item par défaut a la structure suivante::
+
+ <div class="telemeta-item">
+ <dl>
+ <dt class="telemeta-sound">Son :</dt>
+ <dd class="telemeta-sound"><a href="...">...</a></dd>
+
+ <dt class="telemeta-duration">Durée :</dt>
+ <dd class="telemeta-duration">
+ <span class="telemeta-position">...</span>
+ <span class="telemeta-separator"> / </span>
+ ...
+ </dd>
+
+ <dt class="telemeta-description">Description :</dt>
+ <dd class="telemeta-description">...</dd>
+
+ <dt class="telemeta-creator">Auteur / Collecteur :</dt>
+ <dd class="telemeta-creator">...</dd>
+
+ <dt class="telemeta-rights">Droits d'usage :</dt>
+ <dd class="telemeta-rights">...</dd>
+ </dl>
+ <div class="telemeta-clear"></div>
+ </div>
+
+Lorsque la lecture est en cours, la classe ``telemeta-playing`` est
+ajoutée automatiquement (par la classe javascript ``TelemetaPlayer``)
+à l'élément ``div``::
+
+ <div class="telemeta-item telemeta-playing">
+ ...
+ </div>
+
+Si la lecture est activée, mais que le son ne peut-être joué car il est
+en cours de chargement (mise en tampon), la classe ``telemeta-loading``
+est ajoutée à l'élément ``div``::
+
+ <div class="telemeta-item telemeta-playing telemeta-loading">
+ ...
+ </div>
+
+La feuille de style par défaut est quant à elle localisée dans::
+
+ eztelemeta/design/standard/stylesheets/eztelemeta.css
+
+Cette feuille de style contient deux sections:
+
+ - Core styles: ces règles laisse la liste de définition HTML ``<dl/>``
+ quasiment intacte, ajoutant simplement l'icône play/pause au lien,
+ et un effet de clignotement en cours de chargement.
+ - Compact box styles: ces règles, légèrement plus intrusives, donne son
+ apparence plus compacte au lecteur, avec couleur de fond, etc...
+
+Personnalisation des Templates
+------------------------------
+
+Pour une personnalisation plus poussée de l'apparence du lecteur il est possible
+de modifier les templates HTML. Pour ce faire, comme ailleurs dans eZPublish, il
+est recommandé de créer des ``override`` de template, et non de modifier
+directement les templates. Se reporter à la documentation de eZPublish pour plus
+de détails.
+
+Le code HTML du lecteur réside essentiellement dans le template de vue du type
+de donnée ``Telemeta Item``::
+
+ eztelemeta/design/standard/templates/content/datatype/view/eztelemetaitem.tpl
+
+Cependant, d'autres templates sont nécessaires suivant le contexte d'affichage.
+Mais, pour éviter la redondance ils *incluent* le template ci-dessus. De cette
+façon, la modification de ce template se répercutent automatiquement dans les
+différents contextes. Néanmoins, dans certains cas, il peut-être utile d'éviter
+ce mécanisme d'inclusion pour une personnalisation plus poussée, ce qui reste
+possible via le système de surcharge (``override``) de eZPublish.
+
+Ces templates annexes, qui incluent le template principal sont::
+
+ - template d'imbrication (dans un article, etc...) :
+ eztelemeta/design/standard/override/templates/embed/eztelemetaitem.tpl
+
+ - template de vue autonome (résultat de recherche, etc...) :
+ eztelemeta/design/standard/override/templates/full/eztelemetaitem.tpl
+
+Par ailleurs, le chargement des dépendances et l'initialisation du
+lecteur sont réalisés dans::
+
+ eztelemeta/design/standard/templates/eztelemeta_head.tpl
+
+
+Mise à jour dynamique et gestion du cache
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Contenu dynamique
+-----------------
+
+Contrairement à la grande majorité des contenus gérés dans eZPublish,
+les items sont susceptibles de changer depuis l'extérieur, c'est à
+dire dans le contexte de Telemeta lui-même.
+
+L'une des raisons d'être de eZTelemeta est la répercussion automatique
+de ces changements (titre, son, auteur, etc...), sans qu'il soit
+nécessaire d'intervenir dans l'espace d'administration de eZPublish.
+
+Cette fonctionnalité est rendue possible grâce au lien OAI-PMH établi
+avec Telemeta, et la gestion du cache eZPublish.
+
+Gestion du cache
+----------------
+
+L'établissement d'une connexion avec le serveur distant Telemeta ne peut
+bien évidemment pas être effectuée à chaque affichage d'un item,
+ce serait trop lourd.
+
+Cependant, eZTelemeta n'inclut pas de système de gestion de cache spécifique.
+C'est le cache standard de eZPublish qui est utilisé.
+
+Ainsi, il convient que l'administrateur vérifie les réglages du cache,
+de façon à ce qu'il soit vidé périodiquement, pour recharger les
+méta-données des items Telemeta.
+
+Cette opération peut notamment être réalisée via un cronjob appelant régulièrement
+le script eZPublish suivant::
+
+ php bin/php/ezcache.php --clear-tag=content
+
+Cette opération entraînera effectivement le rafraîchissement de l'ensemble des
+méta-données des items, affichées dans le lecteur audio.
+
+Cependant, le nom des objets de contenu n'est pas mis à jour par la
+purge du cache. C'est une limitation de eZPublish, qui est légèrement
+problématique dans le contexte de la gestion d'objets distants comme
+les items Telemeta.
+
+Les noms d'objets contiennent le titre d'item et apparaissent:
+
+- dans le titre HTML de la page lors de la vue autonome d'un item Telemeta
+- dans la liste des résultats de recherche
+- dans la liste d'objets de contenu dans l'espace d'administration
+
+Aucune opération de purge de cache ne met à jour ces noms d'objets, il faut soit
+modifier l'item, soit avoir recours au script eZPublish suivant, via un cronjob
+par exemple (il est recommandé de faire une sauvegarde avant le premier lancement
+de ce script)::
+
+ php update/common/scripts/updatecontentobjectname.php
+
+
+.. |version| replace:: EZTVERSION
+.. |today| date::
+.. vim: set ft=rst:
--- /dev/null
+body { font-size: 90%; }
+h1 a, h2 a { text-decoration: none; color: black; }
+h1 a { border-bottom: solid 2px #BBBBBB; }
+h1 a:hover, h2 a:hover { border-bottom: solid 2px #990000; }
+h1 { font-size: 150%; }
+h2 { font-size: 110%; }
+h1.title { border-bottom: solid 2px #990000; font-size: 170%; }
+tt.literal, pre.literal-block { background: #EEEEEE; }
+.contents a { color: #880000; }
--- /dev/null
+[DataTypeSettings]
+ExtensionDirectories[]=eztelemeta
+AvailableDataTypes[]=eztelemetaitem
+
--- /dev/null
+[ExtensionSettings]
+DesignExtensions[]=eztelemeta
+
--- /dev/null
+[telemetaitem_full]
+Source=node/view/full.tpl
+MatchFile=full/eztelemetaitem.tpl
+Subdir=templates
+Match[class_identifier]=telemetaitem
+
+[embed_telemetaitem]
+Source=content/view/embed.tpl
+MatchFile=embed/eztelemetaitem.tpl
+Subdir=templates
+Match[class_identifier]=telemetaitem
--- /dev/null
+[TemplateSettings]
+ExtensionAutoloadPath[]=eztelemeta
+
+[RegionalSettings]
+TranslationExtensions[]=eztelemeta
+
--- /dev/null
+<!DOCTYPE TS><TS>
+<defaultcodec></defaultcodec>
+<context>
+ <name>eztelemeta</name>
+ <message>
+ <source>Sound</source>
+ <translation>Son</translation>
+ </message>
+ <message>
+ <source>Duration</source>
+ <translation>Durée</translation>
+ </message>
+ <message>
+ <source>Description</source>
+ <translation>Description</translation>
+ </message>
+ <message>
+ <source>Creator</source>
+ <translation>Auteur / Collecteur</translation>
+ </message>
+ <message>
+ <source>Legal rights</source>
+ <translation>Droits d'usage</translation>
+ </message>
+</context>
+</TS>