From 66ab2867ff8702bbb1c5d927efce03b44668a64f Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Sat, 17 Oct 2015 16:02:43 -0400 Subject: [PATCH] Retire stackforge/cloud-pydashie --- .gitattributes | 22 - .gitignore | 4 - .gitreview | 4 - LICENSE.txt | 7 - MANIFEST.in | 4 - README.rst | 124 +- compile.py | 56 - ez_setup.py | 485 - mainscreen.png | Bin 223294 -> 0 bytes pydashie/__init__.py | 0 pydashie/assets/images/favicon.ico | Bin 4286 -> 0 bytes .../assets/images/usage-gauge-background.png | Bin 976 -> 0 bytes pydashie/assets/javascripts/app.js | 355 - .../assets/javascripts/application.coffee | 18 - pydashie/assets/javascripts/application.js | 17658 ---------------- pydashie/assets/javascripts/batman.jquery.js | 333 - pydashie/assets/javascripts/batman.js | 12367 ----------- pydashie/assets/javascripts/d3.v2.min.js | 4 - pydashie/assets/javascripts/dashing.coffee | 111 - .../javascripts/dashing.gridster.coffee | 25 - pydashie/assets/javascripts/es5-shim.js | 1021 - .../assets/javascripts/jquery.gridster.js | 2890 --- pydashie/assets/javascripts/jquery.js | 5 - pydashie/assets/javascripts/jquery.knob.js | 646 - .../javascripts/jquery.leanModal.min.js | 5 - pydashie/assets/javascripts/rickshaw.min.js | 2 - pydashie/assets/stylesheets/application.css | 902 - pydashie/assets/stylesheets/application.scss | 255 - pydashie/assets/stylesheets/font-awesome.css | 303 - .../assets/stylesheets/jquery.gridster.css | 57 - pydashie/assets/stylesheets/rickshaw.min.css | 1 - pydashie/conf.yaml | 30 - pydashie/dashie_sampler.py | 39 - pydashie/main.py | 224 - pydashie/nagios.py | 44 - pydashie/openstack_app.py | 61 - pydashie/openstack_samplers.py | 572 - pydashie/repeated_timer.py | 28 - pydashie/samplers/__init__.py | 0 pydashie/samplers/trello_sampler.py | 23 - pydashie/samplers/website_up.py | 23 - pydashie/templates/main.html | 76 - pydashie/templates/small.html | 41 - pydashie/widgets/clock/clock.coffee | 18 - pydashie/widgets/clock/clock.html | 2 - pydashie/widgets/clock/clock.scss | 13 - pydashie/widgets/comments/comments.coffee | 24 - pydashie/widgets/comments/comments.html | 7 - pydashie/widgets/comments/comments.scss | 33 - pydashie/widgets/hotness/attribution | 6 - pydashie/widgets/hotness/hotness.coffee | 26 - pydashie/widgets/hotness/hotness.html | 5 - pydashie/widgets/hotness/hotness.scss | 59 - pydashie/widgets/iframe/iframe.coffee | 9 - pydashie/widgets/iframe/iframe.html | 1 - pydashie/widgets/iframe/iframe.scss | 8 - pydashie/widgets/image/image.coffee | 9 - pydashie/widgets/image/image.html | 1 - pydashie/widgets/image/image.scss | 13 - pydashie/widgets/list/list.coffee | 6 - pydashie/widgets/list/list.html | 18 - pydashie/widgets/list/list.scss | 61 - pydashie/widgets/meter/meter.coffee | 14 - pydashie/widgets/meter/meter.html | 7 - pydashie/widgets/meter/meter.scss | 37 - pydashie/widgets/nagios/nagios.coffee | 9 - pydashie/widgets/nagios/nagios.html | 21 - pydashie/widgets/nagios/nagios.scss | 51 - .../widgets/nagios_list/nagios_list.coffee | 1 - pydashie/widgets/nagios_list/nagios_list.html | 22 - pydashie/widgets/nagios_list/nagios_list.scss | 68 - pydashie/widgets/number/number.coffee | 21 - pydashie/widgets/number/number.html | 11 - pydashie/widgets/number/number.scss | 39 - pydashie/widgets/progress_bars/attribution | 5 - .../progress_bars/progress_bars.coffee | 205 - .../widgets/progress_bars/progress_bars.html | 6 - .../widgets/progress_bars/progress_bars.scss | 104 - .../rickshawgraph/rickshawgraph.coffee | 446 - .../widgets/rickshawgraph/rickshawgraph.html | 5 - .../widgets/rickshawgraph/rickshawgraph.scss | 114 - pydashie/widgets/text/text.coffee | 1 - pydashie/widgets/text/text.html | 7 - pydashie/widgets/text/text.scss | 32 - pydashie/widgets/usage_gauge/attribution | 5 - .../widgets/usage_gauge/usage_gauge.coffee | 20 - pydashie/widgets/usage_gauge/usage_gauge.html | 5 - pydashie/widgets/usage_gauge/usage_gauge.scss | 56 - requirements.txt | 10 - setup.py | 28 - 90 files changed, 5 insertions(+), 40489 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 .gitreview delete mode 100644 LICENSE.txt delete mode 100644 MANIFEST.in delete mode 100644 compile.py delete mode 100644 ez_setup.py delete mode 100644 mainscreen.png delete mode 100644 pydashie/__init__.py delete mode 100644 pydashie/assets/images/favicon.ico delete mode 100644 pydashie/assets/images/usage-gauge-background.png delete mode 100644 pydashie/assets/javascripts/app.js delete mode 100644 pydashie/assets/javascripts/application.coffee delete mode 100644 pydashie/assets/javascripts/application.js delete mode 100644 pydashie/assets/javascripts/batman.jquery.js delete mode 100644 pydashie/assets/javascripts/batman.js delete mode 100644 pydashie/assets/javascripts/d3.v2.min.js delete mode 100644 pydashie/assets/javascripts/dashing.coffee delete mode 100644 pydashie/assets/javascripts/dashing.gridster.coffee delete mode 100644 pydashie/assets/javascripts/es5-shim.js delete mode 100644 pydashie/assets/javascripts/jquery.gridster.js delete mode 100644 pydashie/assets/javascripts/jquery.js delete mode 100644 pydashie/assets/javascripts/jquery.knob.js delete mode 100644 pydashie/assets/javascripts/jquery.leanModal.min.js delete mode 100644 pydashie/assets/javascripts/rickshaw.min.js delete mode 100644 pydashie/assets/stylesheets/application.css delete mode 100644 pydashie/assets/stylesheets/application.scss delete mode 100644 pydashie/assets/stylesheets/font-awesome.css delete mode 100644 pydashie/assets/stylesheets/jquery.gridster.css delete mode 100644 pydashie/assets/stylesheets/rickshaw.min.css delete mode 100644 pydashie/conf.yaml delete mode 100644 pydashie/dashie_sampler.py delete mode 100644 pydashie/main.py delete mode 100644 pydashie/nagios.py delete mode 100644 pydashie/openstack_app.py delete mode 100644 pydashie/openstack_samplers.py delete mode 100644 pydashie/repeated_timer.py delete mode 100644 pydashie/samplers/__init__.py delete mode 100644 pydashie/samplers/trello_sampler.py delete mode 100644 pydashie/samplers/website_up.py delete mode 100644 pydashie/templates/main.html delete mode 100644 pydashie/templates/small.html delete mode 100644 pydashie/widgets/clock/clock.coffee delete mode 100644 pydashie/widgets/clock/clock.html delete mode 100644 pydashie/widgets/clock/clock.scss delete mode 100644 pydashie/widgets/comments/comments.coffee delete mode 100644 pydashie/widgets/comments/comments.html delete mode 100644 pydashie/widgets/comments/comments.scss delete mode 100644 pydashie/widgets/hotness/attribution delete mode 100644 pydashie/widgets/hotness/hotness.coffee delete mode 100644 pydashie/widgets/hotness/hotness.html delete mode 100644 pydashie/widgets/hotness/hotness.scss delete mode 100644 pydashie/widgets/iframe/iframe.coffee delete mode 100644 pydashie/widgets/iframe/iframe.html delete mode 100644 pydashie/widgets/iframe/iframe.scss delete mode 100644 pydashie/widgets/image/image.coffee delete mode 100644 pydashie/widgets/image/image.html delete mode 100644 pydashie/widgets/image/image.scss delete mode 100644 pydashie/widgets/list/list.coffee delete mode 100644 pydashie/widgets/list/list.html delete mode 100644 pydashie/widgets/list/list.scss delete mode 100644 pydashie/widgets/meter/meter.coffee delete mode 100644 pydashie/widgets/meter/meter.html delete mode 100644 pydashie/widgets/meter/meter.scss delete mode 100644 pydashie/widgets/nagios/nagios.coffee delete mode 100644 pydashie/widgets/nagios/nagios.html delete mode 100644 pydashie/widgets/nagios/nagios.scss delete mode 100644 pydashie/widgets/nagios_list/nagios_list.coffee delete mode 100644 pydashie/widgets/nagios_list/nagios_list.html delete mode 100644 pydashie/widgets/nagios_list/nagios_list.scss delete mode 100644 pydashie/widgets/number/number.coffee delete mode 100644 pydashie/widgets/number/number.html delete mode 100644 pydashie/widgets/number/number.scss delete mode 100644 pydashie/widgets/progress_bars/attribution delete mode 100644 pydashie/widgets/progress_bars/progress_bars.coffee delete mode 100644 pydashie/widgets/progress_bars/progress_bars.html delete mode 100644 pydashie/widgets/progress_bars/progress_bars.scss delete mode 100644 pydashie/widgets/rickshawgraph/rickshawgraph.coffee delete mode 100644 pydashie/widgets/rickshawgraph/rickshawgraph.html delete mode 100644 pydashie/widgets/rickshawgraph/rickshawgraph.scss delete mode 100644 pydashie/widgets/text/text.coffee delete mode 100644 pydashie/widgets/text/text.html delete mode 100644 pydashie/widgets/text/text.scss delete mode 100644 pydashie/widgets/usage_gauge/attribution delete mode 100644 pydashie/widgets/usage_gauge/usage_gauge.coffee delete mode 100644 pydashie/widgets/usage_gauge/usage_gauge.html delete mode 100644 pydashie/widgets/usage_gauge/usage_gauge.scss delete mode 100644 requirements.txt delete mode 100644 setup.py diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 412eeda..0000000 --- a/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore deleted file mode 100644 index cf6e82b..0000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.DS_Store -__pycache__/ -*.py[cod] -*.egg* diff --git a/.gitreview b/.gitreview deleted file mode 100644 index bd72fdf..0000000 --- a/.gitreview +++ /dev/null @@ -1,4 +0,0 @@ -[gerrit] -host=review.openstack.org -port=29418 -project=stackforge/cloud-pydashie.git diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 5a45f77..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2013 Stephen Brown - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index c6d7ccb..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,4 +0,0 @@ -recursive-include pydashie/templates * -recursive-include pydashie/assets * -recursive-include pydashie/widgets * -recursive-include pydashie/samplers * diff --git a/README.rst b/README.rst index 4c0435d..9006052 100644 --- a/README.rst +++ b/README.rst @@ -1,121 +1,7 @@ -Cloud-PyDashie -######## +This project is no longer maintained. -PyDashie is a port of `Dashing `_ by `Shopify `_ to Python 2.7 +The contents of this repository are still available in the Git source code +management system. To see the contents of this repository before it reached +its end of life, please check out the previous commit with +"git checkout HEAD^1". -This is simply an implementation of pydashie tailored to showing information about an openstack cluster with nagios/icinga for monitoring. It is primarily for internal use by maintainers of openstack deloyments, as the current flask file servicing may be somewhat unsafe for public access. - -It uses the standard python clients for collecting formation from openstack across multiple regions. - -The nagios/icinga data is currently collected via ssh but in future might be moved to MKlivestatus as the current method is roundabout. - -.. image:: https://raw.githubusercontent.com/catalyst/openstack-pydashie/master/mainscreen.png - -**NOTE**: The current layout is hardcoded for 1080p. This might be changed to be configurable by the conf.yaml later. If you need to change the sizing, you can do so by changing the widget dimensions and number of columns within this function: - - https://github.com/catalyst/openstack-pydashie/blob/master/pydashie/assets/javascripts/app.js#L336 - -Configuration -############ - -Configuration is handled via a yaml file as follows: - -.. code-block:: yaml - - main: - log_file: pydashie.log - openstack: - allocation: - RegionOne: - vcpus_allocation_ratio: 2.0 - ram_allocation_ratio: 1.0 - # remove this amount per node available metric: - reserved_ram_per_node: 0 - reserved_vcpus_per_node: 0 - # remove this amount from total - # to take into account possible nova evacuate: - reserved_vcpus: 0 - # ram in bytes - reserved_ram: 0 - # total IPs are here as getting this from Neutron is - # far from straightforward - total_floating_ips: 256 - auth: - auth_url: 'http://localhost:5000/v2.0' - username: 'admin' - password: 'openstack' - project_name: 'demo' - insecure: False - nagios: - services: - RegionOne: - statfile: './RegionOne-status.dat' - host: 'RegionOne-mon0' - username: 'admin' - -Because of differences between allocation per region, and the need for a region list, each region is given it's own allocation data. We use this to know which regions to build clients for and aggregate data over, but in future might try and query a for a full region list and for allocation data from openstack itself. - -The nagios collection relies on a local ssh key for the given username, and access for that key on the given host. - -Widgets -############ - -Info on adding/removing/updating widgets will go here later. - -Installation -############ - -**NOTE**: Development/deployment has been done in a Ubuntu environment, so the following might be different for you. Also, the following is a step by step guide for installing into a clean server. - -Some of the python libraries have certain requirements, and the app itself needs a javascript service to deal with javascript files. As such you will need the following packages: - - sudo apt-get install python-dev nodejs - -You will ideally want to run the app inside a virtualenv. If you don't have virtualenv installed you can get it via: - - sudo apt-get install python-virtualenv - -And then create the environment by (this will create a directory for the environment, so be careful where you do this): - - virtualenv - -To then activate it: - - source /bin/activate - -Now that you are in your environment, you will need to install all the required python libraries: - - pip install -r requirements.txt - -At this point you can install the app itself. - -For development purposes use: - - python setup.py develop - -Which will build a python egg pointing to the local git files so that you can edit them and just restart the service when you change them. - -If you aren't planning to develop or edit the files: - - python setup.py install - -But if the files are changed, or you pull an update, you will need to rerun the install. - -Running -############ - -Provided you have a conf with working credentials and correctly named regions, you can run the application by: - - pydashie -c conf.yaml - -Goto localhost:5050 to view the application in action. - -**NOTE**: Getting the app up and running quickly with just openstack credentials is relatively easy, and you can simply comment out the nagios samplers from: - - https://github.com/catalyst/openstack-pydashie/blob/master/pydashie/openstack_app.py - -The port and interface can also be set via the commandline: - - pydashie -c conf.yaml -ip 0.0.0.0 -p 5050 - -Although they default to 0.0.0.0 and 5050 if not manually given. diff --git a/compile.py b/compile.py deleted file mode 100644 index 190f217..0000000 --- a/compile.py +++ /dev/null @@ -1,56 +0,0 @@ -import os -import logging -import StringIO - -from scss import Scss - -log = logging.getLogger('PydashieCompiler') -logging.basicConfig() -log.setLevel(logging.INFO) -#Requirements: - -#pip install pyScss - - -# -def main(): - - current_directory = os.getcwd() - - logging.info("Compiling from local files ...") - dashing_dir = os.path.join(current_directory, 'pydashie') - logging.info("Using walk path : %s" % dashing_dir) - - fileList = [] - for root, subFolders, files in os.walk(dashing_dir): - for fileName in files: - if 'scss' in fileName: - fileList.append(os.path.join(root, fileName)) - log.info('Found SCSS to compile: %s' % fileName) - - css_output = StringIO.StringIO() - css = Scss() - css_output.write('\n'.join([css.compile(open(filePath).read()) for filePath in fileList])) - - fileList = [] - for root, subFolders, files in os.walk(dashing_dir): - for fileName in files: - if 'css' in fileName and 'scss' not in fileName: - if (not fileName.endswith('~') and - not fileName == "application.css"): - # discard any temporary files - # ignore the base application.css (duplication issues) - fileList.append(os.path.join(root, fileName)) - log.info('Found CSS to append: %s' % fileName) - css_output.write('\n'.join([open(filePath).read() for filePath in fileList])) - - app_css_filepath = os.path.join(current_directory, - 'pydashie/assets/stylesheets/application.css') - with open(app_css_filepath, 'w') as outfile: - outfile.write(css_output.getvalue()) - log.info('Wrote CSS out to : %s' % app_css_filepath) - - -if __name__ == '__main__': - - main() diff --git a/ez_setup.py b/ez_setup.py deleted file mode 100644 index 3ea2e66..0000000 --- a/ez_setup.py +++ /dev/null @@ -1,485 +0,0 @@ -#!python -"""Bootstrap distribute installation - -If you want to use setuptools in your package's setup.py, just include this -file in the same directory with it, and add this to the top of your setup.py:: - - from distribute_setup import use_setuptools - use_setuptools() - -If you want to require a specific version of setuptools, set a download -mirror, or use an alternate download directory, you can do so by supplying -the appropriate options to ``use_setuptools()``. - -This file can also be run as a script to install or upgrade setuptools. -""" -import os -import sys -import time -import fnmatch -import tempfile -import tarfile -from distutils import log - -try: - from site import USER_SITE -except ImportError: - USER_SITE = None - -try: - import subprocess - - def _python_cmd(*args): - args = (sys.executable,) + args - return subprocess.call(args) == 0 - -except ImportError: - # will be used for python 2.3 - def _python_cmd(*args): - args = (sys.executable,) + args - # quoting arguments if windows - if sys.platform == 'win32': - def quote(arg): - if ' ' in arg: - return '"%s"' % arg - return arg - args = [quote(arg) for arg in args] - return os.spawnl(os.P_WAIT, sys.executable, *args) == 0 - -DEFAULT_VERSION = "0.6.14" -DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/" -SETUPTOOLS_FAKED_VERSION = "0.6c11" - -SETUPTOOLS_PKG_INFO = """\ -Metadata-Version: 1.0 -Name: setuptools -Version: %s -Summary: xxxx -Home-page: xxx -Author: xxx -Author-email: xxx -License: xxx -Description: xxx -""" % SETUPTOOLS_FAKED_VERSION - - -def _install(tarball): - # extracting the tarball - tmpdir = tempfile.mkdtemp() - log.warn('Extracting in %s', tmpdir) - old_wd = os.getcwd() - try: - os.chdir(tmpdir) - tar = tarfile.open(tarball) - _extractall(tar) - tar.close() - - # going in the directory - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - os.chdir(subdir) - log.warn('Now working in %s', subdir) - - # installing - log.warn('Installing Distribute') - if not _python_cmd('setup.py', 'install'): - log.warn('Something went wrong during the installation.') - log.warn('See the error message above.') - finally: - os.chdir(old_wd) - - -def _build_egg(egg, tarball, to_dir): - # extracting the tarball - tmpdir = tempfile.mkdtemp() - log.warn('Extracting in %s', tmpdir) - old_wd = os.getcwd() - try: - os.chdir(tmpdir) - tar = tarfile.open(tarball) - _extractall(tar) - tar.close() - - # going in the directory - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - os.chdir(subdir) - log.warn('Now working in %s', subdir) - - # building an egg - log.warn('Building a Distribute egg in %s', to_dir) - _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) - - finally: - os.chdir(old_wd) - # returning the result - log.warn(egg) - if not os.path.exists(egg): - raise IOError('Could not build the egg.') - - -def _do_download(version, download_base, to_dir, download_delay): - egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg' - % (version, sys.version_info[0], sys.version_info[1])) - if not os.path.exists(egg): - tarball = download_setuptools(version, download_base, - to_dir, download_delay) - _build_egg(egg, tarball, to_dir) - sys.path.insert(0, egg) - import setuptools - setuptools.bootstrap_install_from = egg - - -def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=os.curdir, download_delay=15, no_fake=True): - # making sure we use the absolute path - to_dir = os.path.abspath(to_dir) - was_imported = 'pkg_resources' in sys.modules or \ - 'setuptools' in sys.modules - try: - try: - import pkg_resources - if not hasattr(pkg_resources, '_distribute'): - if not no_fake: - _fake_setuptools() - raise ImportError - except ImportError: - return _do_download(version, download_base, to_dir, download_delay) - try: - pkg_resources.require("distribute>="+version) - return - except pkg_resources.VersionConflict: - e = sys.exc_info()[1] - if was_imported: - sys.stderr.write( - "The required version of distribute (>=%s) is not available,\n" - "and can't be installed while this script is running. Please\n" - "install a more recent version first, using\n" - "'easy_install -U distribute'." - "\n\n(Currently using %r)\n" % (version, e.args[0])) - sys.exit(2) - else: - del pkg_resources, sys.modules['pkg_resources'] # reload ok - return _do_download(version, download_base, to_dir, - download_delay) - except pkg_resources.DistributionNotFound: - return _do_download(version, download_base, to_dir, - download_delay) - finally: - if not no_fake: - _create_fake_setuptools_pkg_info(to_dir) - -def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=os.curdir, delay=15): - """Download distribute from a specified location and return its filename - - `version` should be a valid distribute version number that is available - as an egg for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download - attempt. - """ - # making sure we use the absolute path - to_dir = os.path.abspath(to_dir) - try: - from urllib.request import urlopen - except ImportError: - from urllib2 import urlopen - tgz_name = "distribute-%s.tar.gz" % version - url = download_base + tgz_name - saveto = os.path.join(to_dir, tgz_name) - src = dst = None - if not os.path.exists(saveto): # Avoid repeated downloads - try: - log.warn("Downloading %s", url) - src = urlopen(url) - # Read/write all in one block, so we don't create a corrupt file - # if the download is interrupted. - data = src.read() - dst = open(saveto, "wb") - dst.write(data) - finally: - if src: - src.close() - if dst: - dst.close() - return os.path.realpath(saveto) - -def _no_sandbox(function): - def __no_sandbox(*args, **kw): - try: - from setuptools.sandbox import DirectorySandbox - if not hasattr(DirectorySandbox, '_old'): - def violation(*args): - pass - DirectorySandbox._old = DirectorySandbox._violation - DirectorySandbox._violation = violation - patched = True - else: - patched = False - except ImportError: - patched = False - - try: - return function(*args, **kw) - finally: - if patched: - DirectorySandbox._violation = DirectorySandbox._old - del DirectorySandbox._old - - return __no_sandbox - -def _patch_file(path, content): - """Will backup the file then patch it""" - existing_content = open(path).read() - if existing_content == content: - # already patched - log.warn('Already patched.') - return False - log.warn('Patching...') - _rename_path(path) - f = open(path, 'w') - try: - f.write(content) - finally: - f.close() - return True - -_patch_file = _no_sandbox(_patch_file) - -def _same_content(path, content): - return open(path).read() == content - -def _rename_path(path): - new_name = path + '.OLD.%s' % time.time() - log.warn('Renaming %s into %s', path, new_name) - os.rename(path, new_name) - return new_name - -def _remove_flat_installation(placeholder): - if not os.path.isdir(placeholder): - log.warn('Unkown installation at %s', placeholder) - return False - found = False - for file in os.listdir(placeholder): - if fnmatch.fnmatch(file, 'setuptools*.egg-info'): - found = True - break - if not found: - log.warn('Could not locate setuptools*.egg-info') - return - - log.warn('Removing elements out of the way...') - pkg_info = os.path.join(placeholder, file) - if os.path.isdir(pkg_info): - patched = _patch_egg_dir(pkg_info) - else: - patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO) - - if not patched: - log.warn('%s already patched.', pkg_info) - return False - # now let's move the files out of the way - for element in ('setuptools', 'pkg_resources.py', 'site.py'): - element = os.path.join(placeholder, element) - if os.path.exists(element): - _rename_path(element) - else: - log.warn('Could not find the %s element of the ' - 'Setuptools distribution', element) - return True - -_remove_flat_installation = _no_sandbox(_remove_flat_installation) - -def _after_install(dist): - log.warn('After install bootstrap.') - placeholder = dist.get_command_obj('install').install_purelib - _create_fake_setuptools_pkg_info(placeholder) - -def _create_fake_setuptools_pkg_info(placeholder): - if not placeholder or not os.path.exists(placeholder): - log.warn('Could not find the install location') - return - pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1]) - setuptools_file = 'setuptools-%s-py%s.egg-info' % \ - (SETUPTOOLS_FAKED_VERSION, pyver) - pkg_info = os.path.join(placeholder, setuptools_file) - if os.path.exists(pkg_info): - log.warn('%s already exists', pkg_info) - return - - log.warn('Creating %s', pkg_info) - f = open(pkg_info, 'w') - try: - f.write(SETUPTOOLS_PKG_INFO) - finally: - f.close() - - pth_file = os.path.join(placeholder, 'setuptools.pth') - log.warn('Creating %s', pth_file) - f = open(pth_file, 'w') - try: - f.write(os.path.join(os.curdir, setuptools_file)) - finally: - f.close() - -_create_fake_setuptools_pkg_info = _no_sandbox(_create_fake_setuptools_pkg_info) - -def _patch_egg_dir(path): - # let's check if it's already patched - pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') - if os.path.exists(pkg_info): - if _same_content(pkg_info, SETUPTOOLS_PKG_INFO): - log.warn('%s already patched.', pkg_info) - return False - _rename_path(path) - os.mkdir(path) - os.mkdir(os.path.join(path, 'EGG-INFO')) - pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') - f = open(pkg_info, 'w') - try: - f.write(SETUPTOOLS_PKG_INFO) - finally: - f.close() - return True - -_patch_egg_dir = _no_sandbox(_patch_egg_dir) - -def _before_install(): - log.warn('Before install bootstrap.') - _fake_setuptools() - - -def _under_prefix(location): - if 'install' not in sys.argv: - return True - args = sys.argv[sys.argv.index('install')+1:] - for index, arg in enumerate(args): - for option in ('--root', '--prefix'): - if arg.startswith('%s=' % option): - top_dir = arg.split('root=')[-1] - return location.startswith(top_dir) - elif arg == option: - if len(args) > index: - top_dir = args[index+1] - return location.startswith(top_dir) - if arg == '--user' and USER_SITE is not None: - return location.startswith(USER_SITE) - return True - - -def _fake_setuptools(): - log.warn('Scanning installed packages') - try: - import pkg_resources - except ImportError: - # we're cool - log.warn('Setuptools or Distribute does not seem to be installed.') - return - ws = pkg_resources.working_set - try: - setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools', - replacement=False)) - except TypeError: - # old distribute API - setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools')) - - if setuptools_dist is None: - log.warn('No setuptools distribution found') - return - # detecting if it was already faked - setuptools_location = setuptools_dist.location - log.warn('Setuptools installation detected at %s', setuptools_location) - - # if --root or --preix was provided, and if - # setuptools is not located in them, we don't patch it - if not _under_prefix(setuptools_location): - log.warn('Not patching, --root or --prefix is installing Distribute' - ' in another location') - return - - # let's see if its an egg - if not setuptools_location.endswith('.egg'): - log.warn('Non-egg installation') - res = _remove_flat_installation(setuptools_location) - if not res: - return - else: - log.warn('Egg installation') - pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO') - if (os.path.exists(pkg_info) and - _same_content(pkg_info, SETUPTOOLS_PKG_INFO)): - log.warn('Already patched.') - return - log.warn('Patching...') - # let's create a fake egg replacing setuptools one - res = _patch_egg_dir(setuptools_location) - if not res: - return - log.warn('Patched done.') - _relaunch() - - -def _relaunch(): - log.warn('Relaunching...') - # we have to relaunch the process - # pip marker to avoid a relaunch bug - if sys.argv[:3] == ['-c', 'install', '--single-version-externally-managed']: - sys.argv[0] = 'setup.py' - args = [sys.executable] + sys.argv - sys.exit(subprocess.call(args)) - - -def _extractall(self, path=".", members=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - import copy - import operator - from tarfile import ExtractError - directories = [] - - if members is None: - members = self - - for tarinfo in members: - if tarinfo.isdir(): - # Extract directories with a safe mode. - directories.append(tarinfo) - tarinfo = copy.copy(tarinfo) - tarinfo.mode = 448 # decimal for oct 0700 - self.extract(tarinfo, path) - - # Reverse sort directories. - if sys.version_info < (2, 4): - def sorter(dir1, dir2): - return cmp(dir1.name, dir2.name) - directories.sort(sorter) - directories.reverse() - else: - directories.sort(key=operator.attrgetter('name'), reverse=True) - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - dirpath = os.path.join(path, tarinfo.name) - try: - self.chown(tarinfo, dirpath) - self.utime(tarinfo, dirpath) - self.chmod(tarinfo, dirpath) - except ExtractError: - e = sys.exc_info()[1] - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - -def main(argv, version=DEFAULT_VERSION): - """Install or upgrade setuptools and EasyInstall""" - tarball = download_setuptools() - _install(tarball) - - -if __name__ == '__main__': - main(sys.argv[1:]) diff --git a/mainscreen.png b/mainscreen.png deleted file mode 100644 index ee236c46bfd7c506ea5f7050ea32cc07e28a1779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223294 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⪼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�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

WtX= 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%0Am{am0f8V=ao&)KunmG=_z8?t@~q8zx3JJj z4CX?$p(3{nAk(@KLmtUaORF54wc0*^zBIuvZQrv}8jwo(B4jgu#-KrejyV08ir1g) z+oeJ6-3xyL*{YZ2rssyJ3C3%g7e(V0WL6F2$O;Os5!Anpmxmwc*b2IC*aBHZxG_@@ zz*m-T%ns{MB6hu>k$N#F36wEa5vt>J?XLf5nX4P)eKd1FQux5(nd-*O>M#osU6?7g zp|z~5YJaJ?xP`ozqdUKDR1=V3qu^vr&GS?G`M9{2*V>quUwsl_3RD#7At3z4`O9zA z4h9CDX8u{7B=2r*>fD->WOG>c@l^q3XnuYb5kBiigVynO2PtsuXKk8=779c?qcare zvWAz%SEXN}CxD%}9t4VT9@zM7!(wIKvDHNQ@VUuTXLV3Zvk>|lakIkP;714h zV+-OFU^q1ZDraa(k-MUWABXyOmr^wlca(h_({H*lT#J z$XXe4W7Qd8tH^mz<=FU=buaa6_*TZtXIk0Pv3Ags^F8_3-2WdsWGBWwqKsykJwbxA z>gr=P=`Ph}yB0of_ejjL6YwQARAb~jjZN<@>2@eXQjm;#+4Z~f#_Ttw2aXDK64tqG zy6NRJ&MeX-<)5eO*Ymcm*3*A4&h;=7c~;RbdhhKgw>PI@CGJXKGoVQcFv3%UA27W< z@<=@@exgYjeiU`nt@D%0lwCqbmF#Dqprz6Dd-Zgu_Nh*LdRZXKfpsa}TUc}pwh2yE0o_w`Bd zQKNmF$M4{v7+Fl2j^^R%`;r^}(;xEiBgwCSc4C?T^ScFHq>{iS+mVN7e=*G_qCX~$ znzapUuHy3y=uqCoZ0f;b>vf00<*{97gstIrJxX7sy$Db1lqB`{R5Mr6-kY?yOw3kp zYh&4)GGaG)V>Tt77??2s>S->E*|tmus-nDVQxT=ZCE5G3Eo*EZ;7T;2X*agZu%_E-J^(xNQkt&(nS~!;Q^>>+;J=bXmp{D7XRHCx-a-vk&H z6E*DKJ|2fx>U2YSgaaI?i7v2Bm{%YRr~fF%vO+)q@r@+utTs_Wb8&Ewo9_JqW7$gYeYGra10guIoWP`H*Q&?-%c>mh$Ml0a z)sdsa^jXNAbmdxYn}eUX!h)OakbL9=Hqd$*I-3aYtY;lN?c(#Jh5Y27Z8j6LyBy=Z zS~a>`hqg%!ZI!{INOf!-l5v6p@|(+GvtHe`AL9>AM0mH$8>z>gmxo$&m*BpteBUyF z&B(30>0=2nMM2oL{ia=vE_ulC#tS$<_O|f)!m46<;ojg1}T5| zuvtU`(;Sj24f*KjjzlLROkqEi9z(gGOO)O(WS?kDkTthmAjFuP=G_F|1io3?Jvz$z zA7Or8-Xs{4`^`F_KgW*KGE4G;+5CM-^Ymi3n(Bx>oNe{4uSj5df@K(Y8x zrF8%L{x$5W-{~~$cc&V^jEr5gor)?{Z)b1|T$f{KSg&oXO1{61$??ekRfWH%QrJ-Q zyCb7L#-j2}Y`;A!u|!q&#r>-xaV^^_1phqwC*MH%PsjJS#Gv0L{)PU3WxxFo;*>ra z5L+VtVvy1;j!uJC^e^85Sb`oc_rgpNaY~A^y}~+vzx)}lc^> zKRo?Q*Y8a9@ee=#bMJrhTKLz4=Pwll1phjS{H0|B?f;R8zi;@R{coKp{(p7;X|Dfe cV}(EBsAM!yBf*^x1fE>ep z3jst?0p$=xkxOn6!pI>828NMifZ-T{xL)z?`;a8%rV7}t^wfXmo9_Pl*RQ+Zdrb%p zKN1pz`X)D45weC5B89>#qKTsFXA8D{w)VZ=S1kDbG4}WdrHtCOcJ-k?z`ans{(cJp$Ka>oXG2c>i8mkL|p%Ne9=A9k6!Z@Hv$VW>x6^cJm zeolyX>Oskai3Y|QUXmu6o)UJ*-!u<Vg|asxHA;LnzF2%<)SuLT|2X zz;I2BCu8X8F~D$WNH# z`#@j*xueLp{crpG3*D~k((g&ANLMuK*)+r*yA?hi6(R?P7uUrYu9gwqA-aWTxQ03! z3zs>*Eybra)%H98722tT{ImRWKNxQegR$E8_74}kol=mh(^8SCp4xY&X~H4L3sQqN zy}5Q$(q5A$tFrgg%}ew?lUW#!J>K(!tY-PY**|;!e21Rh_1K8~{|n#xgY`!~u6Y@1 zJ+j$j^(^#_7~}`TaJla-dy}Gd8gflhbor*Yc9Csxvd{yPd}O8%|3jfwPjs7%@k*sd zv8hgT_T%~o%#J_Zf#(nT!xjFXqcwrXqt$^gh3uF)e#o?-im5Lx@pP@GTuZZ>5*wTn zJK^+wZ-{o6g~MMc|7`q`n)tz0^hNR6iPi+qG{lXZwKe}Zg4JPLb$sE*nX+jY_d{wmBniHMe(Ov zkmQ1z9$G_-GftS5kV6r6^_?5vh*%UE*9)&H@FoQ7>`QsRa7=E3Q5Ux;v50p|@mHxGy!i#ST|S&%2G^}R&{Y%;uei7uxc8LbQ?Va?;TN2X27o%zQQ}4JRO7*J=OKuG z+y^HgxI@$#RdCs$d+F?EUE+dTs34mR6nn25uMd63t#F678@kY(Y61+E-O!p9g0?5X z^T#nT-GRS&{wL~#INSn;q?Q7Izs|M+!FIzTI21k#3EfZNM1dW|*lz#TdA+fvo2>Ej z(~|oZ!lUip$Y)4R)Uif>s`iEa1ZAj=l!b6T9cV}j_?6m!$``5g$FF9=m9X4)ZMET4 zlt4po1T;A0y^%3dxjB2?b8}?kuhe2rC zUU(S#4Wu7YgUsWu*IxCeUPk|TG||Ai-`JX0%E%k~)yP!{yN*wSp64WZ6$v4=p9{y! zJs|qh4qz(o>pLfPu=LzU6Is*;{4}$#2sif!(sjd840ESp|NRT@7+c+V1#Y1j-(HQk z#Y13`17trv{j6jT3`Mp(}zrbH!QBmv8$w-hIbxY=@|)Tu6A<2JYw| zA<4TT+CUFHrOm)&lWEdPq=tR2MQU|kZ5FhA@d|&FR+wh7*DyXO45@yt%*p~5A#p4obbDO6oS+L2}w+C zh|@QMi{Bl3%aE}s@cPbN!b`@SB$=B1&gT`LCzC%#5`KlR)70abchgjU!`MRIcgAu4 zm|vi>!~F>M)ZL%YQnq-& z++uT;DQk7aSI+Y9K3gmaOWpF1m+*<=zZoef(@!&X2bylq2-`1XJWB>4I~fM5Sinb3 z;JxBeg*Vuj9EZ>Zb;v!l*}lM+x*qXH{C1=$E z){Hu+X)lB8rP)xL69%av!BAaN1~qr%VFJ&k5aWGzxqBwbkQXs8KDr3P{9V+{IC82s zJX2-+fm$WoKG{Wx)(SQ+H3yHP;diS1jqtJ~jW~ zi)f`QR*TcM*qL z{5alRl=Bzx<&;{8>Xxb_syZFhbh}YdaTLI|V?$tjc@(k)Q;#Bror;~eG_*KxR4w_SVlM!?(+D_Soq&wNX~-HELhZAb z*Le4NN3H+h14aM{?-5S+=|!yY{9Uw_ghW?$=*zuyz6<8e&Rr_Jx0<_nptips=#~R; zz-Rb1t3g;(JNncP*S~GDIkKOd?<&VDoDKi;55CA&J+%>{uRgL=S9L^sj|%_vZl!@N zZKd97O_k1EWv!0m3f4UF0LLhTdERLFA@fj%{wK7bGaME<`uyGA5u$;TMM;1+Ay7d? zP_#Kw&wt2!sR&Ravl0b@ZF3URh)5r;PqdFF6zikC)sUb8;3(id_e(wh{$B*^Q5BK^ F{{dNulj{Hg diff --git a/pydashie/assets/images/usage-gauge-background.png b/pydashie/assets/images/usage-gauge-background.png deleted file mode 100644 index f75b1fa94c41bd8154216e3ff08f5a0ae73ae40d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976 zcmaJ=zi-n(6h2z1DwQf&7+^YG5dw+$XY4dqOqIql4XUG%1QE76_NB2J`;2`hZpB0= z5Pw8RCd9_Tz`(@JfP}=z(uIk+Jf}&@&~mbU_nyA*d+*+Re%)$5TwS@ff)HA5Y*}sC zkKnz!ya?YrLv{k&O5`SQ{EqfXZERzg5j}1{AkH^AT6%H?u7*HDxKAPVV0 z#NDhArE4<6)@#5`aT&K2E0+vg^MOwX*)Bd<9b1q zJMK*wj$<^Ul)I5f8B@|2F>gPl z5ub7WbFO+RHy?&DhR7C8f)~`c6BgphrH$a?TvWMOvM<$}a{Y^Q0q(kVDOZGK#Jsit zw0h=(`N@y-!3ASJ`ZR)hPhhY=ynFT?eu|~mcDH^ySx;X68G&bkx0{_)^y{Pa2rSaD zs@?2If9H5vTDbBB9X&3!zOBApyk`HDPL_OheFwccT{w parseInt(this.get('last'))) { - return 'icon-arrow-up'; - } else { - return 'icon-arrow-down'; - } - } - }); - - Number.accessor('needsAttention', function() { - return this.get('status') === 'warning' || this.get('status') === 'danger'; - }); - - Number.prototype.onData = function(data) { - if (data.status) { - return $(this.get('node')).addClass("status-" + data.status); - } - }; - - return Number; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Text = (function(_super) { - - __extends(Text, _super); - - function Text() { - return Text.__super__.constructor.apply(this, arguments); - } - - return Text; - - })(Dashing.Widget); - -}).call(this); -(function() { - - console.log("Yeah! The dashboard has started!"); - - Dashing.on('ready', function() { - var contentWidth; - Dashing.widget_margins || (Dashing.widget_margins = [5, 5]); - Dashing.widget_base_dimensions || (Dashing.widget_base_dimensions = [300, 340]); - Dashing.numColumns || (Dashing.numColumns = 6); - contentWidth = (Dashing.widget_base_dimensions[0] + Dashing.widget_margins[0] * 2) * Dashing.numColumns; - return Batman.setImmediate(function() { - $('.gridster').width(contentWidth); - return $('.gridster ul:first').gridster({ - widget_margins: Dashing.widget_margins, - widget_base_dimensions: Dashing.widget_base_dimensions, - avoid_overlapped_widgets: !Dashing.customGridsterLayout, - draggable: { - stop: Dashing.showGridsterInstructions - } - }); - }); - }); - -}).call(this); diff --git a/pydashie/assets/javascripts/application.coffee b/pydashie/assets/javascripts/application.coffee deleted file mode 100644 index e6b1e55..0000000 --- a/pydashie/assets/javascripts/application.coffee +++ /dev/null @@ -1,18 +0,0 @@ -console.log("Yeah! The dashboard has started!") - -Dashing.on 'ready', -> - Dashing.widget_margins ||= [5, 5] - Dashing.widget_base_dimensions ||= [300, 360] - Dashing.numColumns ||= 4 - - contentWidth = (Dashing.widget_base_dimensions[0] + Dashing.widget_margins[0] * 2) * Dashing.numColumns - - Batman.setImmediate -> - $('.gridster').width(contentWidth) - $('.gridster ul:first').gridster - widget_margins: Dashing.widget_margins - widget_base_dimensions: Dashing.widget_base_dimensions - avoid_overlapped_widgets: !Dashing.customGridsterLayout - draggable: - stop: Dashing.showGridsterInstructions - start: -> Dashing.currentWidgetPositions = Dashing.getWidgetPositions() diff --git a/pydashie/assets/javascripts/application.js b/pydashie/assets/javascripts/application.js deleted file mode 100644 index d108b5d..0000000 --- a/pydashie/assets/javascripts/application.js +++ /dev/null @@ -1,17658 +0,0 @@ -/*! jQuery v1.7.2 jquery.com | jquery.org/license */ - -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+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(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="

"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( -a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); -// vim: ts=4 sts=4 sw=4 expandtab -// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License -// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project) -// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA -// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License -// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License -// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License -// -- kossnocorp Sasha Koss XXX TODO License or CLA -// -- bryanforbes Bryan Forbes XXX TODO License or CLA -// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence -// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License -// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License -// -- bbqsrc Brendan Molloy XXX TODO License or CLA -// -- iwyg XXX TODO License or CLA -// -- DomenicDenicola Domenic Denicola XXX TODO License or CLA -// -- xavierm02 Montillet Xavier XXX TODO License or CLA -// -- Raynos Raynos XXX TODO License or CLA -// -- samsonjs Sami Samhuri XXX TODO License or CLA -// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License -// -- lexer Alexey Zakharov XXX TODO License or CLA - -/*! - Copyright (c) 2009, 280 North Inc. http://280north.com/ - MIT License. http://github.com/280north/narwhal/blob/master/README.md -*/ - -// Module systems magic dance -(function (definition) { - // RequireJS - if (typeof define == "function") { - define(definition); - // CommonJS and "); - }; - - $(function() { - $('#save-gridster').leanModal(); - return $('#save-gridster').click(function() { - return $('#save-gridster').slideUp(); - }); - }); - -}).call(this); -/*!jQuery Knob*/ -/** - * Downward compatible, touchable dial - * - * Version: 1.2.0 (15/07/2012) - * Requires: jQuery v1.7+ - * - * Copyright (c) 2012 Anthony Terrien - * Under MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - * Thanks to vor, eskimoblood, spiffistan, FabrizioC - */ - -$(function () { - - /** - * Kontrol library - */ - "use strict"; - - /** - * Definition of globals and core - */ - var k = {}, // kontrol - max = Math.max, - min = Math.min; - - k.c = {}; - k.c.d = $(document); - k.c.t = function (e) { - return e.originalEvent.touches.length - 1; - }; - - /** - * Kontrol Object - * - * Definition of an abstract UI control - * - * Each concrete component must call this one. - * - * k.o.call(this); - * - */ - k.o = function () { - var s = this; - - this.o = null; // array of options - this.$ = null; // jQuery wrapped element - this.i = null; // mixed HTMLInputElement or array of HTMLInputElement - this.g = null; // 2D graphics context for 'pre-rendering' - this.v = null; // value ; mixed array or integer - this.cv = null; // change value ; not commited value - this.x = 0; // canvas x position - this.y = 0; // canvas y position - this.$c = null; // jQuery canvas element - this.c = null; // rendered canvas context - this.t = 0; // touches index - this.isInit = false; - this.fgColor = null; // main color - this.pColor = null; // previous color - this.dH = null; // draw hook - this.cH = null; // change hook - this.eH = null; // cancel hook - this.rH = null; // release hook - - this.run = function () { - var cf = function (e, conf) { - var k; - for (k in conf) { - s.o[k] = conf[k]; - } - s.init(); - s._configure() - ._draw(); - }; - - if(this.$.data('kontroled')) return; - this.$.data('kontroled', true); - - this.extend(); - this.o = $.extend( - { - // Config - min : this.$.data('min') || 0, - max : this.$.data('max') || 100, - stopper : true, - readOnly : this.$.data('readonly'), - - // UI - cursor : (this.$.data('cursor') === true && 30) - || this.$.data('cursor') - || 0, - thickness : this.$.data('thickness') || 0.35, - width : this.$.data('width') || 200, - height : this.$.data('height') || 200, - displayInput : this.$.data('displayinput') == null || this.$.data('displayinput'), - displayPrevious : this.$.data('displayprevious'), - fgColor : this.$.data('fgcolor') || '#87CEEB', - inline : false, - - // Hooks - draw : null, // function () {} - change : null, // function (value) {} - cancel : null, // function () {} - release : null // function (value) {} - }, this.o - ); - - // routing value - if(this.$.is('fieldset')) { - - // fieldset = array of integer - this.v = {}; - this.i = this.$.find('input') - this.i.each(function(k) { - var $this = $(this); - s.i[k] = $this; - s.v[k] = $this.val(); - - $this.bind( - 'change' - , function () { - var val = {}; - val[k] = $this.val(); - s.val(val); - } - ); - }); - this.$.find('legend').remove(); - - } else { - // input = integer - this.i = this.$; - this.v = this.$.val(); - (this.v == '') && (this.v = this.o.min); - - this.$.bind( - 'change' - , function () { - s.val(s.$.val()); - } - ); - } - - (!this.o.displayInput) && this.$.hide(); - - this.$c = $(''); - this.c = this.$c[0].getContext("2d"); - - this.$ - .wrap($('
')) - .before(this.$c); - - if (this.v instanceof Object) { - this.cv = {}; - this.copy(this.v, this.cv); - } else { - this.cv = this.v; - } - - this.$ - .bind("configure", cf) - .parent() - .bind("configure", cf); - - this._listen() - ._configure() - ._xy() - .init(); - - this.isInit = true; - - this._draw(); - - return this; - }; - - this._draw = function () { - - // canvas pre-rendering - var d = true, - c = document.createElement('canvas'); - - c.width = s.o.width; - c.height = s.o.height; - s.g = c.getContext('2d'); - - s.clear(); - - s.dH - && (d = s.dH()); - - (d !== false) && s.draw(); - - s.c.drawImage(c, 0, 0); - c = null; - }; - - this._touch = function (e) { - - var touchMove = function (e) { - - var v = s.xy2val( - e.originalEvent.touches[s.t].pageX, - e.originalEvent.touches[s.t].pageY - ); - - if (v == s.cv) return; - - if ( - s.cH - && (s.cH(v) === false) - ) return; - - - s.change(v); - s._draw(); - }; - - // get touches index - this.t = k.c.t(e); - - // First touch - touchMove(e); - - // Touch events listeners - k.c.d - .bind("touchmove.k", touchMove) - .bind( - "touchend.k" - , function () { - k.c.d.unbind('touchmove.k touchend.k'); - - if ( - s.rH - && (s.rH(s.cv) === false) - ) return; - - s.val(s.cv); - } - ); - - return this; - }; - - this._mouse = function (e) { - - var mouseMove = function (e) { - var v = s.xy2val(e.pageX, e.pageY); - if (v == s.cv) return; - - if ( - s.cH - && (s.cH(v) === false) - ) return; - - s.change(v); - s._draw(); - }; - - // First click - mouseMove(e); - - // Mouse events listeners - k.c.d - .bind("mousemove.k", mouseMove) - .bind( - // Escape key cancel current change - "keyup.k" - , function (e) { - if (e.keyCode === 27) { - k.c.d.unbind("mouseup.k mousemove.k keyup.k"); - - if ( - s.eH - && (s.eH() === false) - ) return; - - s.cancel(); - } - } - ) - .bind( - "mouseup.k" - , function (e) { - k.c.d.unbind('mousemove.k mouseup.k keyup.k'); - - if ( - s.rH - && (s.rH(s.cv) === false) - ) return; - - s.val(s.cv); - } - ); - - return this; - }; - - this._xy = function () { - var o = this.$c.offset(); - this.x = o.left; - this.y = o.top; - return this; - }; - - this._listen = function () { - - if (!this.o.readOnly) { - this.$c - .bind( - "mousedown" - , function (e) { - e.preventDefault(); - s._xy()._mouse(e); - } - ) - .bind( - "touchstart" - , function (e) { - e.preventDefault(); - s._xy()._touch(e); - } - ); - this.listen(); - } else { - this.$.attr('readonly', 'readonly'); - } - - return this; - }; - - this._configure = function () { - - // Hooks - if (this.o.draw) this.dH = this.o.draw; - if (this.o.change) this.cH = this.o.change; - if (this.o.cancel) this.eH = this.o.cancel; - if (this.o.release) this.rH = this.o.release; - - if (this.o.displayPrevious) { - this.pColor = this.h2rgba(this.o.fgColor, "0.4"); - this.fgColor = this.h2rgba(this.o.fgColor, "0.6"); - } else { - this.fgColor = this.o.fgColor; - } - - return this; - }; - - this._clear = function () { - this.$c[0].width = this.$c[0].width; - }; - - // Abstract methods - this.listen = function () {}; // on start, one time - this.extend = function () {}; // each time configure triggered - this.init = function () {}; // each time configure triggered - this.change = function (v) {}; // on change - this.val = function (v) {}; // on release - this.xy2val = function (x, y) {}; // - this.draw = function () {}; // on change / on release - this.clear = function () { this._clear(); }; - - // Utils - this.h2rgba = function (h, a) { - var rgb; - h = h.substring(1,7) - rgb = [parseInt(h.substring(0,2),16) - ,parseInt(h.substring(2,4),16) - ,parseInt(h.substring(4,6),16)]; - return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "," + a + ")"; - }; - - this.copy = function (f, t) { - for (var i in f) { t[i] = f[i]; } - }; - }; - - - /** - * k.Dial - */ - k.Dial = function () { - k.o.call(this); - - this.startAngle = null; - this.xy = null; - this.radius = null; - this.lineWidth = null; - this.cursorExt = null; - this.w2 = null; - this.PI2 = 2*Math.PI; - - this.extend = function () { - this.o = $.extend( - { - bgColor : this.$.data('bgcolor') || '#EEEEEE', - angleOffset : this.$.data('angleoffset') || 0, - angleArc : this.$.data('anglearc') || 360, - inline : true - }, this.o - ); - }; - - this.val = function (v) { - if (null != v) { - this.cv = this.o.stopper ? max(min(v, this.o.max), this.o.min) : v; - this.v = this.cv; - this.$.val(this.v); - this._draw(); - } else { - return this.v; - } - }; - - this.xy2val = function (x, y) { - var a, ret; - - a = Math.atan2( - x - (this.x + this.w2) - , - (y - this.y - this.w2) - ) - this.angleOffset; - - if(this.angleArc != this.PI2 && (a < 0) && (a > -0.5)) { - // if isset angleArc option, set to min if .5 under min - a = 0; - } else if (a < 0) { - a += this.PI2; - } - - ret = ~~ (0.5 + (a * (this.o.max - this.o.min) / this.angleArc)) - + this.o.min; - - this.o.stopper - && (ret = max(min(ret, this.o.max), this.o.min)); - - return ret; - }; - - this.listen = function () { - // bind MouseWheel - var s = this, - mw = function (e) { - e.preventDefault(); - - var ori = e.originalEvent - ,deltaX = ori.detail || ori.wheelDeltaX - ,deltaY = ori.detail || ori.wheelDeltaY - ,v = parseInt(s.$.val()) + (deltaX>0 || deltaY>0 ? 1 : deltaX<0 || deltaY<0 ? -1 : 0); - - if ( - s.cH - && (s.cH(v) === false) - ) return; - - s.val(v); - } - , kval, to, m = 1, kv = {37:-1, 38:1, 39:1, 40:-1}; - - this.$ - .bind( - "keydown" - ,function (e) { - var kc = e.keyCode; - kval = parseInt(String.fromCharCode(kc)); - - if (isNaN(kval)) { - - (kc !== 13) // enter - && (kc !== 8) // bs - && (kc !== 9) // tab - && (kc !== 189) // - - && e.preventDefault(); - - // arrows - if ($.inArray(kc,[37,38,39,40]) > -1) { - e.preventDefault(); - - var v = parseInt(s.$.val()) + kv[kc] * m; - - s.o.stopper - && (v = max(min(v, s.o.max), s.o.min)); - - s.change(v); - s._draw(); - - // long time keydown speed-up - to = window.setTimeout( - function () { m*=2; } - ,30 - ); - } - } - } - ) - .bind( - "keyup" - ,function (e) { - if (isNaN(kval)) { - if (to) { - window.clearTimeout(to); - to = null; - m = 1; - s.val(s.$.val()); - } - } else { - // kval postcond - (s.$.val() > s.o.max && s.$.val(s.o.max)) - || (s.$.val() < s.o.min && s.$.val(s.o.min)); - } - - } - ); - - this.$c.bind("mousewheel DOMMouseScroll", mw); - this.$.bind("mousewheel DOMMouseScroll", mw) - }; - - this.init = function () { - - if ( - this.v < this.o.min - || this.v > this.o.max - ) this.v = this.o.min; - - this.$.val(this.v); - this.w2 = this.o.width / 2; - this.cursorExt = this.o.cursor / 100; - this.xy = this.w2; - this.lineWidth = this.xy * this.o.thickness; - this.radius = this.xy - this.lineWidth / 2; - - this.o.angleOffset - && (this.o.angleOffset = isNaN(this.o.angleOffset) ? 0 : this.o.angleOffset); - - this.o.angleArc - && (this.o.angleArc = isNaN(this.o.angleArc) ? this.PI2 : this.o.angleArc); - - // deg to rad - this.angleOffset = this.o.angleOffset * Math.PI / 180; - this.angleArc = this.o.angleArc * Math.PI / 180; - - // compute start and end angles - this.startAngle = 1.5 * Math.PI + this.angleOffset; - this.endAngle = 1.5 * Math.PI + this.angleOffset + this.angleArc; - - var s = max( - String(Math.abs(this.o.max)).length - , String(Math.abs(this.o.min)).length - , 2 - ) + 2; - - this.o.displayInput - && this.i.css({ - 'width' : ((this.o.width / 2 + 4) >> 0) + 'px' - ,'height' : ((this.o.width / 3) >> 0) + 'px' - ,'position' : 'absolute' - ,'vertical-align' : 'middle' - ,'margin-top' : ((this.o.width / 3) >> 0) + 'px' - ,'margin-left' : '-' + ((this.o.width * 3 / 4 + 2) >> 0) + 'px' - ,'border' : 0 - ,'background' : 'none' - ,'font' : 'bold ' + ((this.o.width / s) >> 0) + 'px Arial' - ,'text-align' : 'center' - ,'color' : this.o.fgColor - ,'padding' : '0px' - ,'-webkit-appearance': 'none' - }) - || this.i.css({ - 'width' : '0px' - ,'visibility' : 'hidden' - }); - }; - - this.change = function (v) { - this.cv = v; - this.$.val(v); - }; - - this.angle = function (v) { - return (v - this.o.min) * this.angleArc / (this.o.max - this.o.min); - }; - - this.draw = function () { - - var c = this.g, // context - a = this.angle(this.cv) // Angle - , sat = this.startAngle // Start angle - , eat = sat + a // End angle - , sa, ea // Previous angles - , r = 1; - - c.lineWidth = this.lineWidth; - - this.o.cursor - && (sat = eat - this.cursorExt) - && (eat = eat + this.cursorExt); - - c.beginPath(); - c.strokeStyle = this.o.bgColor; - c.arc(this.xy, this.xy, this.radius, this.endAngle, this.startAngle, true); - c.stroke(); - - if (this.o.displayPrevious) { - ea = this.startAngle + this.angle(this.v); - sa = this.startAngle; - this.o.cursor - && (sa = ea - this.cursorExt) - && (ea = ea + this.cursorExt); - - c.beginPath(); - c.strokeStyle = this.pColor; - c.arc(this.xy, this.xy, this.radius, sa, ea, false); - c.stroke(); - r = (this.cv == this.v); - } - - c.beginPath(); - c.strokeStyle = r ? this.o.fgColor : this.fgColor ; - c.arc(this.xy, this.xy, this.radius, sat, eat, false); - c.stroke(); - }; - - this.cancel = function () { - this.val(this.v); - }; - }; - - $.fn.dial = $.fn.knob = function (o) { - return this.each( - function () { - var d = new k.Dial(); - d.o = o; - d.$ = $(this); - d.run(); - } - ).parent(); - }; - -}); -Rickshaw={namespace:function(a,b){var c=a.split("."),d=typeof global!="undefined"?global:window,e=d.Rickshaw;for(var f=1,g=c.length;fthis.window.xMax&&(b=!1),b}return!0},this.onUpdate=function(a){this.updateCallbacks.push(a)},this.registerRenderer=function(a){this._renderers=this._renderers||{},this._renderers[a.name]=a},this.configure=function(a){(a.width||a.height)&&this.setSize(a),Rickshaw.keys(this.defaults).forEach(function(b){this[b]=b in a?a[b]:b in this?this[b]:this.defaults[b]},this),this.setRenderer(a.renderer||this.renderer.name,a)},this.setRenderer=function(a,b){if(!this._renderers[a])throw"couldn't find renderer "+a;this.renderer=this._renderers[a],typeof b=="object"&&this.renderer.configure(b)},this.setSize=function(a){a=a||{};if(typeof window!==undefined)var b=window.getComputedStyle(this.element,null),c=parseInt(b.getPropertyValue("width")),d=parseInt(b.getPropertyValue("height"));this.width=a.width||c||400,this.height=a.height||d||250,this.vis&&this.vis.attr("width",this.width).attr("height",this.height)},this.initialize(a)},Rickshaw.namespace("Rickshaw.Fixtures.Color"),Rickshaw.Fixtures.Color=function(){this.schemes={},this.schemes.spectrum14=["#ecb796","#dc8f70","#b2a470","#92875a","#716c49","#d2ed82","#bbe468","#a1d05d","#e7cbe6","#d8aad6","#a888c2","#9dc2d3","#649eb9","#387aa3"].reverse(),this.schemes.spectrum2000=["#57306f","#514c76","#646583","#738394","#6b9c7d","#84b665","#a7ca50","#bfe746","#e2f528","#fff726","#ecdd00","#d4b11d","#de8800","#de4800","#c91515","#9a0000","#7b0429","#580839","#31082b"],this.schemes.spectrum2001=["#2f243f","#3c2c55","#4a3768","#565270","#6b6b7c","#72957f","#86ad6e","#a1bc5e","#b8d954","#d3e04e","#ccad2a","#cc8412","#c1521d","#ad3821","#8a1010","#681717","#531e1e","#3d1818","#320a1b"],this.schemes.classic9=["#423d4f","#4a6860","#848f39","#a2b73c","#ddcb53","#c5a32f","#7d5836","#963b20","#7c2626","#491d37","#2f254a"].reverse(),this.schemes.httpStatus={503:"#ea5029",502:"#d23f14",500:"#bf3613",410:"#efacea",409:"#e291dc",403:"#f457e8",408:"#e121d2",401:"#b92dae",405:"#f47ceb",404:"#a82a9f",400:"#b263c6",301:"#6fa024",302:"#87c32b",307:"#a0d84c",304:"#28b55c",200:"#1a4f74",206:"#27839f",201:"#52adc9",202:"#7c979f",203:"#a5b8bd",204:"#c1cdd1"},this.schemes.colorwheel=["#b5b6a9","#858772","#785f43","#96557e","#4682b4","#65b9ac","#73c03a","#cb513a"].reverse(),this.schemes.cool=["#5e9d2f","#73c03a","#4682b4","#7bc3b8","#a9884e","#c1b266","#a47493","#c09fb5"],this.schemes.munin=["#00cc00","#0066b3","#ff8000","#ffcc00","#330099","#990099","#ccff00","#ff0000","#808080","#008f00","#00487d","#b35a00","#b38f00","#6b006b","#8fb300","#b30000","#bebebe","#80ff80","#80c9ff","#ffc080","#ffe680","#aa80ff","#ee00cc","#ff8080","#666600","#ffbfff","#00ffcc","#cc6699","#999900"]},Rickshaw.namespace("Rickshaw.Fixtures.RandomData"),Rickshaw.Fixtures.RandomData=function(a){var b;a=a||1;var c=200,d=Math.floor((new Date).getTime()/1e3);this.addData=function(b){var e=Math.random()*100+15+c,f=b[0].length,g=1;b.forEach(function(b){var c=Math.random()*20,h=e/25+g++ +(Math.cos(f*g*11/960)+2)*15+(Math.cos(f/7)+2)*7+(Math.cos(f/17)+2)*1;b.push({x:f*a+d,y:h+c})}),c=e*.85}},Rickshaw.namespace("Rickshaw.Fixtures.Time"),Rickshaw.Fixtures.Time=function(){var a=(new Date).getTimezoneOffset()*60,b=this;this.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],this.units=[{name:"decade",seconds:315576e3,formatter:function(a){return parseInt(a.getUTCFullYear()/10)*10}},{name:"year",seconds:31557600,formatter:function(a){return a.getUTCFullYear()}},{name:"month",seconds:2635200,formatter:function(a){return b.months[a.getUTCMonth()]}},{name:"week",seconds:604800,formatter:function(a){return b.formatDate(a)}},{name:"day",seconds:86400,formatter:function(a){return a.getUTCDate()}},{name:"6 hour",seconds:21600,formatter:function(a){return b.formatTime(a)}},{name:"hour",seconds:3600,formatter:function(a){return b.formatTime(a)}},{name:"15 minute",seconds:900,formatter:function(a){return b.formatTime(a)}},{name:"minute",seconds:60,formatter:function(a){return a.getUTCMinutes()}},{name:"15 second",seconds:15,formatter:function(a){return a.getUTCSeconds()+"s"}},{name:"second",seconds:1,formatter:function(a){return a.getUTCSeconds()+"s"}}],this.unit=function(a){return this.units.filter(function(b){return a==b.name}).shift()},this.formatDate=function(a){return a.toUTCString().match(/, (\w+ \w+ \w+)/)[1]},this.formatTime=function(a){return a.toUTCString().match(/(\d+:\d+):/)[1]},this.ceil=function(a,b){if(b.name=="month"){var c=new Date((a+b.seconds-1)*1e3),d=new Date(0);return d.setUTCFullYear(c.getUTCFullYear()),d.setUTCMonth(c.getUTCMonth()),d.setUTCDate(1),d.setUTCHours(0),d.setUTCMinutes(0),d.setUTCSeconds(0),d.setUTCMilliseconds(0),d.getTime()/1e3}if(b.name=="year"){var c=new Date((a+b.seconds-1)*1e3),d=new Date(0);return d.setUTCFullYear(c.getUTCFullYear()),d.setUTCMonth(0),d.setUTCDate(1),d.setUTCHours(0),d.setUTCMinutes(0),d.setUTCSeconds(0),d.setUTCMilliseconds(0),d.getTime()/1e3}return Math.ceil(a/b.seconds)*b.seconds}},Rickshaw.namespace("Rickshaw.Fixtures.Number"),Rickshaw.Fixtures.Number.formatKMBT=function(a){return a>=1e12?a/1e12+"T":a>=1e9?a/1e9+"B":a>=1e6?a/1e6+"M":a>=1e3?a/1e3+"K":a<1&&a>0?a.toFixed(2):a==0?"":a},Rickshaw.Fixtures.Number.formatBase1024KMGTP=function(a){return a>=0x4000000000000?a/0x4000000000000+"P":a>=1099511627776?a/1099511627776+"T":a>=1073741824?a/1073741824+"G":a>=1048576?a/1048576+"M":a>=1024?a/1024+"K":a<1&&a>0?a.toFixed(2):a==0?"":a},Rickshaw.namespace("Rickshaw.Color.Palette"),Rickshaw.Color.Palette=function(a){var b=new Rickshaw.Fixtures.Color;a=a||{},this.schemes={},this.scheme=b.schemes[a.scheme]||a.scheme||b.schemes.colorwheel,this.runningIndex=0,this.generatorIndex=0;if(a.interpolatedStopCount){var c=this.scheme.length-1,d,e,f=[];for(d=0;dc.graph.x.range()[1]){b.element&&(b.element.style.display="none");return}if(!b.element){var e=b.element=document.createElement("div");e.classList.add("annotation"),this.elements.timeline.appendChild(e),e.addEventListener("click",function(a){e.classList.toggle("active"),b.line.classList.toggle("active")},!1)}b.element.style.left=d+"px",b.element.style.display="block",b.boxes.forEach(function(a){var e=a.element;e||(e=a.element=document.createElement("div"),e.classList.add("content"),e.innerHTML=a.content,b.element.appendChild(e),b.line=document.createElement("div"),b.line.classList.add("annotation_line"),c.graph.element.appendChild(b.line)),b.line.style.left=d+"px"})},this)},this.graph.onUpdate(function(){c.update()})},Rickshaw.namespace("Rickshaw.Graph.Axis.Time"),Rickshaw.Graph.Axis.Time=function(a){var b=this;this.graph=a.graph,this.elements=[],this.ticksTreatment=a.ticksTreatment||"plain",this.fixedTimeUnit=a.timeUnit;var c=new Rickshaw.Fixtures.Time;this.appropriateTimeUnit=function(){var a,b=c.units,d=this.graph.x.domain(),e=d[1]-d[0];return b.forEach(function(b){Math.floor(e/b.seconds)>=2&&(a=a||b)}),a||c.units[c.units.length-1]},this.tickOffsets=function(){var a=this.graph.x.domain(),b=this.fixedTimeUnit||this.appropriateTimeUnit(),d=Math.ceil((a[1]-a[0])/b.seconds),e=a[0],f=[];for(var g=0;gb.graph.x.range()[1])return;var c=document.createElement("div");c.style.left=b.graph.x(a.value)+"px",c.classList.add("x_tick"),c.classList.add(b.ticksTreatment);var d=document.createElement("div");d.classList.add("title"),d.innerHTML=a.unit.formatter(new Date(a.value*1e3)),c.appendChild(d),b.graph.element.appendChild(c),b.elements.push(c)})},this.graph.onUpdate(function(){b.render()})},Rickshaw.namespace("Rickshaw.Graph.Axis.Y"),Rickshaw.Graph.Axis.Y=function(a){var b=this,c=.1;this.initialize=function(a){this.graph=a.graph,this.orientation=a.orientation||"right";var c=a.pixelsPerTick||75;this.ticks=a.ticks||Math.floor(this.graph.height/c),this.tickSize=a.tickSize||4,this.ticksTreatment=a.ticksTreatment||"plain",a.element?(this.element=a.element,this.vis=d3.select(a.element).append("svg:svg").attr("class","rickshaw_graph y_axis"),this.element=this.vis[0][0],this.element.style.position="relative",this.setSize({width:a.width,height:a.height})):this.vis=this.graph.vis,this.graph.onUpdate(function(){b.render()})},this.setSize=function(a){a=a||{};if(!this.element)return;if(typeof window!="undefined"){var b=window.getComputedStyle(this.element.parentNode,null),d=parseInt(b.getPropertyValue("width"));if(!a.auto)var e=parseInt(b.getPropertyValue("height"))}this.width=a.width||d||this.graph.width*c,this.height=a.height||e||this.graph.height,this.vis.attr("width",this.width).attr("height",this.height*(1+c));var f=this.height*c;this.element.style.top=-1*f+"px"},this.render=function(){this.graph.height!==this._renderHeight&&this.setSize({auto:!0});var b=d3.svg.axis().scale(this.graph.y).orient(this.orientation);b.tickFormat(a.tickFormat||function(a){return a});if(this.orientation=="left")var d=this.height*c,e="translate("+this.width+", "+d+")";this.element&&this.vis.selectAll("*").remove(),this.vis.append("svg:g").attr("class",["y_ticks",this.ticksTreatment].join(" ")).attr("transform",e).call(b.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize));var f=(this.orientation=="right"?1:-1)*this.graph.width;this.graph.vis.append("svg:g").attr("class","y_grid").call(b.ticks(this.ticks).tickSubdivide(0).tickSize(f)),this._renderHeight=this.graph.height},this.initialize(a)},Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Highlight"),Rickshaw.Graph.Behavior.Series.Highlight=function(a){this.graph=a.graph,this.legend=a.legend;var b=this,c={};this.addHighlightEvents=function(a){a.element.addEventListener("mouseover",function(d){b.legend.lines.forEach(function(b){if(a===b)return;c[b.series.name]=c[b.series.name]||b.series.color,b.series.color=d3.interpolateRgb(b.series.color,d3.rgb("#d8d8d8"))(.8).toString()}),b.graph.update()},!1),a.element.addEventListener("mouseout",function(a){b.legend.lines.forEach(function(a){c[a.series.name]&&(a.series.color=c[a.series.name])}),b.graph.update()},!1)},this.legend&&this.legend.lines.forEach(function(a){b.addHighlightEvents(a)})},Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Order"),Rickshaw.Graph.Behavior.Series.Order=function(a){this.graph=a.graph,this.legend=a.legend;var b=this;$(function(){$(b.legend.list).sortable({containment:"parent",tolerance:"pointer",update:function(a,c){var d=[];$(b.legend.list).find("li").each(function(a,b){if(!b.series)return;d.push(b.series)});for(var e=b.graph.series.length-1;e>=0;e--)b.graph.series[e]=d.shift();b.graph.update()}}),$(b.legend.list).disableSelection()}),this.graph.onUpdate(function(){var a=window.getComputedStyle(b.legend.element).height;b.legend.element.style.height=a})},Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Toggle"),Rickshaw.Graph.Behavior.Series.Toggle=function(a){this.graph=a.graph,this.legend=a.legend;var b=this;this.addAnchor=function(a){var c=document.createElement("a");c.innerHTML="✔",c.classList.add("action"),a.element.insertBefore(c,a.element.firstChild),c.onclick=function(b){a.series.disabled?(a.series.enable(),a.element.classList.remove("disabled")):(a.series.disable(),a.element.classList.add("disabled"))};var d=a.element.getElementsByTagName("span")[0];d.onclick=function(c){var d=a.series.disabled;if(!d)for(var e=0;ee){j=k;break}f[0][k+1]<=e?k++:k--}var e=f[0][j].x,l=this.xFormatter(e),m=b.x(e),n=0,o=b.series.active().map(function(a){return{order:n++,series:a,name:a.name,value:a.stack[j]}}),p,q=function(a,b){return a.value.y0+a.value.y-(b.value.y0+b.value.y)},r=b.y.magnitude.invert(b.element.offsetHeight-d);o.sort(q).forEach(function(a){a.formattedYValue=this.yFormatter.constructor==Array?this.yFormatter[o.indexOf(a)](a.value.y):this.yFormatter(a.value.y),a.graphX=m,a.graphY=b.y(a.value.y0+a.value.y),r>a.value.y0&&r0?this[0].data.forEach(function(b){a.data.push({x:b.x,y:0})}):a.data.length==0&&a.data.push({x:this.timeBase-(this.timeInterval||0),y:0}),this.push(a),this.legend&&this.legend.addLine(this.itemByName(a.name))},addData:function(a){var b=this.getIndex();Rickshaw.keys(a).forEach(function(a){this.itemByName(a)||this.addItem({name:a})},this),this.forEach(function(c){c.data.push({x:(b*this.timeInterval||1)+this.timeBase,y:a[c.name]||0})},this)},getIndex:function(){return this[0]&&this[0].data&&this[0].data.length?this[0].data.length:0},itemByName:function(a){for(var b=0;b0;d--)this.currentSize+=1,this.currentIndex+=1,this.forEach(function(a){a.data.unshift({x:((d-1)*this.timeInterval||1)+this.timeBase,y:0,i:d})},this)},addData:function($super,a){$super(a),this.currentSize+=1,this.currentIndex+=1;if(this.maxDataPoints!==undefined)while(this.currentSize>this.maxDataPoints)this.dropData()},dropData:function(){this.forEach(function(a){a.data.splice(0,1)}),this.currentSize-=1},getIndex:function(){return this.currentIndex}}); -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Clock = (function(_super) { - - __extends(Clock, _super); - - function Clock() { - this.startTime = __bind(this.startTime, this); - return Clock.__super__.constructor.apply(this, arguments); - } - - Clock.prototype.ready = function() { - return setInterval(this.startTime, 500); - }; - - Clock.prototype.startTime = function() { - var h, m, s, today; - today = new Date(); - h = today.getHours(); - m = today.getMinutes(); - s = today.getSeconds(); - m = this.formatTime(m); - s = this.formatTime(s); - this.set('time', h + ":" + m + ":" + s); - return this.set('date', today.toDateString()); - }; - - Clock.prototype.formatTime = function(i) { - if (i < 10) { - return "0" + i; - } else { - return i; - } - }; - - return Clock; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Comments = (function(_super) { - - __extends(Comments, _super); - - function Comments() { - this.nextComment = __bind(this.nextComment, this); - return Comments.__super__.constructor.apply(this, arguments); - } - - Comments.accessor('quote', function() { - var _ref; - return "“" + ((_ref = this.get('current_comment')) != null ? _ref.body : void 0) + "”"; - }); - - Comments.prototype.ready = function() { - this.currentIndex = 0; - this.commentElem = $(this.node).find('.comment-container'); - this.nextComment(); - return this.startCarousel(); - }; - - Comments.prototype.onData = function(data) { - return this.currentIndex = 0; - }; - - Comments.prototype.startCarousel = function() { - return setInterval(this.nextComment, 8000); - }; - - Comments.prototype.nextComment = function() { - var comments, - _this = this; - comments = this.get('comments'); - if (comments) { - return this.commentElem.fadeOut(function() { - _this.currentIndex = (_this.currentIndex + 1) % comments.length; - _this.set('current_comment', comments[_this.currentIndex]); - return _this.commentElem.fadeIn(); - }); - } - }; - - return Comments; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Graph = (function(_super) { - - __extends(Graph, _super); - - function Graph() { - return Graph.__super__.constructor.apply(this, arguments); - } - - Graph.accessor('current', function() { - var points; - if (this.get('displayedValue')) { - return this.get('displayedValue'); - } - points = this.get('points'); - if (points) { - return points[points.length - 1].y; - } - }); - - Graph.prototype.ready = function() { - var container, height, width, x_axis, y_axis; - container = $(this.node).parent(); - width = (Dashing.widget_base_dimensions[0] * container.data("sizex")) + Dashing.widget_margins[0] * 2 * (container.data("sizex") - 1); - height = Dashing.widget_base_dimensions[1] * container.data("sizey"); - this.graph = new Rickshaw.Graph({ - element: this.node, - width: width, - height: height, - series: [ - { - color: "#fff", - data: [ - { - x: 0, - y: 0 - } - ] - } - ] - }); - if (this.get('points')) { - this.graph.series[0].data = this.get('points'); - } - x_axis = new Rickshaw.Graph.Axis.Time({ - graph: this.graph - }); - y_axis = new Rickshaw.Graph.Axis.Y({ - graph: this.graph, - tickFormat: Rickshaw.Fixtures.Number.formatKMBT - }); - return this.graph.render(); - }; - - Graph.prototype.onData = function(data) { - if (this.graph) { - this.graph.series[0].data = data.points; - return this.graph.render(); - } - }; - - return Graph; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Iframe = (function(_super) { - - __extends(Iframe, _super); - - function Iframe() { - return Iframe.__super__.constructor.apply(this, arguments); - } - - Iframe.prototype.ready = function() {}; - - Iframe.prototype.onData = function(data) {}; - - return Iframe; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Image = (function(_super) { - - __extends(Image, _super); - - function Image() { - return Image.__super__.constructor.apply(this, arguments); - } - - Image.prototype.ready = function() {}; - - Image.prototype.onData = function(data) {}; - - return Image; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.List = (function(_super) { - - __extends(List, _super); - - function List() { - return List.__super__.constructor.apply(this, arguments); - } - - List.prototype.ready = function() { - if (this.get('unordered')) { - return $(this.node).find('ol').remove(); - } else { - return $(this.node).find('ul').remove(); - } - }; - - return List; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Meter = (function(_super) { - - __extends(Meter, _super); - - Meter.accessor('value', Dashing.AnimatedValue); - - function Meter() { - Meter.__super__.constructor.apply(this, arguments); - this.observe('value', function(value) { - return $(this.node).find(".meter").val(value).trigger('change'); - }); - } - - Meter.prototype.ready = function() { - var meter; - meter = $(this.node).find(".meter"); - meter.attr("data-bgcolor", meter.css("background-color")); - meter.attr("data-fgcolor", meter.css("color")); - return meter.knob(); - }; - - return Meter; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Number = (function(_super) { - - __extends(Number, _super); - - function Number() { - return Number.__super__.constructor.apply(this, arguments); - } - - Number.accessor('current', Dashing.AnimatedValue); - - Number.accessor('difference', function() { - var current, diff, last; - if (this.get('last')) { - last = parseInt(this.get('last')); - current = parseInt(this.get('current')); - if (last !== 0) { - diff = Math.abs(Math.round((current - last) / last * 100)); - return "" + diff + "%"; - } - } else { - return ""; - } - }); - - Number.accessor('arrow', function() { - if (this.get('last')) { - if (parseInt(this.get('current')) > parseInt(this.get('last'))) { - return 'icon-arrow-up'; - } else { - return 'icon-arrow-down'; - } - } - }); - - Number.accessor('needsAttention', function() { - return this.get('status') === 'warning' || this.get('status') === 'danger'; - }); - - Number.prototype.onData = function(data) { - if (data.status) { - return $(this.get('node')).addClass("status-" + data.status); - } - }; - - return Number; - - })(Dashing.Widget); - -}).call(this); -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Dashing.Text = (function(_super) { - - __extends(Text, _super); - - function Text() { - return Text.__super__.constructor.apply(this, arguments); - } - - return Text; - - })(Dashing.Widget); - -}).call(this); -(function() { - - console.log("Yeah! The dashboard has started!"); - - Dashing.on('ready', function() { - var contentWidth; - Dashing.widget_margins || (Dashing.widget_margins = [5, 5]); - Dashing.widget_base_dimensions || (Dashing.widget_base_dimensions = [300, 360]); - Dashing.numColumns || (Dashing.numColumns = 4); - contentWidth = (Dashing.widget_base_dimensions[0] + Dashing.widget_margins[0] * 2) * Dashing.numColumns; - return Batman.setImmediate(function() { - $('.gridster').width(contentWidth); - return $('.gridster ul:first').gridster({ - widget_margins: Dashing.widget_margins, - widget_base_dimensions: Dashing.widget_base_dimensions, - avoid_overlapped_widgets: !Dashing.customGridsterLayout, - draggable: { - stop: Dashing.showGridsterInstructions - } - }); - }); - }); - -}).call(this); diff --git a/pydashie/assets/javascripts/batman.jquery.js b/pydashie/assets/javascripts/batman.jquery.js deleted file mode 100644 index 3eac437..0000000 --- a/pydashie/assets/javascripts/batman.jquery.js +++ /dev/null @@ -1,333 +0,0 @@ -(function() { - - Batman.extend(Batman.DOM, { - querySelectorAll: function(node, selector) { - return jQuery(selector, node); - }, - querySelector: function(node, selector) { - return jQuery(selector, node)[0]; - }, - setInnerHTML: function(node, html) { - var child, childNodes, result, _i, _j, _len, _len1; - childNodes = (function() { - var _i, _len, _ref, _results; - _ref = node.childNodes; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - _results.push(child); - } - return _results; - })(); - for (_i = 0, _len = childNodes.length; _i < _len; _i++) { - child = childNodes[_i]; - Batman.DOM.willRemoveNode(child); - } - result = jQuery(node).html(html); - for (_j = 0, _len1 = childNodes.length; _j < _len1; _j++) { - child = childNodes[_j]; - Batman.DOM.didRemoveNode(child); - } - return result; - }, - removeNode: function(node) { - var _ref; - Batman.DOM.willRemoveNode(node); - if ((_ref = node.parentNode) != null) { - _ref.removeChild(node); - } - return Batman.DOM.didRemoveNode(node); - }, - destroyNode: function(node) { - Batman.DOM.willDestroyNode(node); - Batman.DOM.willRemoveNode(node); - jQuery(node).remove(); - Batman.DOM.didRemoveNode(node); - return Batman.DOM.didDestroyNode(node); - }, - appendChild: function(parent, child) { - Batman.DOM.willInsertNode(child); - jQuery(parent).append(child); - return Batman.DOM.didInsertNode(child); - } - }); - - Batman.Request.prototype._parseResponseHeaders = function(xhr) { - var headers; - return headers = xhr.getAllResponseHeaders().split('\n').reduce(function(acc, header) { - var key, matches, value; - if (matches = header.match(/([^:]*):\s*(.*)/)) { - key = matches[1]; - value = matches[2]; - acc[key] = value; - } - return acc; - }, {}); - }; - - Batman.Request.prototype._prepareOptions = function(data) { - var options, _ref, - _this = this; - options = { - url: this.get('url'), - type: this.get('method'), - dataType: this.get('type'), - data: data || this.get('data'), - username: this.get('username'), - password: this.get('password'), - headers: this.get('headers'), - beforeSend: function() { - return _this.fire('loading'); - }, - success: function(response, textStatus, xhr) { - _this.mixin({ - xhr: xhr, - status: xhr.status, - response: response, - responseHeaders: _this._parseResponseHeaders(xhr) - }); - return _this.fire('success', response); - }, - error: function(xhr, status, error) { - _this.mixin({ - xhr: xhr, - status: xhr.status, - response: xhr.responseText, - responseHeaders: _this._parseResponseHeaders(xhr) - }); - xhr.request = _this; - return _this.fire('error', xhr); - }, - complete: function() { - return _this.fire('loaded'); - } - }; - if ((_ref = this.get('method')) === 'PUT' || _ref === 'POST') { - if (!this.hasFileUploads()) { - options.contentType = this.get('contentType'); - if (typeof options.data === 'object') { - options.processData = false; - options.data = Batman.URI.queryFromParams(options.data); - } - } else { - options.contentType = false; - options.processData = false; - options.data = this.constructor.objectToFormData(options.data); - } - } - return options; - }; - - Batman.Request.prototype.send = function(data) { - return jQuery.ajax(this._prepareOptions(data)); - }; - - Batman.mixins.animation = { - show: function(addToParent) { - var jq, show, _ref, _ref1; - jq = $(this); - show = function() { - return jq.show(600); - }; - if (addToParent) { - if ((_ref = addToParent.append) != null) { - _ref.appendChild(this); - } - if ((_ref1 = addToParent.before) != null) { - _ref1.parentNode.insertBefore(this, addToParent.before); - } - jq.hide(); - setTimeout(show, 0); - } else { - show(); - } - return this; - }, - hide: function(removeFromParent) { - var _this = this; - $(this).hide(600, function() { - var _ref; - if (removeFromParent) { - if ((_ref = _this.parentNode) != null) { - _ref.removeChild(_this); - } - } - return Batman.DOM.didRemoveNode(_this); - }); - return this; - } - }; - -}).call(this); -(function() { - var lastEvents, source, widgets, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - _this = this; - - Batman.Filters.prettyNumber = function(num) { - if (!isNaN(num)) { - return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } - }; - - Batman.Filters.dashize = function(str) { - var dashes_rx1, dashes_rx2; - dashes_rx1 = /([A-Z]+)([A-Z][a-z])/g; - dashes_rx2 = /([a-z\d])([A-Z])/g; - return str.replace(dashes_rx1, '$1_$2').replace(dashes_rx2, '$1_$2').replace('_', '-').toLowerCase(); - }; - - Batman.Filters.shortenedNumber = function(num) { - if (isNaN(num)) { - return num; - } - if (num >= 1000000000) { - return (num / 1000000000).toFixed(1) + 'B'; - } else if (num >= 1000000) { - return (num / 1000000).toFixed(1) + 'M'; - } else if (num >= 1000) { - return (num / 1000).toFixed(1) + 'K'; - } else { - return num; - } - }; - - window.Dashing = (function(_super) { - - __extends(Dashing, _super); - - function Dashing() { - return Dashing.__super__.constructor.apply(this, arguments); - } - - Dashing.root(function() {}); - - return Dashing; - - })(Batman.App); - - Dashing.params = Batman.URI.paramsFromQuery(window.location.search.slice(1)); - - Dashing.Widget = (function(_super) { - - __extends(Widget, _super); - - function Widget() { - this.onData = __bind(this.onData, this); - - this.receiveData = __bind(this.receiveData, this); - - var type, _base, _name; - this.constructor.prototype.source = Batman.Filters.underscore(this.constructor.name); - Widget.__super__.constructor.apply(this, arguments); - this.mixin($(this.node).data()); - (_base = Dashing.widgets)[_name = this.id] || (_base[_name] = []); - Dashing.widgets[this.id].push(this); - this.mixin(Dashing.lastEvents[this.id]); - type = Batman.Filters.dashize(this.view); - $(this.node).addClass("widget widget-" + type + " " + this.id); - } - - Widget.accessor('updatedAtMessage', function() { - var timestamp, updatedAt; - if (updatedAt = this.get('updatedAt')) { - timestamp = updatedAt.toString().match(/\d*:\d*/)[0]; - return "Last updated at " + timestamp; - } - }); - - Widget.prototype.on('ready', function() { - return Dashing.Widget.fire('ready'); - }); - - Widget.prototype.receiveData = function(data) { - this.mixin(data); - return this.onData(data); - }; - - Widget.prototype.onData = function(data) {}; - - return Widget; - - })(Batman.View); - - Dashing.AnimatedValue = { - get: Batman.Property.defaultAccessor.get, - set: function(k, to) { - var num, num_interval, timer, up, - _this = this; - if (!(to != null) || isNaN(to)) { - return this[k] = to; - } else { - timer = "interval_" + k; - num = !isNaN(this[k]) && (this[k] != null) ? this[k] : 0; - if (!(this[timer] || num === to)) { - to = parseFloat(to); - num = parseFloat(num); - up = to > num; - num_interval = Math.abs(num - to) / 90; - this[timer] = setInterval(function() { - num = up ? Math.ceil(num + num_interval) : Math.floor(num - num_interval); - if ((up && num > to) || (!up && num < to)) { - num = to; - clearInterval(_this[timer]); - _this[timer] = null; - delete _this[timer]; - } - _this[k] = num; - return _this.set(k, to); - }, 10); - } - return this[k] = num; - } - } - }; - - Dashing.widgets = widgets = {}; - - Dashing.lastEvents = lastEvents = {}; - - Dashing.debugMode = false; - - source = new EventSource('/events'); - - source.addEventListener('open', function(e) { - return console.log("Connection opened"); - }); - - source.addEventListener('error', function(e) { - console.log("Connection error"); - if (e.readyState === EventSource.CLOSED) { - return console.log("Connection closed"); - } - }); - - source.addEventListener('message', function(e) { - var data, widget, _i, _len, _ref, _ref1, _results; - data = JSON.parse(e.data); - if (Dashing.debugMode) { - console.log("Received data for " + data.id, data); - } - lastEvents[data.id] = data; - if (((_ref = widgets[data.id]) != null ? _ref.length : void 0) > 0) { - _ref1 = widgets[data.id]; - _results = []; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - widget = _ref1[_i]; - _results.push(widget.receiveData(data)); - } - return _results; - } - }); - - $(document).ready(function() { - return Dashing.run(); - }); - -}).call(this); -(function(){function d(a,b){try{for(var c in b)Object.defineProperty(a.prototype,c,{value:b[c],enumerable:!1})}catch(d){a.prototype=b}}function f(a){var b=-1,c=a.length,d=[];while(++b=0?a.substring(b):(b=a.length,""),d=[];while(b>0)d.push(a.substring(b-=3,b+3));return d.reverse().join(",")+c}function H(a,b){var c=Math.pow(10,Math.abs(8-b)*3);return{scale:b>8?function(a){return a/c}:function(a){return a*c},symbol:a}}function N(a){return function(b){return b<=0?0:b>=1?1:a(b)}}function O(a){return function(b){return 1-a(1-b)}}function P(a){return function(b){return.5*(b<.5?a(2*b):2-a(2-2*b))}}function Q(a){return a}function R(a){return function(b){return Math.pow(b,a)}}function S(a){return 1-Math.cos(a*Math.PI/2)}function T(a){return Math.pow(2,10*(a-1))}function U(a){return 1-Math.sqrt(1-a*a)}function V(a,b){var c;return arguments.length<2&&(b=.45),arguments.length<1?(a=1,c=b/4):c=b/(2*Math.PI)*Math.asin(1/a),function(d){return 1+a*Math.pow(2,10*-d)*Math.sin((d-c)*2*Math.PI/b)}}function W(a){return a||(a=1.70158),function(b){return b*b*((a+1)*b-a)}}function X(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375}function Y(){d3.event.stopPropagation(),d3.event.preventDefault()}function Z(){var a=d3.event,b;while(b=a.sourceEvent)a=b;return a}function $(a){var b=new z,c=0,d=arguments.length;while(++c360?a-=360:a<0&&(a+=360),a<60?d+(e-d)*a/60:a<180?e:a<240?d+(e-d)*(240-a)/60:d}function g(a){return Math.round(f(a)*255)}var d,e;return a%=360,a<0&&(a+=360),b=b<0?0:b>1?1:b,c=c<0?0:c>1?1:c,e=c<=.5?c*(1+b):c+b-c*b,d=2*c-e,bj(g(a+120),g(a),g(a-120))}function bv(a,b,c){return new bw(a,b,c)}function bw(a,b,c){this.h=a,this.c=b,this.l=c}function bx(a,b,c){return by(c,Math.cos(a*=Math.PI/180)*b,Math.sin(a)*b)}function by(a,b,c){return new bz(a,b,c)}function bz(a,b,c){this.l=a,this.a=b,this.b=c}function bE(a,b,c){var d=(a+16)/116,e=d+b/500,f=d-c/200;return e=bG(e)*bB,d=bG(d)*bC,f=bG(f)*bD,bj(bI(3.2404542*e-1.5371385*d-.4985314*f),bI(-0.969266*e+1.8760108*d+.041556*f),bI(.0556434*e-.2040259*d+1.0572252*f))}function bF(a,b,c){return bv(Math.atan2(c,b)/Math.PI*180,Math.sqrt(b*b+c*c),a)}function bG(a){return a>.206893034?a*a*a:(a-4/29)/7.787037}function bH(a){return a>.008856?Math.pow(a,1/3):7.787037*a+4/29}function bI(a){return Math.round(255*(a<=.00304?12.92*a:1.055*Math.pow(a,1/2.4)-.055))}function bJ(a){return i(a,bP),a}function bQ(a){return function(){return bK(a,this)}}function bR(a){return function(){return bL(a,this)}}function bS(a,b){function c(){this.removeAttribute(a)}function d(){this.removeAttributeNS(a.space,a.local)}function e(){this.setAttribute(a,b)}function f(){this.setAttributeNS(a.space,a.local,b)}function g(){var c=b.apply(this,arguments);c==null?this.removeAttribute(a):this.setAttribute(a,c)}function h(){var c=b.apply(this,arguments);c==null?this.removeAttributeNS(a.space,a.local):this.setAttributeNS(a.space,a.local,c)}return a=d3.ns.qualify(a),b==null?a.local?d:c:typeof b=="function"?a.local?h:g:a.local?f:e}function bT(a){return new RegExp("(?:^|\\s+)"+d3.requote(a)+"(?:\\s+|$)","g")}function bU(a,b){function d(){var d=-1;while(++d0&&(a=a.substring(0,e)),b?g:f}function ca(a,b){for(var c=0,d=a.length;cb?q():(m.active=b,d.forEach(function(b,c){(c=c.call(a,n,h))&&j.push(c)}),e.start.call(a,n,h),p(f)||d3.timer(p,0,c),1)}function p(c){if(m.active!==b)return q();var d=(c-k)/l,g=f(d),i=j.length;while(i>0)j[--i].call(a,g);if(d>=1)return q(),ch=b,e.end.call(a,n,h),ch=0,1}function q(){return--m.count||delete a.__transition__,1}var j=[],k=a.delay,l=a.duration,m=(a=a.node).__transition__||(a.__transition__={active:0,count:0}),n=a.__data__;++m.count,k<=g?o(g):d3.timer(o,k,c)})},0,c),a}function co(a){var b=ch,c=cn,d=cl,e=cm;return ch=this.id,cn=this.ease(),ca(this,function(b,c,d){cl=b.delay,cm=b.duration,a.call(b=b.node,b.__data__,c,d)}),ch=b,cn=c,cl=d,cm=e,this}function cq(a,b,c){return c!=""&&cp}function cr(a,b){return d3.tween(a,bg(b))}function cv(){var a,b=Date.now(),c=cs;while(c)a=b-c.then,a>=c.delay&&(c.flush=c.callback(a)),c=c.next;var d=cw()-b;d>24?(isFinite(d)&&(clearTimeout(cu),cu=setTimeout(cv,d)),ct=0):(ct=1,cx(cv))}function cw(){var a=null,b=cs,c=Infinity;while(b)b.flush?b=a?a.next=b.next:cs=b.next:(c=Math.min(c,b.then+b.delay),b=(a=b).next);return c}function cz(a,b){var c=a.ownerSVGElement||a;if(c.createSVGPoint){var d=c.createSVGPoint();if(cy<0&&(window.scrollX||window.scrollY)){c=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var e=c[0][0].getScreenCTM();cy=!e.f&&!e.e,c.remove()}return cy?(d.x=b.pageX,d.y=b.pageY):(d.x=b.clientX,d.y=b.clientY),d=d.matrixTransform(a.getScreenCTM().inverse()),[d.x,d.y]}var f=a.getBoundingClientRect();return[b.clientX-f.left-a.clientLeft,b.clientY-f.top-a.clientTop]}function cA(){}function cB(a){var b=a[0],c=a[a.length-1];return b2?cM:cL,i=d?bi:bh;return e=g(a,b,i,c),f=g(b,a,i,d3.interpolate),h}function h(a){return e(a)}var e,f;return h.invert=function(a){return f(a)},h.domain=function(b){return arguments.length?(a=b.map(Number),g()):a},h.range=function(a){return arguments.length?(b=a,g()):b},h.rangeRound=function(a){return h.range(a).interpolate(d3.interpolateRound)},h.clamp=function(a){return arguments.length?(d=a,g()):d},h.interpolate=function(a){return arguments.length?(c=a,g()):c},h.ticks=function(b){return cJ(a,b)},h.tickFormat=function(b){return cK(a,b)},h.nice=function(){return cD(a,cH),g()},h.copy=function(){return cF(a,b,c,d)},g()}function cG(a,b){return d3.rebind(a,b,"range","rangeRound","interpolate","clamp")}function cH(a){return a=Math.pow(10,Math.round(Math.log(a)/Math.LN10)-1),a&&{floor:function(b){return Math.floor(b/a)*a},ceil:function(b){return Math.ceil(b/a)*a}}}function cI(a,b){var c=cB(a),d=c[1]-c[0],e=Math.pow(10,Math.floor(Math.log(d/b)/Math.LN10)),f=b/d*e;return f<=.15?e*=10:f<=.35?e*=5:f<=.75&&(e*=2),c[0]=Math.ceil(c[0]/e)*e,c[1]=Math.floor(c[1]/e)*e+e*.5,c[2]=e,c}function cJ(a,b){return d3.range.apply(d3,cI(a,b))}function cK(a,b){return d3.format(",."+Math.max(0,-Math.floor(Math.log(cI(a,b)[2])/Math.LN10+.01))+"f")}function cL(a,b,c,d){var e=c(a[0],a[1]),f=d(b[0],b[1]);return function(a){return f(e(a))}}function cM(a,b,c,d){var e=[],f=[],g=0,h=Math.min(a.length,b.length)-1;a[h]0;j--)e.push(c(f)*j)}else{for(;fi;g--);e=e.slice(f,g)}return e},d.tickFormat=function(a,e){arguments.length<2&&(e=cO);if(arguments.length<1)return e;var f=Math.max(.1,a/d.ticks().length),g=b===cQ?(h=-1e-12,Math.floor):(h=1e-12,Math.ceil),h;return function(a){return a/c(g(b(a)+h))<=f?e(a):""}},d.copy=function(){return cN(a.copy(),b)},cG(d,a)}function cP(a){return Math.log(a<0?0:a)/Math.LN10}function cQ(a){return-Math.log(a>0?0:-a)/Math.LN10}function cR(a,b){function e(b){return a(c(b))}var c=cS(b),d=cS(1/b);return e.invert=function(b){return d(a.invert(b))},e.domain=function(b){return arguments.length?(a.domain(b.map(c)),e):a.domain().map(d)},e.ticks=function(a){return cJ(e.domain(),a)},e.tickFormat=function(a){return cK(e.domain(),a)},e.nice=function(){return e.domain(cD(e.domain(),cH))},e.exponent=function(a){if(!arguments.length)return b;var f=e.domain();return c=cS(b=a),d=cS(1/b),e.domain(f)},e.copy=function(){return cR(a.copy(),b)},cG(e,a)}function cS(a){return function(b){return b<0?-Math.pow(-b,a):Math.pow(b,a)}}function cT(a,b){function f(b){return d[((c.get(b)||c.set(b,a.push(b)))-1)%d.length]}function g(b,c){return d3.range(a.length).map(function(a){return b+c*a})}var c,d,e;return f.domain=function(d){if(!arguments.length)return a;a=[],c=new j;var e=-1,g=d.length,h;while(++e1){h=b[1],f=a[i],i++,d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(var j=2;j9&&(f=c*3/Math.sqrt(f),g[h]=f*d,g[h+1]=f*e));h=-1;while(++h<=i)f=(a[Math.min(i,h+1)][0]-a[Math.max(0,h-1)][0])/(6*(1+g[h]*g[h])),b.push([f||0,g[h]*f||0]);return b}function dG(a){return a.length<3?dk(a):a[0]+ds(a,dF(a))}function dH(a){var b,c=-1,d=a.length,e,f;while(++c1){var d=cB(a.domain()),e,f=-1,g=b.length,h=(b[1]-b[0])/++c,i,j;while(++f0;)(j=+b[f]-i*h)>=d[0]&&e.push(j);for(--f,i=0;++id&&(c=b,d=e);return c}function ex(a){return a.reduce(ey,0)}function ey(a,b){return a+b[1]}function ez(a,b){return eA(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function eA(a,b){var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];while(++c<=b)f[c]=e*c+d;return f}function eB(a){return[d3.min(a),d3.max(a)]}function eC(a,b){return d3.rebind(a,b,"sort","children","value"),a.links=eG,a.nodes=function(b){return eH=!0,(a.nodes=a)(b)},a}function eD(a){return a.children}function eE(a){return a.value}function eF(a,b){return b.value-a.value}function eG(a){return d3.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function eI(a,b){return a.value-b.value}function eJ(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function eK(a,b){a._pack_next=b,b._pack_prev=a}function eL(a,b){var c=b.x-a.x,d=b.y-a.y,e=a.r+b.r;return e*e-c*c-d*d>.001}function eM(a){function n(a){c=Math.min(a.x-a.r,c),d=Math.max(a.x+a.r,d),e=Math.min(a.y-a.r,e),f=Math.max(a.y+a.r,f)}if(!(b=a.children)||!(m=b.length))return;var b,c=Infinity,d=-Infinity,e=Infinity,f=-Infinity,g,h,i,j,k,l,m;b.forEach(eN),g=b[0],g.x=-g.r,g.y=0,n(g);if(m>1){h=b[1],h.x=h.r,h.y=0,n(h);if(m>2){i=b[2],eQ(g,h,i),n(i),eJ(g,i),g._pack_prev=i,eJ(i,h),h=g._pack_next;for(j=3;j0&&(a=d)}return a}function eZ(a,b){return a.x-b.x}function e$(a,b){return b.x-a.x}function e_(a,b){return a.depth-b.depth}function fa(a,b){function c(a,d){var e=a.children;if(e&&(i=e.length)){var f,g=null,h=-1,i;while(++h=0)f=d[e]._tree,f.prelim+=b,f.mod+=b,b+=f.shift+(c+=f.change)}function fc(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function fd(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function fe(a){return{x:a.x,y:a.y,dx:a.dx,dy:a.dy}}function ff(a,b){var c=a.x+b[3],d=a.y+b[0],e=a.dx-b[1]-b[3],f=a.dy-b[0]-b[2];return e<0&&(c+=e/2,e=0),f<0&&(d+=f/2,f=0),{x:c,y:d,dx:e,dy:f}}function fg(a,b){function f(a,c){d3.text(a,b,function(a){c(a&&f.parse(a))})}function g(b){return b.map(h).join(a)}function h(a){return d.test(a)?'"'+a.replace(/\"/g,'""')+'"':a}var c=new RegExp("\r\n|["+a+"\r\n]","g"),d=new RegExp('["'+a+"\n]"),e=a.charCodeAt(0);return f.parse=function(a){var b;return f.parseRows(a,function(a,c){if(c){var d={},e=-1,f=b.length;while(++e=a.length)return f;if(j)return j=!1,d;var b=c.lastIndex;if(a.charCodeAt(b)===34){var g=b;while(g++0}function fC(a,b,c){return(c[0]-b[0])*(a[1]-b[1])<(c[1]-b[1])*(a[0]-b[0])}function fD(a,b,c,d){var e=a[0],f=b[0],g=c[0],h=d[0],i=a[1],j=b[1],k=c[1],l=d[1],m=e-g,n=f-e,o=h-g,p=i-k,q=j-i,r=l-k,s=(o*p-r*m)/(r*n-o*q);return[e+s*n,i+s*q]}function fF(a,b){var c={list:a.map(function(a,b){return{index:b,x:a[0],y:a[1]}}).sort(function(a,b){return a.yb.y?1:a.xb.x?1:0}),bottomSite:null},d={list:[],leftEnd:null,rightEnd:null,init:function(){d.leftEnd=d.createHalfEdge(null,"l"),d.rightEnd=d.createHalfEdge(null,"l"),d.leftEnd.r=d.rightEnd,d.rightEnd.l=d.leftEnd,d.list.unshift(d.leftEnd,d.rightEnd)},createHalfEdge:function(a,b){return{edge:a,side:b,vertex:null,l:null,r:null}},insert:function(a,b){b.l=a,b.r=a.r,a.r.l=b,a.r=b},leftBound:function(a){var b=d.leftEnd;do b=b.r;while(b!=d.rightEnd&&e.rightOf(b,a));return b=b.l,b},del:function(a){a.l.r=a.r,a.r.l=a.l,a.edge=null},right:function(a){return a.r},left:function(a){return a.l},leftRegion:function(a){return a.edge==null?c.bottomSite:a.edge.region[a.side]},rightRegion:function(a){return a.edge==null?c.bottomSite:a.edge.region[fE[a.side]]}},e={bisect:function(a,b){var c={region:{l:a,r:b},ep:{l:null,r:null}},d=b.x-a.x,e=b.y-a.y,f=d>0?d:-d,g=e>0?e:-e;return c.c=a.x*d+a.y*e+(d*d+e*e)*.5,f>g?(c.a=1,c.b=e/d,c.c/=d):(c.b=1,c.a=d/e,c.c/=e),c},intersect:function(a,b){var c=a.edge,d=b.edge;if(!c||!d||c.region.r==d.region.r)return null;var e=c.a*d.b-c.b*d.a;if(Math.abs(e)<1e-10)return null;var f=(c.c*d.b-d.c*c.b)/e,g=(d.c*c.a-c.c*d.a)/e,h=c.region.r,i=d.region.r,j,k;h.y=k.region.r.x;return l&&j.side==="l"||!l&&j.side==="r"?null:{x:f,y:g}},rightOf:function(a,b){var c=a.edge,d=c.region.r,e=b.x>d.x;if(e&&a.side==="l")return 1;if(!e&&a.side==="r")return 0;if(c.a===1){var f=b.y-d.y,g=b.x-d.x,h=0,i=0;!e&&c.b<0||e&&c.b>=0?i=h=f>=c.b*g:(i=b.x+b.y*c.b>c.c,c.b<0&&(i=!i),i||(h=1));if(!h){var j=d.x-c.region.l.x;i=c.b*(g*g-f*f)m*m+n*n}return a.side==="l"?i:!i},endPoint:function(a,c,d){a.ep[c]=d;if(!a.ep[fE[c]])return;b(a)},distance:function(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}},f={list:[],insert:function(a,b,c){a.vertex=b,a.ystar=b.y+c;for(var d=0,e=f.list,g=e.length;dh.ystar||a.ystar==h.ystar&&b.x>h.vertex.x)continue;break}e.splice(d,0,a)},del:function(a){for(var b=0,c=f.list,d=c.length;bo.y&&(p=n,n=o,o=p,t="r"),s=e.bisect(n,o),m=d.createHalfEdge(s,t),d.insert(k,m),e.endPoint(s,fE[t],r),q=e.intersect(k,m),q&&(f.del(k),f.insert(k,q,e.distance(q,n))),q=e.intersect(m,l),q&&f.insert(m,q,e.distance(q,n));else break}for(i=d.right(d.leftEnd);i!=d.rightEnd;i=d.right(i))b(i.edge)}function fG(){return{leaf:!0,nodes:[],point:null}}function fH(a,b,c,d,e,f){if(!a(b,c,d,e,f)){var g=(c+e)*.5,h=(d+f)*.5,i=b.nodes;i[0]&&fH(a,i[0],c,d,g,h),i[1]&&fH(a,i[1],g,d,e,h),i[2]&&fH(a,i[2],c,h,g,f),i[3]&&fH(a,i[3],g,h,e,f)}}function fI(a){return{x:a[0],y:a[1]}}function fL(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function fU(a){return a.substring(0,3)}function fV(a,b,c,d){var e,f,g=0,h=b.length,i=c.length;while(g=i)return-1;e=b.charCodeAt(g++);if(e==37){f=gh[b.charAt(g++)];if(!f||(d=f(a,c,d))<0)return-1}else if(e!=c.charCodeAt(d++))return-1}return d}function fW(a){return new RegExp("^(?:"+a.map(d3.requote).join("|")+")","i")}function fX(a){var b=new j,c=-1,d=a.length;while(++c68?1900:2e3)}function gs(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.m=d[0]-1,c+=d[0].length):-1}function gt(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.d=+d[0],c+=d[0].length):-1}function gu(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.H=+d[0],c+=d[0].length):-1}function gv(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.M=+d[0],c+=d[0].length):-1}function gw(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.S=+d[0],c+=d[0].length):-1}function gx(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+3));return d?(a.L=+d[0],c+=d[0].length):-1}function gz(a,b,c){var d=gA.get(b.substring(c,c+=2).toLowerCase());return d==null?-1:(a.p=d,c)}function gB(a){var b=a.getTimezoneOffset(),c=b>0?"-":"+",d=~~(Math.abs(b)/60),e=Math.abs(b)%60;return c+fY(d)+fY(e)}function gD(a){return a.toISOString()}function gE(a,b,c){function d(b){var c=a(b),d=f(c,1);return b-c1)while(gb?1:a>=b?0:NaN},d3.descending=function(a,b){return ba?1:b>=a?0:NaN},d3.mean=function(a,b){var c=a.length,d,e=0,f=-1,g=0;if(arguments.length===1)while(++f1&&(a=a.map(b)),a=a.filter(r),a.length?d3.quantile(a.sort(d3.ascending),.5):undefined},d3.min=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++cf&&(e=f)}else{while(++cf&&(e=f)}return e},d3.max=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++ce&&(e=f)}else{while(++ce&&(e=f)}return e},d3.extent=function(a,b){var c=-1,d=a.length,e,f,g;if(arguments.length===1){while(++cf&&(e=f),gf&&(e=f),g1);return a+b*c*Math.sqrt(-2*Math.log(e)/e)}},logNormal:function(a,b){var c=arguments.length;c<2&&(b=1),c<1&&(a=0);var d=d3.random.normal();return function(){return Math.exp(a+b*d())}},irwinHall:function(a){return function(){for(var b=0,c=0;c>>1;a.call(b,b[f],f)>>1;c0&&(e=f);return e},d3.last=function(a,b){var c=0,d=a.length,e=a[0],f;arguments.length===1&&(b=d3.ascending);while(++c=b.length)return e?e.call(a,c):d?c.sort(d):c;var h=-1,i=c.length,k=b[g++],l,m,n=new j,o,p={};while(++h=b.length)return a;var e=[],f=c[d++],h;for(h in a)e.push({key:h,values:g(a[h],d)});return f&&e.sort(function(a,b){return f(a.key,b.key)}),e}var a={},b=[],c=[],d,e;return a.map=function(a){return f(a,0)},a.entries=function(a){return g(f(a,0),0)},a.key=function(c){return b.push(c),a},a.sortKeys=function(d){return c[b.length-1]=d,a},a.sortValues=function(b){return d=b,a},a.rollup=function(b){return e=b,a},a},d3.keys=function(a){var b=[];for(var c in a)b.push(c);return b},d3.values=function(a){var b=[];for(var c in a)b.push(a[c]);return b},d3.entries=function(a){var b=[];for(var c in a)b.push({key:c,value:a[c]});return b},d3.permute=function(a,b){var c=[],d=-1,e=b.length;while(++db)d.push(g/e);else while((g=a+c*++f)=200&&a<300||a===304?d:null)}},d.send(null)},d3.text=function(a,b,c){function d(a){c(a&&a.responseText)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)},d3.json=function(a,b){d3.text(a,"application/json",function(a){b(a?JSON.parse(a):null)})},d3.html=function(a,b){d3.text(a,"text/html",function(a){if(a!=null){var c=document.createRange();c.selectNode(document.body),a=c.createContextualFragment(a)}b(a)})},d3.xml=function(a,b,c){function d(a){c(a&&a.responseXML)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)};var y={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:y,qualify:function(a){var b=a.indexOf(":"),c=a;return b>=0&&(c=a.substring(0,b),a=a.substring(b+1)),y.hasOwnProperty(c)?{space:y[c],local:a}:a}},d3.dispatch=function(){var a=new z,b=-1,c=arguments.length;while(++b0&&(d=a.substring(c+1),a=a.substring(0,c)),arguments.length<2?this[a].on(d):this[a].on(d,b)},d3.format=function(a){var b=B.exec(a),c=b[1]||" ",d=b[3]||"",e=b[5],f=+b[6],g=b[7],h=b[8],i=b[9],j=1,k="",l=!1;h&&(h=+h.substring(1)),e&&(c="0",g&&(f-=Math.floor((f-1)/4)));switch(i){case"n":g=!0,i="g";break;case"%":j=100,k="%",i="f";break;case"p":j=100,k="%",i="r";break;case"d":l=!0,h=0;break;case"s":j=-1,i="r"}return i=="r"&&!h&&(i="g"),i=C.get(i)||E,function(a){if(l&&a%1)return"";var b=a<0&&(a=-a)?"-":d;if(j<0){var m=d3.formatPrefix(a,h);a=m.scale(a),k=m.symbol}else a*=j;a=i(a,h);if(e){var n=a.length+b.length;n=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,C=d3.map({g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){return d3.round(a,b=D(a,b)).toFixed(Math.max(0,Math.min(20,b)))}}),G=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(H);d3.formatPrefix=function(a,b){var c=0;return a&&(a<0&&(a*=-1),b&&(a=d3.round(a,D(a,b))),c=1+Math.floor(1e-12+Math.log(a)/Math.LN10),c=Math.max(-24,Math.min(24,Math.floor((c<=0?c+1:c-1)/3)*3))),G[8+c/3]};var I=R(2),J=R(3),K=function(){return Q},L=d3.map({linear:K,poly:R,quad:function(){return I},cubic:function(){return J},sin:function(){return S},exp:function(){return T},circle:function(){return U},elastic:V,back:W,bounce:function(){return X}}),M=d3.map({"in":Q,out:O,"in-out":P,"out-in":function(a){return P(O(a))}});d3.ease=function(a){var b=a.indexOf("-"),c=b>=0?a.substring(0,b):a,d=b>=0?a.substring(b+1):"in";return c=L.get(c)||K,d=M.get(d)||Q,N(d(c.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(a){var b=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(a){b.setAttribute("transform",a);var c=b.transform.baseVal.consolidate();return new _(c?c.matrix:be)})(a)},_.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var bd=180/Math.PI,be={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(a,b){var c=d3.interpolators.length,d;while(--c>=0&&!(d=d3.interpolators[c](a,b)));return d},d3.interpolateNumber=function(a,b){return b-=a,function(c){return a+b*c}},d3.interpolateRound=function(a,b){return b-=a,function(c){return Math.round(a+b*c)}},d3.interpolateString=function(a,b){var c,d,e,f=0,g=0,h=[],i=[],j,k;bf.lastIndex=0;for(d=0;c=bf.exec(b);++d)c.index&&h.push(b.substring(f,g=c.index)),i.push({i:h.length,x:c[0]}),h.push(null),f=bf.lastIndex;f180?k+=360:k-j>180&&(j+=360),d.push({i:c.push(c.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(j,k)})):k&&c.push(c.pop()+"rotate("+k+")"),l!=m?d.push({i:c.push(c.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(l,m)}):m&&c.push(c.pop()+"skewX("+m+")"),n[0]!=o[0]||n[1]!=o[1]?(e=c.push(c.pop()+"scale(",null,",",null,")"),d.push({i:e-4,x:d3.interpolateNumber(n[0],o[0])},{i:e-2,x:d3.interpolateNumber(n[1],o[1])})):(o[0]!=1||o[1]!=1)&&c.push(c.pop()+"scale("+o+")"),e=d.length,function(a){var b=-1,f;while(++b180?f-=360:f<-180&&(f+=360),function(a){return bu(c+f*a,d+g*a,e+h*a)+""}},d3.interpolateLab=function(a,b){a=d3.lab(a),b=d3.lab(b);var c=a.l,d=a.a,e=a.b,f=b.l-c,g=b.a-d,h=b.b-e;return function(a){return bE(c+f*a,d+g*a,e+h*a)+""}},d3.interpolateHcl=function(a,b){a=d3.hcl(a),b=d3.hcl(b);var c=a.h,d=a.c,e=a.l,f=b.h-c,g=b.c-d,h=b.l-e;return f>180?f-=360:f<-180&&(f+=360),function(a){return bx(c+f*a,d+g*a,e+h*a)+""}},d3.interpolateArray=function(a,b){var c=[],d=[],e=a.length,f=b.length,g=Math.min(a.length,b.length),h;for(h=0;h=0;)if(f=c[d])e&&e!==f.nextSibling&&e.parentNode.insertBefore(f,e),e=f;return this},bP.sort=function(a){a=b$.apply(this,arguments);for(var b=-1,c=this.length;++b=db?e?"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"Z":e?"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L"+e*m+","+e*n+"A"+e+","+e+" 0 "+j+",0 "+e*k+","+e*l+"Z":"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L0,0"+"Z"}var a=dc,b=dd,c=de,d=df;return e.innerRadius=function(b){return arguments.length?(a=p(b),e):a},e.outerRadius=function(a){return arguments.length?(b=p(a),e):b},e.startAngle=function(a){return arguments.length?(c=p(a),e):c},e.endAngle=function(a){return arguments.length?(d=p(a),e):d},e.centroid=function(){var e=(a.apply(this,arguments)+b.apply(this,arguments))/2,f=(c.apply(this,arguments)+d.apply(this,arguments))/2+da;return[Math.cos(f)*e,Math.sin(f)*e]},e};var da=-Math.PI/2,db=2*Math.PI-1e-6;d3.svg.line=function(){return dg(m)};var dj=d3.map({linear:dk,"linear-closed":dl,"step-before":dm,"step-after":dn,basis:du,"basis-open":dv,"basis-closed":dw,bundle:dx,cardinal:dr,"cardinal-open":dp,"cardinal-closed":dq,monotone:dG});dj.forEach(function(a,b){b.key=a,b.closed=/-closed$/.test(a)});var dz=[0,2/3,1/3,0],dA=[0,1/3,2/3,0],dB=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var a=dg(dH);return a.radius=a.x,delete a.x,a.angle=a.y,delete a.y,a},dm.reverse=dn,dn.reverse=dm,d3.svg.area=function(){return dI(m)},d3.svg.area.radial=function(){var a=dI(dH);return a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1,a},d3.svg.chord=function(){function f(c,d){var e=g(this,a,c,d),f=g(this,b,c,d);return"M"+e.p0+i(e.r,e.p1,e.a1-e.a0)+(h(e,f)?j(e.r,e.p1,e.r,e.p0):j(e.r,e.p1,f.r,f.p0)+i(f.r,f.p1,f.a1-f.a0)+j(f.r,f.p1,e.r,e.p0))+"Z"}function g(a,b,f,g){var h=b.call(a,f,g),i=c.call(a,h,g),j=d.call(a,h,g)+da,k=e.call(a,h,g)+da;return{r:i,a0:j,a1:k,p0:[i*Math.cos(j),i*Math.sin(j)],p1:[i*Math.cos(k),i*Math.sin(k)]}}function h(a,b){return a.a0==b.a0&&a.a1==b.a1}function i(a,b,c){return"A"+a+","+a+" 0 "+ +(c>Math.PI)+",1 "+b}function j(a,b,c,d){return"Q 0,0 "+d}var a=dJ,b=dK,c=dL,d=de,e=df;return f.radius=function(a){return arguments.length?(c=p(a),f):c},f.source=function(b){return arguments.length?(a=p(b),f):a},f.target=function(a){return arguments.length?(b=p(a),f):b},f.startAngle=function(a){return arguments.length?(d=p(a),f):d},f.endAngle=function(a){return arguments.length?(e=p(a),f):e},f},d3.svg.diagonal=function(){function d(d,e){var f=a.call(this,d,e),g=b.call(this,d,e),h=(f.y+g.y)/2,i=[f,{x:f.x,y:h},{x:g.x,y:h},g];return i=i.map(c),"M"+i[0]+"C"+i[1]+" "+i[2]+" "+i[3]}var a=dJ,b=dK,c=dO;return d.source=function(b){return arguments.length?(a=p(b),d):a},d.target=function(a){return arguments.length?(b=p(a),d):b},d.projection=function(a){return arguments.length?(c=a,d):c},d},d3.svg.diagonal.radial=function(){var a=d3.svg.diagonal(),b=dO,c=a.projection;return a.projection=function(a){return arguments.length?c(dP(b=a)):b},a},d3.svg.mouse=d3.mouse,d3.svg.touches=d3.touches,d3.svg.symbol=function(){function c(c,d){return(dT.get(a.call(this,c,d))||dS)(b.call(this,c,d))}var a=dR,b=dQ;return c.type=function(b){return arguments.length?(a=p(b),c):a},c.size=function(a){return arguments.length?(b=p(a),c):b},c};var dT=d3.map({circle:dS,cross:function(a){var b=Math.sqrt(a/5)/2;return"M"+ -3*b+","+ -b+"H"+ -b+"V"+ -3*b+"H"+b+"V"+ -b+"H"+3*b+"V"+b+"H"+b+"V"+3*b+"H"+ -b+"V"+b+"H"+ -3*b+"Z"},diamond:function(a){var b=Math.sqrt(a/(2*dV)),c=b*dV;return"M0,"+ -b+"L"+c+",0"+" 0,"+b+" "+ -c+",0"+"Z"},square:function(a){var b=Math.sqrt(a)/2;return"M"+ -b+","+ -b+"L"+b+","+ -b+" "+b+","+b+" "+ -b+","+b+"Z"},"triangle-down":function(a){var b=Math.sqrt(a/dU),c=b*dU/2;return"M0,"+c+"L"+b+","+ -c+" "+ -b+","+ -c+"Z"},"triangle-up":function(a){var b=Math.sqrt(a/dU),c=b*dU/2;return"M0,"+ -c+"L"+b+","+c+" "+ -b+","+c+"Z"}});d3.svg.symbolTypes=dT.keys();var dU=Math.sqrt(3),dV=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function k(k){k.each(function(){var k=d3.select(this),l=h==null?a.ticks?a.ticks.apply(a,g):a.domain():h,m=i==null?a.tickFormat?a.tickFormat.apply(a,g):String:i,n=dY(a,l,j),o=k.selectAll(".minor").data(n,String),p=o.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),q=d3.transition(o.exit()).style("opacity",1e-6).remove(),r=d3.transition(o).style("opacity",1),s=k.selectAll("g").data(l,String),t=s.enter().insert("g","path").style("opacity",1e-6),u=d3.transition(s.exit()).style("opacity",1e-6).remove(),v=d3.transition(s).style("opacity",1),w,x=cC(a),y=k.selectAll(".domain").data([0]),z=y.enter().append("path").attr("class","domain"),A=d3.transition(y),B=a.copy(),C=this.__chart__||B;this.__chart__=B,t.append("line").attr("class","tick"),t.append("text");var D=t.select("line"),E=v.select("line"),F=s.select("text").text(m),G=t.select("text"),H=v.select("text");switch(b){case"bottom":w=dW,p.attr("y2",d),r.attr("x2",0).attr("y2",d),D.attr("y2",c),G.attr("y",Math.max(c,0)+f),E.attr("x2",0).attr("y2",c),H.attr("x",0).attr("y",Math.max(c,0)+f),F.attr("dy",".71em").attr("text-anchor","middle"),A.attr("d","M"+x[0]+","+e+"V0H"+x[1]+"V"+e);break;case"top":w=dW,p.attr("y2",-d),r.attr("x2",0).attr("y2",-d),D.attr("y2",-c),G.attr("y",-(Math.max(c,0)+f)),E.attr("x2",0).attr("y2",-c),H.attr("x",0).attr("y",-(Math.max(c,0)+f)),F.attr("dy","0em").attr("text-anchor","middle"),A.attr("d","M"+x[0]+","+ -e+"V0H"+x[1]+"V"+ -e);break;case"left":w=dX,p.attr("x2",-d),r.attr("x2",-d).attr("y2",0),D.attr("x2",-c),G.attr("x",-(Math.max(c,0)+f)),E.attr("x2",-c).attr("y2",0),H.attr("x",-(Math.max(c,0)+f)).attr("y",0),F.attr("dy",".32em").attr("text-anchor","end"),A.attr("d","M"+ -e+","+x[0]+"H0V"+x[1]+"H"+ -e);break;case"right":w=dX,p.attr("x2",d),r.attr("x2",d).attr("y2",0),D.attr("x2",c),G.attr("x",Math.max(c,0)+f),E.attr("x2",c).attr("y2",0),H.attr("x",Math.max(c,0)+f).attr("y",0),F.attr("dy",".32em").attr("text-anchor","start"),A.attr("d","M"+e+","+x[0]+"H0V"+x[1]+"H"+e)}if(a.ticks)t.call(w,C),v.call(w,B),u.call(w,B),p.call(w,C),r.call(w,B),q.call(w,B);else{var I=B.rangeBand()/2,J=function(a){return B(a)+I};t.call(w,J),v.call(w,J)}})}var a=d3.scale.linear(),b="bottom",c=6,d=6,e=6,f=3,g=[10],h=null,i,j=0;return k.scale=function(b){return arguments.length?(a=b,k):a},k.orient=function(a){return arguments.length?(b=a,k):b},k.ticks=function(){return arguments.length?(g=arguments,k):g},k.tickValues=function(a){return arguments.length?(h=a,k):h},k.tickFormat=function(a){return arguments.length?(i=a,k):i},k.tickSize=function(a,b,f){if(!arguments.length)return c;var g=arguments.length-1;return c=+a,d=g>1?+b:c,e=g>0?+arguments[g]:c,k},k.tickPadding=function(a){return arguments.length?(f=+a,k):f},k.tickSubdivide=function(a){return arguments.length?(j=+a,k):j},k},d3.svg.brush=function(){function g(a){a.each(function(){var a=d3.select(this),e=a.selectAll(".background").data([0]),f=a.selectAll(".extent").data([0]),l=a.selectAll(".resize").data(d,String),m;a.style("pointer-events","all").on("mousedown.brush",k).on("touchstart.brush",k),e.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.enter().append("rect").attr("class","extent").style("cursor","move"),l.enter().append("g").attr("class",function(a){return"resize "+a}).style("cursor",function(a){return dZ[a]}).append("rect").attr("x",function(a){return/[ew]$/.test(a)?-3:null}).attr("y",function(a){return/^[ns]/.test(a)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),l.style("display",g.empty()?"none":null),l.exit().remove(),b&&(m=cC(b),e.attr("x",m[0]).attr("width",m[1]-m[0]),i(a)),c&&(m=cC(c),e.attr("y",m[0]).attr("height",m[1]-m[0]),j(a)),h(a)})}function h(a){a.selectAll(".resize").attr("transform",function(a){return"translate("+e[+/e$/.test(a)][0]+","+e[+/^s/.test(a)][1]+")"})}function i(a){a.select(".extent").attr("x",e[0][0]),a.selectAll(".extent,.n>rect,.s>rect").attr("width",e[1][0]-e[0][0])}function j(a){a.select(".extent").attr("y",e[0][1]),a.selectAll(".extent,.e>rect,.w>rect").attr("height",e[1][1]-e[0][1])}function k(){function x(){var a=d3.event.changedTouches;return a?d3.touches(d,a)[0]:d3.mouse(d)}function y(){d3.event.keyCode==32&&(q||(r=null,s[0]-=e[1][0],s[1]-=e[1][1],q=2),Y())}function z(){d3.event.keyCode==32&&q==2&&(s[0]+=e[1][0],s[1]+=e[1][1],q=0,Y())}function A(){var a=x(),d=!1;t&&(a[0]+=t[0],a[1]+=t[1]),q||(d3.event.altKey?(r||(r=[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]),s[0]=e[+(a[0]0?e=c:e=0:c>0&&(b.start({type:"start",alpha:e=c}),d3.timer(a.tick)),a):e},a.start=function(){function p(a,c){var d=t(b),e=-1,f=d.length,g;while(++ee&&(e=h),d.push(h)}for(g=0;g0){f=-1;while(++f=i[0]&&o<=i[1]&&(k=g[d3.bisect(j,o,1,m)-1],k.y+=n,k.push(e[f]))}return g}var a=!0,b=Number,c=eB,d=ez;return e.value=function(a){return arguments.length?(b=a,e):b},e.range=function(a){return arguments.length?(c=p(a),e):c},e.bins=function(a){return arguments.length?(d=typeof a=="number"?function(b){return eA(b,a)}:p(a),e):d},e.frequency=function(b){return arguments.length?(a=!!b,e):a},e},d3.layout.hierarchy=function(){function d(e,g,h){var i=b.call(f,e,g),j=eH?e:{data:e};j.depth=g,h.push(j);if(i&&(l=i.length)){var k=-1,l,m=j.children=[],n=0,o=g+1,p;while(++k0){var k=b*j/2;fa(g,function(a){a.r+=k}),fa(g,eM),fa(g,function(a){a.r-=k}),j=Math.max(2*g.r/h,2*g.r/i)}return eP(g,h/2,i/2,1/j),f}var a=d3.layout.hierarchy().sort(eI),b=0,c=[1,1];return d.size=function(a){return arguments.length?(c=a,d):c},d.padding=function(a){return arguments.length?(b=+a,d):b},eC(d,a)},d3.layout.cluster=function(){function d(d,e){var f=a.call(this,d,e),g=f[0],h,i=0,j,k;fa(g,function(a){var c=a.children;c&&c.length?(a.x=eS(c),a.y=eR(c)):(a.x=h?i+=b(a,h):0,a.y=0,h=a)});var l=eT(g),m=eU(g),n=l.x-b(l,m)/2,o=m.x+b(m,l)/2;return fa(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=(1-(g.y?a.y/g.y:1))*c[1]}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=eV,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},eC(d,a)},d3.layout.tree=function(){function d(d,e){function h(a,c){var d=a.children,e=a._tree;if(d&&(f=d.length)){var f,g=d[0],i,k=g,l,m=-1;while(++m0&&(fc(fd(g,a,d),a,m),i+=m,j+=m),k+=g._tree.mod,i+=e._tree.mod,l+=h._tree.mod,j+=f._tree.mod;g&&!eX(f)&&(f._tree.thread=g,f._tree.mod+=k-j),e&&!eW(h)&&(h._tree.thread=e,h._tree.mod+=i-l,d=a)}return d}var f=a.call(this,d,e),g=f[0];fa(g,function(a,b){a._tree={ancestor:a,prelim:0,mod:0,change:0,shift:0,number:b?b._tree.number+1:0}}),h(g),i(g,-g._tree.prelim);var k=eY(g,e$),l=eY(g,eZ),m=eY(g,e_),n=k.x-b(k,l)/2,o=l.x+b(l,k)/2,p=m.depth||1;return fa(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=a.depth/p*c[1],delete a._tree}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=eV,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},eC(d,a)},d3.layout.treemap=function(){function i(a,b){var c=-1,d=a.length,e,f;while(++c0)d.push(g=f[o-1]),d.area+=g.area,(k=l(d,n))<=h?(f.pop(),h=k):(d.area-=d.pop().area,m(d,n,c,!1),n=Math.min(c.dx,c.dy),d.length=d.area=0,h=Infinity);d.length&&(m(d,n,c,!0),d.length=d.area=0),b.forEach(j)}}function k(a){var b=a.children;if(b&&b.length){var c=e(a),d=b.slice(),f,g=[];i(d,c.dx*c.dy/a.value),g.area=0;while(f=d.pop())g.push(f),g.area+=f.area,f.z!=null&&(m(g,f.z?c.dx:c.dy,c,!d.length),g.length=g.area=0);b.forEach(k)}}function l(a,b){var c=a.area,d,e=0,f=Infinity,g=-1,i=a.length;while(++ge&&(e=d)}return c*=c,b*=b,c?Math.max(b*e*h/c,c/(b*f*h)):Infinity}function m(a,c,d,e){var f=-1,g=a.length,h=d.x,i=d.y,j=c?b(a.area/c):0,k;if(c==d.dx){if(e||j>d.dy)j=d.dy;while(++fd.dx)j=d.dx;while(++f50?b:f<-140?c:g<21?d:a)(e)}var a=d3.geo.albers(),b=d3.geo.albers().origin([-160,60]).parallels([55,65]),c=d3.geo.albers().origin([-160,20]).parallels([8,18]),d=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(f){return arguments.length?(a.scale(f),b.scale(f*.6),c.scale(f),d.scale(f*1.5),e.translate(a.translate())):a.scale()},e.translate=function(f){if(!arguments.length)return a.translate();var g=a.scale()/1e3,h=f[0],i=f[1];return a.translate(f),b.translate([h-400*g,i+170*g]),c.translate([h-190*g,i+200*g]),d.translate([h+580*g,i+430*g]),e},e.scale(a.scale())},d3.geo.bonne=function(){function g(g){var h=g[0]*fh-c,i=g[1]*fh-d;if(e){var j=f+e-i,k=h*Math.cos(i)/j;h=j*Math.sin(k),i=j*Math.cos(k)-f}else h*=Math.cos(i),i*=-1;return[a*h+b[0],a*i+b[1]]}var a=200,b=[480,250],c,d,e,f;return g.invert=function(d){var g=(d[0]-b[0])/a,h=(d[1]-b[1])/a;if(e){var i=f+h,j=Math.sqrt(g*g+i*i);h=f+e-j,g=c+j*Math.atan2(g,i)/Math.cos(h)}else h*=-1,g/=Math.cos(h);return[g/fh,h/fh]},g.parallel=function(a){return arguments.length?(f=1/ -Math.tan(e=a*fh),g):e/fh},g.origin=function(a){return arguments.length?(c=a[0]*fh,d=a[1]*fh,g):[c/fh,d/fh]},g.scale=function(b){return arguments.length?(a=+b,g):a},g.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],g):b},g.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function c(c){var d=c[0]/360,e=-c[1]/360;return[a*d+b[0],a*e+b[1]]}var a=500,b=[480,250];return c.invert=function(c){var d=(c[0]-b[0])/a,e=(c[1]-b[1])/a;return[360*d,-360*e]},c.scale=function(b){return arguments.length?(a=+b,c):a},c.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],c):b},c},d3.geo.mercator=function(){function c(c){var d=c[0]/360,e=-(Math.log(Math.tan(Math.PI/4+c[1]*fh/2))/fh)/360;return[a*d+b[0],a*Math.max(-0.5,Math.min(.5,e))+b[1]]}var a=500,b=[480,250];return c.invert=function(c){var d=(c[0]-b[0])/a,e=(c[1]-b[1])/a;return[360*d,2*Math.atan(Math.exp(-360*e*fh))/fh-90]},c.scale=function(b){return arguments.length?(a=+b,c):a},c.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],c):b},c},d3.geo.path=function(){function e(c,e){typeof a=="function"&&(b=fj(a.apply(this,arguments))),g(c);var f=d.length?d.join(""):null;return d=[],f}function f(a){return c(a).join(",")}function i(a){var b=l(a[0]),c=0,d=a.length;while(++c0){d.push("M");while(++h0){d.push("M");while(++kd&&(d=a),fe&&(e=f)}),[[b,c],[d,e]]};var fl={Feature:fm,FeatureCollection:fn,GeometryCollection:fo,LineString:fp,MultiLineString:fq,MultiPoint:fp,MultiPolygon:fr,Point:fs,Polygon:ft};d3.geo.circle=function(){function e(){}function f(a){return d.distance(a)=k*k+l*l?d[f].index=-1:(d[m].index=-1,o=d[f].angle,m=f,n=g)):(o=d[f].angle,m=f,n=g);e.push(h);for(f=0,g=0;f<2;++g)d[g].index!==-1&&(e.push(d[g].index),f++);p=e.length;for(;g=0?(c=a.ep.r,d=a.ep.l):(c=a.ep.l,d=a.ep.r),a.a===1?(g=c?c.y:-1e6,e=a.c-a.b*g,h=d?d.y:1e6,f=a.c-a.b*h):(e=c?c.x:-1e6,g=a.c-a.a*e,f=d?d.x:1e6,h=a.c-a.a*f);var i=[e,g],j=[f,h];b[a.region.l.index].push(i,j),b[a.region.r.index].push(i,j)}),b.map(function(b,c){var d=a[c][0],e=a[c][1];return b.forEach(function(a){a.angle=Math.atan2(a[0]-d,a[1]-e)}),b.sort(function(a,b){return a.angle-b.angle}).filter(function(a,c){return!c||a.angle-b[c-1].angle>1e-10})})};var fE={l:"r",r:"l"};d3.geom.delaunay=function(a){var b=a.map(function(){return[]}),c=[];return fF(a,function(c){b[c.region.l.index].push(a[c.region.r.index])}),b.forEach(function(b,d){var e=a[d],f=e[0],g=e[1];b.forEach(function(a){a.angle=Math.atan2(a[0]-f,a[1]-g)}),b.sort(function(a,b){return a.angle-b.angle});for(var h=0,i=b.length-1;h=g,j=b.y>=h,l=(j<<1)+i;a.leaf=!1,a=a.nodes[l]||(a.nodes[l]=fG()),i?c=g:e=g,j?d=h:f=h,k(a,b,c,d,e,f)}var f,g=-1,h=a.length;h&&isNaN(a[0].x)&&(a=a.map(fI));if(arguments.length<5)if(arguments.length===3)e=d=c,c=b;else{b=c=Infinity,d=e=-Infinity;while(++gd&&(d=f.x),f.y>e&&(e=f.y);var i=d-b,j=e-c;i>j?e=c+i:d=b+j}var m=fG();return m.add=function(a){k(m,a,b,c,d,e)},m.visit=function(a){fH(a,m,b,c,d,e)},a.forEach(m.add),m},d3.time={};var fJ=Date,fK=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];fL.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){fM.setUTCDate.apply(this._,arguments)},setDay:function(){fM.setUTCDay.apply(this._,arguments)},setFullYear:function(){fM.setUTCFullYear.apply(this._,arguments)},setHours:function(){fM.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){fM.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){fM.setUTCMinutes.apply(this._,arguments)},setMonth:function(){fM.setUTCMonth.apply(this._,arguments)},setSeconds:function(){fM.setUTCSeconds.apply(this._,arguments)},setTime:function(){fM.setTime.apply(this._,arguments)}};var fM=Date.prototype,fN="%a %b %e %H:%M:%S %Y",fO="%m/%d/%y",fP="%H:%M:%S",fQ=fK,fR=fQ.map(fU),fS=["January","February","March","April","May","June","July","August","September","October","November","December"],fT=fS.map(fU);d3.time.format=function(a){function c(c){var d=[],e=-1,f=0,g,h;while(++e=12?"PM":"AM"},S:function(a){return fY(a.getSeconds())},U:function(a){return fY(d3.time.sundayOfYear(a))},w:function(a){return a.getDay()},W:function(a){return fY(d3.time.mondayOfYear(a))},x:d3.time.format(fO),X:d3.time.format(fP),y:function(a){return fY(a.getFullYear()%100)},Y:function(a){return f$(a.getFullYear()%1e4)},Z:gB,"%":function(a){return"%"}},gh={a:gi,A:gj,b:gk,B:gl,c:gm,d:gt,e:gt,H:gu,I:gu,L:gx,m:gs,M:gv,p:gz,S:gw,x:gn,X:go,y:gq,Y:gp},gy=/^\s*\d+/,gA=d3.map({am:0,pm:1});d3.time.format.utc=function(a){function c(a){try{fJ=fL;var c=new fJ;return c._=a,b(c)}finally{fJ=Date}}var b=d3.time.format(a);return c.parse=function(a){try{fJ=fL;var c=b.parse(a);return c&&c._}finally{fJ=Date}},c.toString=b.toString,c};var gC=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?gD:gC,gD.parse=function(a){var b=new Date(a);return isNaN(b)?null:b},gD.toString=gC.toString,d3.time.second=gE(function(a){return new fJ(Math.floor(a/1e3)*1e3)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*1e3)},function(a){return a.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=gE(function(a){return new fJ(Math.floor(a/6e4)*6e4)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*6e4)},function(a){return a.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=gE(function(a){var b=a.getTimezoneOffset()/60;return new fJ((Math.floor(a/36e5-b)+b)*36e5)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*36e5)},function(a){return a.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=gE(function(a){var b=new fJ(0,a.getMonth(),a.getDate());return b.setFullYear(a.getFullYear()),b},function(a,b){a.setDate(a.getDate()+b)},function(a){return a.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(a){var b=d3.time.year(a);return Math.floor((a-b-(a.getTimezoneOffset()-b.getTimezoneOffset())*6e4)/864e5)},fK.forEach(function(a,b){a=a.toLowerCase(),b=7-b;var c=d3.time[a]=gE(function(a){return(a=d3.time.day(a)).setDate(a.getDate()-(a.getDay()+b)%7),a},function(a,b){a.setDate(a.getDate()+Math.floor(b)*7)},function(a){var c=d3.time.year(a).getDay();return Math.floor((d3.time.dayOfYear(a)+(c+b)%7)/7)-(c!==b)});d3.time[a+"s"]=c.range,d3.time[a+"s"].utc=c.utc.range,d3.time[a+"OfYear"]=function(a){var c=d3.time.year(a).getDay();return Math.floor((d3.time.dayOfYear(a)+(c+b)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=gE(function(a){return a=d3.time.day(a),a.setDate(1),a},function(a,b){a.setMonth(a.getMonth()+b)},function(a){return a.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=gE(function(a){return a=d3.time.day(a),a.setMonth(0,1),a},function(a,b){a.setFullYear(a.getFullYear()+b)},function(a){return a.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var gM=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],gN=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],gO=[[d3.time.format("%Y"),function(a){return!0}],[d3.time.format("%B"),function(a){return a.getMonth()}],[d3.time.format("%b %d"),function(a){return a.getDate()!=1}],[d3.time.format("%a %d"),function(a){return a.getDay()&&a.getDate()!=1}],[d3.time.format("%I %p"),function(a){return a.getHours()}],[d3.time.format("%I:%M"),function(a){return a.getMinutes()}],[d3.time.format(":%S"),function(a){return a.getSeconds()}],[d3.time.format(".%L"),function(a){return a.getMilliseconds()}]],gP=d3.scale.linear(),gQ=gJ(gO);gN.year=function(a,b){return gP.domain(a.map(gL)).ticks(b).map(gK)},d3.time.scale=function(){return gG(d3.scale.linear(),gN,gQ)};var gR=gN.map(function(a){return[a[0].utc,a[1]]}),gS=[[d3.time.format.utc("%Y"),function(a){return!0}],[d3.time.format.utc("%B"),function(a){return a.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(a){return a.getUTCDate()!=1}],[d3.time.format.utc("%a %d"),function(a){return a.getUTCDay()&&a.getUTCDate()!=1}],[d3.time.format.utc("%I %p"),function(a){return a.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(a){return a.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(a){return a.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(a){return a.getUTCMilliseconds()}]],gT=gJ(gS);gR.year=function(a,b){return gP.domain(a.map(gV)).ticks(b).map(gU)},d3.time.scale.utc=function(){return gG(d3.scale.linear(),gR,gT)}})(); diff --git a/pydashie/assets/javascripts/batman.js b/pydashie/assets/javascripts/batman.js deleted file mode 100644 index 03dfa3b..0000000 --- a/pydashie/assets/javascripts/batman.js +++ /dev/null @@ -1,12367 +0,0 @@ -(function() { - var Batman, - __slice = [].slice; - - Batman = function() { - var mixins; - mixins = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.Object, mixins, function(){}); - }; - - Batman.version = '0.13.0'; - - Batman.config = { - pathPrefix: '/', - viewPrefix: 'views', - fetchRemoteViews: true, - usePushState: false, - minificationErrors: true - }; - - (Batman.container = (function() { - return this; - })()).Batman = Batman; - - if (typeof define === 'function') { - define('batman', [], function() { - return Batman; - }); - } - - Batman.exportHelpers = function(onto) { - var k, _i, _len, _ref; - _ref = ['mixin', 'extend', 'unmixin', 'redirect', 'typeOf', 'redirect', 'setImmediate', 'clearImmediate']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - onto["$" + k] = Batman[k]; - } - return onto; - }; - - Batman.exportGlobals = function() { - return Batman.exportHelpers(Batman.container); - }; - -}).call(this); - -(function() { - var _implementImmediates, _objectToString, - __slice = [].slice, - __hasProp = {}.hasOwnProperty, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Batman.typeOf = function(object) { - if (typeof object === 'undefined') { - return "Undefined"; - } - return _objectToString.call(object).slice(8, -1); - }; - - _objectToString = Object.prototype.toString; - - Batman.extend = function() { - var key, object, objects, to, value, _i, _len; - to = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - for (_i = 0, _len = objects.length; _i < _len; _i++) { - object = objects[_i]; - for (key in object) { - value = object[key]; - to[key] = value; - } - } - return to; - }; - - Batman.mixin = function() { - var hasSet, key, mixin, mixins, to, value, _i, _len; - to = arguments[0], mixins = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - hasSet = typeof to.set === 'function'; - for (_i = 0, _len = mixins.length; _i < _len; _i++) { - mixin = mixins[_i]; - if (Batman.typeOf(mixin) !== 'Object') { - continue; - } - for (key in mixin) { - if (!__hasProp.call(mixin, key)) continue; - value = mixin[key]; - if (key === 'initialize' || key === 'uninitialize' || key === 'prototype') { - continue; - } - if (hasSet) { - to.set(key, value); - } else if (to.nodeName != null) { - Batman.data(to, key, value); - } else { - to[key] = value; - } - } - if (typeof mixin.initialize === 'function') { - mixin.initialize.call(to); - } - } - return to; - }; - - Batman.unmixin = function() { - var from, key, mixin, mixins, _i, _len; - from = arguments[0], mixins = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - for (_i = 0, _len = mixins.length; _i < _len; _i++) { - mixin = mixins[_i]; - for (key in mixin) { - if (key === 'initialize' || key === 'uninitialize') { - continue; - } - delete from[key]; - } - if (typeof mixin.uninitialize === 'function') { - mixin.uninitialize.call(from); - } - } - return from; - }; - - Batman._functionName = Batman.functionName = function(f) { - var _ref; - if (f.__name__) { - return f.__name__; - } - if (f.name) { - return f.name; - } - return (_ref = f.toString().match(/\W*function\s+([\w\$]+)\(/)) != null ? _ref[1] : void 0; - }; - - Batman._isChildOf = Batman.isChildOf = function(parentNode, childNode) { - var node; - node = childNode.parentNode; - while (node) { - if (node === parentNode) { - return true; - } - node = node.parentNode; - } - return false; - }; - - Batman.setImmediate = Batman.clearImmediate = null; - - _implementImmediates = function(container) { - var canUsePostMessage, count, functions, getHandle, handler, prefix, tasks; - canUsePostMessage = function() { - var async, oldMessage; - if (!container.postMessage) { - return false; - } - async = true; - oldMessage = container.onmessage; - container.onmessage = function() { - return async = false; - }; - container.postMessage("", "*"); - container.onmessage = oldMessage; - return async; - }; - tasks = new Batman.SimpleHash; - count = 0; - getHandle = function() { - return "go" + (++count); - }; - if (container.setImmediate) { - Batman.setImmediate = container.setImmediate; - Batman.clearImmediate = container.clearImmediate; - } else if (container.msSetImmediate) { - Batman.setImmediate = msSetImmediate; - Batman.clearImmediate = msClearImmediate; - } else if (canUsePostMessage()) { - prefix = 'com.batman.'; - functions = new Batman.SimpleHash; - handler = function(e) { - var handle, _base; - if (!~e.data.search(prefix)) { - return; - } - handle = e.data.substring(prefix.length); - return typeof (_base = tasks.unset(handle)) === "function" ? _base() : void 0; - }; - if (container.addEventListener) { - container.addEventListener('message', handler, false); - } else { - container.attachEvent('onmessage', handler); - } - Batman.setImmediate = function(f) { - var handle; - tasks.set(handle = getHandle(), f); - container.postMessage(prefix + handle, "*"); - return handle; - }; - Batman.clearImmediate = function(handle) { - return tasks.unset(handle); - }; - } else if (typeof document !== 'undefined' && __indexOf.call(document.createElement("script"), "onreadystatechange") >= 0) { - Batman.setImmediate = function(f) { - var handle, script; - handle = getHandle(); - script = document.createElement("script"); - script.onreadystatechange = function() { - var _base; - if (typeof (_base = tasks.get(handle)) === "function") { - _base(); - } - script.onreadystatechange = null; - script.parentNode.removeChild(script); - return script = null; - }; - document.documentElement.appendChild(script); - return handle; - }; - Batman.clearImmediate = function(handle) { - return tasks.unset(handle); - }; - } else if (typeof process !== "undefined" && process !== null ? process.nextTick : void 0) { - functions = {}; - Batman.setImmediate = function(f) { - var handle; - handle = getHandle(); - functions[handle] = f; - process.nextTick(function() { - if (typeof functions[handle] === "function") { - functions[handle](); - } - return delete functions[handle]; - }); - return handle; - }; - Batman.clearImmediate = function(handle) { - return delete functions[handle]; - }; - } else { - Batman.setImmediate = function(f) { - return setTimeout(f, 0); - }; - Batman.clearImmediate = function(handle) { - return clearTimeout(handle); - }; - } - Batman.setImmediate = Batman.setImmediate; - return Batman.clearImmediate = Batman.clearImmediate; - }; - - Batman.setImmediate = function() { - _implementImmediates(Batman.container); - return Batman.setImmediate.apply(this, arguments); - }; - - Batman.clearImmediate = function() { - _implementImmediates(Batman.container); - return Batman.clearImmediate.apply(this, arguments); - }; - - Batman.forEach = function(container, iterator, ctx) { - var e, i, k, v, _i, _len, _results, _results1; - if (container.forEach) { - return container.forEach(iterator, ctx); - } else if (container.indexOf) { - _results = []; - for (i = _i = 0, _len = container.length; _i < _len; i = ++_i) { - e = container[i]; - _results.push(iterator.call(ctx, e, i, container)); - } - return _results; - } else { - _results1 = []; - for (k in container) { - v = container[k]; - _results1.push(iterator.call(ctx, k, v, container)); - } - return _results1; - } - }; - - Batman.objectHasKey = function(object, key) { - if (typeof object.hasKey === 'function') { - return object.hasKey(key); - } else { - return key in object; - } - }; - - Batman.contains = function(container, item) { - if (container.indexOf) { - return __indexOf.call(container, item) >= 0; - } else if (typeof container.has === 'function') { - return container.has(item); - } else { - return Batman.objectHasKey(container, item); - } - }; - - Batman.get = function(base, key) { - if (typeof base.get === 'function') { - return base.get(key); - } else { - return Batman.Property.forBaseAndKey(base, key).getValue(); - } - }; - - Batman.getPath = function(base, segments) { - var segment, _i, _len; - for (_i = 0, _len = segments.length; _i < _len; _i++) { - segment = segments[_i]; - if (base != null) { - base = Batman.get(base, segment); - if (base == null) { - return base; - } - } else { - return void 0; - } - } - return base; - }; - - Batman.escapeHTML = (function() { - var replacements; - replacements = { - "&": "&", - "<": "<", - ">": ">", - "\"": """, - "'": "'" - }; - return function(s) { - return ("" + s).replace(/[&<>'"]/g, function(c) { - return replacements[c]; - }); - }; - })(); - - Batman.translate = function(x, values) { - if (values == null) { - values = {}; - } - return Batman.helpers.interpolate(Batman.get(Batman.translate.messages, x), values); - }; - - Batman.translate.messages = {}; - - Batman.t = function() { - return Batman.translate.apply(Batman, arguments); - }; - - Batman.redirect = function(url) { - var _ref; - return (_ref = Batman.navigator) != null ? _ref.redirect(url) : void 0; - }; - - Batman.initializeObject = function(object) { - if (object._batman != null) { - return object._batman.check(object); - } else { - return object._batman = new Batman._Batman(object); - } - }; - -}).call(this); - -(function() { - var __slice = [].slice, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Batman.Inflector = (function() { - - Inflector.prototype.plural = function(regex, replacement) { - return this._plural.unshift([regex, replacement]); - }; - - Inflector.prototype.singular = function(regex, replacement) { - return this._singular.unshift([regex, replacement]); - }; - - Inflector.prototype.human = function(regex, replacement) { - return this._human.unshift([regex, replacement]); - }; - - Inflector.prototype.uncountable = function() { - var strings; - strings = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return this._uncountable = this._uncountable.concat(strings.map(function(x) { - return new RegExp("" + x + "$", 'i'); - })); - }; - - Inflector.prototype.irregular = function(singular, plural) { - if (singular.charAt(0) === plural.charAt(0)) { - this.plural(new RegExp("(" + (singular.charAt(0)) + ")" + (singular.slice(1)) + "$", "i"), "$1" + plural.slice(1)); - this.plural(new RegExp("(" + (singular.charAt(0)) + ")" + (plural.slice(1)) + "$", "i"), "$1" + plural.slice(1)); - return this.singular(new RegExp("(" + (plural.charAt(0)) + ")" + (plural.slice(1)) + "$", "i"), "$1" + singular.slice(1)); - } else { - this.plural(new RegExp("" + singular + "$", 'i'), plural); - this.plural(new RegExp("" + plural + "$", 'i'), plural); - return this.singular(new RegExp("" + plural + "$", 'i'), singular); - } - }; - - function Inflector() { - this._plural = []; - this._singular = []; - this._uncountable = []; - this._human = []; - } - - Inflector.prototype.ordinalize = function(number) { - var absNumber, _ref; - absNumber = Math.abs(parseInt(number)); - if (_ref = absNumber % 100, __indexOf.call([11, 12, 13], _ref) >= 0) { - return number + "th"; - } else { - switch (absNumber % 10) { - case 1: - return number + "st"; - case 2: - return number + "nd"; - case 3: - return number + "rd"; - default: - return number + "th"; - } - } - }; - - Inflector.prototype.pluralize = function(word) { - var regex, replace_string, uncountableRegex, _i, _j, _len, _len1, _ref, _ref1, _ref2; - _ref = this._uncountable; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - uncountableRegex = _ref[_i]; - if (uncountableRegex.test(word)) { - return word; - } - } - _ref1 = this._plural; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - _ref2 = _ref1[_j], regex = _ref2[0], replace_string = _ref2[1]; - if (regex.test(word)) { - return word.replace(regex, replace_string); - } - } - return word; - }; - - Inflector.prototype.singularize = function(word) { - var regex, replace_string, uncountableRegex, _i, _j, _len, _len1, _ref, _ref1, _ref2; - _ref = this._uncountable; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - uncountableRegex = _ref[_i]; - if (uncountableRegex.test(word)) { - return word; - } - } - _ref1 = this._singular; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - _ref2 = _ref1[_j], regex = _ref2[0], replace_string = _ref2[1]; - if (regex.test(word)) { - return word.replace(regex, replace_string); - } - } - return word; - }; - - Inflector.prototype.humanize = function(word) { - var regex, replace_string, _i, _len, _ref, _ref1; - _ref = this._human; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], regex = _ref1[0], replace_string = _ref1[1]; - if (regex.test(word)) { - return word.replace(regex, replace_string); - } - } - return word; - }; - - return Inflector; - - })(); - -}).call(this); - -(function() { - var Inflector, camelize_rx, capitalize_rx, humanize_rx1, humanize_rx2, humanize_rx3, underscore_rx1, underscore_rx2; - - camelize_rx = /(?:^|_|\-)(.)/g; - - capitalize_rx = /(^|\s)([a-z])/g; - - underscore_rx1 = /([A-Z]+)([A-Z][a-z])/g; - - underscore_rx2 = /([a-z\d])([A-Z])/g; - - humanize_rx1 = /_id$/; - - humanize_rx2 = /_|-/g; - - humanize_rx3 = /^\w/g; - - Batman.helpers = { - ordinalize: function() { - return Batman.helpers.inflector.ordinalize.apply(Batman.helpers.inflector, arguments); - }, - singularize: function() { - return Batman.helpers.inflector.singularize.apply(Batman.helpers.inflector, arguments); - }, - pluralize: function(count, singular, plural, includeCount) { - var result; - if (includeCount == null) { - includeCount = true; - } - if (arguments.length < 2) { - return Batman.helpers.inflector.pluralize(count); - } else { - result = +count === 1 ? singular : plural || Batman.helpers.inflector.pluralize(singular); - if (includeCount) { - result = ("" + (count || 0) + " ") + result; - } - return result; - } - }, - camelize: function(string, firstLetterLower) { - string = string.replace(camelize_rx, function(str, p1) { - return p1.toUpperCase(); - }); - if (firstLetterLower) { - return string.substr(0, 1).toLowerCase() + string.substr(1); - } else { - return string; - } - }, - underscore: function(string) { - return string.replace(underscore_rx1, '$1_$2').replace(underscore_rx2, '$1_$2').replace('-', '_').toLowerCase(); - }, - capitalize: function(string) { - return string.replace(capitalize_rx, function(m, p1, p2) { - return p1 + p2.toUpperCase(); - }); - }, - trim: function(string) { - if (string) { - return string.trim(); - } else { - return ""; - } - }, - interpolate: function(stringOrObject, keys) { - var key, string, value; - if (typeof stringOrObject === 'object') { - string = stringOrObject[keys.count]; - if (!string) { - string = stringOrObject['other']; - } - } else { - string = stringOrObject; - } - for (key in keys) { - value = keys[key]; - string = string.replace(new RegExp("%\\{" + key + "\\}", "g"), value); - } - return string; - }, - humanize: function(string) { - string = Batman.helpers.underscore(string); - string = Batman.helpers.inflector.humanize(string); - return string.replace(humanize_rx1, '').replace(humanize_rx2, ' ').replace(humanize_rx3, function(match) { - return match.toUpperCase(); - }); - } - }; - - Inflector = new Batman.Inflector; - - Batman.helpers.inflector = Inflector; - - Inflector.plural(/$/, 's'); - - Inflector.plural(/s$/i, 's'); - - Inflector.plural(/(ax|test)is$/i, '$1es'); - - Inflector.plural(/(octop|vir)us$/i, '$1i'); - - Inflector.plural(/(octop|vir)i$/i, '$1i'); - - Inflector.plural(/(alias|status)$/i, '$1es'); - - Inflector.plural(/(bu)s$/i, '$1ses'); - - Inflector.plural(/(buffal|tomat)o$/i, '$1oes'); - - Inflector.plural(/([ti])um$/i, '$1a'); - - Inflector.plural(/([ti])a$/i, '$1a'); - - Inflector.plural(/sis$/i, 'ses'); - - Inflector.plural(/(?:([^f])fe|([lr])f)$/i, '$1$2ves'); - - Inflector.plural(/(hive)$/i, '$1s'); - - Inflector.plural(/([^aeiouy]|qu)y$/i, '$1ies'); - - Inflector.plural(/(x|ch|ss|sh)$/i, '$1es'); - - Inflector.plural(/(matr|vert|ind)(?:ix|ex)$/i, '$1ices'); - - Inflector.plural(/([m|l])ouse$/i, '$1ice'); - - Inflector.plural(/([m|l])ice$/i, '$1ice'); - - Inflector.plural(/^(ox)$/i, '$1en'); - - Inflector.plural(/^(oxen)$/i, '$1'); - - Inflector.plural(/(quiz)$/i, '$1zes'); - - Inflector.singular(/s$/i, ''); - - Inflector.singular(/(n)ews$/i, '$1ews'); - - Inflector.singular(/([ti])a$/i, '$1um'); - - Inflector.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, '$1$2sis'); - - Inflector.singular(/(^analy)ses$/i, '$1sis'); - - Inflector.singular(/([^f])ves$/i, '$1fe'); - - Inflector.singular(/(hive)s$/i, '$1'); - - Inflector.singular(/(tive)s$/i, '$1'); - - Inflector.singular(/([lr])ves$/i, '$1f'); - - Inflector.singular(/([^aeiouy]|qu)ies$/i, '$1y'); - - Inflector.singular(/(s)eries$/i, '$1eries'); - - Inflector.singular(/(m)ovies$/i, '$1ovie'); - - Inflector.singular(/(x|ch|ss|sh)es$/i, '$1'); - - Inflector.singular(/([m|l])ice$/i, '$1ouse'); - - Inflector.singular(/(bus)es$/i, '$1'); - - Inflector.singular(/(o)es$/i, '$1'); - - Inflector.singular(/(shoe)s$/i, '$1'); - - Inflector.singular(/(cris|ax|test)es$/i, '$1is'); - - Inflector.singular(/(octop|vir)i$/i, '$1us'); - - Inflector.singular(/(alias|status)es$/i, '$1'); - - Inflector.singular(/^(ox)en/i, '$1'); - - Inflector.singular(/(vert|ind)ices$/i, '$1ex'); - - Inflector.singular(/(matr)ices$/i, '$1ix'); - - Inflector.singular(/(quiz)zes$/i, '$1'); - - Inflector.singular(/(database)s$/i, '$1'); - - Inflector.irregular('person', 'people'); - - Inflector.irregular('man', 'men'); - - Inflector.irregular('child', 'children'); - - Inflector.irregular('sex', 'sexes'); - - Inflector.irregular('move', 'moves'); - - Inflector.irregular('cow', 'kine'); - - Inflector.irregular('zombie', 'zombies'); - - Inflector.uncountable('equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans'); - -}).call(this); - -(function() { - var developer; - - Batman.developer = { - suppressed: false, - DevelopmentError: (function() { - var DevelopmentError; - DevelopmentError = function(message) { - this.message = message; - return this.name = "DevelopmentError"; - }; - DevelopmentError.prototype = Error.prototype; - return DevelopmentError; - })(), - _ie_console: function(f, args) { - var arg, _i, _len, _results; - if (args.length !== 1) { - if (typeof console !== "undefined" && console !== null) { - console[f]("..." + f + " of " + args.length + " items..."); - } - } - _results = []; - for (_i = 0, _len = args.length; _i < _len; _i++) { - arg = args[_i]; - _results.push(typeof console !== "undefined" && console !== null ? console[f](arg) : void 0); - } - return _results; - }, - suppress: function(f) { - developer.suppressed = true; - if (f) { - f(); - return developer.suppressed = false; - } - }, - unsuppress: function() { - return developer.suppressed = false; - }, - log: function() { - if (developer.suppressed || !((typeof console !== "undefined" && console !== null ? console.log : void 0) != null)) { - return; - } - if (console.log.apply) { - return console.log.apply(console, arguments); - } else { - return developer._ie_console("log", arguments); - } - }, - warn: function() { - if (developer.suppressed || !((typeof console !== "undefined" && console !== null ? console.warn : void 0) != null)) { - return; - } - if (console.warn.apply) { - return console.warn.apply(console, arguments); - } else { - return developer._ie_console("warn", arguments); - } - }, - error: function(message) { - throw new developer.DevelopmentError(message); - }, - assert: function(result, message) { - if (!result) { - return developer.error(message); - } - }, - "do": function(f) { - if (!developer.suppressed) { - return f(); - } - }, - addFilters: function() { - return Batman.extend(Batman.Filters, { - log: function(value, key) { - if (typeof console !== "undefined" && console !== null) { - if (typeof console.log === "function") { - console.log(arguments); - } - } - return value; - }, - logStack: function(value) { - if (typeof console !== "undefined" && console !== null) { - if (typeof console.log === "function") { - console.log(developer.currentFilterStack); - } - } - return value; - } - }); - } - }; - - developer = Batman.developer; - - Batman.developer.assert((function() {}).bind, "Error! Batman needs Function.bind to work! Please shim it using something like es5-shim or augmentjs!"); - -}).call(this); - -(function() { - var _Batman; - - Batman._Batman = _Batman = (function() { - - function _Batman(object) { - this.object = object; - } - - _Batman.prototype.check = function(object) { - if (object !== this.object) { - object._batman = new Batman._Batman(object); - return false; - } - return true; - }; - - _Batman.prototype.get = function(key) { - var reduction, results; - results = this.getAll(key); - switch (results.length) { - case 0: - return void 0; - case 1: - return results[0]; - default: - reduction = results[0].concat != null ? function(a, b) { - return a.concat(b); - } : results[0].merge != null ? function(a, b) { - return a.merge(b); - } : results.every(function(x) { - return typeof x === 'object'; - }) ? (results.unshift({}), function(a, b) { - return Batman.extend(a, b); - }) : void 0; - if (reduction) { - return results.reduceRight(reduction); - } else { - return results; - } - } - }; - - _Batman.prototype.getFirst = function(key) { - var results; - results = this.getAll(key); - return results[0]; - }; - - _Batman.prototype.getAll = function(keyOrGetter) { - var getter, results, val; - if (typeof keyOrGetter === 'function') { - getter = keyOrGetter; - } else { - getter = function(ancestor) { - var _ref; - return (_ref = ancestor._batman) != null ? _ref[keyOrGetter] : void 0; - }; - } - results = this.ancestors(getter); - if (val = getter(this.object)) { - results.unshift(val); - } - return results; - }; - - _Batman.prototype.ancestors = function(getter) { - var isClass, parent, proto, results, val, _ref, _ref1; - if (getter == null) { - getter = function(x) { - return x; - }; - } - results = []; - isClass = !!this.object.prototype; - parent = isClass ? (_ref = this.object.__super__) != null ? _ref.constructor : void 0 : (proto = Object.getPrototypeOf(this.object)) === this.object ? this.object.constructor.__super__ : proto; - if (parent != null) { - if ((_ref1 = parent._batman) != null) { - _ref1.check(parent); - } - val = getter(parent); - if (val != null) { - results.push(val); - } - if (parent._batman != null) { - results = results.concat(parent._batman.ancestors(getter)); - } - } - return results; - }; - - _Batman.prototype.set = function(key, value) { - return this[key] = value; - }; - - return _Batman; - - })(); - -}).call(this); - -(function() { - - Batman.Event = (function() { - - Event.forBaseAndKey = function(base, key) { - if (base.isEventEmitter) { - return base.event(key); - } else { - return new Batman.Event(base, key); - } - }; - - function Event(base, key) { - this.base = base; - this.key = key; - this.handlers = []; - this._preventCount = 0; - } - - Event.prototype.isEvent = true; - - Event.prototype.isEqual = function(other) { - return this.constructor === other.constructor && this.base === other.base && this.key === other.key; - }; - - Event.prototype.hashKey = function() { - var key; - this.hashKey = function() { - return key; - }; - return key = ""; - }; - - Event.prototype.addHandler = function(handler) { - if (this.handlers.indexOf(handler) === -1) { - this.handlers.push(handler); - } - if (this.oneShot) { - this.autofireHandler(handler); - } - return this; - }; - - Event.prototype.removeHandler = function(handler) { - var index; - if ((index = this.handlers.indexOf(handler)) !== -1) { - this.handlers.splice(index, 1); - } - return this; - }; - - Event.prototype.eachHandler = function(iterator) { - var key, _ref, _ref1; - this.handlers.slice().forEach(iterator); - if ((_ref = this.base) != null ? _ref.isEventEmitter : void 0) { - key = this.key; - return (_ref1 = this.base._batman) != null ? _ref1.ancestors(function(ancestor) { - var handlers, _ref2, _ref3; - if (ancestor.isEventEmitter && ((_ref2 = ancestor._batman) != null ? (_ref3 = _ref2.events) != null ? _ref3.hasOwnProperty(key) : void 0 : void 0)) { - handlers = ancestor.event(key).handlers; - return handlers.slice().forEach(iterator); - } - }) : void 0; - } - }; - - Event.prototype.clearHandlers = function() { - return this.handlers = []; - }; - - Event.prototype.handlerContext = function() { - return this.base; - }; - - Event.prototype.prevent = function() { - return ++this._preventCount; - }; - - Event.prototype.allow = function() { - if (this._preventCount) { - --this._preventCount; - } - return this._preventCount; - }; - - Event.prototype.isPrevented = function() { - return this._preventCount > 0; - }; - - Event.prototype.autofireHandler = function(handler) { - if (this._oneShotFired && (this._oneShotArgs != null)) { - return handler.apply(this.handlerContext(), this._oneShotArgs); - } - }; - - Event.prototype.resetOneShot = function() { - this._oneShotFired = false; - return this._oneShotArgs = null; - }; - - Event.prototype.fire = function() { - var args, context; - if (this.isPrevented() || this._oneShotFired) { - return false; - } - context = this.handlerContext(); - args = arguments; - if (this.oneShot) { - this._oneShotFired = true; - this._oneShotArgs = arguments; - } - return this.eachHandler(function(handler) { - return handler.apply(context, args); - }); - }; - - Event.prototype.allowAndFire = function() { - this.allow(); - return this.fire.apply(this, arguments); - }; - - return Event; - - })(); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PropertyEvent = (function(_super) { - - __extends(PropertyEvent, _super); - - function PropertyEvent() { - return PropertyEvent.__super__.constructor.apply(this, arguments); - } - - PropertyEvent.prototype.eachHandler = function(iterator) { - return this.base.eachObserver(iterator); - }; - - PropertyEvent.prototype.handlerContext = function() { - return this.base.base; - }; - - return PropertyEvent; - - })(Batman.Event); - -}).call(this); - -(function() { - var __slice = [].slice; - - Batman.EventEmitter = { - isEventEmitter: true, - hasEvent: function(key) { - var _ref, _ref1; - return (_ref = this._batman) != null ? typeof _ref.get === "function" ? (_ref1 = _ref.get('events')) != null ? _ref1.hasOwnProperty(key) : void 0 : void 0 : void 0; - }, - event: function(key) { - var eventClass, events, existingEvent, newEvent, _base; - Batman.initializeObject(this); - eventClass = this.eventClass || Batman.Event; - events = (_base = this._batman).events || (_base.events = {}); - if (events.hasOwnProperty(key)) { - return existingEvent = events[key]; - } else { - this._batman.ancestors(function(ancestor) { - var _ref, _ref1; - return existingEvent || (existingEvent = (_ref = ancestor._batman) != null ? (_ref1 = _ref.events) != null ? _ref1[key] : void 0 : void 0); - }); - newEvent = events[key] = new eventClass(this, key); - newEvent.oneShot = existingEvent != null ? existingEvent.oneShot : void 0; - return newEvent; - } - }, - on: function() { - var handler, key, keys, _i, _j, _len, _results; - keys = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), handler = arguments[_i++]; - _results = []; - for (_j = 0, _len = keys.length; _j < _len; _j++) { - key = keys[_j]; - _results.push(this.event(key).addHandler(handler)); - } - return _results; - }, - once: function(key, handler) { - var event, handlerWrapper; - event = this.event(key); - handlerWrapper = function() { - handler.apply(this, arguments); - return event.removeHandler(handlerWrapper); - }; - return event.addHandler(handlerWrapper); - }, - registerAsMutableSource: function() { - return Batman.Property.registerSource(this); - }, - mutation: function(wrappedFunction) { - return function() { - var result; - result = wrappedFunction.apply(this, arguments); - this.event('change').fire(this, this); - return result; - }; - }, - prevent: function(key) { - this.event(key).prevent(); - return this; - }, - allow: function(key) { - this.event(key).allow(); - return this; - }, - isPrevented: function(key) { - return this.event(key).isPrevented(); - }, - fire: function() { - var args, key, _ref; - key = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - return (_ref = this.event(key)).fire.apply(_ref, args); - }, - allowAndFire: function() { - var args, key, _ref; - key = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - return (_ref = this.event(key)).allowAndFire.apply(_ref, args); - } - }; - -}).call(this); - -(function() { - var __slice = [].slice; - - Batman.Enumerable = { - isEnumerable: true, - map: function(f, ctx) { - var r; - if (ctx == null) { - ctx = Batman.container; - } - r = []; - this.forEach(function() { - return r.push(f.apply(ctx, arguments)); - }); - return r; - }, - mapToProperty: function(key) { - var r; - r = []; - this.forEach(function(item) { - return r.push(item.get(key)); - }); - return r; - }, - every: function(f, ctx) { - var r; - if (ctx == null) { - ctx = Batman.container; - } - r = true; - this.forEach(function() { - return r = r && f.apply(ctx, arguments); - }); - return r; - }, - some: function(f, ctx) { - var r; - if (ctx == null) { - ctx = Batman.container; - } - r = false; - this.forEach(function() { - return r = r || f.apply(ctx, arguments); - }); - return r; - }, - reduce: function(f, r) { - var count, self; - count = 0; - self = this; - this.forEach(function() { - if (r != null) { - return r = f.apply(null, [r].concat(__slice.call(arguments), [count], [self])); - } else { - return r = arguments[0]; - } - }); - return r; - }, - filter: function(f) { - var r, wrap; - r = new this.constructor; - if (r.add) { - wrap = function(r, e) { - if (f(e)) { - r.add(e); - } - return r; - }; - } else if (r.set) { - wrap = function(r, k, v) { - if (f(k, v)) { - r.set(k, v); - } - return r; - }; - } else { - if (!r.push) { - r = []; - } - wrap = function(r, e) { - if (f(e)) { - r.push(e); - } - return r; - }; - } - return this.reduce(wrap, r); - }, - inGroupsOf: function(n) { - var current, i, r; - r = []; - current = false; - i = 0; - this.forEach(function(x) { - if (i++ % n === 0) { - current = []; - r.push(current); - } - return current.push(x); - }); - return r; - } - }; - -}).call(this); - -(function() { - var __slice = [].slice; - - Batman.SimpleHash = (function() { - - function SimpleHash(obj) { - this._storage = {}; - this.length = 0; - if (obj != null) { - this.update(obj); - } - } - - Batman.extend(SimpleHash.prototype, Batman.Enumerable); - - SimpleHash.prototype.propertyClass = Batman.Property; - - SimpleHash.prototype.hasKey = function(key) { - var pair, pairs, _i, _len; - if (this.objectKey(key)) { - if (!this._objectStorage) { - return false; - } - if (pairs = this._objectStorage[this.hashKeyFor(key)]) { - for (_i = 0, _len = pairs.length; _i < _len; _i++) { - pair = pairs[_i]; - if (this.equality(pair[0], key)) { - return true; - } - } - } - return false; - } else { - key = this.prefixedKey(key); - return this._storage.hasOwnProperty(key); - } - }; - - SimpleHash.prototype.get = function(key) { - var pair, pairs, _i, _len; - if (this.objectKey(key)) { - if (!this._objectStorage) { - return void 0; - } - if (pairs = this._objectStorage[this.hashKeyFor(key)]) { - for (_i = 0, _len = pairs.length; _i < _len; _i++) { - pair = pairs[_i]; - if (this.equality(pair[0], key)) { - return pair[1]; - } - } - } - } else { - return this._storage[this.prefixedKey(key)]; - } - }; - - SimpleHash.prototype.set = function(key, val) { - var pair, pairs, _base, _i, _len, _name; - if (this.objectKey(key)) { - this._objectStorage || (this._objectStorage = {}); - pairs = (_base = this._objectStorage)[_name = this.hashKeyFor(key)] || (_base[_name] = []); - for (_i = 0, _len = pairs.length; _i < _len; _i++) { - pair = pairs[_i]; - if (this.equality(pair[0], key)) { - return pair[1] = val; - } - } - this.length++; - pairs.push([key, val]); - return val; - } else { - key = this.prefixedKey(key); - if (this._storage[key] == null) { - this.length++; - } - return this._storage[key] = val; - } - }; - - SimpleHash.prototype.unset = function(key) { - var hashKey, index, obj, pair, pairs, val, value, _i, _len, _ref; - if (this.objectKey(key)) { - if (!this._objectStorage) { - return void 0; - } - hashKey = this.hashKeyFor(key); - if (pairs = this._objectStorage[hashKey]) { - for (index = _i = 0, _len = pairs.length; _i < _len; index = ++_i) { - _ref = pairs[index], obj = _ref[0], value = _ref[1]; - if (this.equality(obj, key)) { - pair = pairs.splice(index, 1); - if (!pairs.length) { - delete this._objectStorage[hashKey]; - } - this.length--; - return pair[0][1]; - } - } - } - } else { - key = this.prefixedKey(key); - val = this._storage[key]; - if (this._storage[key] != null) { - this.length--; - delete this._storage[key]; - } - return val; - } - }; - - SimpleHash.prototype.getOrSet = function(key, valueFunction) { - var currentValue; - currentValue = this.get(key); - if (!currentValue) { - currentValue = valueFunction(); - this.set(key, currentValue); - } - return currentValue; - }; - - SimpleHash.prototype.prefixedKey = function(key) { - return "_" + key; - }; - - SimpleHash.prototype.unprefixedKey = function(key) { - return key.slice(1); - }; - - SimpleHash.prototype.hashKeyFor = function(obj) { - return (obj != null ? typeof obj.hashKey === "function" ? obj.hashKey() : void 0 : void 0) || obj; - }; - - SimpleHash.prototype.equality = function(lhs, rhs) { - if (lhs === rhs) { - return true; - } - if (lhs !== lhs && rhs !== rhs) { - return true; - } - if ((lhs != null ? typeof lhs.isEqual === "function" ? lhs.isEqual(rhs) : void 0 : void 0) && (rhs != null ? typeof rhs.isEqual === "function" ? rhs.isEqual(lhs) : void 0 : void 0)) { - return true; - } - return false; - }; - - SimpleHash.prototype.objectKey = function(key) { - return typeof key !== 'string'; - }; - - SimpleHash.prototype.forEach = function(iterator, ctx) { - var key, obj, results, value, values, _i, _len, _ref, _ref1, _ref2, _ref3; - results = []; - if (this._objectStorage) { - _ref = this._objectStorage; - for (key in _ref) { - values = _ref[key]; - _ref1 = values.slice(); - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - _ref2 = _ref1[_i], obj = _ref2[0], value = _ref2[1]; - results.push(iterator.call(ctx, obj, value, this)); - } - } - } - _ref3 = this._storage; - for (key in _ref3) { - value = _ref3[key]; - results.push(iterator.call(ctx, this.unprefixedKey(key), value, this)); - } - return results; - }; - - SimpleHash.prototype.keys = function() { - var result; - result = []; - Batman.SimpleHash.prototype.forEach.call(this, function(key) { - return result.push(key); - }); - return result; - }; - - SimpleHash.prototype.toArray = SimpleHash.prototype.keys; - - SimpleHash.prototype.clear = function() { - this._storage = {}; - delete this._objectStorage; - return this.length = 0; - }; - - SimpleHash.prototype.isEmpty = function() { - return this.length === 0; - }; - - SimpleHash.prototype.merge = function() { - var hash, merged, others, _i, _len; - others = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - merged = new this.constructor; - others.unshift(this); - for (_i = 0, _len = others.length; _i < _len; _i++) { - hash = others[_i]; - hash.forEach(function(obj, value) { - return merged.set(obj, value); - }); - } - return merged; - }; - - SimpleHash.prototype.update = function(object) { - var k, v, _results; - _results = []; - for (k in object) { - v = object[k]; - _results.push(this.set(k, v)); - } - return _results; - }; - - SimpleHash.prototype.replace = function(object) { - var _this = this; - this.forEach(function(key, value) { - if (!(key in object)) { - return _this.unset(key); - } - }); - return this.update(object); - }; - - SimpleHash.prototype.toObject = function() { - var key, obj, pair, value, _ref, _ref1; - obj = {}; - _ref = this._storage; - for (key in _ref) { - value = _ref[key]; - obj[this.unprefixedKey(key)] = value; - } - if (this._objectStorage) { - _ref1 = this._objectStorage; - for (key in _ref1) { - pair = _ref1[key]; - obj[key] = pair[0][1]; - } - } - return obj; - }; - - SimpleHash.prototype.toJSON = SimpleHash.prototype.toObject; - - return SimpleHash; - - })(); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.AssociationCurator = (function(_super) { - - __extends(AssociationCurator, _super); - - AssociationCurator.availableAssociations = ['belongsTo', 'hasOne', 'hasMany']; - - function AssociationCurator(model) { - this.model = model; - AssociationCurator.__super__.constructor.call(this); - this._byTypeStorage = new Batman.SimpleHash; - } - - AssociationCurator.prototype.add = function(association) { - var associationTypeSet; - this.set(association.label, association); - if (!(associationTypeSet = this._byTypeStorage.get(association.associationType))) { - associationTypeSet = new Batman.SimpleSet; - this._byTypeStorage.set(association.associationType, associationTypeSet); - } - return associationTypeSet.add(association); - }; - - AssociationCurator.prototype.getByType = function(type) { - return this._byTypeStorage.get(type); - }; - - AssociationCurator.prototype.getByLabel = function(label) { - return this.get(label); - }; - - AssociationCurator.prototype.reset = function() { - this.forEach(function(label, association) { - return association.reset(); - }); - return true; - }; - - AssociationCurator.prototype.merge = function() { - var others, result; - others = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - result = AssociationCurator.__super__.merge.apply(this, arguments); - result._byTypeStorage = this._byTypeStorage.merge(others.map(function(other) { - return other._byTypeStorage; - })); - return result; - }; - - AssociationCurator.prototype._markDirtyAttribute = function(key, oldValue) { - var _ref; - if ((_ref = this.lifecycle.get('state')) !== 'loading' && _ref !== 'creating' && _ref !== 'saving' && _ref !== 'saved') { - if (this.lifecycle.startTransition('set')) { - return this.dirtyKeys.set(key, oldValue); - } else { - throw new Batman.StateMachine.InvalidTransitionError("Can't set while in state " + (this.lifecycle.get('state'))); - } - } - }; - - return AssociationCurator; - - })(Batman.SimpleHash); - -}).call(this); - -(function() { - var __slice = [].slice; - - Batman.SimpleSet = (function() { - - function SimpleSet() { - this._storage = []; - this.length = 0; - if (arguments.length > 0) { - this.add.apply(this, arguments); - } - } - - Batman.extend(SimpleSet.prototype, Batman.Enumerable); - - SimpleSet.prototype.has = function(item) { - return !!(~this._indexOfItem(item)); - }; - - SimpleSet.prototype.add = function() { - var addedItems, item, items, _i, _len; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - addedItems = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if (!(!~this._indexOfItem(item))) { - continue; - } - this._storage.push(item); - addedItems.push(item); - } - this.length = this._storage.length; - if (this.fire && addedItems.length !== 0) { - this.fire('change', this, this); - this.fire.apply(this, ['itemsWereAdded'].concat(__slice.call(addedItems))); - } - return addedItems; - }; - - SimpleSet.prototype.remove = function() { - var index, item, items, removedItems, _i, _len; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - removedItems = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if (!(~(index = this._indexOfItem(item)))) { - continue; - } - this._storage.splice(index, 1); - removedItems.push(item); - } - this.length = this._storage.length; - if (this.fire && removedItems.length !== 0) { - this.fire('change', this, this); - this.fire.apply(this, ['itemsWereRemoved'].concat(__slice.call(removedItems))); - } - return removedItems; - }; - - SimpleSet.prototype.find = function(f) { - var item, _i, _len, _ref; - _ref = this._storage; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - item = _ref[_i]; - if (f(item)) { - return item; - } - } - }; - - SimpleSet.prototype.forEach = function(iterator, ctx) { - var container; - container = this; - return this._storage.slice().forEach(function(key) { - return iterator.call(ctx, key, null, container); - }); - }; - - SimpleSet.prototype.isEmpty = function() { - return this.length === 0; - }; - - SimpleSet.prototype.clear = function() { - var items; - items = this._storage; - this._storage = []; - this.length = 0; - if (this.fire && items.length !== 0) { - this.fire('change', this, this); - this.fire.apply(this, ['itemsWereRemoved'].concat(__slice.call(items))); - } - return items; - }; - - SimpleSet.prototype.replace = function(other) { - try { - if (typeof this.prevent === "function") { - this.prevent('change'); - } - this.clear(); - return this.add.apply(this, other.toArray()); - } finally { - if (typeof this.allowAndFire === "function") { - this.allowAndFire('change', this, this); - } - } - }; - - SimpleSet.prototype.toArray = function() { - return this._storage.slice(); - }; - - SimpleSet.prototype.merge = function() { - var merged, others, set, _i, _len; - others = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - merged = new this.constructor; - others.unshift(this); - for (_i = 0, _len = others.length; _i < _len; _i++) { - set = others[_i]; - set.forEach(function(v) { - return merged.add(v); - }); - } - return merged; - }; - - SimpleSet.prototype.indexedBy = function(key) { - this._indexes || (this._indexes = new Batman.SimpleHash); - return this._indexes.get(key) || this._indexes.set(key, new Batman.SetIndex(this, key)); - }; - - SimpleSet.prototype.indexedByUnique = function(key) { - this._uniqueIndexes || (this._uniqueIndexes = new Batman.SimpleHash); - return this._uniqueIndexes.get(key) || this._uniqueIndexes.set(key, new Batman.UniqueSetIndex(this, key)); - }; - - SimpleSet.prototype.sortedBy = function(key, order) { - var sortsForKey; - if (order == null) { - order = "asc"; - } - order = order.toLowerCase() === "desc" ? "desc" : "asc"; - this._sorts || (this._sorts = new Batman.SimpleHash); - sortsForKey = this._sorts.get(key) || this._sorts.set(key, new Batman.Object); - return sortsForKey.get(order) || sortsForKey.set(order, new Batman.SetSort(this, key, order)); - }; - - SimpleSet.prototype.equality = Batman.SimpleHash.prototype.equality; - - SimpleSet.prototype._indexOfItem = function(givenItem) { - var index, item, _i, _len, _ref; - _ref = this._storage; - for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { - item = _ref[index]; - if (this.equality(givenItem, item)) { - return index; - } - } - return -1; - }; - - return SimpleSet; - - })(); - -}).call(this); - -(function() { - var __slice = [].slice; - - Batman.Property = (function() { - - Batman.mixin(Property.prototype, Batman.EventEmitter); - - Property._sourceTrackerStack = []; - - Property.sourceTracker = function() { - var stack; - return (stack = this._sourceTrackerStack)[stack.length - 1]; - }; - - Property.defaultAccessor = { - get: function(key) { - return this[key]; - }, - set: function(key, val) { - return this[key] = val; - }, - unset: function(key) { - var x; - x = this[key]; - delete this[key]; - return x; - }, - cache: false - }; - - Property.defaultAccessorForBase = function(base) { - var _ref; - return ((_ref = base._batman) != null ? _ref.getFirst('defaultAccessor') : void 0) || Batman.Property.defaultAccessor; - }; - - Property.accessorForBaseAndKey = function(base, key) { - var accessor, _bm, _ref, - _this = this; - if ((_bm = base._batman) != null) { - accessor = (_ref = _bm.keyAccessors) != null ? _ref.get(key) : void 0; - if (!accessor) { - _bm.ancestors(function(ancestor) { - var _ref1, _ref2; - return accessor || (accessor = (_ref1 = ancestor._batman) != null ? (_ref2 = _ref1.keyAccessors) != null ? _ref2.get(key) : void 0 : void 0); - }); - } - } - return accessor || this.defaultAccessorForBase(base); - }; - - Property.forBaseAndKey = function(base, key) { - if (base.isObservable) { - return base.property(key); - } else { - return new Batman.Keypath(base, key); - } - }; - - Property.withoutTracking = function(block) { - return this.wrapTrackingPrevention(block)(); - }; - - Property.wrapTrackingPrevention = function(block) { - return function() { - Batman.Property.pushDummySourceTracker(); - try { - return block.apply(this, arguments); - } finally { - Batman.Property.popSourceTracker(); - } - }; - }; - - Property.registerSource = function(obj) { - var _ref; - if (!obj.isEventEmitter) { - return; - } - return (_ref = this.sourceTracker()) != null ? _ref.add(obj) : void 0; - }; - - Property.pushSourceTracker = function() { - return Batman.Property._sourceTrackerStack.push(new Batman.SimpleSet); - }; - - Property.pushDummySourceTracker = function() { - return Batman.Property._sourceTrackerStack.push(null); - }; - - Property.popSourceTracker = function() { - return Batman.Property._sourceTrackerStack.pop(); - }; - - function Property(base, key) { - this.base = base; - this.key = key; - } - - Property.prototype._isolationCount = 0; - - Property.prototype.cached = false; - - Property.prototype.value = null; - - Property.prototype.sources = null; - - Property.prototype.isProperty = true; - - Property.prototype.isDead = false; - - Property.prototype.eventClass = Batman.PropertyEvent; - - Property.prototype.isEqual = function(other) { - return this.constructor === other.constructor && this.base === other.base && this.key === other.key; - }; - - Property.prototype.hashKey = function() { - var key; - this.hashKey = function() { - return key; - }; - return key = ""; - }; - - Property.prototype.event = function(key) { - var eventClass, _base; - eventClass = this.eventClass || Batman.Event; - this.events || (this.events = {}); - (_base = this.events)[key] || (_base[key] = new eventClass(this, key)); - return this.events[key]; - }; - - Property.prototype.changeEvent = function() { - var event; - event = this.event('change'); - this.changeEvent = function() { - return event; - }; - return event; - }; - - Property.prototype.accessor = function() { - var accessor; - accessor = this.constructor.accessorForBaseAndKey(this.base, this.key); - this.accessor = function() { - return accessor; - }; - return accessor; - }; - - Property.prototype.eachObserver = function(iterator) { - var key; - key = this.key; - this.changeEvent().handlers.slice().forEach(iterator); - if (this.base.isObservable) { - return this.base._batman.ancestors(function(ancestor) { - var handlers, property; - if (ancestor.isObservable && ancestor.hasProperty(key)) { - property = ancestor.property(key); - handlers = property.changeEvent().handlers; - return handlers.slice().forEach(iterator); - } - }); - } - }; - - Property.prototype.observers = function() { - var results; - results = []; - this.eachObserver(function(observer) { - return results.push(observer); - }); - return results; - }; - - Property.prototype.hasObservers = function() { - return this.observers().length > 0; - }; - - Property.prototype.updateSourcesFromTracker = function() { - var handler, newSources; - newSources = this.constructor.popSourceTracker(); - handler = this.sourceChangeHandler(); - this._eachSourceChangeEvent(function(e) { - return e.removeHandler(handler); - }); - this.sources = newSources; - return this._eachSourceChangeEvent(function(e) { - return e.addHandler(handler); - }); - }; - - Property.prototype._eachSourceChangeEvent = function(iterator) { - if (this.sources == null) { - return; - } - return this.sources.forEach(function(source) { - return iterator(source.event('change')); - }); - }; - - Property.prototype.getValue = function() { - this.registerAsMutableSource(); - if (!this.isCached()) { - this.constructor.pushSourceTracker(); - try { - this.value = this.valueFromAccessor(); - this.cached = true; - } finally { - this.updateSourcesFromTracker(); - } - } - return this.value; - }; - - Property.prototype.isCachable = function() { - var cacheable; - if (this.isFinal()) { - return true; - } - cacheable = this.accessor().cache; - if (cacheable != null) { - return !!cacheable; - } else { - return true; - } - }; - - Property.prototype.isCached = function() { - return this.isCachable() && this.cached; - }; - - Property.prototype.isFinal = function() { - return !!this.accessor()['final']; - }; - - Property.prototype.refresh = function() { - var previousValue, value; - this.cached = false; - previousValue = this.value; - value = this.getValue(); - if (value !== previousValue && !this.isIsolated()) { - this.fire(value, previousValue); - } - if (this.value !== void 0 && this.isFinal()) { - return this.lockValue(); - } - }; - - Property.prototype.sourceChangeHandler = function() { - var handler, - _this = this; - handler = this._handleSourceChange.bind(this); - Batman.developer["do"](function() { - return handler.property = _this; - }); - this.sourceChangeHandler = function() { - return handler; - }; - return handler; - }; - - Property.prototype._handleSourceChange = function() { - if (this.isIsolated()) { - return this._needsRefresh = true; - } else if (!this.isFinal() && !this.hasObservers()) { - return this.cached = false; - } else { - return this.refresh(); - } - }; - - Property.prototype.valueFromAccessor = function() { - var _ref; - return (_ref = this.accessor().get) != null ? _ref.call(this.base, this.key) : void 0; - }; - - Property.prototype.setValue = function(val) { - var set; - if (!(set = this.accessor().set)) { - return; - } - return this._changeValue(function() { - return set.call(this.base, this.key, val); - }); - }; - - Property.prototype.unsetValue = function() { - var unset; - if (!(unset = this.accessor().unset)) { - return; - } - return this._changeValue(function() { - return unset.call(this.base, this.key); - }); - }; - - Property.prototype._changeValue = function(block) { - var result; - this.cached = false; - this.constructor.pushDummySourceTracker(); - try { - result = block.apply(this); - this.refresh(); - } finally { - this.constructor.popSourceTracker(); - } - if (!(this.isCached() || this.hasObservers())) { - this.die(); - } - return result; - }; - - Property.prototype.forget = function(handler) { - if (handler != null) { - return this.changeEvent().removeHandler(handler); - } else { - return this.changeEvent().clearHandlers(); - } - }; - - Property.prototype.observeAndFire = function(handler) { - this.observe(handler); - return handler.call(this.base, this.value, this.value, this.key); - }; - - Property.prototype.observe = function(handler) { - this.changeEvent().addHandler(handler); - if (this.sources == null) { - this.getValue(); - } - return this; - }; - - Property.prototype.observeOnce = function(originalHandler) { - var event, handler; - event = this.changeEvent(); - handler = function() { - originalHandler.apply(this, arguments); - return event.removeHandler(handler); - }; - event.addHandler(handler); - if (this.sources == null) { - this.getValue(); - } - return this; - }; - - Property.prototype._removeHandlers = function() { - var handler; - handler = this.sourceChangeHandler(); - this._eachSourceChangeEvent(function(e) { - return e.removeHandler(handler); - }); - delete this.sources; - return this.changeEvent().clearHandlers(); - }; - - Property.prototype.lockValue = function() { - this._removeHandlers(); - this.getValue = function() { - return this.value; - }; - return this.setValue = this.unsetValue = this.refresh = this.observe = function() {}; - }; - - Property.prototype.die = function() { - var _ref, _ref1; - this._removeHandlers(); - if ((_ref = this.base._batman) != null) { - if ((_ref1 = _ref.properties) != null) { - _ref1.unset(this.key); - } - } - return this.isDead = true; - }; - - Property.prototype.fire = function() { - var _ref; - return (_ref = this.changeEvent()).fire.apply(_ref, __slice.call(arguments).concat([this.key])); - }; - - Property.prototype.isolate = function() { - if (this._isolationCount === 0) { - this._preIsolationValue = this.getValue(); - } - return this._isolationCount++; - }; - - Property.prototype.expose = function() { - if (this._isolationCount === 1) { - this._isolationCount--; - if (this._needsRefresh) { - this.value = this._preIsolationValue; - this.refresh(); - } else if (this.value !== this._preIsolationValue) { - this.fire(this.value, this._preIsolationValue); - } - return this._preIsolationValue = null; - } else if (this._isolationCount > 0) { - return this._isolationCount--; - } - }; - - Property.prototype.isIsolated = function() { - return this._isolationCount > 0; - }; - - return Property; - - })(); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.Keypath = (function(_super) { - - __extends(Keypath, _super); - - function Keypath(base, key) { - if (typeof key === 'string') { - this.segments = key.split('.'); - this.depth = this.segments.length; - } else { - this.segments = [key]; - this.depth = 1; - } - Keypath.__super__.constructor.apply(this, arguments); - } - - Keypath.prototype.isCachable = function() { - if (this.depth === 1) { - return Keypath.__super__.isCachable.apply(this, arguments); - } else { - return true; - } - }; - - Keypath.prototype.terminalProperty = function() { - var base; - base = Batman.getPath(this.base, this.segments.slice(0, -1)); - if (base == null) { - return; - } - return Batman.Keypath.forBaseAndKey(base, this.segments[this.depth - 1]); - }; - - Keypath.prototype.valueFromAccessor = function() { - if (this.depth === 1) { - return Keypath.__super__.valueFromAccessor.apply(this, arguments); - } else { - return Batman.getPath(this.base, this.segments); - } - }; - - Keypath.prototype.setValue = function(val) { - var _ref; - if (this.depth === 1) { - return Keypath.__super__.setValue.apply(this, arguments); - } else { - return (_ref = this.terminalProperty()) != null ? _ref.setValue(val) : void 0; - } - }; - - Keypath.prototype.unsetValue = function() { - var _ref; - if (this.depth === 1) { - return Keypath.__super__.unsetValue.apply(this, arguments); - } else { - return (_ref = this.terminalProperty()) != null ? _ref.unsetValue() : void 0; - } - }; - - return Keypath; - - })(Batman.Property); - -}).call(this); - -(function() { - var __slice = [].slice; - - Batman.Observable = { - isObservable: true, - hasProperty: function(key) { - var _ref, _ref1; - return (_ref = this._batman) != null ? (_ref1 = _ref.properties) != null ? typeof _ref1.hasKey === "function" ? _ref1.hasKey(key) : void 0 : void 0 : void 0; - }, - property: function(key) { - var properties, propertyClass, _base; - Batman.initializeObject(this); - propertyClass = this.propertyClass || Batman.Keypath; - properties = (_base = this._batman).properties || (_base.properties = new Batman.SimpleHash); - return properties.get(key) || properties.set(key, new propertyClass(this, key)); - }, - get: function(key) { - return this.property(key).getValue(); - }, - set: function(key, val) { - return this.property(key).setValue(val); - }, - unset: function(key) { - return this.property(key).unsetValue(); - }, - getOrSet: Batman.SimpleHash.prototype.getOrSet, - forget: function(key, observer) { - var _ref; - if (key) { - this.property(key).forget(observer); - } else { - if ((_ref = this._batman.properties) != null) { - _ref.forEach(function(key, property) { - return property.forget(); - }); - } - } - return this; - }, - observe: function() { - var args, key, _ref; - key = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - (_ref = this.property(key)).observe.apply(_ref, args); - return this; - }, - observeAndFire: function() { - var args, key, _ref; - key = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - (_ref = this.property(key)).observeAndFire.apply(_ref, args); - return this; - }, - observeOnce: function() { - var args, key, _ref; - key = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - (_ref = this.property(key)).observeOnce.apply(_ref, args); - return this; - } - }; - -}).call(this); - -(function() { - - Batman.DOM = { - textInputTypes: ['text', 'search', 'tel', 'url', 'email', 'password'], - scrollIntoView: function(elementID) { - var _ref; - return (_ref = document.getElementById(elementID)) != null ? typeof _ref.scrollIntoView === "function" ? _ref.scrollIntoView() : void 0 : void 0; - }, - partial: function(container, path, context, renderer) { - var view; - renderer.prevent('rendered'); - view = new Batman.View({ - source: path, - context: context - }); - return view.on('ready', function() { - Batman.DOM.setInnerHTML(container, ''); - Batman.DOM.appendChild(container, view.get('node')); - return renderer.allowAndFire('rendered'); - }); - }, - propagateBindingEvent: function(binding, node) { - var current, parentBinding, parentBindings, _i, _len; - while ((current = (current || node).parentNode)) { - parentBindings = Batman._data(current, 'bindings'); - if (parentBindings != null) { - for (_i = 0, _len = parentBindings.length; _i < _len; _i++) { - parentBinding = parentBindings[_i]; - if (typeof parentBinding.childBindingAdded === "function") { - parentBinding.childBindingAdded(binding); - } - } - } - } - }, - propagateBindingEvents: function(newNode) { - var binding, bindings, child, _i, _j, _len, _len1, _ref; - _ref = newNode.childNodes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - Batman.DOM.propagateBindingEvents(child); - } - if (bindings = Batman._data(newNode, 'bindings')) { - for (_j = 0, _len1 = bindings.length; _j < _len1; _j++) { - binding = bindings[_j]; - Batman.DOM.propagateBindingEvent(binding, newNode); - } - } - }, - trackBinding: function(binding, node) { - var bindings; - if (bindings = Batman._data(node, 'bindings')) { - bindings.push(binding); - } else { - Batman._data(node, 'bindings', [binding]); - } - Batman.DOM.fire('bindingAdded', binding); - Batman.DOM.propagateBindingEvent(binding, node); - return true; - }, - onParseExit: function(node, callback) { - var set; - set = Batman._data(node, 'onParseExit') || Batman._data(node, 'onParseExit', new Batman.SimpleSet); - if (callback != null) { - set.add(callback); - } - return set; - }, - forgetParseExit: function(node, callback) { - return Batman.removeData(node, 'onParseExit', true); - }, - defineView: function(name, node) { - var contents; - contents = node.innerHTML; - Batman.View.store.set(Batman.Navigator.normalizePath(name), contents); - return contents; - }, - setStyleProperty: function(node, property, value, importance) { - if (node.style.setProperty) { - return node.style.setProperty(property, value, importance); - } else { - return node.style.setAttribute(property, value, importance); - } - }, - removeOrDestroyNode: function(node) { - var view; - view = Batman._data(node, 'view'); - view || (view = Batman._data(node, 'yielder')); - if ((view != null) && view.get('cached')) { - return Batman.DOM.removeNode(node); - } else { - return Batman.DOM.destroyNode(node); - } - }, - insertBefore: function(parentNode, newNode, referenceNode) { - if (referenceNode == null) { - referenceNode = null; - } - if (!referenceNode || parentNode.childNodes.length <= 0) { - return Batman.DOM.appendChild(parentNode, newNode); - } else { - Batman.DOM.willInsertNode(newNode); - parentNode.insertBefore(newNode, referenceNode); - return Batman.DOM.didInsertNode(newNode); - } - }, - valueForNode: function(node, value, escapeValue) { - var isSetting; - if (value == null) { - value = ''; - } - if (escapeValue == null) { - escapeValue = true; - } - isSetting = arguments.length > 1; - switch (node.nodeName.toUpperCase()) { - case 'INPUT': - case 'TEXTAREA': - if (isSetting) { - return node.value = value; - } else { - return node.value; - } - break; - case 'SELECT': - if (isSetting) { - return node.value = value; - } - break; - default: - if (isSetting) { - return Batman.DOM.setInnerHTML(node, escapeValue ? Batman.escapeHTML(value) : value); - } else { - return node.innerHTML; - } - } - }, - nodeIsEditable: function(node) { - var _ref; - return (_ref = node.nodeName.toUpperCase()) === 'INPUT' || _ref === 'TEXTAREA' || _ref === 'SELECT'; - }, - addEventListener: function(node, eventName, callback) { - var listeners; - if (!(listeners = Batman._data(node, 'listeners'))) { - listeners = Batman._data(node, 'listeners', {}); - } - if (!listeners[eventName]) { - listeners[eventName] = []; - } - listeners[eventName].push(callback); - if (Batman.DOM.hasAddEventListener) { - return node.addEventListener(eventName, callback, false); - } else { - return node.attachEvent("on" + eventName, callback); - } - }, - removeEventListener: function(node, eventName, callback) { - var eventListeners, index, listeners; - if (listeners = Batman._data(node, 'listeners')) { - if (eventListeners = listeners[eventName]) { - index = eventListeners.indexOf(callback); - if (index !== -1) { - eventListeners.splice(index, 1); - } - } - } - if (Batman.DOM.hasAddEventListener) { - return node.removeEventListener(eventName, callback, false); - } else { - return node.detachEvent('on' + eventName, callback); - } - }, - hasAddEventListener: !!(typeof window !== "undefined" && window !== null ? window.addEventListener : void 0), - preventDefault: function(e) { - if (typeof e.preventDefault === "function") { - return e.preventDefault(); - } else { - return e.returnValue = false; - } - }, - stopPropagation: function(e) { - if (e.stopPropagation) { - return e.stopPropagation(); - } else { - return e.cancelBubble = true; - } - }, - willInsertNode: function(node) { - var child, view, _i, _len, _ref, _ref1; - view = Batman._data(node, 'view'); - if (view != null) { - view.fire('beforeAppear', node); - } - if ((_ref = Batman.data(node, 'show')) != null) { - _ref.call(node); - } - _ref1 = node.childNodes; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - child = _ref1[_i]; - Batman.DOM.willInsertNode(child); - } - return true; - }, - didInsertNode: function(node) { - var child, view, _i, _len, _ref; - view = Batman._data(node, 'view'); - if (view) { - view.fire('appear', node); - view.applyYields(); - } - _ref = node.childNodes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - Batman.DOM.didInsertNode(child); - } - return true; - }, - willRemoveNode: function(node) { - var child, view, _i, _len, _ref, _ref1; - view = Batman._data(node, 'view'); - if (view) { - view.fire('beforeDisappear', node); - } - if ((_ref = Batman.data(node, 'hide')) != null) { - _ref.call(node); - } - _ref1 = node.childNodes; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - child = _ref1[_i]; - Batman.DOM.willRemoveNode(child); - } - return true; - }, - didRemoveNode: function(node) { - var child, view, _i, _len, _ref; - view = Batman._data(node, 'view'); - if (view) { - view.retractYields(); - view.fire('disappear', node); - } - _ref = node.childNodes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - Batman.DOM.didRemoveNode(child); - } - return true; - }, - willDestroyNode: function(node) { - var child, view, _i, _len, _ref; - view = Batman._data(node, 'view'); - if (view) { - view.fire('beforeDestroy', node); - view.get('yields').forEach(function(name, actions) { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = actions.length; _i < _len; _i++) { - node = actions[_i].node; - _results.push(Batman.DOM.willDestroyNode(node)); - } - return _results; - }); - } - _ref = node.childNodes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - Batman.DOM.willDestroyNode(child); - } - return true; - }, - didDestroyNode: function(node) { - var bindings, child, eventListeners, eventName, listeners, view, _i, _len, _ref; - view = Batman._data(node, 'view'); - if (view) { - view.fire('destroy', node); - view.get('yields').forEach(function(name, actions) { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = actions.length; _i < _len; _i++) { - node = actions[_i].node; - _results.push(Batman.DOM.didDestroyNode(node)); - } - return _results; - }); - } - if (bindings = Batman._data(node, 'bindings')) { - bindings.forEach(function(binding) { - return binding.die(); - }); - } - if (listeners = Batman._data(node, 'listeners')) { - for (eventName in listeners) { - eventListeners = listeners[eventName]; - eventListeners.forEach(function(listener) { - return Batman.DOM.removeEventListener(node, eventName, listener); - }); - } - } - Batman.removeData(node); - Batman.removeData(node, void 0, true); - _ref = node.childNodes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - Batman.DOM.didDestroyNode(child); - } - return true; - } - }; - - Batman.mixin(Batman.DOM, Batman.EventEmitter, Batman.Observable); - - Batman.DOM.event('bindingAdded'); - -}).call(this); - -(function() { - var __slice = [].slice; - - Batman.DOM.readers = { - target: function(node, key, context, renderer) { - Batman.DOM.readers.bind(node, key, context, renderer, 'nodeChange'); - return true; - }, - source: function(node, key, context, renderer) { - Batman.DOM.readers.bind(node, key, context, renderer, 'dataChange'); - return true; - }, - bind: function(node, key, context, renderer, only) { - var bindingClass; - bindingClass = false; - switch (node.nodeName.toLowerCase()) { - case 'input': - switch (node.getAttribute('type')) { - case 'checkbox': - Batman.DOM.attrReaders.bind(node, 'checked', key, context, renderer, only); - return true; - case 'radio': - bindingClass = Batman.DOM.RadioBinding; - break; - case 'file': - bindingClass = Batman.DOM.FileBinding; - } - break; - case 'select': - bindingClass = Batman.DOM.SelectBinding; - } - bindingClass || (bindingClass = Batman.DOM.Binding); - (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(bindingClass, arguments, function(){}); - return true; - }, - context: function(node, key, context, renderer) { - return context.descendWithKey(key); - }, - mixin: function(node, key, context, renderer) { - new Batman.DOM.MixinBinding(node, key, context.descend(Batman.mixins), renderer); - return true; - }, - showif: function(node, key, context, parentRenderer, invert) { - new Batman.DOM.ShowHideBinding(node, key, context, parentRenderer, false, invert); - return true; - }, - hideif: function() { - var _ref; - return (_ref = Batman.DOM.readers).showif.apply(_ref, __slice.call(arguments).concat([true])); - }, - insertif: function(node, key, context, parentRenderer, invert) { - new Batman.DOM.InsertionBinding(node, key, context, parentRenderer, false, invert); - return true; - }, - removeif: function() { - var _ref; - return (_ref = Batman.DOM.readers).insertif.apply(_ref, __slice.call(arguments).concat([true])); - }, - route: function() { - (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.DOM.RouteBinding, arguments, function(){}); - return true; - }, - view: function() { - (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.DOM.ViewBinding, arguments, function(){}); - return false; - }, - partial: function(node, path, context, renderer) { - Batman.DOM.partial(node, path, context, renderer); - return true; - }, - defineview: function(node, name, context, renderer) { - Batman.DOM.onParseExit(node, function() { - var _ref; - return (_ref = node.parentNode) != null ? _ref.removeChild(node) : void 0; - }); - Batman.DOM.defineView(name, node); - return false; - }, - renderif: function(node, key, context, renderer) { - new Batman.DOM.DeferredRenderingBinding(node, key, context, renderer); - return false; - }, - "yield": function(node, key) { - Batman.DOM.onParseExit(node, function() { - return Batman.DOM.Yield.withName(key).set('containerNode', node); - }); - return true; - }, - contentfor: function(node, key, context, renderer, action) { - if (action == null) { - action = 'append'; - } - Batman.DOM.onParseExit(node, function() { - var _ref; - if ((_ref = node.parentNode) != null) { - _ref.removeChild(node); - } - return renderer.view.pushYieldAction(key, action, node); - }); - return true; - }, - replace: function(node, key, context, renderer) { - Batman.DOM.readers.contentfor(node, key, context, renderer, 'replace'); - return true; - } - }; - -}).call(this); - -(function() { - var __slice = [].slice, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Batman.DOM.events = { - click: function(node, callback, context, eventName) { - if (eventName == null) { - eventName = 'click'; - } - Batman.DOM.addEventListener(node, eventName, function() { - var args, event; - event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - if (event.metaKey || event.ctrlKey) { - return; - } - Batman.DOM.preventDefault(event); - if (!Batman.DOM.eventIsAllowed(eventName, event)) { - return; - } - return callback.apply(null, [node, event].concat(__slice.call(args), [context])); - }); - if (node.nodeName.toUpperCase() === 'A' && !node.href) { - node.href = '#'; - } - return node; - }, - doubleclick: function(node, callback, context) { - return Batman.DOM.events.click(node, callback, context, 'dblclick'); - }, - change: function(node, callback, context) { - var eventName, eventNames, oldCallback, _i, _len, _results; - eventNames = (function() { - var _ref; - switch (node.nodeName.toUpperCase()) { - case 'TEXTAREA': - return ['input', 'keyup', 'change']; - case 'INPUT': - if (_ref = node.type.toLowerCase(), __indexOf.call(Batman.DOM.textInputTypes, _ref) >= 0) { - oldCallback = callback; - callback = function(node, event) { - if (event.type === 'keyup' && Batman.DOM.events.isEnter(event)) { - return; - } - return oldCallback.apply(null, arguments); - }; - return ['input', 'keyup', 'change']; - } else { - return ['input', 'change']; - } - break; - default: - return ['change']; - } - })(); - _results = []; - for (_i = 0, _len = eventNames.length; _i < _len; _i++) { - eventName = eventNames[_i]; - _results.push(Batman.DOM.addEventListener(node, eventName, function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return callback.apply(null, [node].concat(__slice.call(args), [context])); - })); - } - return _results; - }, - isEnter: function(ev) { - var _ref, _ref1; - return ((13 <= (_ref = ev.keyCode) && _ref <= 14)) || ((13 <= (_ref1 = ev.which) && _ref1 <= 14)) || ev.keyIdentifier === 'Enter' || ev.key === 'Enter'; - }, - submit: function(node, callback, context) { - if (Batman.DOM.nodeIsEditable(node)) { - Batman.DOM.addEventListener(node, 'keydown', function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - if (Batman.DOM.events.isEnter(args[0])) { - return Batman.DOM._keyCapturingNode = node; - } - }); - Batman.DOM.addEventListener(node, 'keyup', function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - if (Batman.DOM.events.isEnter(args[0])) { - if (Batman.DOM._keyCapturingNode === node) { - Batman.DOM.preventDefault(args[0]); - callback.apply(null, [node].concat(__slice.call(args), [context])); - } - return Batman.DOM._keyCapturingNode = null; - } - }); - } else { - Batman.DOM.addEventListener(node, 'submit', function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - Batman.DOM.preventDefault(args[0]); - return callback.apply(null, [node].concat(__slice.call(args), [context])); - }); - } - return node; - }, - other: function(node, eventName, callback, context) { - return Batman.DOM.addEventListener(node, eventName, function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return callback.apply(null, [node].concat(__slice.call(args), [context])); - }); - } - }; - - Batman.DOM.eventIsAllowed = function(eventName, event) { - var delegate, _ref, _ref1; - if (delegate = (_ref = Batman.currentApp) != null ? (_ref1 = _ref.shouldAllowEvent) != null ? _ref1[eventName] : void 0 : void 0) { - if (delegate(event) === false) { - return false; - } - } - return true; - }; - -}).call(this); - -(function() { - - Batman.DOM.attrReaders = { - _parseAttribute: function(value) { - if (value === 'false') { - value = false; - } - if (value === 'true') { - value = true; - } - return value; - }, - source: function(node, attr, key, context, renderer) { - return Batman.DOM.attrReaders.bind(node, attr, key, context, renderer, 'dataChange'); - }, - bind: function(node, attr, key, context, renderer, only) { - var bindingClass; - bindingClass = (function() { - switch (attr) { - case 'checked': - case 'disabled': - case 'selected': - return Batman.DOM.CheckedBinding; - case 'value': - case 'href': - case 'src': - case 'size': - return Batman.DOM.NodeAttributeBinding; - case 'class': - return Batman.DOM.ClassBinding; - case 'style': - return Batman.DOM.StyleBinding; - default: - return Batman.DOM.AttributeBinding; - } - })(); - (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(bindingClass, arguments, function(){}); - return true; - }, - context: function(node, contextName, key, context) { - return context.descendWithKey(key, contextName); - }, - event: function(node, eventName, key, context) { - (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.DOM.EventBinding, arguments, function(){}); - return true; - }, - addclass: function(node, className, key, context, parentRenderer, invert) { - new Batman.DOM.AddClassBinding(node, className, key, context, parentRenderer, false, invert); - return true; - }, - removeclass: function(node, className, key, context, parentRenderer) { - return Batman.DOM.attrReaders.addclass(node, className, key, context, parentRenderer, true); - }, - foreach: function(node, iteratorName, key, context, parentRenderer) { - (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.DOM.IteratorBinding, arguments, function(){}); - return false; - }, - formfor: function(node, localName, key, context) { - (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.DOM.FormBinding, arguments, function(){}); - return context.descendWithKey(key, localName); - } - }; - -}).call(this); - -(function() { - var BatmanObject, ObjectFunctions, getAccessorObject, promiseWrapper, wrapSingleAccessor, - __slice = [].slice, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - getAccessorObject = function(base, accessor) { - var deprecated, _i, _len, _ref; - if (typeof accessor === 'function') { - accessor = { - get: accessor - }; - } - _ref = ['cachable', 'cacheable']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - deprecated = _ref[_i]; - if (deprecated in accessor) { - Batman.developer.warn("Property accessor option \"" + deprecated + "\" is deprecated. Use \"cache\" instead."); - if (!('cache' in accessor)) { - accessor.cache = accessor[deprecated]; - } - } - } - return accessor; - }; - - promiseWrapper = function(fetcher) { - return function(defaultAccessor) { - return { - get: function(key) { - var asyncDeliver, existingValue, newValue, _base, _base1, _ref, _ref1, - _this = this; - if ((existingValue = defaultAccessor.get.apply(this, arguments)) != null) { - return existingValue; - } - asyncDeliver = false; - newValue = void 0; - if ((_ref = (_base = this._batman).promises) == null) { - _base.promises = {}; - } - if ((_ref1 = (_base1 = this._batman.promises)[key]) == null) { - _base1[key] = (function() { - var deliver, returnValue; - deliver = function(err, result) { - if (asyncDeliver) { - _this.set(key, result); - } - return newValue = result; - }; - returnValue = fetcher.call(_this, deliver, key); - if (newValue == null) { - newValue = returnValue; - } - return true; - })(); - } - asyncDeliver = true; - return newValue; - }, - cache: true - }; - }; - }; - - wrapSingleAccessor = function(core, wrapper) { - var k, v; - wrapper = (typeof wrapper === "function" ? wrapper(core) : void 0) || wrapper; - for (k in core) { - v = core[k]; - if (!(k in wrapper)) { - wrapper[k] = v; - } - } - return wrapper; - }; - - ObjectFunctions = { - _defineAccessor: function() { - var accessor, key, keys, _base, _i, _j, _len, _ref, _results; - keys = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), accessor = arguments[_i++]; - if (!(accessor != null)) { - return Batman.Property.defaultAccessorForBase(this); - } else if (keys.length === 0 && ((_ref = Batman.typeOf(accessor)) !== 'Object' && _ref !== 'Function')) { - return Batman.Property.accessorForBaseAndKey(this, accessor); - } else if (typeof accessor.promise === 'function') { - return this._defineWrapAccessor.apply(this, __slice.call(keys).concat([promiseWrapper(accessor.promise)])); - } - Batman.initializeObject(this); - if (keys.length === 0) { - return this._batman.defaultAccessor = getAccessorObject(this, accessor); - } else { - (_base = this._batman).keyAccessors || (_base.keyAccessors = new Batman.SimpleHash); - _results = []; - for (_j = 0, _len = keys.length; _j < _len; _j++) { - key = keys[_j]; - _results.push(this._batman.keyAccessors.set(key, getAccessorObject(this, accessor))); - } - return _results; - } - }, - _defineWrapAccessor: function() { - var key, keys, wrapper, _i, _j, _len, _results; - keys = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), wrapper = arguments[_i++]; - Batman.initializeObject(this); - if (keys.length === 0) { - return this._defineAccessor(wrapSingleAccessor(this._defineAccessor(), wrapper)); - } else { - _results = []; - for (_j = 0, _len = keys.length; _j < _len; _j++) { - key = keys[_j]; - _results.push(this._defineAccessor(key, wrapSingleAccessor(this._defineAccessor(key), wrapper))); - } - return _results; - } - }, - _resetPromises: function() { - var key; - if (this._batman.promises == null) { - return; - } - for (key in this._batman.promises) { - this._resetPromise(key); - } - }, - _resetPromise: function(key) { - this.unset(key); - this.property(key).cached = false; - delete this._batman.promises[key]; - } - }; - - BatmanObject = (function(_super) { - var counter; - - __extends(BatmanObject, _super); - - Batman.initializeObject(BatmanObject); - - Batman.initializeObject(BatmanObject.prototype); - - Batman.mixin(BatmanObject.prototype, ObjectFunctions, Batman.EventEmitter, Batman.Observable); - - Batman.mixin(BatmanObject, ObjectFunctions, Batman.EventEmitter, Batman.Observable); - - BatmanObject.classMixin = function() { - return Batman.mixin.apply(Batman, [this].concat(__slice.call(arguments))); - }; - - BatmanObject.mixin = function() { - return this.classMixin.apply(this.prototype, arguments); - }; - - BatmanObject.prototype.mixin = BatmanObject.classMixin; - - BatmanObject.classAccessor = BatmanObject._defineAccessor; - - BatmanObject.accessor = function() { - var _ref; - return (_ref = this.prototype)._defineAccessor.apply(_ref, arguments); - }; - - BatmanObject.prototype.accessor = BatmanObject._defineAccessor; - - BatmanObject.wrapClassAccessor = BatmanObject._defineWrapAccessor; - - BatmanObject.wrapAccessor = function() { - var _ref; - return (_ref = this.prototype)._defineWrapAccessor.apply(_ref, arguments); - }; - - BatmanObject.prototype.wrapAccessor = BatmanObject._defineWrapAccessor; - - BatmanObject.observeAll = function() { - return this.prototype.observe.apply(this.prototype, arguments); - }; - - BatmanObject.singleton = function(singletonMethodName) { - if (singletonMethodName == null) { - singletonMethodName = "sharedInstance"; - } - return this.classAccessor(singletonMethodName, { - get: function() { - var _name; - return this[_name = "_" + singletonMethodName] || (this[_name] = new this); - } - }); - }; - - BatmanObject.accessor('_batmanID', function() { - return this._batmanID(); - }); - - function BatmanObject() { - var mixins; - mixins = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - this._batman = new Batman._Batman(this); - this.mixin.apply(this, mixins); - } - - counter = 0; - - BatmanObject.prototype._batmanID = function() { - var _base, _ref; - this._batman.check(this); - if ((_ref = (_base = this._batman).id) == null) { - _base.id = counter++; - } - return this._batman.id; - }; - - BatmanObject.prototype.hashKey = function() { - var key; - if (typeof this.isEqual === 'function') { - return; - } - this.hashKey = function() { - return key; - }; - return key = ""; - }; - - BatmanObject.prototype.toJSON = function() { - var key, obj, value; - obj = {}; - for (key in this) { - if (!__hasProp.call(this, key)) continue; - value = this[key]; - if (key !== "_batman" && key !== "hashKey" && key !== "_batmanID") { - obj[key] = (value != null ? value.toJSON : void 0) ? value.toJSON() : value; - } - } - return obj; - }; - - return BatmanObject; - - })(Object); - - Batman.Object = BatmanObject; - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.Renderer = (function(_super) { - var bindingRegexp, bindingSortOrder, bindingSortPositions, k, name, pos, _i, _j, _len, _len1, _ref; - - __extends(Renderer, _super); - - Renderer.prototype.deferEvery = 50; - - function Renderer(node, context, view) { - this.node = node; - this.context = context; - this.view = view; - this.resume = __bind(this.resume, this); - - this.start = __bind(this.start, this); - - Renderer.__super__.constructor.call(this); - if (!(this.context instanceof Batman.RenderContext)) { - Batman.developer.error("Must pass a RenderContext to a renderer for rendering"); - } - this.immediate = Batman.setImmediate(this.start); - } - - Renderer.prototype.start = function() { - this.startTime = new Date; - this.prevent('parsed'); - this.prevent('rendered'); - return this.parseNode(this.node); - }; - - Renderer.prototype.resume = function() { - this.startTime = new Date; - return this.parseNode(this.resumeNode); - }; - - Renderer.prototype.finish = function() { - this.startTime = null; - this.prevent('stopped'); - this.allowAndFire('parsed'); - return this.allowAndFire('rendered'); - }; - - Renderer.prototype.stop = function() { - Batman.clearImmediate(this.immediate); - return this.fire('stopped'); - }; - - _ref = ['parsed', 'rendered', 'stopped']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - Renderer.prototype.event(k).oneShot = true; - } - - bindingRegexp = /^data\-(.*)/; - - bindingSortOrder = ["view", "renderif", "foreach", "formfor", "context", "bind", "source", "target"]; - - bindingSortPositions = {}; - - for (pos = _j = 0, _len1 = bindingSortOrder.length; _j < _len1; pos = ++_j) { - name = bindingSortOrder[pos]; - bindingSortPositions[name] = pos; - } - - Renderer.prototype._sortBindings = function(a, b) { - var aindex, bindex; - aindex = bindingSortPositions[a[0]]; - bindex = bindingSortPositions[b[0]]; - if (aindex == null) { - aindex = bindingSortOrder.length; - } - if (bindex == null) { - bindex = bindingSortOrder.length; - } - if (aindex > bindex) { - return 1; - } else if (bindex > aindex) { - return -1; - } else if (a[0] > b[0]) { - return 1; - } else if (b[0] > a[0]) { - return -1; - } else { - return 0; - } - }; - - Renderer.prototype.parseNode = function(node) { - var argument, attribute, bindings, keypath, names, nextNode, oldContext, result, skipChildren, _base, _base1, _k, _l, _len2, _len3, _ref1, _ref2, _ref3, _ref4, - _this = this; - if (this.deferEvery && (new Date - this.startTime) > this.deferEvery) { - this.resumeNode = node; - this.timeout = Batman.setImmediate(this.resume); - return; - } - if (node.getAttribute && node.attributes) { - bindings = []; - _ref1 = node.attributes; - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - attribute = _ref1[_k]; - name = (_ref2 = attribute.nodeName.match(bindingRegexp)) != null ? _ref2[1] : void 0; - if (!name) { - continue; - } - bindings.push((names = name.split('-')).length > 1 ? [names[0], names.slice(1, names.length + 1 || 9e9).join('-'), attribute.value] : [name, void 0, attribute.value]); - } - _ref3 = bindings.sort(this._sortBindings); - for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { - _ref4 = _ref3[_l], name = _ref4[0], argument = _ref4[1], keypath = _ref4[2]; - result = argument ? typeof (_base = Batman.DOM.attrReaders)[name] === "function" ? _base[name](node, argument, keypath, this.context, this) : void 0 : typeof (_base1 = Batman.DOM.readers)[name] === "function" ? _base1[name](node, keypath, this.context, this) : void 0; - if (result === false) { - skipChildren = true; - break; - } else if (result instanceof Batman.RenderContext) { - oldContext = this.context; - this.context = result; - Batman.DOM.onParseExit(node, function() { - return _this.context = oldContext; - }); - } - } - } - if ((nextNode = this.nextNode(node, skipChildren))) { - return this.parseNode(nextNode); - } else { - return this.finish(); - } - }; - - Renderer.prototype.nextNode = function(node, skipChildren) { - var children, nextParent, parentSibling, sibling, _ref1, _ref2; - if (!skipChildren) { - children = node.childNodes; - if (children != null ? children.length : void 0) { - return children[0]; - } - } - sibling = node.nextSibling; - if ((_ref1 = Batman.DOM.onParseExit(node)) != null) { - _ref1.forEach(function(callback) { - return callback(); - }); - } - Batman.DOM.forgetParseExit(node); - if (this.node === node) { - return; - } - if (sibling) { - return sibling; - } - nextParent = node; - while (nextParent = nextParent.parentNode) { - parentSibling = nextParent.nextSibling; - if ((_ref2 = Batman.DOM.onParseExit(nextParent)) != null) { - _ref2.forEach(function(callback) { - return callback(); - }); - } - Batman.DOM.forgetParseExit(nextParent); - if (this.node === nextParent) { - return; - } - if (parentSibling) { - return parentSibling; - } - } - }; - - return Renderer; - - })(Batman.Object); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.AbstractBinding = (function(_super) { - var get_dot_rx, get_rx, keypath_rx; - - __extends(AbstractBinding, _super); - - keypath_rx = /(^|,)\s*(?:(true|false)|("[^"]*")|(\{[^\}]*\})|([a-zA-Z][\w\-\.]*[\?\!]?))\s*(?=$|,)/g; - - get_dot_rx = /(?:\]\.)(.+?)(?=[\[\.]|\s*\||$)/; - - get_rx = /(?!^\s*)\[(.*?)\]/g; - - AbstractBinding.accessor('filteredValue', { - get: function() { - var renderContext, result, self, unfilteredValue; - unfilteredValue = this.get('unfilteredValue'); - self = this; - renderContext = this.get('renderContext'); - if (this.filterFunctions.length > 0) { - Batman.developer.currentFilterStack = renderContext; - result = this.filterFunctions.reduce(function(value, fn, i) { - var args; - args = self.filterArguments[i].map(function(argument) { - if (argument._keypath) { - return self.renderContext.get(argument._keypath); - } else { - return argument; - } - }); - args.unshift(value); - while (args.length < (fn.length - 1)) { - args.push(void 0); - } - args.push(self); - return fn.apply(renderContext, args); - }, unfilteredValue); - Batman.developer.currentFilterStack = null; - return result; - } else { - return unfilteredValue; - } - }, - set: function(_, newValue) { - return this.set('unfilteredValue', newValue); - } - }); - - AbstractBinding.accessor('unfilteredValue', { - get: function() { - var k; - if (k = this.get('key')) { - return Batman.RenderContext.deProxy(Batman.getPath(this, ['keyContext', k])); - } else { - return this.get('value'); - } - }, - set: function(_, value) { - var k, keyContext, prop; - if (k = this.get('key')) { - keyContext = this.get('keyContext'); - if (keyContext && keyContext !== Batman.container) { - prop = Batman.Property.forBaseAndKey(keyContext, k); - return prop.setValue(value); - } - } else { - return this.set('value', value); - } - } - }); - - AbstractBinding.accessor('keyContext', function() { - return this.renderContext.contextForKey(this.key); - }); - - AbstractBinding.prototype.bindImmediately = true; - - AbstractBinding.prototype.shouldSet = true; - - AbstractBinding.prototype.isInputBinding = false; - - AbstractBinding.prototype.escapeValue = true; - - function AbstractBinding(node, keyPath, renderContext, renderer, only) { - this.node = node; - this.keyPath = keyPath; - this.renderContext = renderContext; - this.renderer = renderer; - this.only = only != null ? only : false; - this._fireDataChange = __bind(this._fireDataChange, this); - - this._fireNodeChange = __bind(this._fireNodeChange, this); - - this.parseFilter(); - if (this.bindImmediately) { - this.bind(); - } - } - - AbstractBinding.prototype.isTwoWay = function() { - return (this.key != null) && this.filterFunctions.length === 0; - }; - - AbstractBinding.prototype.bind = function() { - var _ref, _ref1; - if ((this.node != null) && ((_ref = this.only) === false || _ref === 'nodeChange') && Batman.DOM.nodeIsEditable(this.node)) { - Batman.DOM.events.change(this.node, this._fireNodeChange); - if (this.only === 'nodeChange') { - this._fireNodeChange(); - } - } - if ((_ref1 = this.only) === false || _ref1 === 'dataChange') { - this.observeAndFire('filteredValue', this._fireDataChange); - } - if (this.node != null) { - return Batman.DOM.trackBinding(this, this.node); - } - }; - - AbstractBinding.prototype._fireNodeChange = function(event) { - var val; - this.shouldSet = false; - val = this.value || this.get('keyContext'); - if (typeof this.nodeChange === "function") { - this.nodeChange(this.node, val, event); - } - this.fire('nodeChange', this.node, val); - return this.shouldSet = true; - }; - - AbstractBinding.prototype._fireDataChange = function(value) { - if (this.shouldSet) { - if (typeof this.dataChange === "function") { - this.dataChange(value, this.node); - } - return this.fire('dataChange', value, this.node); - } - }; - - AbstractBinding.prototype.die = function() { - var _ref; - this.forget(); - if ((_ref = this._batman.properties) != null) { - _ref.forEach(function(key, property) { - return property.die(); - }); - } - this.fire('die'); - this.dead = true; - return true; - }; - - AbstractBinding.prototype.parseFilter = function() { - var args, filter, filterName, filterString, filters, key, keyPath, orig, split; - this.filterFunctions = []; - this.filterArguments = []; - keyPath = this.keyPath; - while (get_dot_rx.test(keyPath)) { - keyPath = keyPath.replace(get_dot_rx, "]['$1']"); - } - filters = keyPath.replace(get_rx, " | get $1 ").replace(/'/g, '"').split(/(?!")\s+\|\s+(?!")/); - try { - key = this.parseSegment(orig = filters.shift())[0]; - } catch (e) { - Batman.developer.warn(e); - Batman.developer.error("Error! Couldn't parse keypath in \"" + orig + "\". Parsing error above."); - } - if (key && key._keypath) { - this.key = key._keypath; - } else { - this.value = key; - } - if (filters.length) { - while (filterString = filters.shift()) { - split = filterString.indexOf(' '); - if (split === -1) { - split = filterString.length; - } - filterName = filterString.substr(0, split); - args = filterString.substr(split); - if (!(filter = Batman.Filters[filterName])) { - return Batman.developer.error("Unrecognized filter '" + filterName + "' in key \"" + this.keyPath + "\"!"); - } - this.filterFunctions.push(filter); - try { - this.filterArguments.push(this.parseSegment(args)); - } catch (e) { - Batman.developer.error("Bad filter arguments \"" + args + "\"!"); - } - } - return true; - } - }; - - AbstractBinding.prototype.parseSegment = function(segment) { - segment = segment.replace(keypath_rx, function(match, start, bool, string, object, keypath, offset) { - var replacement; - if (start == null) { - start = ''; - } - replacement = keypath ? '{"_keypath": "' + keypath + '"}' : bool || string || object; - return start + replacement; - }); - return JSON.parse("[" + segment + "]"); - }; - - return AbstractBinding; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.ViewBinding = (function(_super) { - - __extends(ViewBinding, _super); - - function ViewBinding() { - ViewBinding.__super__.constructor.apply(this, arguments); - this.renderer.prevent('rendered'); - this.node.removeAttribute('data-view'); - } - - ViewBinding.prototype.dataChange = function(viewClassOrInstance) { - var _this = this; - if (viewClassOrInstance == null) { - return; - } - if (viewClassOrInstance.isView) { - this.view = viewClassOrInstance; - this.view.set('context', this.renderContext); - this.view.set('node', this.node); - } else { - this.view = new viewClassOrInstance({ - node: this.node, - context: this.renderContext, - parentView: this.renderer.view - }); - } - this.view.on('ready', function() { - return _this.renderer.allowAndFire('rendered'); - }); - return this.die(); - }; - - return ViewBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.ViewArgumentBinding = (function(_super) { - - __extends(ViewArgumentBinding, _super); - - function ViewArgumentBinding() { - return ViewArgumentBinding.__super__.constructor.apply(this, arguments); - } - - return ViewArgumentBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.ShowHideBinding = (function(_super) { - - __extends(ShowHideBinding, _super); - - function ShowHideBinding(node, className, key, context, parentRenderer, invert) { - var display; - this.invert = invert != null ? invert : false; - display = node.style.display; - if (!display || display === 'none') { - display = ''; - } - this.originalDisplay = display; - ShowHideBinding.__super__.constructor.apply(this, arguments); - } - - ShowHideBinding.prototype.dataChange = function(value) { - var hide, view, _ref; - view = Batman._data(this.node, 'view'); - if (!!value === !this.invert) { - if (view != null) { - view.fire('beforeAppear', this.node); - } - if ((_ref = Batman.data(this.node, 'show')) != null) { - _ref.call(this.node); - } - this.node.style.display = this.originalDisplay; - return view != null ? view.fire('appear', this.node) : void 0; - } else { - if (view != null) { - view.fire('beforeDisappear', this.node); - } - if (typeof (hide = Batman.data(this.node, 'hide')) === 'function') { - hide.call(this.node); - } else { - Batman.DOM.setStyleProperty(this.node, 'display', 'none', 'important'); - } - return view != null ? view.fire('disappear', this.node) : void 0; - } - }; - - return ShowHideBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.SelectBinding = (function(_super) { - - __extends(SelectBinding, _super); - - SelectBinding.prototype.isInputBinding = true; - - SelectBinding.prototype.canSetImplicitly = true; - - function SelectBinding() { - this.updateOptionBindings = __bind(this.updateOptionBindings, this); - - this.nodeChange = __bind(this.nodeChange, this); - - this.dataChange = __bind(this.dataChange, this); - - this.childBindingAdded = __bind(this.childBindingAdded, this); - this.selectedBindings = new Batman.SimpleSet; - SelectBinding.__super__.constructor.apply(this, arguments); - } - - SelectBinding.prototype.childBindingAdded = function(binding) { - var dataChangeHandler, - _this = this; - if (binding instanceof Batman.DOM.CheckedBinding) { - binding.on('dataChange', dataChangeHandler = function() { - return _this.nodeChange(); - }); - binding.on('die', function() { - binding.forget('dataChange', dataChangeHandler); - return _this.selectedBindings.remove(binding); - }); - this.selectedBindings.add(binding); - } else if (binding instanceof Batman.DOM.IteratorBinding) { - binding.on('nodeAdded', dataChangeHandler = function() { - return _this._fireDataChange(_this.get('filteredValue')); - }); - binding.on('nodeRemoved', dataChangeHandler); - binding.on('die', function() { - binding.forget('nodeAdded', dataChangeHandler); - return binding.forget('nodeRemoved', dataChangeHandler); - }); - } else { - return; - } - return this._fireDataChange(this.get('filteredValue')); - }; - - SelectBinding.prototype.lastKeyContext = null; - - SelectBinding.prototype.dataChange = function(newValue) { - var child, matches, valueToChild, _i, _len, _name, _ref, - _this = this; - this.lastKeyContext || (this.lastKeyContext = this.get('keyContext')); - if (this.lastKeyContext !== this.get('keyContext')) { - this.canSetImplicitly = true; - this.lastKeyContext = this.get('keyContext'); - } - if (newValue != null ? newValue.forEach : void 0) { - valueToChild = {}; - _ref = this.node.children; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - child.selected = false; - matches = valueToChild[_name = child.value] || (valueToChild[_name] = []); - matches.push(child); - } - newValue.forEach(function(value) { - var children, node, _j, _len1, _results; - if (children = valueToChild[value]) { - _results = []; - for (_j = 0, _len1 = children.length; _j < _len1; _j++) { - node = children[_j]; - _results.push(node.selected = true); - } - return _results; - } - }); - } else { - if (!(newValue != null) && this.canSetImplicitly) { - if (this.node.value) { - this.canSetImplicitly = false; - this.set('unfilteredValue', this.node.value); - } - } else { - this.canSetImplicitly = false; - Batman.DOM.valueForNode(this.node, newValue, this.escapeValue); - } - } - this.updateOptionBindings(); - }; - - SelectBinding.prototype.nodeChange = function() { - var c, selections; - if (this.isTwoWay()) { - selections = this.node.multiple ? (function() { - var _i, _len, _ref, _results; - _ref = this.node.children; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - c = _ref[_i]; - if (c.selected) { - _results.push(c.value); - } - } - return _results; - }).call(this) : this.node.value; - if (typeof selections === Array && selections.length === 1) { - selections = selections[0]; - } - this.set('unfilteredValue', selections); - this.updateOptionBindings(); - } - }; - - SelectBinding.prototype.updateOptionBindings = function() { - return this.selectedBindings.forEach(function(binding) { - return binding._fireNodeChange(); - }); - }; - - return SelectBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.RouteBinding = (function(_super) { - - __extends(RouteBinding, _super); - - function RouteBinding() { - return RouteBinding.__super__.constructor.apply(this, arguments); - } - - RouteBinding.prototype.onATag = false; - - RouteBinding.accessor('dispatcher', function() { - return this.renderContext.get('dispatcher') || Batman.App.get('current.dispatcher'); - }); - - RouteBinding.prototype.bind = function() { - var _this = this; - if (this.node.nodeName.toUpperCase() === 'A') { - this.onATag = true; - } - RouteBinding.__super__.bind.apply(this, arguments); - return Batman.DOM.events.click(this.node, function(node, event) { - var params; - if (event.__batmanActionTaken) { - return; - } - event.__batmanActionTaken = true; - params = _this.pathFromValue(_this.get('filteredValue')); - if (params != null) { - return Batman.redirect(params); - } - }); - }; - - RouteBinding.prototype.dataChange = function(value) { - var path; - if (value != null) { - path = this.pathFromValue(value); - } - if (this.onATag) { - if ((path != null) && (Batman.navigator != null)) { - path = Batman.navigator.linkTo(path); - } else { - path = "#"; - } - return this.node.href = path; - } - }; - - RouteBinding.prototype.pathFromValue = function(value) { - var _ref; - if (value != null) { - if (value.isNamedRouteQuery) { - return value.get('path'); - } else { - return (_ref = this.get('dispatcher')) != null ? _ref.pathFromParams(value) : void 0; - } - } - }; - - return RouteBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.RadioBinding = (function(_super) { - - __extends(RadioBinding, _super); - - function RadioBinding() { - return RadioBinding.__super__.constructor.apply(this, arguments); - } - - RadioBinding.accessor('parsedNodeValue', function() { - return Batman.DOM.attrReaders._parseAttribute(this.node.value); - }); - - RadioBinding.prototype.firstBind = true; - - RadioBinding.prototype.dataChange = function(value) { - var boundValue; - boundValue = this.get('filteredValue'); - if (boundValue != null) { - this.node.checked = boundValue === Batman.DOM.attrReaders._parseAttribute(this.node.value); - } else { - if (this.firstBind && this.node.checked) { - this.set('filteredValue', this.get('parsedNodeValue')); - } - } - return this.firstBind = false; - }; - - RadioBinding.prototype.nodeChange = function(node) { - if (this.isTwoWay()) { - return this.set('filteredValue', this.get('parsedNodeValue')); - } - }; - - return RadioBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.MixinBinding = (function(_super) { - - __extends(MixinBinding, _super); - - function MixinBinding() { - return MixinBinding.__super__.constructor.apply(this, arguments); - } - - MixinBinding.prototype.dataChange = function(value) { - if (value != null) { - return Batman.mixin(this.node, value); - } - }; - - return MixinBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.FileBinding = (function(_super) { - - __extends(FileBinding, _super); - - function FileBinding() { - return FileBinding.__super__.constructor.apply(this, arguments); - } - - FileBinding.prototype.isInputBinding = true; - - FileBinding.prototype.nodeChange = function(node, subContext) { - if (!this.isTwoWay()) { - return; - } - if (node.hasAttribute('multiple')) { - return this.set('filteredValue', Array.prototype.slice.call(node.files)); - } else { - return this.set('filteredValue', node.files[0]); - } - }; - - return FileBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.DeferredRenderingBinding = (function(_super) { - - __extends(DeferredRenderingBinding, _super); - - DeferredRenderingBinding.prototype.rendered = false; - - function DeferredRenderingBinding() { - DeferredRenderingBinding.__super__.constructor.apply(this, arguments); - this.node.removeAttribute("data-renderif"); - } - - DeferredRenderingBinding.prototype.nodeChange = function() {}; - - DeferredRenderingBinding.prototype.dataChange = function(value) { - if (value && !this.rendered) { - return this.render(); - } - }; - - DeferredRenderingBinding.prototype.render = function() { - new Batman.Renderer(this.node, this.renderContext, this.renderer.view); - return this.rendered = true; - }; - - return DeferredRenderingBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.Binding = (function(_super) { - - __extends(Binding, _super); - - function Binding(node) { - var _ref; - this.isInputBinding = (_ref = node.nodeName.toLowerCase()) === 'input' || _ref === 'textarea'; - Binding.__super__.constructor.apply(this, arguments); - } - - Binding.prototype.nodeChange = function(node, context) { - if (this.isTwoWay()) { - return this.set('filteredValue', this.node.value); - } - }; - - Binding.prototype.dataChange = function(value, node) { - return Batman.DOM.valueForNode(this.node, value, this.escapeValue); - }; - - return Binding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.DOM.AbstractAttributeBinding = (function(_super) { - - __extends(AbstractAttributeBinding, _super); - - function AbstractAttributeBinding() { - var args, attributeName, node; - node = arguments[0], attributeName = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - this.attributeName = attributeName; - AbstractAttributeBinding.__super__.constructor.apply(this, [node].concat(__slice.call(args))); - } - - return AbstractAttributeBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.FormBinding = (function(_super) { - - __extends(FormBinding, _super); - - FormBinding.current = null; - - FormBinding.prototype.errorClass = 'error'; - - FormBinding.prototype.defaultErrorsListSelector = 'div.errors'; - - FormBinding.accessor('errorsListSelector', function() { - return this.get('node').getAttribute('data-errors-list') || this.defaultErrorsListSelector; - }); - - function FormBinding(node, contextName, keyPath, renderContext, renderer, only) { - this.childBindingAdded = __bind(this.childBindingAdded, this); - FormBinding.__super__.constructor.apply(this, arguments); - this.contextName = contextName; - delete this.attributeName; - Batman.DOM.events.submit(this.get('node'), function(node, e) { - return Batman.DOM.preventDefault(e); - }); - this.setupErrorsList(); - } - - FormBinding.prototype.childBindingAdded = function(binding) { - var field, index, node; - if (binding.isInputBinding && Batman.isChildOf(this.get('node'), binding.get('node'))) { - if (~(index = binding.get('key').indexOf(this.contextName))) { - node = binding.get('node'); - field = binding.get('key').slice(index + this.contextName.length + 1); - return new Batman.DOM.AddClassBinding(node, this.errorClass, this.get('keyPath') + (" | get 'errors." + field + ".length'"), this.renderContext, this.renderer); - } - } - }; - - FormBinding.prototype.setupErrorsList = function() { - if (this.errorsListNode = Batman.DOM.querySelector(this.get('node'), this.get('errorsListSelector'))) { - Batman.DOM.setInnerHTML(this.errorsListNode, this.errorsListHTML()); - if (!this.errorsListNode.getAttribute('data-showif')) { - return this.errorsListNode.setAttribute('data-showif', "" + this.contextName + ".errors.length"); - } - } - }; - - FormBinding.prototype.errorsListHTML = function() { - return "
    \n
  • \n
"; - }; - - return FormBinding; - - })(Batman.DOM.AbstractAttributeBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.EventBinding = (function(_super) { - - __extends(EventBinding, _super); - - EventBinding.prototype.bindImmediately = false; - - function EventBinding(node, eventName, key, context) { - var attacher, callback, - _this = this; - EventBinding.__super__.constructor.apply(this, arguments); - callback = function() { - var _ref; - return (_ref = _this.get('filteredValue')) != null ? _ref.apply(_this.get('callbackContext'), arguments) : void 0; - }; - if (attacher = Batman.DOM.events[this.attributeName]) { - attacher(this.node, callback, context); - } else { - Batman.DOM.events.other(this.node, this.attributeName, callback, context); - } - this.bind(); - } - - EventBinding.accessor('callbackContext', function() { - var contextKeySegments; - contextKeySegments = this.key.split('.'); - contextKeySegments.pop(); - if (contextKeySegments.length > 0) { - return this.get('keyContext').get(contextKeySegments.join('.')); - } else { - return this.get('keyContext'); - } - }); - - EventBinding.wrapAccessor('unfilteredValue', function(core) { - return { - get: function() { - var functionKey, k, keyContext, keys; - if (k = this.get('key')) { - keys = k.split('.'); - if (keys.length > 1) { - functionKey = keys.pop(); - keyContext = Batman.getPath(this, ['keyContext'].concat(keys)); - keyContext = Batman.RenderContext.deProxy(keyContext); - if (keyContext != null) { - return keyContext[functionKey]; - } - } - } - return core.get.apply(this, arguments); - } - }; - }); - - return EventBinding; - - })(Batman.DOM.AbstractAttributeBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.NodeAttributeBinding = (function(_super) { - - __extends(NodeAttributeBinding, _super); - - function NodeAttributeBinding() { - return NodeAttributeBinding.__super__.constructor.apply(this, arguments); - } - - NodeAttributeBinding.prototype.dataChange = function(value) { - if (value == null) { - value = ""; - } - return this.node[this.attributeName] = value; - }; - - NodeAttributeBinding.prototype.nodeChange = function(node) { - if (this.isTwoWay()) { - return this.set('filteredValue', Batman.DOM.attrReaders._parseAttribute(node[this.attributeName])); - } - }; - - return NodeAttributeBinding; - - })(Batman.DOM.AbstractAttributeBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.CheckedBinding = (function(_super) { - - __extends(CheckedBinding, _super); - - function CheckedBinding() { - return CheckedBinding.__super__.constructor.apply(this, arguments); - } - - CheckedBinding.prototype.isInputBinding = true; - - CheckedBinding.prototype.dataChange = function(value) { - return this.node[this.attributeName] = !!value; - }; - - return CheckedBinding; - - })(Batman.DOM.NodeAttributeBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.AttributeBinding = (function(_super) { - - __extends(AttributeBinding, _super); - - function AttributeBinding() { - return AttributeBinding.__super__.constructor.apply(this, arguments); - } - - AttributeBinding.prototype.dataChange = function(value) { - return this.node.setAttribute(this.attributeName, value); - }; - - AttributeBinding.prototype.nodeChange = function(node) { - if (this.isTwoWay()) { - return this.set('filteredValue', Batman.DOM.attrReaders._parseAttribute(node.getAttribute(this.attributeName))); - } - }; - - return AttributeBinding; - - })(Batman.DOM.AbstractAttributeBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.AddClassBinding = (function(_super) { - - __extends(AddClassBinding, _super); - - function AddClassBinding(node, className, keyPath, renderContext, renderer, only, invert) { - var name, names; - this.invert = invert != null ? invert : false; - names = className.split('|'); - this.classes = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = names.length; _i < _len; _i++) { - name = names[_i]; - _results.push({ - name: name, - pattern: new RegExp("(?:^|\\s)" + name + "(?:$|\\s)", 'i') - }); - } - return _results; - })(); - AddClassBinding.__super__.constructor.apply(this, arguments); - delete this.attributeName; - } - - AddClassBinding.prototype.dataChange = function(value) { - var currentName, includesClassName, name, pattern, _i, _len, _ref, _ref1; - currentName = this.node.className; - _ref = this.classes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], name = _ref1.name, pattern = _ref1.pattern; - includesClassName = pattern.test(currentName); - if (!!value === !this.invert) { - if (!includesClassName) { - this.node.className = "" + currentName + " " + name; - } - } else { - if (includesClassName) { - this.node.className = currentName.replace(pattern, ' '); - } - } - } - return true; - }; - - return AddClassBinding; - - })(Batman.DOM.AbstractAttributeBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.AbstractCollectionBinding = (function(_super) { - - __extends(AbstractCollectionBinding, _super); - - function AbstractCollectionBinding() { - return AbstractCollectionBinding.__super__.constructor.apply(this, arguments); - } - - AbstractCollectionBinding.prototype.bindCollection = function(newCollection) { - var _ref; - if (newCollection instanceof Batman.Hash) { - newCollection = newCollection.meta; - } - if (newCollection === this.collection) { - return true; - } else { - this.unbindCollection(); - this.collection = newCollection; - if ((_ref = this.collection) != null ? _ref.isObservable : void 0) { - this.collection.observeAndFire('toArray', this.handleArrayChanged); - return true; - } - } - return false; - }; - - AbstractCollectionBinding.prototype.unbindCollection = function() { - var _ref; - if ((_ref = this.collection) != null ? _ref.isObservable : void 0) { - return this.collection.forget('toArray', this.handleArrayChanged); - } - }; - - AbstractCollectionBinding.prototype.handleArrayChanged = function() {}; - - AbstractCollectionBinding.prototype.die = function() { - this.unbindCollection(); - return AbstractCollectionBinding.__super__.die.apply(this, arguments); - }; - - return AbstractCollectionBinding; - - })(Batman.DOM.AbstractAttributeBinding); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.DOM.StyleBinding = (function(_super) { - - __extends(StyleBinding, _super); - - StyleBinding.SingleStyleBinding = (function(_super1) { - - __extends(SingleStyleBinding, _super1); - - SingleStyleBinding.prototype.isTwoWay = function() { - return false; - }; - - function SingleStyleBinding() { - var args, parent, _i; - args = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), parent = arguments[_i++]; - this.parent = parent; - SingleStyleBinding.__super__.constructor.apply(this, args); - } - - SingleStyleBinding.prototype.dataChange = function(value) { - return this.parent.setStyle(this.attributeName, value); - }; - - return SingleStyleBinding; - - })(Batman.DOM.AbstractAttributeBinding); - - function StyleBinding() { - this.setStyle = __bind(this.setStyle, this); - - this.handleArrayChanged = __bind(this.handleArrayChanged, this); - this.oldStyles = {}; - this.styleBindings = {}; - StyleBinding.__super__.constructor.apply(this, arguments); - } - - StyleBinding.prototype.dataChange = function(value) { - var colonSplitCSSValues, cssName, key, style, _i, _len, _ref, _ref1, _results; - if (!value) { - this.resetStyles(); - return; - } - this.unbindCollection(); - if (typeof value === 'string') { - this.resetStyles(); - _ref = value.split(';'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - style = _ref[_i]; - _ref1 = style.split(":"), cssName = _ref1[0], colonSplitCSSValues = 2 <= _ref1.length ? __slice.call(_ref1, 1) : []; - this.setStyle(cssName, colonSplitCSSValues.join(":")); - } - return; - } - if (value instanceof Batman.Hash) { - return this.bindCollection(value); - } else { - if (value instanceof Batman.Object) { - value = value.toJSON(); - } - this.resetStyles(); - _results = []; - for (key in value) { - if (!__hasProp.call(value, key)) continue; - _results.push(this.bindSingleAttribute(key, "" + this.keyPath + "." + key)); - } - return _results; - } - }; - - StyleBinding.prototype.handleArrayChanged = function(array) { - var _this = this; - return this.collection.forEach(function(key, value) { - return _this.bindSingleAttribute(key, "" + _this.keyPath + "." + key); - }); - }; - - StyleBinding.prototype.bindSingleAttribute = function(attr, keyPath) { - return this.styleBindings[attr] = new this.constructor.SingleStyleBinding(this.node, attr, keyPath, this.renderContext, this.renderer, this.only, this); - }; - - StyleBinding.prototype.setStyle = function(key, value) { - key = Batman.helpers.camelize(key.trim(), true); - if (this.oldStyles[key] == null) { - this.oldStyles[key] = this.node.style[key] || ""; - } - if (value != null ? value.trim : void 0) { - value = value.trim(); - } - if (value == null) { - value = ""; - } - return this.node.style[key] = value; - }; - - StyleBinding.prototype.resetStyles = function() { - var cssName, cssValue, _ref, _results; - _ref = this.oldStyles; - _results = []; - for (cssName in _ref) { - if (!__hasProp.call(_ref, cssName)) continue; - cssValue = _ref[cssName]; - _results.push(this.setStyle(cssName, cssValue)); - } - return _results; - }; - - StyleBinding.prototype.resetBindings = function() { - var attribute, binding, _ref; - _ref = this.styleBindings; - for (attribute in _ref) { - binding = _ref[attribute]; - binding._fireDataChange(''); - binding.die(); - } - return this.styleBindings = {}; - }; - - StyleBinding.prototype.unbindCollection = function() { - this.resetBindings(); - return StyleBinding.__super__.unbindCollection.apply(this, arguments); - }; - - return StyleBinding; - - })(Batman.DOM.AbstractCollectionBinding); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.IteratorBinding = (function(_super) { - - __extends(IteratorBinding, _super); - - IteratorBinding.prototype.currentActionNumber = 0; - - IteratorBinding.prototype.queuedActionNumber = 0; - - IteratorBinding.prototype.bindImmediately = false; - - function IteratorBinding(sourceNode, iteratorName, key, context, parentRenderer) { - var previousSiblingNode, - _this = this; - this.iteratorName = iteratorName; - this.key = key; - this.context = context; - this.parentRenderer = parentRenderer; - this.handleArrayChanged = __bind(this.handleArrayChanged, this); - - this.nodeMap = new Batman.SimpleHash; - this.rendererMap = new Batman.SimpleHash; - this.fragment = document.createDocumentFragment(); - this.prototypeNode = sourceNode.cloneNode(true); - this.prototypeNode.removeAttribute("data-foreach-" + this.iteratorName); - previousSiblingNode = sourceNode.nextSibling; - this.startNode = document.createComment("start " + this.iteratorName + "-" + (this.get('_batmanID'))); - this.endNode = document.createComment("end " + this.iteratorName + "-" + (this.get('_batmanID'))); - this.endNode[Batman.expando] = sourceNode[Batman.expando]; - if (Batman.canDeleteExpando) { - delete sourceNode[Batman.expando]; - } - Batman.DOM.insertBefore(sourceNode.parentNode, this.startNode, previousSiblingNode); - Batman.DOM.insertBefore(sourceNode.parentNode, this.endNode, previousSiblingNode); - this.parentRenderer.prevent('rendered'); - Batman.DOM.onParseExit(sourceNode.parentNode, function() { - Batman.DOM.destroyNode(sourceNode); - _this.bind(); - return _this.parentRenderer.allowAndFire('rendered'); - }); - IteratorBinding.__super__.constructor.call(this, this.endNode, this.iteratorName, this.key, this.context, this.parentRenderer); - } - - IteratorBinding.prototype.parentNode = function() { - return this.endNode.parentNode; - }; - - IteratorBinding.prototype.die = function() { - this.dead = true; - return IteratorBinding.__super__.die.apply(this, arguments); - }; - - IteratorBinding.prototype.dataChange = function(collection) { - var items, _items; - if (collection != null) { - if (!this.bindCollection(collection)) { - items = (collection != null ? collection.forEach : void 0) ? (_items = [], collection.forEach(function(item) { - return _items.push(item); - }), _items) : Object.keys(collection); - return this.handleArrayChanged(items); - } - } else { - return this.handleArrayChanged([]); - } - }; - - IteratorBinding.prototype.handleArrayChanged = function(newItems) { - var existingNode, index, newItem, node, nodeAtIndex, parentNode, startIndex, unseenNodeMap, _i, _len, - _this = this; - parentNode = this.parentNode(); - startIndex = this._getStartNodeIndex() + 1; - unseenNodeMap = this.nodeMap.merge(); - if (newItems != null) { - for (index = _i = 0, _len = newItems.length; _i < _len; index = ++_i) { - newItem = newItems[index]; - nodeAtIndex = parentNode.childNodes[startIndex + index]; - if ((nodeAtIndex != null) && this._itemForNode(nodeAtIndex) === newItem) { - unseenNodeMap.unset(newItem); - continue; - } else { - node = (existingNode = this.nodeMap.get(newItem)) ? (unseenNodeMap.unset(newItem), existingNode) : this._newNodeForItem(newItem); - Batman.DOM.insertBefore(this.parentNode(), node, nodeAtIndex); - } - } - } - unseenNodeMap.forEach(function(item, node) { - return _this._removeItem(item); - }); - }; - - IteratorBinding.prototype._itemForNode = function(node) { - return Batman._data(node, "" + this.iteratorName + "Item"); - }; - - IteratorBinding.prototype._newNodeForItem = function(newItem) { - var newNode, renderer, - _this = this; - newNode = this.prototypeNode.cloneNode(true); - Batman._data(newNode, "" + this.iteratorName + "Item", newItem); - this.nodeMap.set(newItem, newNode); - this.parentRenderer.prevent('rendered'); - renderer = new Batman.Renderer(newNode, this.renderContext.descend(newItem, this.iteratorName), this.parentRenderer.view); - renderer.on('rendered', function() { - Batman.DOM.propagateBindingEvents(newNode); - _this.fire('nodeAdded', newNode, newItem); - return _this.parentRenderer.allowAndFire('rendered'); - }); - return newNode; - }; - - IteratorBinding.prototype._getStartNodeIndex = function() { - var index, node, _i, _len, _ref; - _ref = this.parentNode().childNodes; - for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { - node = _ref[index]; - if (node === this.startNode) { - return index; - } - } - return 0; - }; - - IteratorBinding.prototype._removeItem = function(item) { - var node; - node = this.nodeMap.unset(item); - Batman.DOM.destroyNode(node); - return this.fire('nodeRemoved', node, item); - }; - - return IteratorBinding; - - })(Batman.DOM.AbstractCollectionBinding); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.ClassBinding = (function(_super) { - - __extends(ClassBinding, _super); - - function ClassBinding() { - this.handleArrayChanged = __bind(this.handleArrayChanged, this); - return ClassBinding.__super__.constructor.apply(this, arguments); - } - - ClassBinding.prototype.dataChange = function(value) { - if (value != null) { - this.unbindCollection(); - if (typeof value === 'string') { - return this.node.className = value; - } else { - this.bindCollection(value); - return this.updateFromCollection(); - } - } - }; - - ClassBinding.prototype.updateFromCollection = function() { - var array, k, v; - if (this.collection) { - array = this.collection.map ? this.collection.map(function(x) { - return x; - }) : (function() { - var _ref, _results; - _ref = this.collection; - _results = []; - for (k in _ref) { - if (!__hasProp.call(_ref, k)) continue; - v = _ref[k]; - _results.push(k); - } - return _results; - }).call(this); - if (array.toArray != null) { - array = array.toArray(); - } - return this.node.className = array.join(' '); - } - }; - - ClassBinding.prototype.handleArrayChanged = function() { - return this.updateFromCollection(); - }; - - return ClassBinding; - - })(Batman.DOM.AbstractCollectionBinding); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.ValidationError = (function(_super) { - - __extends(ValidationError, _super); - - ValidationError.accessor('fullMessage', function() { - return Batman.t('errors.format', { - attribute: Batman.helpers.humanize(this.attribute), - message: this.message - }); - }); - - function ValidationError(attribute, message) { - ValidationError.__super__.constructor.call(this, { - attribute: attribute, - message: message - }); - } - - return ValidationError; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.StorageAdapter = (function(_super) { - - __extends(StorageAdapter, _super); - - StorageAdapter.StorageError = (function(_super1) { - - __extends(StorageError, _super1); - - StorageError.prototype.name = "StorageError"; - - function StorageError(message) { - StorageError.__super__.constructor.apply(this, arguments); - this.message = message; - } - - return StorageError; - - })(Error); - - StorageAdapter.RecordExistsError = (function(_super1) { - - __extends(RecordExistsError, _super1); - - RecordExistsError.prototype.name = 'RecordExistsError'; - - function RecordExistsError(message) { - RecordExistsError.__super__.constructor.call(this, message || "Can't create this record because it already exists in the store!"); - } - - return RecordExistsError; - - })(StorageAdapter.StorageError); - - StorageAdapter.NotFoundError = (function(_super1) { - - __extends(NotFoundError, _super1); - - NotFoundError.prototype.name = 'NotFoundError'; - - function NotFoundError(message) { - NotFoundError.__super__.constructor.call(this, message || "Record couldn't be found in storage!"); - } - - return NotFoundError; - - })(StorageAdapter.StorageError); - - StorageAdapter.NotAllowedError = (function(_super1) { - - __extends(NotAllowedError, _super1); - - NotAllowedError.prototype.name = "NotAllowedError"; - - function NotAllowedError(message) { - NotAllowedError.__super__.constructor.call(this, message || "Storage operation denied access to the operation!"); - } - - return NotAllowedError; - - })(StorageAdapter.StorageError); - - StorageAdapter.NotAcceptableError = (function(_super1) { - - __extends(NotAcceptableError, _super1); - - NotAcceptableError.prototype.name = "NotAcceptableError"; - - function NotAcceptableError(message) { - NotAcceptableError.__super__.constructor.call(this, message || "Storage operation permitted but the request was malformed!"); - } - - return NotAcceptableError; - - })(StorageAdapter.StorageError); - - StorageAdapter.UnprocessableRecordError = (function(_super1) { - - __extends(UnprocessableRecordError, _super1); - - UnprocessableRecordError.prototype.name = "UnprocessableRecordError"; - - function UnprocessableRecordError(message) { - UnprocessableRecordError.__super__.constructor.call(this, message || "Storage adapter could not process the record!"); - } - - return UnprocessableRecordError; - - })(StorageAdapter.StorageError); - - StorageAdapter.InternalStorageError = (function(_super1) { - - __extends(InternalStorageError, _super1); - - InternalStorageError.prototype.name = "InternalStorageError"; - - function InternalStorageError(message) { - InternalStorageError.__super__.constructor.call(this, message || "An error occured during the storage operation!"); - } - - return InternalStorageError; - - })(StorageAdapter.StorageError); - - StorageAdapter.NotImplementedError = (function(_super1) { - - __extends(NotImplementedError, _super1); - - NotImplementedError.prototype.name = "NotImplementedError"; - - function NotImplementedError(message) { - NotImplementedError.__super__.constructor.call(this, message || "This operation is not implemented by the storage adpater!"); - } - - return NotImplementedError; - - })(StorageAdapter.StorageError); - - function StorageAdapter(model) { - var constructor; - StorageAdapter.__super__.constructor.call(this, { - model: model - }); - constructor = this.constructor; - if (constructor.ModelMixin) { - Batman.extend(model, constructor.ModelMixin); - } - if (constructor.RecordMixin) { - Batman.extend(model.prototype, constructor.RecordMixin); - } - } - - StorageAdapter.prototype.isStorageAdapter = true; - - StorageAdapter.prototype.storageKey = function(record) { - var model; - model = (record != null ? record.constructor : void 0) || this.model; - return model.get('storageKey') || Batman.helpers.pluralize(Batman.helpers.underscore(model.get('resourceName'))); - }; - - StorageAdapter.prototype.getRecordFromData = function(attributes, constructor) { - var record; - if (constructor == null) { - constructor = this.model; - } - record = new constructor(); - record._withoutDirtyTracking(function() { - return this.fromJSON(attributes); - }); - return record; - }; - - StorageAdapter.skipIfError = function(f) { - return function(env, next) { - if (env.error != null) { - return next(); - } else { - return f.call(this, env, next); - } - }; - }; - - StorageAdapter.prototype.before = function() { - return this._addFilter.apply(this, ['before'].concat(__slice.call(arguments))); - }; - - StorageAdapter.prototype.after = function() { - return this._addFilter.apply(this, ['after'].concat(__slice.call(arguments))); - }; - - StorageAdapter.prototype._inheritFilters = function() { - var filtersByKey, filtersList, key, oldFilters, position, _results; - if (!this._batman.check(this) || !this._batman.filters) { - oldFilters = this._batman.getFirst('filters'); - this._batman.filters = { - before: {}, - after: {} - }; - if (oldFilters != null) { - _results = []; - for (position in oldFilters) { - filtersByKey = oldFilters[position]; - _results.push((function() { - var _results1; - _results1 = []; - for (key in filtersByKey) { - filtersList = filtersByKey[key]; - _results1.push(this._batman.filters[position][key] = filtersList.slice(0)); - } - return _results1; - }).call(this)); - } - return _results; - } - } - }; - - StorageAdapter.prototype._addFilter = function() { - var filter, key, keys, position, _base, _i, _j, _len; - position = arguments[0], keys = 3 <= arguments.length ? __slice.call(arguments, 1, _i = arguments.length - 1) : (_i = 1, []), filter = arguments[_i++]; - this._inheritFilters(); - for (_j = 0, _len = keys.length; _j < _len; _j++) { - key = keys[_j]; - (_base = this._batman.filters[position])[key] || (_base[key] = []); - this._batman.filters[position][key].push(filter); - } - return true; - }; - - StorageAdapter.prototype.runFilter = function(position, action, env, callback) { - var actionFilters, allFilters, filters, next, - _this = this; - this._inheritFilters(); - allFilters = this._batman.filters[position].all || []; - actionFilters = this._batman.filters[position][action] || []; - env.action = action; - filters = position === 'before' ? actionFilters.concat(allFilters) : allFilters.concat(actionFilters); - next = function(newEnv) { - var nextFilter; - if (newEnv != null) { - env = newEnv; - } - if ((nextFilter = filters.shift()) != null) { - return nextFilter.call(_this, env, next); - } else { - return callback.call(_this, env); - } - }; - return next(); - }; - - StorageAdapter.prototype.runBeforeFilter = function() { - return this.runFilter.apply(this, ['before'].concat(__slice.call(arguments))); - }; - - StorageAdapter.prototype.runAfterFilter = function(action, env, callback) { - return this.runFilter('after', action, env, this.exportResult(callback)); - }; - - StorageAdapter.prototype.exportResult = function(callback) { - return function(env) { - return callback(env.error, env.result, env); - }; - }; - - StorageAdapter.prototype._jsonToAttributes = function(json) { - return JSON.parse(json); - }; - - StorageAdapter.prototype.perform = function(key, subject, options, callback) { - var env, next, - _this = this; - options || (options = {}); - env = { - options: options, - subject: subject - }; - next = function(newEnv) { - if (newEnv != null) { - env = newEnv; - } - return _this.runAfterFilter(key, env, callback); - }; - this.runBeforeFilter(key, env, function(env) { - return this[key](env, next); - }); - return void 0; - }; - - return StorageAdapter; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Batman.RestStorage = (function(_super) { - var key, _fn, _i, _len, _ref, - _this = this; - - __extends(RestStorage, _super); - - RestStorage.CommunicationError = (function(_super1) { - - __extends(CommunicationError, _super1); - - CommunicationError.prototype.name = 'CommunicationError'; - - function CommunicationError(message) { - CommunicationError.__super__.constructor.call(this, message || "A communication error has occurred!"); - } - - return CommunicationError; - - })(RestStorage.StorageError); - - RestStorage.JSONContentType = 'application/json'; - - RestStorage.PostBodyContentType = 'application/x-www-form-urlencoded'; - - RestStorage.BaseMixin = { - request: function(action, options, callback) { - if (!callback) { - callback = options; - options = {}; - } - options.method || (options.method = 'GET'); - options.action = action; - return this._doStorageOperation(options.method.toLowerCase(), options, callback); - } - }; - - RestStorage.ModelMixin = Batman.extend({}, RestStorage.BaseMixin, { - urlNestsUnder: function() { - var key, keys, parents, _i, _len; - keys = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - parents = {}; - for (_i = 0, _len = keys.length; _i < _len; _i++) { - key = keys[_i]; - parents[key + '_id'] = Batman.helpers.pluralize(key); - } - this.url = function(options) { - var childSegment, parentID, plural; - childSegment = Batman.helpers.pluralize(this.get('resourceName').toLowerCase()); - for (key in parents) { - plural = parents[key]; - parentID = options.data[key]; - if (parentID) { - delete options.data[key]; - return "" + plural + "/" + parentID + "/" + childSegment; - } - } - return childSegment; - }; - return this.prototype.url = function() { - var childSegment, id, parentID, plural, url; - childSegment = Batman.helpers.pluralize(this.constructor.get('resourceName').toLowerCase()); - for (key in parents) { - plural = parents[key]; - parentID = this.get('dirtyKeys').get(key); - if (parentID === void 0) { - parentID = this.get(key); - } - if (parentID) { - url = "" + plural + "/" + parentID + "/" + childSegment; - break; - } - } - url || (url = childSegment); - if (id = this.get('id')) { - url += '/' + id; - } - return url; - }; - } - }); - - RestStorage.RecordMixin = Batman.extend({}, RestStorage.BaseMixin); - - RestStorage.prototype.defaultRequestOptions = { - type: 'json' - }; - - RestStorage.prototype._implicitActionNames = ['create', 'read', 'update', 'destroy', 'readAll']; - - RestStorage.prototype.serializeAsForm = true; - - function RestStorage() { - RestStorage.__super__.constructor.apply(this, arguments); - this.defaultRequestOptions = Batman.extend({}, this.defaultRequestOptions); - } - - RestStorage.prototype.recordJsonNamespace = function(record) { - return Batman.helpers.singularize(this.storageKey(record)); - }; - - RestStorage.prototype.collectionJsonNamespace = function(constructor) { - return Batman.helpers.pluralize(this.storageKey(constructor.prototype)); - }; - - RestStorage.prototype._execWithOptions = function(object, key, options, context) { - if (context == null) { - context = object; - } - if (typeof object[key] === 'function') { - return object[key].call(context, options); - } else { - return object[key]; - } - }; - - RestStorage.prototype._defaultCollectionUrl = function(model) { - return "" + (this.storageKey(model.prototype)); - }; - - RestStorage.prototype._addParams = function(url, options) { - var _ref; - if (options && options.action && !(_ref = options.action, __indexOf.call(this._implicitActionNames, _ref) >= 0)) { - url += '/' + options.action.toLowerCase(); - } - return url; - }; - - RestStorage.prototype._addUrlAffixes = function(url, subject, env) { - var prefix, segments; - segments = [url, this.urlSuffix(subject, env)]; - if (url.charAt(0) !== '/') { - prefix = this.urlPrefix(subject, env); - if (prefix.charAt(prefix.length - 1) !== '/') { - segments.unshift('/'); - } - segments.unshift(prefix); - } - return segments.join(''); - }; - - RestStorage.prototype.urlPrefix = function(object, env) { - return this._execWithOptions(object, 'urlPrefix', env.options) || ''; - }; - - RestStorage.prototype.urlSuffix = function(object, env) { - return this._execWithOptions(object, 'urlSuffix', env.options) || ''; - }; - - RestStorage.prototype.urlForRecord = function(record, env) { - var id, url, _ref; - if ((_ref = env.options) != null ? _ref.recordUrl : void 0) { - url = this._execWithOptions(env.options, 'recordUrl', env.options, record); - } else if (record.url) { - url = this._execWithOptions(record, 'url', env.options); - } else { - url = record.constructor.url ? this._execWithOptions(record.constructor, 'url', env.options) : this._defaultCollectionUrl(record.constructor); - if (env.action !== 'create') { - if ((id = record.get('id')) != null) { - url = url + "/" + id; - } else { - throw new this.constructor.StorageError("Couldn't get/set record primary key on " + env.action + "!"); - } - } - } - return this._addUrlAffixes(this._addParams(url, env.options), record, env); - }; - - RestStorage.prototype.urlForCollection = function(model, env) { - var url, _ref; - url = ((_ref = env.options) != null ? _ref.collectionUrl : void 0) ? this._execWithOptions(env.options, 'collectionUrl', env.options, env.options.urlContext) : model.url ? this._execWithOptions(model, 'url', env.options) : this._defaultCollectionUrl(model, env.options); - return this._addUrlAffixes(this._addParams(url, env.options), model, env); - }; - - RestStorage.prototype.request = function(env, next) { - var options; - options = Batman.extend(env.options, { - autosend: false, - success: function(data) { - return env.data = data; - }, - error: function(error) { - return env.error = error; - }, - loaded: function() { - env.response = env.request.get('response'); - return next(); - } - }); - env.request = new Batman.Request(options); - return env.request.send(); - }; - - RestStorage.prototype.perform = function(key, record, options, callback) { - options || (options = {}); - Batman.extend(options, this.defaultRequestOptions); - return RestStorage.__super__.perform.call(this, key, record, options, callback); - }; - - RestStorage.prototype.before('all', RestStorage.skipIfError(function(env, next) { - if (!env.options.url) { - try { - env.options.url = env.subject.prototype ? this.urlForCollection(env.subject, env) : this.urlForRecord(env.subject, env); - } catch (error) { - env.error = error; - } - } - return next(); - })); - - RestStorage.prototype.before('get', 'put', 'post', 'delete', RestStorage.skipIfError(function(env, next) { - env.options.method = env.action.toUpperCase(); - return next(); - })); - - RestStorage.prototype.before('create', 'update', RestStorage.skipIfError(function(env, next) { - var data, json, namespace; - json = env.subject.toJSON(); - if (namespace = this.recordJsonNamespace(env.subject)) { - data = {}; - data[namespace] = json; - } else { - data = json; - } - env.options.data = data; - return next(); - })); - - RestStorage.prototype.before('create', 'update', 'put', 'post', RestStorage.skipIfError(function(env, next) { - if (this.serializeAsForm) { - env.options.contentType = this.constructor.PostBodyContentType; - } else { - if (env.options.data != null) { - env.options.data = JSON.stringify(env.options.data); - env.options.contentType = this.constructor.JSONContentType; - } - } - return next(); - })); - - RestStorage.prototype.after('all', RestStorage.skipIfError(function(env, next) { - var json; - if (!(env.data != null)) { - return next(); - } - if (typeof env.data === 'string') { - if (env.data.length > 0) { - try { - json = this._jsonToAttributes(env.data); - } catch (error) { - env.error = error; - return next(); - } - } - } else if (typeof env.data === 'object') { - json = env.data; - } - if (json != null) { - env.json = json; - } - return next(); - })); - - RestStorage.prototype.extractFromNamespace = function(data, namespace) { - if (namespace && (data[namespace] != null)) { - return data[namespace]; - } else { - return data; - } - }; - - RestStorage.prototype.after('create', 'read', 'update', RestStorage.skipIfError(function(env, next) { - var json; - if (env.json != null) { - json = this.extractFromNamespace(env.json, this.recordJsonNamespace(env.subject)); - env.subject._withoutDirtyTracking(function() { - return this.fromJSON(json); - }); - } - env.result = env.subject; - return next(); - })); - - RestStorage.prototype.after('readAll', RestStorage.skipIfError(function(env, next) { - var jsonRecordAttributes, namespace; - namespace = this.collectionJsonNamespace(env.subject); - env.recordsAttributes = this.extractFromNamespace(env.json, namespace); - if (Batman.typeOf(env.recordsAttributes) !== 'Array') { - namespace = this.recordJsonNamespace(env.subject.prototype); - env.recordsAttributes = [this.extractFromNamespace(env.json, namespace)]; - } - env.result = env.records = (function() { - var _i, _len, _ref, _results; - _ref = env.recordsAttributes; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - jsonRecordAttributes = _ref[_i]; - _results.push(this.getRecordFromData(jsonRecordAttributes, env.subject)); - } - return _results; - }).call(this); - return next(); - })); - - RestStorage.prototype.after('get', 'put', 'post', 'delete', RestStorage.skipIfError(function(env, next) { - var json, namespace; - if (env.json != null) { - json = env.json; - namespace = env.subject.prototype ? this.collectionJsonNamespace(env.subject) : this.recordJsonNamespace(env.subject); - env.result = namespace && (env.json[namespace] != null) ? env.json[namespace] : env.json; - } - return next(); - })); - - RestStorage.HTTPMethods = { - create: 'POST', - update: 'PUT', - read: 'GET', - readAll: 'GET', - destroy: 'DELETE' - }; - - _ref = ['create', 'read', 'update', 'destroy', 'readAll', 'get', 'post', 'put', 'delete']; - _fn = function(key) { - return RestStorage.prototype[key] = RestStorage.skipIfError(function(env, next) { - var _base; - (_base = env.options).method || (_base.method = this.constructor.HTTPMethods[key]); - return this.request(env, next); - }); - }; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - _fn(key); - } - - RestStorage.prototype.after('all', function(env, next) { - if (env.error) { - env.error = this._errorFor(env.error, env); - } - return next(); - }); - - RestStorage._statusCodeErrors = { - '0': RestStorage.CommunicationError, - '403': RestStorage.NotAllowedError, - '404': RestStorage.NotFoundError, - '406': RestStorage.NotAcceptableError, - '422': RestStorage.UnprocessableRecordError, - '500': RestStorage.InternalStorageError, - '501': RestStorage.NotImplementedError - }; - - RestStorage.prototype._errorFor = function(error, env) { - var errorClass, request; - if (error instanceof Error || !(error.request != null)) { - return error; - } - if (errorClass = this.constructor._statusCodeErrors[error.request.status]) { - request = error.request; - error = new errorClass; - error.request = request; - error.env = env; - } - return error; - }; - - return RestStorage; - - }).call(this, Batman.StorageAdapter); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.LocalStorage = (function(_super) { - - __extends(LocalStorage, _super); - - function LocalStorage() { - if (typeof window.localStorage === 'undefined') { - return null; - } - LocalStorage.__super__.constructor.apply(this, arguments); - this.storage = localStorage; - } - - LocalStorage.prototype.storageRegExpForRecord = function(record) { - return new RegExp("^" + (this.storageKey(record)) + "(\\d+)$"); - }; - - LocalStorage.prototype.nextIdForRecord = function(record) { - var nextId, re; - re = this.storageRegExpForRecord(record); - nextId = 1; - this._forAllStorageEntries(function(k, v) { - var matches; - if (matches = re.exec(k)) { - return nextId = Math.max(nextId, parseInt(matches[1], 10) + 1); - } - }); - return nextId; - }; - - LocalStorage.prototype._forAllStorageEntries = function(iterator) { - var i, key, _i, _ref; - for (i = _i = 0, _ref = this.storage.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { - key = this.storage.key(i); - iterator.call(this, key, this.storage.getItem(key)); - } - return true; - }; - - LocalStorage.prototype._storageEntriesMatching = function(constructor, options) { - var re, records; - re = this.storageRegExpForRecord(constructor.prototype); - records = []; - this._forAllStorageEntries(function(storageKey, storageString) { - var data, keyMatches; - if (keyMatches = re.exec(storageKey)) { - data = this._jsonToAttributes(storageString); - data[constructor.primaryKey] = keyMatches[1]; - if (this._dataMatches(options, data)) { - return records.push(data); - } - } - }); - return records; - }; - - LocalStorage.prototype._dataMatches = function(conditions, data) { - var k, match, v; - match = true; - for (k in conditions) { - v = conditions[k]; - if (data[k] !== v) { - match = false; - break; - } - } - return match; - }; - - LocalStorage.prototype.before('read', 'create', 'update', 'destroy', LocalStorage.skipIfError(function(env, next) { - var _this = this; - if (env.action === 'create') { - env.id = env.subject.get('id') || env.subject._withoutDirtyTracking(function() { - return env.subject.set('id', _this.nextIdForRecord(env.subject)); - }); - } else { - env.id = env.subject.get('id'); - } - if (env.id == null) { - env.error = new this.constructor.StorageError("Couldn't get/set record primary key on " + env.action + "!"); - } else { - env.key = this.storageKey(env.subject) + env.id; - } - return next(); - })); - - LocalStorage.prototype.before('create', 'update', LocalStorage.skipIfError(function(env, next) { - env.recordAttributes = JSON.stringify(env.subject); - return next(); - })); - - LocalStorage.prototype.after('read', LocalStorage.skipIfError(function(env, next) { - if (typeof env.recordAttributes === 'string') { - try { - env.recordAttributes = this._jsonToAttributes(env.recordAttributes); - } catch (error) { - env.error = error; - return next(); - } - } - env.subject._withoutDirtyTracking(function() { - return this.fromJSON(env.recordAttributes); - }); - return next(); - })); - - LocalStorage.prototype.after('read', 'create', 'update', 'destroy', LocalStorage.skipIfError(function(env, next) { - env.result = env.subject; - return next(); - })); - - LocalStorage.prototype.after('readAll', LocalStorage.skipIfError(function(env, next) { - var recordAttributes; - env.result = env.records = (function() { - var _i, _len, _ref, _results; - _ref = env.recordsAttributes; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - recordAttributes = _ref[_i]; - _results.push(this.getRecordFromData(recordAttributes, env.subject)); - } - return _results; - }).call(this); - return next(); - })); - - LocalStorage.prototype.read = LocalStorage.skipIfError(function(env, next) { - env.recordAttributes = this.storage.getItem(env.key); - if (!env.recordAttributes) { - env.error = new this.constructor.NotFoundError(); - } - return next(); - }); - - LocalStorage.prototype.create = LocalStorage.skipIfError(function(_arg, next) { - var key, recordAttributes; - key = _arg.key, recordAttributes = _arg.recordAttributes; - if (this.storage.getItem(key)) { - arguments[0].error = new this.constructor.RecordExistsError; - } else { - this.storage.setItem(key, recordAttributes); - } - return next(); - }); - - LocalStorage.prototype.update = LocalStorage.skipIfError(function(_arg, next) { - var key, recordAttributes; - key = _arg.key, recordAttributes = _arg.recordAttributes; - this.storage.setItem(key, recordAttributes); - return next(); - }); - - LocalStorage.prototype.destroy = LocalStorage.skipIfError(function(_arg, next) { - var key; - key = _arg.key; - this.storage.removeItem(key); - return next(); - }); - - LocalStorage.prototype.readAll = LocalStorage.skipIfError(function(env, next) { - try { - arguments[0].recordsAttributes = this._storageEntriesMatching(env.subject, env.options.data); - } catch (error) { - arguments[0].error = error; - } - return next(); - }); - - return LocalStorage; - - })(Batman.StorageAdapter); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.SessionStorage = (function(_super) { - - __extends(SessionStorage, _super); - - function SessionStorage() { - if (typeof window.sessionStorage === 'undefined') { - return null; - } - SessionStorage.__super__.constructor.apply(this, arguments); - this.storage = sessionStorage; - } - - return SessionStorage; - - })(Batman.LocalStorage); - -}).call(this); - -(function() { - - Batman.Encoders = new Batman.Object; - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.ParamsReplacer = (function(_super) { - - __extends(ParamsReplacer, _super); - - function ParamsReplacer(navigator, params) { - this.navigator = navigator; - this.params = params; - } - - ParamsReplacer.prototype.redirect = function() { - return this.navigator.replace(this.toObject()); - }; - - ParamsReplacer.prototype.replace = function(params) { - this.params.replace(params); - return this.redirect(); - }; - - ParamsReplacer.prototype.update = function(params) { - this.params.update(params); - return this.redirect(); - }; - - ParamsReplacer.prototype.clear = function() { - this.params.clear(); - return this.redirect(); - }; - - ParamsReplacer.prototype.toObject = function() { - return this.params.toObject(); - }; - - ParamsReplacer.accessor({ - get: function(k) { - return this.params.get(k); - }, - set: function(k, v) { - var oldValue, result; - oldValue = this.params.get(k); - result = this.params.set(k, v); - if (oldValue !== v) { - this.redirect(); - } - return result; - }, - unset: function(k) { - var hadKey, result; - hadKey = this.params.hasKey(k); - result = this.params.unset(k); - if (hadKey) { - this.redirect(); - } - return result; - } - }); - - return ParamsReplacer; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.ParamsPusher = (function(_super) { - - __extends(ParamsPusher, _super); - - function ParamsPusher() { - return ParamsPusher.__super__.constructor.apply(this, arguments); - } - - ParamsPusher.prototype.redirect = function() { - return this.navigator.push(this.toObject()); - }; - - return ParamsPusher; - - })(Batman.ParamsReplacer); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.NamedRouteQuery = (function(_super) { - - __extends(NamedRouteQuery, _super); - - NamedRouteQuery.prototype.isNamedRouteQuery = true; - - function NamedRouteQuery(routeMap, args) { - var key; - if (args == null) { - args = []; - } - NamedRouteQuery.__super__.constructor.call(this, { - routeMap: routeMap, - args: args - }); - for (key in this.get('routeMap').childrenByName) { - this[key] = this._queryAccess.bind(this, key); - } - } - - NamedRouteQuery.accessor('route', function() { - var collectionRoute, memberRoute, route, _i, _len, _ref, _ref1; - _ref = this.get('routeMap'), memberRoute = _ref.memberRoute, collectionRoute = _ref.collectionRoute; - _ref1 = [memberRoute, collectionRoute]; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - route = _ref1[_i]; - if (route != null) { - if (route.namedArguments.length === this.get('args').length) { - return route; - } - } - } - return collectionRoute || memberRoute; - }); - - NamedRouteQuery.accessor('path', function() { - return this.path(); - }); - - NamedRouteQuery.accessor('routeMap', 'args', 'cardinality', 'hashValue', Batman.Property.defaultAccessor); - - NamedRouteQuery.accessor({ - get: function(key) { - if (key == null) { - return; - } - if (typeof key === 'string') { - return this.nextQueryForName(key); - } else { - return this.nextQueryWithArgument(key); - } - }, - cache: false - }); - - NamedRouteQuery.accessor('withHash', function() { - var _this = this; - return new Batman.Accessible(function(hashValue) { - return _this.withHash(hashValue); - }); - }); - - NamedRouteQuery.prototype.withHash = function(hashValue) { - var clone; - clone = this.clone(); - clone.set('hashValue', hashValue); - return clone; - }; - - NamedRouteQuery.prototype.nextQueryForName = function(key) { - var map; - if (map = this.get('routeMap').childrenByName[key]) { - return new Batman.NamedRouteQuery(map, this.args); - } else { - return Batman.developer.error("Couldn't find a route for the name " + key + "!"); - } - }; - - NamedRouteQuery.prototype.nextQueryWithArgument = function(arg) { - var args; - args = this.args.slice(0); - args.push(arg); - return this.clone(args); - }; - - NamedRouteQuery.prototype.path = function() { - var argumentName, argumentValue, index, namedArguments, params, _i, _len; - params = {}; - namedArguments = this.get('route.namedArguments'); - for (index = _i = 0, _len = namedArguments.length; _i < _len; index = ++_i) { - argumentName = namedArguments[index]; - if ((argumentValue = this.get('args')[index]) != null) { - params[argumentName] = this._toParam(argumentValue); - } - } - if (this.get('hashValue') != null) { - params['#'] = this.get('hashValue'); - } - return this.get('route').pathFromParams(params); - }; - - NamedRouteQuery.prototype.toString = function() { - return this.path(); - }; - - NamedRouteQuery.prototype.clone = function(args) { - if (args == null) { - args = this.args; - } - return new Batman.NamedRouteQuery(this.routeMap, args); - }; - - NamedRouteQuery.prototype._toParam = function(arg) { - if (arg instanceof Batman.AssociationProxy) { - arg = arg.get('target'); - } - if ((arg != null ? arg.toParam : void 0) != null) { - return arg.toParam(); - } else { - return arg; - } - }; - - NamedRouteQuery.prototype._queryAccess = function(key, arg) { - var query; - query = this.nextQueryForName(key); - if (arg != null) { - query = query.nextQueryWithArgument(arg); - } - return query; - }; - - return NamedRouteQuery; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.Dispatcher = (function(_super) { - var ControllerDirectory; - - __extends(Dispatcher, _super); - - Dispatcher.canInferRoute = function(argument) { - return argument instanceof Batman.Model || argument instanceof Batman.AssociationProxy || argument.prototype instanceof Batman.Model; - }; - - Dispatcher.paramsFromArgument = function(argument) { - var resourceNameFromModel; - resourceNameFromModel = function(model) { - return Batman.helpers.camelize(Batman.helpers.pluralize(model.get('resourceName')), true); - }; - if (!this.canInferRoute(argument)) { - return argument; - } - if (argument instanceof Batman.Model || argument instanceof Batman.AssociationProxy) { - if (argument.isProxy) { - argument = argument.get('target'); - } - if (argument != null) { - return { - controller: resourceNameFromModel(argument.constructor), - action: 'show', - id: argument.get('id') - }; - } else { - return {}; - } - } else if (argument.prototype instanceof Batman.Model) { - return { - controller: resourceNameFromModel(argument), - action: 'index' - }; - } else { - return argument; - } - }; - - ControllerDirectory = (function(_super1) { - - __extends(ControllerDirectory, _super1); - - function ControllerDirectory() { - return ControllerDirectory.__super__.constructor.apply(this, arguments); - } - - ControllerDirectory.accessor('__app', Batman.Property.defaultAccessor); - - ControllerDirectory.accessor(function(key) { - return this.get("__app." + (Batman.helpers.capitalize(key)) + "Controller.sharedController"); - }); - - return ControllerDirectory; - - })(Batman.Object); - - Dispatcher.accessor('controllers', function() { - return new ControllerDirectory({ - __app: this.get('app') - }); - }); - - function Dispatcher(app, routeMap) { - Dispatcher.__super__.constructor.call(this, { - app: app, - routeMap: routeMap - }); - } - - Dispatcher.prototype.routeForParams = function(params) { - params = this.constructor.paramsFromArgument(params); - return this.get('routeMap').routeForParams(params); - }; - - Dispatcher.prototype.pathFromParams = function(params) { - var _ref; - if (typeof params === 'string') { - return params; - } - params = this.constructor.paramsFromArgument(params); - return (_ref = this.routeForParams(params)) != null ? _ref.pathFromParams(params) : void 0; - }; - - Dispatcher.prototype.dispatch = function(params) { - var error, inferredParams, path, route, _ref, _ref1; - inferredParams = this.constructor.paramsFromArgument(params); - route = this.routeForParams(inferredParams); - if (route) { - _ref = route.pathAndParamsFromArgument(inferredParams), path = _ref[0], params = _ref[1]; - this.set('app.currentRoute', route); - this.set('app.currentURL', path); - this.get('app.currentParams').replace(params || {}); - route.dispatch(params); - } else { - if (Batman.typeOf(params) === 'Object' && !this.constructor.canInferRoute(params)) { - return this.get('app.currentParams').replace(params); - } else { - this.get('app.currentParams').clear(); - } - error = { - type: '404', - isPrevented: false, - preventDefault: function() { - return this.isPrevented = true; - } - }; - if ((_ref1 = Batman.currentApp) != null) { - _ref1.fire('error', error); - } - if (error.isPrevented) { - return params; - } - if (params !== '/404') { - return Batman.redirect('/404'); - } - } - return path; - }; - - return Dispatcher; - - }).call(this, Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.Route = (function(_super) { - - __extends(Route, _super); - - Route.regexps = { - namedParam: /:([\w\d]+)/g, - splatParam: /\*([\w\d]+)/g, - queryParam: '(?:\\?.+)?', - namedOrSplat: /[:|\*]([\w\d]+)/g, - namePrefix: '[:|\*]', - escapeRegExp: /[-[\]{}+?.,\\^$|#\s]/g, - openOptParam: /\(/g, - closeOptParam: /\)/g - }; - - Route.prototype.optionKeys = ['member', 'collection']; - - Route.prototype.testKeys = ['controller', 'action']; - - Route.prototype.isRoute = true; - - function Route(templatePath, baseParams) { - var k, matches, namedArguments, pattern, properties, regexp, regexps, _i, _len, _ref; - regexps = this.constructor.regexps; - if (templatePath.indexOf('/') !== 0) { - templatePath = "/" + templatePath; - } - pattern = templatePath.replace(regexps.escapeRegExp, '\\$&'); - regexp = RegExp("^" + (pattern.replace(regexps.openOptParam, '(?:').replace(regexps.closeOptParam, ')?').replace(regexps.namedParam, '([^\/]+)').replace(regexps.splatParam, '(.*?)')) + regexps.queryParam + "$"); - regexps.namedOrSplat.lastIndex = 0; - namedArguments = ((function() { - var _results; - _results = []; - while (matches = regexps.namedOrSplat.exec(pattern)) { - _results.push(matches[1]); - } - return _results; - })()); - properties = { - templatePath: templatePath, - pattern: pattern, - regexp: regexp, - namedArguments: namedArguments, - baseParams: baseParams - }; - _ref = this.optionKeys; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - properties[k] = baseParams[k]; - delete baseParams[k]; - } - Route.__super__.constructor.call(this, properties); - } - - Route.prototype.paramsFromPath = function(pathAndQuery) { - var index, match, matches, name, namedArguments, params, uri, _i, _len; - uri = new Batman.URI(pathAndQuery); - namedArguments = this.get('namedArguments'); - params = Batman.extend({ - path: uri.path - }, this.get('baseParams')); - matches = this.get('regexp').exec(uri.path).slice(1); - for (index = _i = 0, _len = matches.length; _i < _len; index = ++_i) { - match = matches[index]; - name = namedArguments[index]; - params[name] = match; - } - return Batman.extend(params, uri.queryParams); - }; - - Route.prototype.pathFromParams = function(argumentParams) { - var hash, key, name, newPath, params, path, query, regexp, regexps, _i, _j, _len, _len1, _ref, _ref1; - params = Batman.extend({}, argumentParams); - path = this.get('templatePath'); - regexps = this.constructor.regexps; - _ref = this.get('namedArguments'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - regexp = RegExp("" + regexps.namePrefix + name); - newPath = path.replace(regexp, (params[name] != null ? params[name] : '')); - if (newPath !== path) { - delete params[name]; - path = newPath; - } - } - path = path.replace(regexps.openOptParam, '').replace(regexps.closeOptParam, '').replace(/([^\/])\/+$/, '$1'); - _ref1 = this.testKeys; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - key = _ref1[_j]; - delete params[key]; - } - if (params['#']) { - hash = params['#']; - delete params['#']; - } - query = Batman.URI.queryFromParams(params); - if (query) { - path += "?" + query; - } - if (hash) { - path += "#" + hash; - } - return path; - }; - - Route.prototype.test = function(pathOrParams) { - var key, path, value, _i, _len, _ref; - if (typeof pathOrParams === 'string') { - path = pathOrParams; - } else if (pathOrParams.path != null) { - path = pathOrParams.path; - } else { - path = this.pathFromParams(pathOrParams); - _ref = this.testKeys; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - if ((value = this.get(key)) != null) { - if (pathOrParams[key] !== value) { - return false; - } - } - } - } - return this.get('regexp').test(path); - }; - - Route.prototype.pathAndParamsFromArgument = function(pathOrParams) { - var params, path; - if (typeof pathOrParams === 'string') { - params = this.paramsFromPath(pathOrParams); - path = pathOrParams; - } else { - params = pathOrParams; - path = this.pathFromParams(pathOrParams); - } - return [path, params]; - }; - - Route.prototype.dispatch = function(params) { - if (!this.test(params)) { - return false; - } - return this.get('callback')(params); - }; - - Route.prototype.callback = function() { - throw new Batman.DevelopmentError("Override callback in a Route subclass"); - }; - - return Route; - - })(Batman.Object); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.ControllerActionRoute = (function(_super) { - - __extends(ControllerActionRoute, _super); - - ControllerActionRoute.prototype.optionKeys = ['member', 'collection', 'app', 'controller', 'action']; - - function ControllerActionRoute(templatePath, options) { - this.callback = __bind(this.callback, this); - - var action, controller, _ref; - if (options.signature) { - _ref = options.signature.split('#'), controller = _ref[0], action = _ref[1]; - action || (action = 'index'); - options.controller = controller; - options.action = action; - delete options.signature; - } - ControllerActionRoute.__super__.constructor.call(this, templatePath, options); - } - - ControllerActionRoute.prototype.callback = function(params) { - var controller; - controller = this.get("app.dispatcher.controllers." + (this.get('controller'))); - return controller.dispatch(this.get('action'), params); - }; - - return ControllerActionRoute; - - })(Batman.Route); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.CallbackActionRoute = (function(_super) { - - __extends(CallbackActionRoute, _super); - - function CallbackActionRoute() { - return CallbackActionRoute.__super__.constructor.apply(this, arguments); - } - - CallbackActionRoute.prototype.optionKeys = ['member', 'collection', 'callback', 'app']; - - CallbackActionRoute.prototype.controller = false; - - CallbackActionRoute.prototype.action = false; - - return CallbackActionRoute; - - })(Batman.Route); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.Hash = (function(_super) { - var k, _fn, _i, _j, _len, _len1, _ref, _ref1, - _this = this; - - __extends(Hash, _super); - - Hash.Metadata = (function(_super1) { - - __extends(Metadata, _super1); - - Batman.extend(Metadata.prototype, Batman.Enumerable); - - function Metadata(hash) { - this.hash = hash; - } - - Metadata.accessor('length', function() { - this.hash.registerAsMutableSource(); - return this.hash.length; - }); - - Metadata.accessor('isEmpty', 'keys', 'toArray', function(key) { - this.hash.registerAsMutableSource(); - return this.hash[key](); - }); - - Metadata.prototype.forEach = function() { - var _ref; - return (_ref = this.hash).forEach.apply(_ref, arguments); - }; - - return Metadata; - - })(Batman.Object); - - function Hash() { - this.meta = new this.constructor.Metadata(this); - Batman.SimpleHash.apply(this, arguments); - Hash.__super__.constructor.apply(this, arguments); - } - - Batman.extend(Hash.prototype, Batman.Enumerable); - - Hash.prototype.propertyClass = Batman.Property; - - Hash.defaultAccessor = { - get: Batman.SimpleHash.prototype.get, - set: Hash.mutation(function(key, value) { - var result; - result = Batman.SimpleHash.prototype.set.call(this, key, value); - this.fire('itemsWereAdded', key); - return result; - }), - unset: Hash.mutation(function(key) { - var result; - result = Batman.SimpleHash.prototype.unset.call(this, key); - if (result != null) { - this.fire('itemsWereRemoved', key); - } - return result; - }), - cache: false - }; - - Hash.accessor(Hash.defaultAccessor); - - Hash.prototype._preventMutationEvents = function(block) { - this.prevent('change'); - this.prevent('itemsWereAdded'); - this.prevent('itemsWereRemoved'); - try { - return block.call(this); - } finally { - this.allow('change'); - this.allow('itemsWereAdded'); - this.allow('itemsWereRemoved'); - } - }; - - Hash.prototype.clear = Hash.mutation(function() { - var keys, result; - keys = this.keys(); - this._preventMutationEvents(function() { - var _this = this; - return this.forEach(function(k) { - return _this.unset(k); - }); - }); - result = Batman.SimpleHash.prototype.clear.call(this); - this.fire.apply(this, ['itemsWereRemoved'].concat(__slice.call(keys))); - return result; - }); - - Hash.prototype.update = Hash.mutation(function(object) { - var addedKeys; - addedKeys = []; - this._preventMutationEvents(function() { - var _this = this; - return Batman.forEach(object, function(k, v) { - if (!_this.hasKey(k)) { - addedKeys.push(k); - } - return _this.set(k, v); - }); - }); - if (addedKeys.length > 0) { - return this.fire.apply(this, ['itemsWereAdded'].concat(__slice.call(addedKeys))); - } - }); - - Hash.prototype.replace = Hash.mutation(function(object) { - var addedKeys, removedKeys; - addedKeys = []; - removedKeys = []; - this._preventMutationEvents(function() { - var _this = this; - this.forEach(function(k, _) { - if (!Batman.objectHasKey(object, k)) { - _this.unset(k); - return removedKeys.push(k); - } - }); - return Batman.forEach(object, function(k, v) { - if (!_this.hasKey(k)) { - addedKeys.push(k); - } - return _this.set(k, v); - }); - }); - if (addedKeys.length > 0) { - this.fire.apply(this, ['itemsWereAdded'].concat(__slice.call(addedKeys))); - } - if (removedKeys.length > 0) { - return this.fire.apply(this, ['itemsWereRemoved'].concat(__slice.call(removedKeys))); - } - }); - - _ref = ['equality', 'hashKeyFor', 'objectKey', 'prefixedKey', 'unprefixedKey']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - Hash.prototype[k] = Batman.SimpleHash.prototype[k]; - } - - _ref1 = ['hasKey', 'forEach', 'isEmpty', 'keys', 'toArray', 'merge', 'toJSON', 'toObject']; - _fn = function(k) { - return Hash.prototype[k] = function() { - this.registerAsMutableSource(); - return Batman.SimpleHash.prototype[k].apply(this, arguments); - }; - }; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - k = _ref1[_j]; - _fn(k); - } - - return Hash; - - }).call(this, Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.RenderCache = (function(_super) { - - __extends(RenderCache, _super); - - RenderCache.prototype.maximumLength = 4; - - function RenderCache() { - RenderCache.__super__.constructor.apply(this, arguments); - this.keyQueue = []; - } - - RenderCache.prototype.viewForOptions = function(options) { - var _this = this; - if (options.cache === false || options.viewClass.prototype.cache === false) { - return this._newViewFromOptions(options); - } - return this.getOrSet(options, function() { - return _this._newViewFromOptions(Batman.extend({}, options)); - }); - }; - - RenderCache.prototype._newViewFromOptions = function(options) { - return new options.viewClass(options); - }; - - RenderCache.wrapAccessor(function(core) { - return { - cache: false, - get: function(key) { - var result; - result = core.get.call(this, key); - if (result) { - this._addOrBubbleKey(key); - } - return result; - }, - set: function(key, value) { - var result; - result = core.set.apply(this, arguments); - result.set('cached', true); - this._addOrBubbleKey(key); - this._evictExpiredKeys(); - return result; - }, - unset: function(key) { - var result; - result = core.unset.apply(this, arguments); - result.set('cached', false); - this._removeKeyFromQueue(key); - return result; - } - }; - }); - - RenderCache.prototype.equality = function(incomingOptions, storageOptions) { - var key; - if (Object.keys(incomingOptions).length !== Object.keys(storageOptions).length) { - return false; - } - for (key in incomingOptions) { - if (!(key === 'view')) { - if (incomingOptions[key] !== storageOptions[key]) { - return false; - } - } - } - return true; - }; - - RenderCache.prototype.reset = function() { - var key, _i, _len, _ref, _results; - _ref = this.keyQueue.slice(0); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - _results.push(this.unset(key)); - } - return _results; - }; - - RenderCache.prototype._addOrBubbleKey = function(key) { - this._removeKeyFromQueue(key); - return this.keyQueue.unshift(key); - }; - - RenderCache.prototype._removeKeyFromQueue = function(key) { - var index, queuedKey, _i, _len, _ref; - _ref = this.keyQueue; - for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { - queuedKey = _ref[index]; - if (this.equality(queuedKey, key)) { - this.keyQueue.splice(index, 1); - break; - } - } - return key; - }; - - RenderCache.prototype._evictExpiredKeys = function() { - var currentKeys, i, key, _i, _ref, _ref1; - if (this.length > this.maximumLength) { - currentKeys = this.keyQueue.slice(0); - for (i = _i = _ref = this.maximumLength, _ref1 = currentKeys.length; _ref <= _ref1 ? _i < _ref1 : _i > _ref1; i = _ref <= _ref1 ? ++_i : --_i) { - key = currentKeys[i]; - if (!this.get(key).isInDOM()) { - this.unset(key); - } - } - } - }; - - return RenderCache; - - })(Batman.Hash); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Batman.Controller = (function(_super) { - var _optionsFromFilterArguments; - - __extends(Controller, _super); - - Controller.singleton('sharedController'); - - Controller.wrapAccessor('routingKey', function(core) { - return { - get: function() { - if (this.routingKey != null) { - return this.routingKey; - } else { - if (Batman.config.minificationErrors) { - Batman.developer.error("Please define `routingKey` on the prototype of " + (Batman.functionName(this.constructor)) + " in order for your controller to be minification safe."); - } - return Batman.functionName(this.constructor).replace(/Controller$/, ''); - } - } - }; - }); - - Controller.accessor('_renderContext', function() { - return Batman.RenderContext.root().descend(this); - }); - - _optionsFromFilterArguments = function(options, nameOrFunction) { - if (!nameOrFunction) { - nameOrFunction = options; - options = {}; - } else { - if (typeof options === 'string') { - options = { - only: [options] - }; - } else { - if (options.only && Batman.typeOf(options.only) !== 'Array') { - options.only = [options.only]; - } - if (options.except && Batman.typeOf(options.except) !== 'Array') { - options.except = [options.except]; - } - } - } - options.block = nameOrFunction; - return options; - }; - - Controller.beforeFilter = function() { - var filters, options, _base; - Batman.initializeObject(this); - options = _optionsFromFilterArguments.apply(null, arguments); - filters = (_base = this._batman).beforeFilters || (_base.beforeFilters = []); - return filters.push(options); - }; - - Controller.afterFilter = function() { - var filters, options, _base; - Batman.initializeObject(this); - options = _optionsFromFilterArguments.apply(null, arguments); - filters = (_base = this._batman).afterFilters || (_base.afterFilters = []); - return filters.push(options); - }; - - Controller.afterFilter(function(params) { - if (this.autoScrollToHash && (params['#'] != null)) { - return this.scrollToHash(params['#']); - } - }); - - Controller.catchError = function() { - var currentHandlers, error, errors, handlers, options, _base, _i, _j, _len, _results; - errors = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), options = arguments[_i++]; - Batman.initializeObject(this); - (_base = this._batman).errorHandlers || (_base.errorHandlers = new Batman.SimpleHash); - handlers = Batman.typeOf(options["with"]) === 'Array' ? options["with"] : [options["with"]]; - _results = []; - for (_j = 0, _len = errors.length; _j < _len; _j++) { - error = errors[_j]; - currentHandlers = this._batman.errorHandlers.get(error) || []; - _results.push(this._batman.errorHandlers.set(error, currentHandlers.concat(handlers))); - } - return _results; - }; - - Controller.prototype.errorHandler = function(callback) { - var errorFrame, _ref, - _this = this; - errorFrame = (_ref = this._actionFrames) != null ? _ref[this._actionFrames.length - 1] : void 0; - return function(err, result, env) { - if (err) { - if (errorFrame != null ? errorFrame.error : void 0) { - return; - } - if (errorFrame != null) { - errorFrame.error = err; - } - if (!_this.handleError(err)) { - throw err; - } - } else { - return typeof callback === "function" ? callback(result, env) : void 0; - } - }; - }; - - Controller.prototype.handleError = function(error) { - var handled, _ref, - _this = this; - handled = false; - if ((_ref = this.constructor._batman.getAll('errorHandlers')) != null) { - _ref.forEach(function(hash) { - return hash.forEach(function(key, value) { - var handler, _i, _len, _results; - if (error instanceof key) { - handled = true; - _results = []; - for (_i = 0, _len = value.length; _i < _len; _i++) { - handler = value[_i]; - _results.push(handler.call(_this, error)); - } - return _results; - } - }); - }); - } - return handled; - }; - - function Controller() { - this.redirect = __bind(this.redirect, this); - - this.handleError = __bind(this.handleError, this); - - this.errorHandler = __bind(this.errorHandler, this); - Controller.__super__.constructor.apply(this, arguments); - this._resetActionFrames(); - } - - Controller.prototype.renderCache = new Batman.RenderCache; - - Controller.prototype.defaultRenderYield = 'main'; - - Controller.prototype.autoScrollToHash = true; - - Controller.prototype.dispatch = function(action, params) { - var redirectTo; - if (params == null) { - params = {}; - } - params.controller || (params.controller = this.get('routingKey')); - params.action || (params.action = action); - params.target || (params.target = this); - this._resetActionFrames(); - this.set('action', action); - this.set('params', params); - Batman.DOM.Yield.cycleAll(); - this.executeAction(action, params); - Batman.DOM.Yield.clearAllStale(); - redirectTo = this._afterFilterRedirect; - delete this._afterFilterRedirect; - if (redirectTo) { - return Batman.redirect(redirectTo); - } - }; - - Controller.prototype.executeAction = function(action, params) { - var frame, oldRedirect, parentFrame, result, _ref, _ref1, - _this = this; - if (params == null) { - params = this.get('params'); - } - Batman.developer.assert(this[action], "Error! Controller action " + (this.get('routingKey')) + "." + action + " couldn't be found!"); - parentFrame = this._actionFrames[this._actionFrames.length - 1]; - frame = new Batman.ControllerActionFrame({ - parentFrame: parentFrame, - action: action - }, function() { - var _ref; - if (!_this._afterFilterRedirect) { - _this._runFilters(action, params, 'afterFilters'); - } - _this._resetActionFrames(); - return (_ref = Batman.navigator) != null ? _ref.redirect = oldRedirect : void 0; - }); - this._actionFrames.push(frame); - frame.startOperation({ - internal: true - }); - oldRedirect = (_ref = Batman.navigator) != null ? _ref.redirect : void 0; - if ((_ref1 = Batman.navigator) != null) { - _ref1.redirect = this.redirect; - } - this._runFilters(action, params, 'beforeFilters'); - if (!this._afterFilterRedirect) { - result = this[action](params); - } - if (!frame.operationOccurred) { - this.render(); - } - frame.finishOperation(); - return result; - }; - - Controller.prototype.redirect = function(url) { - var frame; - frame = this._actionFrames[this._actionFrames.length - 1]; - if (frame) { - if (frame.operationOccurred) { - Batman.developer.warn("Warning! Trying to redirect but an action has already been taken during " + (this.get('routingKey')) + "." + (frame.action || this.get('action'))); - } - frame.startAndFinishOperation(); - if (this._afterFilterRedirect != null) { - return Batman.developer.warn("Warning! Multiple actions trying to redirect!"); - } else { - return this._afterFilterRedirect = url; - } - } else { - if (Batman.typeOf(url) === 'Object') { - if (!url.controller) { - url.controller = this; - } - } - return Batman.redirect(url); - } - }; - - Controller.prototype.render = function(options) { - var action, frame, view, _ref, _ref1, - _this = this; - if (options == null) { - options = {}; - } - if (frame = (_ref = this._actionFrames) != null ? _ref[this._actionFrames.length - 1] : void 0) { - frame.startOperation(); - } - if (options === false) { - frame.finishOperation(); - return; - } - action = (frame != null ? frame.action : void 0) || this.get('action'); - if (options) { - options.into || (options.into = this.defaultRenderYield); - } - if (!options.view) { - options.viewClass || (options.viewClass = this._viewClassForAction(action)); - options.context || (options.context = this.get('_renderContext')); - options.source || (options.source = Batman.helpers.underscore(this.get('routingKey') + '/' + action)); - view = this.renderCache.viewForOptions(options); - } else { - view = options.view; - options.view = null; - } - if (view) { - if ((_ref1 = Batman.currentApp) != null) { - _ref1.prevent('ready'); - } - view.on('ready', function() { - var _ref2; - Batman.DOM.Yield.withName(options.into).replace(view.get('node')); - if ((_ref2 = Batman.currentApp) != null) { - _ref2.allowAndFire('ready'); - } - return frame != null ? frame.finishOperation() : void 0; - }); - } - return view; - }; - - Controller.prototype.scrollToHash = function(hash) { - if (hash == null) { - hash = this.get('params')['#']; - } - return Batman.DOM.scrollIntoView(hash); - }; - - Controller.prototype._resetActionFrames = function() { - return this._actionFrames = []; - }; - - Controller.prototype._viewClassForAction = function(action) { - var classPrefix, _ref; - classPrefix = this.get('routingKey').replace('/', '_'); - return ((_ref = Batman.currentApp) != null ? _ref[Batman.helpers.camelize("" + classPrefix + "_" + action + "_view")] : void 0) || Batman.View; - }; - - Controller.prototype._runFilters = function(action, params, filters) { - var block, options, _i, _len, _ref; - if (filters = (_ref = this.constructor._batman) != null ? _ref.get(filters) : void 0) { - for (_i = 0, _len = filters.length; _i < _len; _i++) { - options = filters[_i]; - if (options.only && __indexOf.call(options.only, action) < 0) { - continue; - } - if (options.except && __indexOf.call(options.except, action) >= 0) { - continue; - } - if (this._afterFilterRedirect) { - return; - } - block = options.block; - if (typeof block === 'function') { - block.call(this, params); - } else { - if (typeof this[block] === "function") { - this[block](params); - } - } - } - } - }; - - return Controller; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.Set = (function(_super) { - var k, _fn, _i, _j, _len, _len1, _ref, _ref1, - _this = this; - - __extends(Set, _super); - - function Set() { - Batman.SimpleSet.apply(this, arguments); - } - - Batman.extend(Set.prototype, Batman.Enumerable); - - Set._applySetAccessors = function(klass) { - var accessor, accessors, key, _results; - accessors = { - first: function() { - return this.toArray()[0]; - }, - last: function() { - return this.toArray()[this.length - 1]; - }, - isEmpty: function() { - return this.isEmpty(); - }, - toArray: function() { - return this.toArray(); - }, - length: function() { - this.registerAsMutableSource(); - return this.length; - }, - indexedBy: function() { - var _this = this; - return new Batman.TerminalAccessible(function(key) { - return _this.indexedBy(key); - }); - }, - indexedByUnique: function() { - var _this = this; - return new Batman.TerminalAccessible(function(key) { - return _this.indexedByUnique(key); - }); - }, - sortedBy: function() { - var _this = this; - return new Batman.TerminalAccessible(function(key) { - return _this.sortedBy(key); - }); - }, - sortedByDescending: function() { - var _this = this; - return new Batman.TerminalAccessible(function(key) { - return _this.sortedBy(key, 'desc'); - }); - } - }; - _results = []; - for (key in accessors) { - accessor = accessors[key]; - _results.push(klass.accessor(key, accessor)); - } - return _results; - }; - - Set._applySetAccessors(Set); - - _ref = ['add', 'remove', 'clear', 'replace', 'indexedBy', 'indexedByUnique', 'sortedBy', 'equality', '_indexOfItem']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - Set.prototype[k] = Batman.SimpleSet.prototype[k]; - } - - _ref1 = ['find', 'merge', 'forEach', 'toArray', 'isEmpty', 'has']; - _fn = function(k) { - return Set.prototype[k] = function() { - this.registerAsMutableSource(); - return Batman.SimpleSet.prototype[k].apply(this, arguments); - }; - }; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - k = _ref1[_j]; - _fn(k); - } - - Set.prototype.toJSON = Set.prototype.toArray; - - return Set; - - }).call(this, Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.ErrorsSet = (function(_super) { - - __extends(ErrorsSet, _super); - - function ErrorsSet() { - return ErrorsSet.__super__.constructor.apply(this, arguments); - } - - ErrorsSet.accessor(function(key) { - return this.indexedBy('attribute').get(key); - }); - - ErrorsSet.prototype.add = function(key, error) { - return ErrorsSet.__super__.add.call(this, new Batman.ValidationError(key, error)); - }; - - return ErrorsSet; - - })(Batman.Set); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.SetProxy = (function(_super) { - var k, _fn, _i, _len, _ref, - _this = this; - - __extends(SetProxy, _super); - - function SetProxy(base) { - var _this = this; - this.base = base; - SetProxy.__super__.constructor.call(this); - this.length = this.base.length; - this.base.on('itemsWereAdded', function() { - var items; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - _this.set('length', _this.base.length); - return _this.fire.apply(_this, ['itemsWereAdded'].concat(__slice.call(items))); - }); - this.base.on('itemsWereRemoved', function() { - var items; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - _this.set('length', _this.base.length); - return _this.fire.apply(_this, ['itemsWereRemoved'].concat(__slice.call(items))); - }); - } - - Batman.extend(SetProxy.prototype, Batman.Enumerable); - - SetProxy.prototype.filter = function(f) { - var r; - r = new Batman.Set(); - return this.reduce((function(r, e) { - if (f(e)) { - r.add(e); - } - return r; - }), r); - }; - - SetProxy.prototype.replace = function() { - var length, result; - length = this.property('length'); - length.isolate(); - result = this.base.replace.apply(this, arguments); - length.expose(); - return result; - }; - - Batman.Set._applySetAccessors(SetProxy); - - _ref = ['add', 'remove', 'find', 'clear', 'has', 'merge', 'toArray', 'isEmpty', 'indexedBy', 'indexedByUnique', 'sortedBy']; - _fn = function(k) { - return SetProxy.prototype[k] = function() { - var _ref1; - return (_ref1 = this.base)[k].apply(_ref1, arguments); - }; - }; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - _fn(k); - } - - SetProxy.accessor('length', { - get: function() { - this.registerAsMutableSource(); - return this.length; - }, - set: function(_, v) { - return this.length = v; - } - }); - - return SetProxy; - - }).call(this, Batman.Object); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.BinarySetOperation = (function(_super) { - - __extends(BinarySetOperation, _super); - - function BinarySetOperation(left, right) { - this.left = left; - this.right = right; - this._setup = __bind(this._setup, this); - - BinarySetOperation.__super__.constructor.call(this); - this._setup(this.left, this.right); - this._setup(this.right, this.left); - } - - BinarySetOperation.prototype._setup = function(set, opposite) { - var _this = this; - set.on('itemsWereAdded', function() { - var items; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return _this._itemsWereAddedToSource.apply(_this, [set, opposite].concat(__slice.call(items))); - }); - set.on('itemsWereRemoved', function() { - var items; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return _this._itemsWereRemovedFromSource.apply(_this, [set, opposite].concat(__slice.call(items))); - }); - return this._itemsWereAddedToSource.apply(this, [set, opposite].concat(__slice.call(set.toArray()))); - }; - - BinarySetOperation.prototype.merge = function() { - var merged, others, set, _i, _len; - others = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - merged = new Batman.Set; - others.unshift(this); - for (_i = 0, _len = others.length; _i < _len; _i++) { - set = others[_i]; - set.forEach(function(v) { - return merged.add(v); - }); - } - return merged; - }; - - BinarySetOperation.prototype.filter = Batman.SetProxy.prototype.filter; - - return BinarySetOperation; - - })(Batman.Set); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.SetUnion = (function(_super) { - - __extends(SetUnion, _super); - - function SetUnion() { - return SetUnion.__super__.constructor.apply(this, arguments); - } - - SetUnion.prototype._itemsWereAddedToSource = function() { - var items, opposite, source; - source = arguments[0], opposite = arguments[1], items = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - return this.add.apply(this, items); - }; - - SetUnion.prototype._itemsWereRemovedFromSource = function() { - var item, items, itemsToRemove, opposite, source; - source = arguments[0], opposite = arguments[1], items = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - itemsToRemove = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if (!opposite.has(item)) { - _results.push(item); - } - } - return _results; - })(); - return this.remove.apply(this, itemsToRemove); - }; - - return SetUnion; - - })(Batman.BinarySetOperation); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.SetIntersection = (function(_super) { - - __extends(SetIntersection, _super); - - function SetIntersection() { - return SetIntersection.__super__.constructor.apply(this, arguments); - } - - SetIntersection.prototype._itemsWereAddedToSource = function() { - var item, items, itemsToAdd, opposite, source; - source = arguments[0], opposite = arguments[1], items = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - itemsToAdd = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if (opposite.has(item)) { - _results.push(item); - } - } - return _results; - })(); - return this.add.apply(this, itemsToAdd); - }; - - SetIntersection.prototype._itemsWereRemovedFromSource = function() { - var items, opposite, source; - source = arguments[0], opposite = arguments[1], items = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - return this.remove.apply(this, items); - }; - - return SetIntersection; - - })(Batman.BinarySetOperation); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.SetComplement = (function(_super) { - - __extends(SetComplement, _super); - - function SetComplement() { - return SetComplement.__super__.constructor.apply(this, arguments); - } - - SetComplement.prototype._itemsWereAddedToSource = function() { - var item, items, itemsToAdd, itemsToRemove, opposite, source; - source = arguments[0], opposite = arguments[1], items = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - if (source === this.left) { - itemsToAdd = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if (!opposite.has(item)) { - _results.push(item); - } - } - return _results; - })(); - return this.add.apply(this, itemsToAdd); - } else { - itemsToRemove = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if (opposite.has(item)) { - _results.push(item); - } - } - return _results; - })(); - return this.remove.apply(this, itemsToRemove); - } - }; - - SetComplement.prototype._itemsWereRemovedFromSource = function() { - var item, items, itemsToAdd, opposite, source; - source = arguments[0], opposite = arguments[1], items = 3 <= arguments.length ? __slice.call(arguments, 2) : []; - if (source === this.left) { - return this.remove.apply(this, items); - } else { - itemsToAdd = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if (opposite.has(item)) { - _results.push(item); - } - } - return _results; - })(); - return this.add.apply(this, itemsToAdd); - } - }; - - SetComplement.prototype._addComplement = function(items, opposite) { - var item; - return this.add.apply(this, (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if (opposite.has(item)) { - _results.push(item); - } - } - return _results; - })()); - }; - - return SetComplement; - - })(Batman.BinarySetOperation); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.StateMachine = (function(_super) { - - __extends(StateMachine, _super); - - StateMachine.InvalidTransitionError = function(message) { - this.message = message != null ? message : ""; - }; - - StateMachine.InvalidTransitionError.prototype = new Error; - - StateMachine.transitions = function(table) { - var definePredicate, fromState, k, object, predicateKeys, toState, transitions, v, _fn, _ref, - _this = this; - for (k in table) { - v = table[k]; - if (!(v.from && v.to)) { - continue; - } - object = {}; - if (v.from.forEach) { - v.from.forEach(function(fromKey) { - return object[fromKey] = v.to; - }); - } else { - object[v.from] = v.to; - } - table[k] = object; - } - this.prototype.transitionTable = Batman.extend({}, this.prototype.transitionTable, table); - predicateKeys = []; - definePredicate = function(state) { - var key; - key = "is" + (Batman.helpers.capitalize(state)); - if (_this.prototype[key] != null) { - return; - } - predicateKeys.push(key); - return _this.prototype[key] = function() { - return this.get('state') === state; - }; - }; - _ref = this.prototype.transitionTable; - _fn = function(k) { - return _this.prototype[k] = function() { - return this.startTransition(k); - }; - }; - for (k in _ref) { - transitions = _ref[k]; - if (!(!this.prototype[k])) { - continue; - } - _fn(k); - for (fromState in transitions) { - toState = transitions[fromState]; - definePredicate(fromState); - definePredicate(toState); - } - } - if (predicateKeys.length) { - this.accessor.apply(this, __slice.call(predicateKeys).concat([function(key) { - return this[key](); - }])); - } - return this; - }; - - function StateMachine(startState) { - this.nextEvents = []; - this.set('_state', startState); - } - - StateMachine.accessor('state', function() { - return this.get('_state'); - }); - - StateMachine.prototype.isTransitioning = false; - - StateMachine.prototype.transitionTable = {}; - - StateMachine.prototype.onTransition = function(from, into, callback) { - return this.on("" + from + "->" + into, callback); - }; - - StateMachine.prototype.onEnter = function(into, callback) { - return this.on("enter " + into, callback); - }; - - StateMachine.prototype.onExit = function(from, callback) { - return this.on("exit " + from, callback); - }; - - StateMachine.prototype.startTransition = Batman.Property.wrapTrackingPrevention(function(event) { - var nextState, previousState; - if (this.isTransitioning) { - this.nextEvents.push(event); - return; - } - previousState = this.get('state'); - nextState = this.nextStateForEvent(event); - if (!nextState) { - return false; - } - this.isTransitioning = true; - this.fire("exit " + previousState); - this.set('_state', nextState); - this.fire("" + previousState + "->" + nextState); - this.fire("enter " + nextState); - this.fire(event); - this.isTransitioning = false; - if (this.nextEvents.length > 0) { - this.startTransition(this.nextEvents.shift()); - } - return true; - }); - - StateMachine.prototype.canStartTransition = function(event, fromState) { - if (fromState == null) { - fromState = this.get('state'); - } - return !!this.nextStateForEvent(event, fromState); - }; - - StateMachine.prototype.nextStateForEvent = function(event, fromState) { - var _ref; - if (fromState == null) { - fromState = this.get('state'); - } - return (_ref = this.transitionTable[event]) != null ? _ref[fromState] : void 0; - }; - - return StateMachine; - - })(Batman.Object); - - Batman.DelegatingStateMachine = (function(_super) { - - __extends(DelegatingStateMachine, _super); - - function DelegatingStateMachine(startState, base) { - this.base = base; - DelegatingStateMachine.__super__.constructor.call(this, startState); - } - - DelegatingStateMachine.prototype.fire = function() { - var result, _ref; - result = DelegatingStateMachine.__super__.fire.apply(this, arguments); - (_ref = this.base).fire.apply(_ref, arguments); - return result; - }; - - return DelegatingStateMachine; - - })(Batman.StateMachine); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.Model = (function(_super) { - var functionName, _i, _j, _len, _len1, _ref, _ref1; - - __extends(Model, _super); - - Model.storageKey = null; - - Model.primaryKey = 'id'; - - Model.persist = function() { - var mechanism, options; - mechanism = arguments[0], options = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - Batman.initializeObject(this.prototype); - mechanism = mechanism.isStorageAdapter ? mechanism : new mechanism(this); - if (options.length > 0) { - Batman.mixin.apply(Batman, [mechanism].concat(__slice.call(options))); - } - this.prototype._batman.storage = mechanism; - return mechanism; - }; - - Model.storageAdapter = function() { - Batman.initializeObject(this.prototype); - return this.prototype._batman.storage; - }; - - Model.encode = function() { - var encoder, encoderForKey, encoderOrLastKey, key, keys, _base, _i, _j, _len; - keys = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), encoderOrLastKey = arguments[_i++]; - Batman.initializeObject(this.prototype); - (_base = this.prototype._batman).encoders || (_base.encoders = new Batman.SimpleHash); - encoder = {}; - switch (Batman.typeOf(encoderOrLastKey)) { - case 'String': - keys.push(encoderOrLastKey); - break; - case 'Function': - encoder.encode = encoderOrLastKey; - break; - default: - encoder = encoderOrLastKey; - } - for (_j = 0, _len = keys.length; _j < _len; _j++) { - key = keys[_j]; - encoderForKey = Batman.extend({ - as: key - }, this.defaultEncoder, encoder); - this.prototype._batman.encoders.set(key, encoderForKey); - } - }; - - Model.defaultEncoder = { - encode: function(x) { - return x; - }, - decode: function(x) { - return x; - } - }; - - Model.observeAndFire('primaryKey', function(newPrimaryKey, oldPrimaryKey) { - this.encode(oldPrimaryKey, { - encode: false, - decode: false - }); - return this.encode(newPrimaryKey, { - encode: false, - decode: this.defaultEncoder.decode - }); - }); - - Model.validate = function() { - var keys, matches, optionsOrFunction, validatorClass, validators, _base, _i, _j, _len, _ref, _results; - keys = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), optionsOrFunction = arguments[_i++]; - Batman.initializeObject(this.prototype); - validators = (_base = this.prototype._batman).validators || (_base.validators = []); - if (typeof optionsOrFunction === 'function') { - return validators.push({ - keys: keys, - callback: optionsOrFunction - }); - } else { - _ref = Batman.Validators; - _results = []; - for (_j = 0, _len = _ref.length; _j < _len; _j++) { - validatorClass = _ref[_j]; - if ((matches = validatorClass.matches(optionsOrFunction))) { - _results.push(validators.push({ - keys: keys, - validator: new validatorClass(matches) - })); - } else { - _results.push(void 0); - } - } - return _results; - } - }; - - Model.classAccessor('resourceName', { - get: function() { - if (this.resourceName != null) { - return this.resourceName; - } else { - if (Batman.config.minificationErrors) { - Batman.developer.error("Please define " + (Batman.functionName(this)) + ".resourceName in order for your model to be minification safe."); - } - return Batman.helpers.underscore(Batman.functionName(this)); - } - } - }); - - Model.classAccessor('all', { - get: function() { - this._batman.check(this); - if (this.prototype.hasStorage() && !this._batman.allLoadTriggered) { - this.load(); - this._batman.allLoadTriggered = true; - } - return this.get('loaded'); - }, - set: function(k, v) { - return this.set('loaded', v); - } - }); - - Model.classAccessor('loaded', { - get: function() { - return this._loaded || (this._loaded = new Batman.Set); - }, - set: function(k, v) { - return this._loaded = v; - } - }); - - Model.classAccessor('first', function() { - return this.get('all').toArray()[0]; - }); - - Model.classAccessor('last', function() { - var x; - x = this.get('all').toArray(); - return x[x.length - 1]; - }); - - Model.clear = function() { - var result, _ref; - Batman.initializeObject(this); - result = this.get('loaded').clear(); - if ((_ref = this._batman.get('associations')) != null) { - _ref.reset(); - } - this._resetPromises(); - return result; - }; - - Model.find = function(id, callback) { - return this.findWithOptions(id, void 0, callback); - }; - - Model.findWithOptions = function(id, options, callback) { - var record; - if (options == null) { - options = {}; - } - Batman.developer.assert(callback, "Must call find with a callback!"); - record = new this(); - record._withoutDirtyTracking(function() { - return this.set('id', id); - }); - record.loadWithOptions(options, callback); - return record; - }; - - Model.load = function(options, callback) { - var _ref; - if ((_ref = typeof options) === 'function' || _ref === 'undefined') { - callback = options; - options = {}; - } else { - options = { - data: options - }; - } - return this.loadWithOptions(options, callback); - }; - - Model.loadWithOptions = function(options, callback) { - var _this = this; - this.fire('loading', options); - return this._doStorageOperation('readAll', options, function(err, records, env) { - var mappedRecords, record; - if (err != null) { - _this.fire('error', err); - return typeof callback === "function" ? callback(err, []) : void 0; - } else { - mappedRecords = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = records.length; _i < _len; _i++) { - record = records[_i]; - _results.push(this._mapIdentity(record)); - } - return _results; - }).call(_this); - _this.fire('loaded', mappedRecords, env); - return typeof callback === "function" ? callback(err, mappedRecords, env) : void 0; - } - }); - }; - - Model.create = function(attrs, callback) { - var obj, _ref; - if (!callback) { - _ref = [{}, attrs], attrs = _ref[0], callback = _ref[1]; - } - obj = new this(attrs); - obj.save(callback); - return obj; - }; - - Model.findOrCreate = function(attrs, callback) { - var foundRecord, record; - record = new this(attrs); - if (record.isNew()) { - record.save(callback); - } else { - foundRecord = this._mapIdentity(record); - callback(void 0, foundRecord); - } - return record; - }; - - Model.createFromJSON = function(json) { - var record; - record = new this; - record._withoutDirtyTracking(function() { - return this.fromJSON(json); - }); - return this._mapIdentity(record); - }; - - Model._mapIdentity = function(record) { - var existing, id, _ref; - if (typeof (id = record.get('id')) === 'undefined' || id === '') { - return record; - } else { - existing = (_ref = this.get("loaded.indexedBy.id").get(id)) != null ? _ref.toArray()[0] : void 0; - if (existing) { - existing._withoutDirtyTracking(function() { - var _ref1; - return this.updateAttributes(((_ref1 = record.get('attributes')) != null ? _ref1.toObject() : void 0) || {}); - }); - return existing; - } else { - this.get('loaded').add(record); - return record; - } - } - }; - - Model._doStorageOperation = function(operation, options, callback) { - var adapter; - Batman.developer.assert(this.prototype.hasStorage(), "Can't " + operation + " model " + (Batman.functionName(this.constructor)) + " without any storage adapters!"); - adapter = this.prototype._batman.get('storage'); - return adapter.perform(operation, this, options, callback); - }; - - _ref = ['find', 'load', 'create']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - functionName = _ref[_i]; - Model[functionName] = Batman.Property.wrapTrackingPrevention(Model[functionName]); - } - - Model.InstanceLifecycleStateMachine = (function(_super1) { - - __extends(InstanceLifecycleStateMachine, _super1); - - function InstanceLifecycleStateMachine() { - return InstanceLifecycleStateMachine.__super__.constructor.apply(this, arguments); - } - - InstanceLifecycleStateMachine.transitions({ - load: { - from: ['dirty', 'clean'], - to: 'loading' - }, - create: { - from: ['dirty', 'clean'], - to: 'creating' - }, - save: { - from: ['dirty', 'clean'], - to: 'saving' - }, - destroy: { - from: ['dirty', 'clean'], - to: 'destroying' - }, - failedValidation: { - from: ['saving', 'creating'], - to: 'dirty' - }, - loaded: { - loading: 'clean' - }, - created: { - creating: 'clean' - }, - saved: { - saving: 'clean' - }, - destroyed: { - destroying: 'destroyed' - }, - set: { - from: ['dirty', 'clean'], - to: 'dirty' - }, - error: { - from: ['saving', 'creating', 'loading', 'destroying'], - to: 'error' - } - }); - - return InstanceLifecycleStateMachine; - - })(Batman.DelegatingStateMachine); - - function Model(idOrAttributes) { - if (idOrAttributes == null) { - idOrAttributes = {}; - } - this.destroy = __bind(this.destroy, this); - - this.save = __bind(this.save, this); - - this.loadWithOptions = __bind(this.loadWithOptions, this); - - this.load = __bind(this.load, this); - - Batman.developer.assert(this instanceof Batman.Object, "constructors must be called with new"); - if (Batman.typeOf(idOrAttributes) === 'Object') { - Model.__super__.constructor.call(this, idOrAttributes); - } else { - Model.__super__.constructor.call(this); - this.set('id', idOrAttributes); - } - } - - Model.accessor('lifecycle', function() { - return this.lifecycle || (this.lifecycle = new Batman.Model.InstanceLifecycleStateMachine('clean', this)); - }); - - Model.accessor('attributes', function() { - return this.attributes || (this.attributes = new Batman.Hash); - }); - - Model.accessor('dirtyKeys', function() { - return this.dirtyKeys || (this.dirtyKeys = new Batman.Hash); - }); - - Model.accessor('_dirtiedKeys', function() { - return this._dirtiedKeys || (this._dirtiedKeys = new Batman.SimpleSet); - }); - - Model.accessor('errors', function() { - return this.errors || (this.errors = new Batman.ErrorsSet); - }); - - Model.accessor('isNew', function() { - return this.isNew(); - }); - - Model.accessor('isDirty', function() { - return this.isDirty(); - }); - - Model.accessor(Model.defaultAccessor = { - get: function(k) { - return Batman.getPath(this, ['attributes', k]); - }, - set: function(k, v) { - if (this._willSet(k)) { - return this.get('attributes').set(k, v); - } else { - return this.get(k); - } - }, - unset: function(k) { - return this.get('attributes').unset(k); - } - }); - - Model.wrapAccessor('id', function(core) { - return { - get: function() { - var primaryKey; - primaryKey = this.constructor.primaryKey; - if (primaryKey === 'id') { - return core.get.apply(this, arguments); - } else { - return this.get(primaryKey); - } - }, - set: function(key, value) { - var parsedValue, primaryKey; - if ((typeof value === "string") && (value.match(/[^0-9]/) === null) && (("" + (parsedValue = parseInt(value, 10))) === value)) { - value = parsedValue; - } - primaryKey = this.constructor.primaryKey; - if (primaryKey === 'id') { - this._willSet(key); - return core.set.apply(this, arguments); - } else { - return this.set(primaryKey, value); - } - } - }; - }); - - Model.prototype.isNew = function() { - return typeof this.get('id') === 'undefined'; - }; - - Model.prototype.isDirty = function() { - return this.get('lifecycle.state') === 'dirty'; - }; - - Model.prototype.updateAttributes = function(attrs) { - this.mixin(attrs); - return this; - }; - - Model.prototype.toString = function() { - return "" + (this.constructor.get('resourceName')) + ": " + (this.get('id')); - }; - - Model.prototype.toParam = function() { - return this.get('id'); - }; - - Model.prototype.toJSON = function() { - var encoders, obj, - _this = this; - obj = {}; - encoders = this._batman.get('encoders'); - if (!(!encoders || encoders.isEmpty())) { - encoders.forEach(function(key, encoder) { - var encodedVal, val; - if (encoder.encode) { - val = _this.get(key); - if (typeof val !== 'undefined') { - encodedVal = encoder.encode(val, key, obj, _this); - if (typeof encodedVal !== 'undefined') { - return obj[encoder.as] = encodedVal; - } - } - } - }); - } - return obj; - }; - - Model.prototype.fromJSON = function(data) { - var encoders, key, obj, value, - _this = this; - obj = {}; - encoders = this._batman.get('encoders'); - if (!encoders || encoders.isEmpty() || !encoders.some(function(key, encoder) { - return encoder.decode != null; - })) { - for (key in data) { - value = data[key]; - obj[key] = value; - } - } else { - encoders.forEach(function(key, encoder) { - if (encoder.decode && typeof data[encoder.as] !== 'undefined') { - return obj[key] = encoder.decode(data[encoder.as], encoder.as, data, obj, _this); - } - }); - } - if (this.constructor.primaryKey !== 'id') { - obj.id = data[this.constructor.primaryKey]; - } - Batman.developer["do"](function() { - if ((!encoders) || encoders.length <= 1) { - return Batman.developer.warn("Warning: Model " + (Batman.functionName(_this.constructor)) + " has suspiciously few decoders!"); - } - }); - return this.mixin(obj); - }; - - Model.prototype.hasStorage = function() { - return this._batman.get('storage') != null; - }; - - Model.prototype.load = function(options, callback) { - var _ref1; - if (!callback) { - _ref1 = [{}, options], options = _ref1[0], callback = _ref1[1]; - } else { - options = { - data: options - }; - } - return this.loadWithOptions(options, callback); - }; - - Model.prototype.loadWithOptions = function(options, callback) { - var callbackQueue, hasOptions, _ref1, - _this = this; - hasOptions = Object.keys(options).length !== 0; - if ((_ref1 = this.get('lifecycle.state')) === 'destroying' || _ref1 === 'destroyed') { - if (typeof callback === "function") { - callback(new Error("Can't load a destroyed record!")); - } - return; - } - if (this.get('lifecycle').load()) { - callbackQueue = []; - if (callback != null) { - callbackQueue.push(callback); - } - if (!hasOptions) { - this._currentLoad = callbackQueue; - } - return this._doStorageOperation('read', options, function(err, record, env) { - var _j, _len1; - if (!err) { - _this.get('lifecycle').loaded(); - record = _this.constructor._mapIdentity(record); - } else { - _this.get('lifecycle').error(); - } - if (!hasOptions) { - _this._currentLoad = null; - } - for (_j = 0, _len1 = callbackQueue.length; _j < _len1; _j++) { - callback = callbackQueue[_j]; - callback(err, record, env); - } - }); - } else { - if (this.get('lifecycle.state') === 'loading' && !hasOptions) { - if (callback != null) { - return this._currentLoad.push(callback); - } - } else { - return typeof callback === "function" ? callback(new Batman.StateMachine.InvalidTransitionError("Can't load while in state " + (this.get('lifecycle.state')))) : void 0; - } - } - }; - - Model.prototype.save = function(options, callback) { - var endState, isNew, startState, storageOperation, _ref1, _ref2, - _this = this; - if (!callback) { - _ref1 = [{}, options], options = _ref1[0], callback = _ref1[1]; - } - isNew = this.isNew(); - _ref2 = isNew ? ['create', 'create', 'created'] : ['save', 'update', 'saved'], startState = _ref2[0], storageOperation = _ref2[1], endState = _ref2[2]; - if (this.get('lifecycle').startTransition(startState)) { - return this.validate(function(error, errors) { - var associations; - if (error || errors.length) { - _this.get('lifecycle').failedValidation(); - return typeof callback === "function" ? callback(error || errors, _this) : void 0; - } - associations = _this.constructor._batman.get('associations'); - _this._withoutDirtyTracking(function() { - var _ref3, - _this = this; - return associations != null ? (_ref3 = associations.getByType('belongsTo')) != null ? _ref3.forEach(function(association, label) { - return association.apply(_this); - }) : void 0 : void 0; - }); - return _this._doStorageOperation(storageOperation, { - data: options - }, function(err, record, env) { - if (!err) { - _this.get('dirtyKeys').clear(); - _this.get('_dirtiedKeys').clear(); - if (associations) { - record._withoutDirtyTracking(function() { - var _ref3, _ref4; - if ((_ref3 = associations.getByType('hasOne')) != null) { - _ref3.forEach(function(association, label) { - return association.apply(err, record); - }); - } - return (_ref4 = associations.getByType('hasMany')) != null ? _ref4.forEach(function(association, label) { - return association.apply(err, record); - }) : void 0; - }); - } - record = _this.constructor._mapIdentity(record); - _this.get('lifecycle').startTransition(endState); - } else { - if (err instanceof Batman.ErrorsSet) { - _this.get('lifecycle').failedValidation(); - } else { - _this.get('lifecycle').error(); - } - } - return typeof callback === "function" ? callback(err, record || _this, env) : void 0; - }); - }); - } else { - return typeof callback === "function" ? callback(new Batman.StateMachine.InvalidTransitionError("Can't save while in state " + (this.get('lifecycle.state')))) : void 0; - } - }; - - Model.prototype.destroy = function(options, callback) { - var _ref1, - _this = this; - if (!callback) { - _ref1 = [{}, options], options = _ref1[0], callback = _ref1[1]; - } - if (this.get('lifecycle').destroy()) { - return this._doStorageOperation('destroy', { - data: options - }, function(err, record, env) { - if (!err) { - _this.constructor.get('loaded').remove(_this); - _this.get('lifecycle').destroyed(); - } else { - _this.get('lifecycle').error(); - } - return typeof callback === "function" ? callback(err, record, env) : void 0; - }); - } else { - return typeof callback === "function" ? callback(new Batman.StateMachine.InvalidTransitionError("Can't destroy while in state " + (this.get('lifecycle.state')))) : void 0; - } - }; - - Model.prototype.validate = function(callback) { - var args, count, errors, finishedValidation, key, validator, validators, _j, _k, _len1, _len2, _ref1; - errors = this.get('errors'); - errors.clear(); - validators = this._batman.get('validators') || []; - if (!validators || validators.length === 0) { - if (typeof callback === "function") { - callback(void 0, errors); - } - return true; - } - count = validators.reduce((function(acc, validator) { - return acc + validator.keys.length; - }), 0); - finishedValidation = function() { - if (--count === 0) { - return typeof callback === "function" ? callback(void 0, errors) : void 0; - } - }; - for (_j = 0, _len1 = validators.length; _j < _len1; _j++) { - validator = validators[_j]; - _ref1 = validator.keys; - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - key = _ref1[_k]; - args = [errors, this, key, finishedValidation]; - try { - if (validator.validator) { - validator.validator.validateEach.apply(validator.validator, args); - } else { - validator.callback.apply(validator, args); - } - } catch (e) { - if (typeof callback === "function") { - callback(e, errors); - } - } - } - } - }; - - Model.prototype.associationProxy = function(association) { - var proxies, _base, _name; - Batman.initializeObject(this); - proxies = (_base = this._batman).associationProxies || (_base.associationProxies = {}); - proxies[_name = association.label] || (proxies[_name] = new association.proxyClass(association, this)); - return proxies[association.label]; - }; - - Model.prototype._willSet = function(key) { - if (this._pauseDirtyTracking) { - return true; - } - if (this.get('lifecycle').startTransition('set')) { - if (!this.get('_dirtiedKeys').has(key)) { - this.set("dirtyKeys." + key, this.get(key)); - this.get('_dirtiedKeys').add(key); - } - return true; - } else { - return false; - } - }; - - Model.prototype._doStorageOperation = function(operation, options, callback) { - var adapter, - _this = this; - Batman.developer.assert(this.hasStorage(), "Can't " + operation + " model " + (Batman.functionName(this.constructor)) + " without any storage adapters!"); - adapter = this._batman.get('storage'); - return adapter.perform(operation, this, options, function() { - return callback.apply(null, arguments); - }); - }; - - Model.prototype._withoutDirtyTracking = function(block) { - var result; - this._pauseDirtyTracking = true; - result = block.call(this); - this._pauseDirtyTracking = false; - return result; - }; - - _ref1 = ['load', 'save', 'validate', 'destroy']; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - functionName = _ref1[_j]; - Model.prototype[functionName] = Batman.Property.wrapTrackingPrevention(Model.prototype[functionName]); - } - - return Model; - - }).call(this, Batman.Object); - -}).call(this); - -(function() { - var k, _fn, _i, _len, _ref, - _this = this; - - _ref = Batman.AssociationCurator.availableAssociations; - _fn = function(k) { - return Batman.Model[k] = function(label, scope) { - var collection, _base; - Batman.initializeObject(this); - collection = (_base = this._batman).associations || (_base.associations = new Batman.AssociationCurator(this)); - return collection.add(new Batman["" + (Batman.helpers.capitalize(k)) + "Association"](this, label, scope)); - }; - }; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - _fn(k); - } - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.Proxy = (function(_super) { - - __extends(Proxy, _super); - - Proxy.prototype.isProxy = true; - - function Proxy(target) { - Proxy.__super__.constructor.call(this); - if (target != null) { - this.set('target', target); - } - } - - Proxy.accessor('target', Batman.Property.defaultAccessor); - - Proxy.accessor({ - get: function(key) { - var _ref; - return (_ref = this.get('target')) != null ? _ref.get(key) : void 0; - }, - set: function(key, value) { - var _ref; - return (_ref = this.get('target')) != null ? _ref.set(key, value) : void 0; - }, - unset: function(key) { - var _ref; - return (_ref = this.get('target')) != null ? _ref.unset(key) : void 0; - } - }); - - return Proxy; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.AssociationProxy = (function(_super) { - - __extends(AssociationProxy, _super); - - AssociationProxy.prototype.loaded = false; - - function AssociationProxy(association, model) { - this.association = association; - this.model = model; - AssociationProxy.__super__.constructor.call(this); - } - - AssociationProxy.prototype.toJSON = function() { - var target; - target = this.get('target'); - if (target != null) { - return this.get('target').toJSON(); - } - }; - - AssociationProxy.prototype.load = function(callback) { - var _this = this; - this.fetch(function(err, proxiedRecord) { - if (!err) { - _this._setTarget(proxiedRecord); - } - return typeof callback === "function" ? callback(err, proxiedRecord) : void 0; - }); - return this.get('target'); - }; - - AssociationProxy.prototype.loadFromLocal = function() { - var target; - if (!this._canLoad()) { - return; - } - if (target = this.fetchFromLocal()) { - this._setTarget(target); - } - return target; - }; - - AssociationProxy.prototype.fetch = function(callback) { - var record; - if (!this._canLoad()) { - return callback(void 0, void 0); - } - record = this.fetchFromLocal(); - if (record) { - return callback(void 0, record); - } else { - return this.fetchFromRemote(callback); - } - }; - - AssociationProxy.accessor('loaded', Batman.Property.defaultAccessor); - - AssociationProxy.accessor('target', { - get: function() { - return this.fetchFromLocal(); - }, - set: function(_, v) { - return v; - } - }); - - AssociationProxy.prototype._canLoad = function() { - return (this.get('foreignValue') || this.get('primaryValue')) != null; - }; - - AssociationProxy.prototype._setTarget = function(target) { - this.set('target', target); - this.set('loaded', true); - return this.fire('loaded', target); - }; - - return AssociationProxy; - - })(Batman.Proxy); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.HasOneProxy = (function(_super) { - - __extends(HasOneProxy, _super); - - function HasOneProxy() { - return HasOneProxy.__super__.constructor.apply(this, arguments); - } - - HasOneProxy.accessor('primaryValue', function() { - return this.model.get(this.association.primaryKey); - }); - - HasOneProxy.prototype.fetchFromLocal = function() { - return this.association.setIndex().get(this.get('primaryValue')); - }; - - HasOneProxy.prototype.fetchFromRemote = function(callback) { - var loadOptions, - _this = this; - loadOptions = { - data: {} - }; - loadOptions.data[this.association.foreignKey] = this.get('primaryValue'); - if (this.association.options.url) { - loadOptions.collectionUrl = this.association.options.url; - loadOptions.urlContext = this.model; - } - return this.association.getRelatedModel().loadWithOptions(loadOptions, function(error, loadedRecords) { - if (error) { - throw error; - } - if (!loadedRecords || loadedRecords.length <= 0) { - return callback(new Error("Couldn't find related record!"), void 0); - } else { - return callback(void 0, loadedRecords[0]); - } - }); - }; - - return HasOneProxy; - - })(Batman.AssociationProxy); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.BelongsToProxy = (function(_super) { - - __extends(BelongsToProxy, _super); - - function BelongsToProxy() { - return BelongsToProxy.__super__.constructor.apply(this, arguments); - } - - BelongsToProxy.accessor('foreignValue', function() { - return this.model.get(this.association.foreignKey); - }); - - BelongsToProxy.prototype.fetchFromLocal = function() { - return this.association.setIndex().get(this.get('foreignValue')); - }; - - BelongsToProxy.prototype.fetchFromRemote = function(callback) { - var loadOptions, - _this = this; - loadOptions = {}; - if (this.association.options.url) { - loadOptions.recordUrl = this.association.options.url; - } - return this.association.getRelatedModel().findWithOptions(this.get('foreignValue'), loadOptions, function(error, loadedRecord) { - if (error) { - throw error; - } - return callback(void 0, loadedRecord); - }); - }; - - return BelongsToProxy; - - })(Batman.AssociationProxy); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PolymorphicBelongsToProxy = (function(_super) { - - __extends(PolymorphicBelongsToProxy, _super); - - function PolymorphicBelongsToProxy() { - return PolymorphicBelongsToProxy.__super__.constructor.apply(this, arguments); - } - - PolymorphicBelongsToProxy.accessor('foreignTypeValue', function() { - return this.model.get(this.association.foreignTypeKey); - }); - - PolymorphicBelongsToProxy.prototype.fetchFromLocal = function() { - return this.association.setIndexForType(this.get('foreignTypeValue')).get(this.get('foreignValue')); - }; - - PolymorphicBelongsToProxy.prototype.fetchFromRemote = function(callback) { - var loadOptions, - _this = this; - loadOptions = {}; - if (this.association.options.url) { - loadOptions.recordUrl = this.association.options.url; - } - return this.association.getRelatedModelForType(this.get('foreignTypeValue')).findWithOptions(this.get('foreignValue'), loadOptions, function(error, loadedRecord) { - if (error) { - throw error; - } - return callback(void 0, loadedRecord); - }); - }; - - return PolymorphicBelongsToProxy; - - })(Batman.BelongsToProxy); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.Accessible = (function(_super) { - - __extends(Accessible, _super); - - function Accessible() { - this.accessor.apply(this, arguments); - } - - return Accessible; - - })(Batman.Object); - - Batman.TerminalAccessible = (function(_super) { - - __extends(TerminalAccessible, _super); - - function TerminalAccessible() { - return TerminalAccessible.__super__.constructor.apply(this, arguments); - } - - TerminalAccessible.prototype.propertyClass = Batman.Property; - - return TerminalAccessible; - - })(Batman.Accessible); - -}).call(this); - -(function() { - - Batman.mixins = new Batman.Object; - -}).call(this); - -(function() { - - Batman.URI = (function() { - /* - # URI parsing - */ - - var attributes, childKeyMatchers, decodeQueryComponent, encodeComponent, encodeQueryComponent, keyVal, nameParser, normalizeParams, plus, queryFromParams, r20, strictParser; - - strictParser = /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/; - - attributes = ["source", "protocol", "authority", "userInfo", "user", "password", "hostname", "port", "relative", "path", "directory", "file", "query", "hash"]; - - function URI(str) { - var i, matches; - matches = strictParser.exec(str); - i = 14; - while (i--) { - this[attributes[i]] = matches[i] || ''; - } - this.queryParams = this.constructor.paramsFromQuery(this.query); - delete this.authority; - delete this.userInfo; - delete this.relative; - delete this.directory; - delete this.file; - delete this.query; - } - - URI.prototype.queryString = function() { - return this.constructor.queryFromParams(this.queryParams); - }; - - URI.prototype.toString = function() { - return [this.protocol ? "" + this.protocol + ":" : void 0, this.authority() ? "//" : void 0, this.authority(), this.relative()].join(""); - }; - - URI.prototype.userInfo = function() { - return [this.user, this.password ? ":" + this.password : void 0].join(""); - }; - - URI.prototype.authority = function() { - return [this.userInfo(), this.user || this.password ? "@" : void 0, this.hostname, this.port ? ":" + this.port : void 0].join(""); - }; - - URI.prototype.relative = function() { - var query; - query = this.queryString(); - return [this.path, query ? "?" + query : void 0, this.hash ? "#" + this.hash : void 0].join(""); - }; - - URI.prototype.directory = function() { - var splitPath; - splitPath = this.path.split('/'); - if (splitPath.length > 1) { - return splitPath.slice(0, splitPath.length - 1).join('/') + "/"; - } else { - return ""; - } - }; - - URI.prototype.file = function() { - var splitPath; - splitPath = this.path.split("/"); - return splitPath[splitPath.length - 1]; - }; - - /* - # query parsing - */ - - - URI.paramsFromQuery = function(query) { - var matches, params, segment, _i, _len, _ref; - params = {}; - _ref = query.split('&'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - segment = _ref[_i]; - if (matches = segment.match(keyVal)) { - normalizeParams(params, decodeQueryComponent(matches[1]), decodeQueryComponent(matches[2])); - } else { - normalizeParams(params, decodeQueryComponent(segment), null); - } - } - return params; - }; - - URI.decodeQueryComponent = decodeQueryComponent = function(str) { - return decodeURIComponent(str.replace(plus, '%20')); - }; - - nameParser = /^[\[\]]*([^\[\]]+)\]*(.*)/; - - childKeyMatchers = [/^\[\]\[([^\[\]]+)\]$/, /^\[\](.+)$/]; - - plus = /\+/g; - - r20 = /%20/g; - - keyVal = /^([^=]*)=(.*)/; - - normalizeParams = function(params, name, v) { - var after, childKey, k, last, matches, _ref, _ref1, _ref2; - if (matches = name.match(nameParser)) { - k = matches[1]; - after = matches[2]; - } else { - return; - } - if (after === '') { - params[k] = v; - } else if (after === '[]') { - if ((_ref = params[k]) == null) { - params[k] = []; - } - if (Batman.typeOf(params[k]) !== 'Array') { - throw new Error("expected Array (got " + (Batman.typeOf(params[k])) + ") for param \"" + k + "\""); - } - params[k].push(v); - } else if (matches = after.match(childKeyMatchers[0]) || after.match(childKeyMatchers[1])) { - childKey = matches[1]; - if ((_ref1 = params[k]) == null) { - params[k] = []; - } - if (Batman.typeOf(params[k]) !== 'Array') { - throw new Error("expected Array (got " + (Batman.typeOf(params[k])) + ") for param \"" + k + "\""); - } - last = params[k][params[k].length - 1]; - if (Batman.typeOf(last) === 'Object' && !(childKey in last)) { - normalizeParams(last, childKey, v); - } else { - params[k].push(normalizeParams({}, childKey, v)); - } - } else { - if ((_ref2 = params[k]) == null) { - params[k] = {}; - } - if (Batman.typeOf(params[k]) !== 'Object') { - throw new Error("expected Object (got " + (Batman.typeOf(params[k])) + ") for param \"" + k + "\""); - } - params[k] = normalizeParams(params[k], after, v); - } - return params; - }; - - /* - # query building - */ - - - URI.queryFromParams = queryFromParams = function(value, prefix) { - var arrayResults, k, v, valueType; - if (value == null) { - return prefix; - } - valueType = Batman.typeOf(value); - if (!((prefix != null) || valueType === 'Object')) { - throw new Error("value must be an Object"); - } - switch (valueType) { - case 'Array': - return ((function() { - var _i, _len; - arrayResults = []; - if (value.length === 0) { - arrayResults.push(queryFromParams(null, "" + prefix + "[]")); - } else { - for (_i = 0, _len = value.length; _i < _len; _i++) { - v = value[_i]; - arrayResults.push(queryFromParams(v, "" + prefix + "[]")); - } - } - return arrayResults; - })()).join("&"); - case 'Object': - return ((function() { - var _results; - _results = []; - for (k in value) { - v = value[k]; - _results.push(queryFromParams(v, prefix ? "" + prefix + "[" + (encodeQueryComponent(k)) + "]" : encodeQueryComponent(k))); - } - return _results; - })()).join("&"); - default: - if (prefix != null) { - return "" + prefix + "=" + (encodeQueryComponent(value)); - } else { - return encodeQueryComponent(value); - } - } - }; - - URI.encodeComponent = encodeComponent = function(str) { - if (str != null) { - return encodeURIComponent(str); - } else { - return ''; - } - }; - - URI.encodeQueryComponent = encodeQueryComponent = function(str) { - return encodeComponent(str).replace(r20, '+'); - }; - - return URI; - - })(); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.Request = (function(_super) { - var dataHasFileUploads; - - __extends(Request, _super); - - Request.objectToFormData = function(data) { - var formData, key, pairForList, val, _i, _len, _ref, _ref1; - pairForList = function(key, object, first) { - var k, list, v; - if (first == null) { - first = false; - } - if (object instanceof Batman.container.File) { - return [[key, object]]; - } - return list = (function() { - switch (Batman.typeOf(object)) { - case 'Object': - list = (function() { - var _results; - _results = []; - for (k in object) { - v = object[k]; - _results.push(pairForList((first ? k : "" + key + "[" + k + "]"), v)); - } - return _results; - })(); - return list.reduce(function(acc, list) { - return acc.concat(list); - }, []); - case 'Array': - return object.reduce(function(acc, element) { - return acc.concat(pairForList("" + key + "[]", element)); - }, []); - default: - return [[key, object != null ? object : ""]]; - } - })(); - }; - formData = new Batman.container.FormData(); - _ref = pairForList("", data, true); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - _ref1 = _ref[_i], key = _ref1[0], val = _ref1[1]; - formData.append(key, val); - } - return formData; - }; - - Request.dataHasFileUploads = dataHasFileUploads = function(data) { - var k, type, v, _i, _len; - if ((typeof File !== "undefined" && File !== null) && data instanceof File) { - return true; - } - type = Batman.typeOf(data); - switch (type) { - case 'Object': - for (k in data) { - v = data[k]; - if (dataHasFileUploads(v)) { - return true; - } - } - break; - case 'Array': - for (_i = 0, _len = data.length; _i < _len; _i++) { - v = data[_i]; - if (dataHasFileUploads(v)) { - return true; - } - } - } - return false; - }; - - Request.wrapAccessor('method', function(core) { - return { - set: function(k, val) { - return core.set.call(this, k, val != null ? typeof val.toUpperCase === "function" ? val.toUpperCase() : void 0 : void 0); - } - }; - }); - - Request.prototype.method = 'GET'; - - Request.prototype.hasFileUploads = function() { - return dataHasFileUploads(this.data); - }; - - Request.prototype.contentType = 'application/x-www-form-urlencoded'; - - Request.prototype.autosend = true; - - function Request(options) { - var handler, handlers, k, _ref; - handlers = {}; - for (k in options) { - handler = options[k]; - if (!(k === 'success' || k === 'error' || k === 'loading' || k === 'loaded')) { - continue; - } - handlers[k] = handler; - delete options[k]; - } - Request.__super__.constructor.call(this, options); - for (k in handlers) { - handler = handlers[k]; - this.on(k, handler); - } - if (((_ref = this.get('url')) != null ? _ref.length : void 0) > 0) { - if (this.autosend) { - this.send(); - } - } else { - this.observe('url', function(url) { - if (url != null) { - return this.send(); - } - }); - } - } - - Request.prototype.send = function() { - return Batman.developer.error("Please source a dependency file for a request implementation"); - }; - - return Request; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.SetObserver = (function(_super) { - - __extends(SetObserver, _super); - - function SetObserver(base) { - var _this = this; - this.base = base; - this._itemObservers = new Batman.SimpleHash; - this._setObservers = new Batman.SimpleHash; - this._setObservers.set("itemsWereAdded", function() { - return _this.fire.apply(_this, ['itemsWereAdded'].concat(__slice.call(arguments))); - }); - this._setObservers.set("itemsWereRemoved", function() { - return _this.fire.apply(_this, ['itemsWereRemoved'].concat(__slice.call(arguments))); - }); - this.on('itemsWereAdded', this.startObservingItems.bind(this)); - this.on('itemsWereRemoved', this.stopObservingItems.bind(this)); - } - - SetObserver.prototype.observedItemKeys = []; - - SetObserver.prototype.observerForItemAndKey = function(item, key) {}; - - SetObserver.prototype._getOrSetObserverForItemAndKey = function(item, key) { - var _this = this; - return this._itemObservers.getOrSet(item, function() { - var observersByKey; - observersByKey = new Batman.SimpleHash; - return observersByKey.getOrSet(key, function() { - return _this.observerForItemAndKey(item, key); - }); - }); - }; - - SetObserver.prototype.startObserving = function() { - this._manageItemObservers("observe"); - return this._manageSetObservers("addHandler"); - }; - - SetObserver.prototype.stopObserving = function() { - this._manageItemObservers("forget"); - return this._manageSetObservers("removeHandler"); - }; - - SetObserver.prototype.startObservingItems = function() { - var item, items, _i, _len, _results; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - _results.push(this._manageObserversForItem(item, "observe")); - } - return _results; - }; - - SetObserver.prototype.stopObservingItems = function() { - var item, items, _i, _len, _results; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - _results.push(this._manageObserversForItem(item, "forget")); - } - return _results; - }; - - SetObserver.prototype._manageObserversForItem = function(item, method) { - var key, _i, _len, _ref; - if (!item.isObservable) { - return; - } - _ref = this.observedItemKeys; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - item[method](key, this._getOrSetObserverForItemAndKey(item, key)); - } - if (method === "forget") { - return this._itemObservers.unset(item); - } - }; - - SetObserver.prototype._manageItemObservers = function(method) { - var _this = this; - return this.base.forEach(function(item) { - return _this._manageObserversForItem(item, method); - }); - }; - - SetObserver.prototype._manageSetObservers = function(method) { - var _this = this; - if (!this.base.isObservable) { - return; - } - return this._setObservers.forEach(function(key, observer) { - return _this.base.event(key)[method](observer); - }); - }; - - return SetObserver; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.SetSort = (function(_super) { - - __extends(SetSort, _super); - - function SetSort(base, key, order) { - var boundReIndex; - this.key = key; - if (order == null) { - order = "asc"; - } - SetSort.__super__.constructor.call(this, base); - this.descending = order.toLowerCase() === "desc"; - if (this.base.isObservable) { - this._setObserver = new Batman.SetObserver(this.base); - this._setObserver.observedItemKeys = [this.key]; - boundReIndex = this._reIndex.bind(this); - this._setObserver.observerForItemAndKey = function() { - return boundReIndex; - }; - this._setObserver.on('itemsWereAdded', boundReIndex); - this._setObserver.on('itemsWereRemoved', boundReIndex); - this.startObserving(); - } - this._reIndex(); - } - - SetSort.prototype.startObserving = function() { - var _ref; - return (_ref = this._setObserver) != null ? _ref.startObserving() : void 0; - }; - - SetSort.prototype.stopObserving = function() { - var _ref; - return (_ref = this._setObserver) != null ? _ref.stopObserving() : void 0; - }; - - SetSort.prototype.toArray = function() { - return this.get('_storage'); - }; - - SetSort.prototype.forEach = function(iterator, ctx) { - var e, i, _i, _len, _ref, _results; - _ref = this.get('_storage'); - _results = []; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - e = _ref[i]; - _results.push(iterator.call(ctx, e, i, this)); - } - return _results; - }; - - SetSort.prototype.find = function(block) { - var item, _i, _len, _ref; - this.base.registerAsMutableSource(); - _ref = this.get('_storage'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - item = _ref[_i]; - if (block(item)) { - return item; - } - } - }; - - SetSort.prototype.merge = function(other) { - this.base.registerAsMutableSource(); - return (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.Set, this._storage, function(){}).merge(other).sortedBy(this.key, this.order); - }; - - SetSort.prototype.compare = function(a, b) { - if (a === b) { - return 0; - } - if (a === void 0) { - return 1; - } - if (b === void 0) { - return -1; - } - if (a === null) { - return 1; - } - if (b === null) { - return -1; - } - if (a === false) { - return 1; - } - if (b === false) { - return -1; - } - if (a === true) { - return 1; - } - if (b === true) { - return -1; - } - if (a !== a) { - if (b !== b) { - return 0; - } else { - return 1; - } - } - if (b !== b) { - return -1; - } - if (a > b) { - return 1; - } - if (a < b) { - return -1; - } - return 0; - }; - - SetSort.prototype._reIndex = function() { - var newOrder, _ref, - _this = this; - newOrder = this.base.toArray().sort(function(a, b) { - var multiple, valueA, valueB; - valueA = Batman.get(a, _this.key); - if (typeof valueA === 'function') { - valueA = valueA.call(a); - } - if (valueA != null) { - valueA = valueA.valueOf(); - } - valueB = Batman.get(b, _this.key); - if (typeof valueB === 'function') { - valueB = valueB.call(b); - } - if (valueB != null) { - valueB = valueB.valueOf(); - } - multiple = _this.descending ? -1 : 1; - return _this.compare.call(_this, valueA, valueB) * multiple; - }); - if ((_ref = this._setObserver) != null) { - _ref.startObservingItems.apply(_ref, newOrder); - } - return this.set('_storage', newOrder); - }; - - return SetSort; - - })(Batman.SetProxy); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.AssociationSet = (function(_super) { - - __extends(AssociationSet, _super); - - function AssociationSet(foreignKeyValue, association) { - var base; - this.foreignKeyValue = foreignKeyValue; - this.association = association; - base = new Batman.Set; - AssociationSet.__super__.constructor.call(this, base, '_batmanID'); - } - - AssociationSet.prototype.loaded = false; - - AssociationSet.prototype.load = function(callback) { - var _this = this; - if (this.foreignKeyValue == null) { - return callback(void 0, this); - } - return this.association.getRelatedModel().loadWithOptions(this._getLoadOptions(), function(err, records) { - if (!err) { - _this.markAsLoaded(); - } - return callback(err, _this); - }); - }; - - AssociationSet.prototype._getLoadOptions = function() { - var loadOptions; - loadOptions = { - data: {} - }; - loadOptions.data[this.association.foreignKey] = this.foreignKeyValue; - if (this.association.options.url) { - loadOptions.collectionUrl = this.association.options.url; - loadOptions.urlContext = this.association.parentSetIndex().get(this.foreignKeyValue); - } - return loadOptions; - }; - - AssociationSet.accessor('loaded', Batman.Property.defaultAccessor); - - AssociationSet.prototype.markAsLoaded = function() { - this.set('loaded', true); - return this.fire('loaded'); - }; - - return AssociationSet; - - })(Batman.SetSort); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PolymorphicAssociationSet = (function(_super) { - - __extends(PolymorphicAssociationSet, _super); - - function PolymorphicAssociationSet(foreignKeyValue, foreignTypeKeyValue, association) { - this.foreignKeyValue = foreignKeyValue; - this.foreignTypeKeyValue = foreignTypeKeyValue; - this.association = association; - PolymorphicAssociationSet.__super__.constructor.call(this, this.foreignKeyValue, this.association); - } - - PolymorphicAssociationSet.prototype._getLoadOptions = function() { - var loadOptions; - loadOptions = { - data: {} - }; - loadOptions.data[this.association.foreignKey] = this.foreignKeyValue; - loadOptions.data[this.association.foreignTypeKey] = this.foreignTypeKeyValue; - if (this.association.options.url) { - loadOptions.collectionUrl = this.association.options.url; - loadOptions.urlContext = this.association.parentSetIndex().get(this.foreignKeyValue); - } - return loadOptions; - }; - - return PolymorphicAssociationSet; - - })(Batman.AssociationSet); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.SetIndex = (function(_super) { - - __extends(SetIndex, _super); - - SetIndex.accessor('toArray', function() { - return this.toArray(); - }); - - Batman.extend(SetIndex.prototype, Batman.Enumerable); - - SetIndex.prototype.propertyClass = Batman.Property; - - function SetIndex(base, key) { - var _this = this; - this.base = base; - this.key = key; - SetIndex.__super__.constructor.call(this); - this._storage = new Batman.Hash; - if (this.base.isEventEmitter) { - this._setObserver = new Batman.SetObserver(this.base); - this._setObserver.observedItemKeys = [this.key]; - this._setObserver.observerForItemAndKey = this.observerForItemAndKey.bind(this); - this._setObserver.on('itemsWereAdded', function() { - var item, items, _i, _len, _results; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - _results.push(_this._addItem(item)); - } - return _results; - }); - this._setObserver.on('itemsWereRemoved', function() { - var item, items, _i, _len, _results; - items = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - _results.push(_this._removeItem(item)); - } - return _results; - }); - } - this.base.forEach(this._addItem.bind(this)); - this.startObserving(); - } - - SetIndex.accessor(function(key) { - return this._resultSetForKey(key); - }); - - SetIndex.prototype.startObserving = function() { - var _ref; - return (_ref = this._setObserver) != null ? _ref.startObserving() : void 0; - }; - - SetIndex.prototype.stopObserving = function() { - var _ref; - return (_ref = this._setObserver) != null ? _ref.stopObserving() : void 0; - }; - - SetIndex.prototype.observerForItemAndKey = function(item, key) { - var _this = this; - return function(newValue, oldValue) { - _this._removeItemFromKey(item, oldValue); - return _this._addItemToKey(item, newValue); - }; - }; - - SetIndex.prototype.forEach = function(iterator, ctx) { - var _this = this; - return this._storage.forEach(function(key, set) { - if (set.get('length') > 0) { - return iterator.call(ctx, key, set, _this); - } - }); - }; - - SetIndex.prototype.toArray = function() { - var results; - results = []; - this._storage.forEach(function(key, set) { - if (set.get('length') > 0) { - return results.push(key); - } - }); - return results; - }; - - SetIndex.prototype._addItem = function(item) { - return this._addItemToKey(item, this._keyForItem(item)); - }; - - SetIndex.prototype._addItemToKey = function(item, key) { - return this._resultSetForKey(key).add(item); - }; - - SetIndex.prototype._removeItem = function(item) { - return this._removeItemFromKey(item, this._keyForItem(item)); - }; - - SetIndex.prototype._removeItemFromKey = function(item, key) { - return this._resultSetForKey(key).remove(item); - }; - - SetIndex.prototype._resultSetForKey = function(key) { - return this._storage.getOrSet(key, function() { - return new Batman.Set; - }); - }; - - SetIndex.prototype._keyForItem = function(item) { - return Batman.Keypath.forBaseAndKey(item, this.key).getValue(); - }; - - return SetIndex; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PolymorphicAssociationSetIndex = (function(_super) { - - __extends(PolymorphicAssociationSetIndex, _super); - - function PolymorphicAssociationSetIndex(association, type, key) { - this.association = association; - this.type = type; - PolymorphicAssociationSetIndex.__super__.constructor.call(this, this.association.getRelatedModelForType(type).get('loaded'), key); - } - - PolymorphicAssociationSetIndex.prototype._resultSetForKey = function(key) { - var _this = this; - return this._storage.getOrSet(key, function() { - return new _this.association.proxyClass(key, _this.type, _this.association); - }); - }; - - return PolymorphicAssociationSetIndex; - - })(Batman.SetIndex); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.AssociationSetIndex = (function(_super) { - - __extends(AssociationSetIndex, _super); - - function AssociationSetIndex(association, key) { - this.association = association; - AssociationSetIndex.__super__.constructor.call(this, this.association.getRelatedModel().get('loaded'), key); - } - - AssociationSetIndex.prototype._resultSetForKey = function(key) { - return this.association.setForKey(key); - }; - - AssociationSetIndex.prototype.forEach = function(iterator, ctx) { - var _this = this; - return this.association.proxies.forEach(function(record, set) { - var key; - key = _this.association.indexValueForRecord(record); - if (set.get('length') > 0) { - return iterator.call(ctx, key, set, _this); - } - }); - }; - - AssociationSetIndex.prototype.toArray = function() { - var results; - results = []; - this.forEach(function(key) { - return results.push(key); - }); - return results; - }; - - return AssociationSetIndex; - - })(Batman.SetIndex); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.UniqueSetIndex = (function(_super) { - - __extends(UniqueSetIndex, _super); - - function UniqueSetIndex() { - this._uniqueIndex = new Batman.Hash; - UniqueSetIndex.__super__.constructor.apply(this, arguments); - } - - UniqueSetIndex.accessor(function(key) { - return this._uniqueIndex.get(key); - }); - - UniqueSetIndex.prototype._addItemToKey = function(item, key) { - this._resultSetForKey(key).add(item); - if (!this._uniqueIndex.hasKey(key)) { - return this._uniqueIndex.set(key, item); - } - }; - - UniqueSetIndex.prototype._removeItemFromKey = function(item, key) { - var resultSet; - resultSet = this._resultSetForKey(key); - UniqueSetIndex.__super__._removeItemFromKey.apply(this, arguments); - if (resultSet.isEmpty()) { - return this._uniqueIndex.unset(key); - } else { - return this._uniqueIndex.set(key, resultSet.toArray()[0]); - } - }; - - return UniqueSetIndex; - - })(Batman.SetIndex); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.UniqueAssociationSetIndex = (function(_super) { - - __extends(UniqueAssociationSetIndex, _super); - - function UniqueAssociationSetIndex(association, key) { - this.association = association; - UniqueAssociationSetIndex.__super__.constructor.call(this, this.association.getRelatedModel().get('loaded'), key); - } - - return UniqueAssociationSetIndex; - - })(Batman.UniqueSetIndex); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PolymorphicUniqueAssociationSetIndex = (function(_super) { - - __extends(PolymorphicUniqueAssociationSetIndex, _super); - - function PolymorphicUniqueAssociationSetIndex(association, type, key) { - this.association = association; - this.type = type; - PolymorphicUniqueAssociationSetIndex.__super__.constructor.call(this, this.association.getRelatedModelForType(type).get('loaded'), key); - } - - return PolymorphicUniqueAssociationSetIndex; - - })(Batman.UniqueSetIndex); - -}).call(this); - -(function() { - var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __slice = [].slice; - - Batman.Navigator = (function() { - - Navigator.defaultClass = function() { - if (Batman.config.usePushState && Batman.PushStateNavigator.isSupported()) { - return Batman.PushStateNavigator; - } else { - return Batman.HashbangNavigator; - } - }; - - Navigator.forApp = function(app) { - return new (this.defaultClass())(app); - }; - - function Navigator(app) { - this.app = app; - this.handleCurrentLocation = __bind(this.handleCurrentLocation, this); - - } - - Navigator.prototype.start = function() { - var _this = this; - if (typeof window === 'undefined') { - return; - } - if (this.started) { - return; - } - this.started = true; - this.startWatching(); - Batman.currentApp.prevent('ready'); - return Batman.setImmediate(function() { - if (_this.started && Batman.currentApp) { - _this.handleCurrentLocation(); - return Batman.currentApp.allowAndFire('ready'); - } - }); - }; - - Navigator.prototype.stop = function() { - this.stopWatching(); - return this.started = false; - }; - - Navigator.prototype.handleLocation = function(location) { - var path; - path = this.pathFromLocation(location); - if (path === this.cachedPath) { - return; - } - return this.dispatch(path); - }; - - Navigator.prototype.handleCurrentLocation = function() { - return this.handleLocation(window.location); - }; - - Navigator.prototype.dispatch = function(params) { - this.cachedPath = this.app.get('dispatcher').dispatch(params); - if (this._lastRedirect) { - this.cachedPath = this._lastRedirect; - } - return this.cachedPath; - }; - - Navigator.prototype.push = function(params) { - var path, pathFromParams, _base; - pathFromParams = typeof (_base = this.app.get('dispatcher')).pathFromParams === "function" ? _base.pathFromParams(params) : void 0; - if (pathFromParams) { - this._lastRedirect = pathFromParams; - } - path = this.dispatch(params); - if (!this._lastRedirect || this._lastRedirect === path) { - this.pushState(null, '', path); - } - return path; - }; - - Navigator.prototype.replace = function(params) { - var path, pathFromParams, _base; - pathFromParams = typeof (_base = this.app.get('dispatcher')).pathFromParams === "function" ? _base.pathFromParams(params) : void 0; - if (pathFromParams) { - this._lastRedirect = pathFromParams; - } - path = this.dispatch(params); - if (!this._lastRedirect || this._lastRedirect === path) { - this.replaceState(null, '', path); - } - return path; - }; - - Navigator.prototype.redirect = Navigator.prototype.push; - - Navigator.prototype.normalizePath = function() { - var i, seg, segments; - segments = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - segments = (function() { - var _i, _len, _results; - _results = []; - for (i = _i = 0, _len = segments.length; _i < _len; i = ++_i) { - seg = segments[i]; - _results.push(("" + seg).replace(/^(?!\/)/, '/').replace(/\/+$/, '')); - } - return _results; - })(); - return segments.join('') || '/'; - }; - - Navigator.normalizePath = Navigator.prototype.normalizePath; - - return Navigator; - - })(); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PushStateNavigator = (function(_super) { - - __extends(PushStateNavigator, _super); - - function PushStateNavigator() { - return PushStateNavigator.__super__.constructor.apply(this, arguments); - } - - PushStateNavigator.isSupported = function() { - var _ref; - return (typeof window !== "undefined" && window !== null ? (_ref = window.history) != null ? _ref.pushState : void 0 : void 0) != null; - }; - - PushStateNavigator.prototype.startWatching = function() { - return Batman.DOM.addEventListener(window, 'popstate', this.handleCurrentLocation); - }; - - PushStateNavigator.prototype.stopWatching = function() { - return Batman.DOM.removeEventListener(window, 'popstate', this.handleCurrentLocation); - }; - - PushStateNavigator.prototype.pushState = function(stateObject, title, path) { - if (path !== this.pathFromLocation(window.location)) { - return window.history.pushState(stateObject, title, this.linkTo(path)); - } - }; - - PushStateNavigator.prototype.replaceState = function(stateObject, title, path) { - if (path !== this.pathFromLocation(window.location)) { - return window.history.replaceState(stateObject, title, this.linkTo(path)); - } - }; - - PushStateNavigator.prototype.linkTo = function(url) { - return this.normalizePath(Batman.config.pathPrefix, url); - }; - - PushStateNavigator.prototype.pathFromLocation = function(location) { - var fullPath, prefixPattern; - fullPath = "" + (location.pathname || '') + (location.search || ''); - prefixPattern = new RegExp("^" + (this.normalizePath(Batman.config.pathPrefix))); - return this.normalizePath(fullPath.replace(prefixPattern, '')); - }; - - PushStateNavigator.prototype.handleLocation = function(location) { - var hashbangPath, path; - path = this.pathFromLocation(location); - if (path === '/' && (hashbangPath = Batman.HashbangNavigator.prototype.pathFromLocation(location)) !== '/') { - return this.replace(hashbangPath); - } else { - return PushStateNavigator.__super__.handleLocation.apply(this, arguments); - } - }; - - return PushStateNavigator; - - })(Batman.Navigator); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.HashbangNavigator = (function(_super) { - - __extends(HashbangNavigator, _super); - - function HashbangNavigator() { - return HashbangNavigator.__super__.constructor.apply(this, arguments); - } - - HashbangNavigator.prototype.HASH_PREFIX = '#!'; - - if ((typeof window !== "undefined" && window !== null) && 'onhashchange' in window) { - HashbangNavigator.prototype.startWatching = function() { - return Batman.DOM.addEventListener(window, 'hashchange', this.handleCurrentLocation); - }; - HashbangNavigator.prototype.stopWatching = function() { - return Batman.DOM.removeEventListener(window, 'hashchange', this.handleCurrentLocation); - }; - } else { - HashbangNavigator.prototype.startWatching = function() { - return this.interval = setInterval(this.handleCurrentLocation, 100); - }; - HashbangNavigator.prototype.stopWatching = function() { - return this.interval = clearInterval(this.interval); - }; - } - - HashbangNavigator.prototype.pushState = function(stateObject, title, path) { - return window.location.hash = this.linkTo(path); - }; - - HashbangNavigator.prototype.replaceState = function(stateObject, title, path) { - var loc; - loc = window.location; - return loc.replace("" + loc.pathname + loc.search + (this.linkTo(path))); - }; - - HashbangNavigator.prototype.linkTo = function(url) { - return this.HASH_PREFIX + url; - }; - - HashbangNavigator.prototype.pathFromLocation = function(location) { - var hash; - hash = location.hash; - if ((hash != null ? hash.substr(0, 2) : void 0) === this.HASH_PREFIX) { - return this.normalizePath(hash.substr(2)); - } else { - return '/'; - } - }; - - HashbangNavigator.prototype.handleLocation = function(location) { - var realPath; - if (!Batman.config.usePushState) { - return HashbangNavigator.__super__.handleLocation.apply(this, arguments); - } - realPath = Batman.PushStateNavigator.prototype.pathFromLocation(location); - if (realPath === '/') { - return HashbangNavigator.__super__.handleLocation.apply(this, arguments); - } else { - return location.replace(this.normalizePath("" + Batman.config.pathPrefix + (this.linkTo(realPath)))); - } - }; - - return HashbangNavigator; - - })(Batman.Navigator); - -}).call(this); - -(function() { - - Batman.RouteMap = (function() { - - RouteMap.prototype.memberRoute = null; - - RouteMap.prototype.collectionRoute = null; - - function RouteMap() { - this.childrenByOrder = []; - this.childrenByName = {}; - } - - RouteMap.prototype.routeForParams = function(params) { - var route, _i, _len, _ref; - _ref = this.childrenByOrder; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - route = _ref[_i]; - if (route.test(params)) { - return route; - } - } - return void 0; - }; - - RouteMap.prototype.addRoute = function(name, route) { - var base, names, - _this = this; - this.childrenByOrder.push(route); - if (name.length > 0 && (names = name.split('.')).length > 0) { - base = names.shift(); - if (!this.childrenByName[base]) { - this.childrenByName[base] = new Batman.RouteMap; - } - this.childrenByName[base].addRoute(names.join('.'), route); - } else { - if (route.get('member')) { - Batman.developer["do"](function() { - if (_this.memberRoute) { - return Batman.developer.error("Member route with name " + name + " already exists!"); - } - }); - this.memberRoute = route; - } else { - Batman.developer["do"](function() { - if (_this.collectionRoute) { - return Batman.developer.error("Collection route with name " + name + " already exists!"); - } - }); - this.collectionRoute = route; - } - } - return true; - }; - - return RouteMap; - - })(); - -}).call(this); - -(function() { - var __slice = [].slice; - - Batman.RouteMapBuilder = (function() { - - RouteMapBuilder.BUILDER_FUNCTIONS = ['resources', 'member', 'collection', 'route', 'root']; - - RouteMapBuilder.ROUTES = { - index: { - cardinality: 'collection', - path: function(resource) { - return resource; - }, - name: function(resource) { - return resource; - } - }, - "new": { - cardinality: 'collection', - path: function(resource) { - return "" + resource + "/new"; - }, - name: function(resource) { - return "" + resource + ".new"; - } - }, - show: { - cardinality: 'member', - path: function(resource) { - return "" + resource + "/:id"; - }, - name: function(resource) { - return resource; - } - }, - edit: { - cardinality: 'member', - path: function(resource) { - return "" + resource + "/:id/edit"; - }, - name: function(resource) { - return "" + resource + ".edit"; - } - }, - collection: { - cardinality: 'collection', - path: function(resource, name) { - return "" + resource + "/" + name; - }, - name: function(resource, name) { - return "" + resource + "." + name; - } - }, - member: { - cardinality: 'member', - path: function(resource, name) { - return "" + resource + "/:id/" + name; - }, - name: function(resource, name) { - return "" + resource + "." + name; - } - } - }; - - function RouteMapBuilder(app, routeMap, parent, baseOptions) { - this.app = app; - this.routeMap = routeMap; - this.parent = parent; - this.baseOptions = baseOptions != null ? baseOptions : {}; - if (this.parent) { - this.rootPath = this.parent._nestingPath(); - this.rootName = this.parent._nestingName(); - } else { - this.rootPath = ''; - this.rootName = ''; - } - } - - RouteMapBuilder.prototype.resources = function() { - var action, actions, arg, args, as, callback, childBuilder, controller, included, k, options, path, resourceName, resourceNames, resourceRoot, routeOptions, routeTemplate, v, _i, _j, _k, _len, _len1, _len2, _ref, _ref1; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - resourceNames = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = args.length; _i < _len; _i++) { - arg = args[_i]; - if (typeof arg === 'string') { - _results.push(arg); - } - } - return _results; - })(); - if (typeof args[args.length - 1] === 'function') { - callback = args.pop(); - } - if (typeof args[args.length - 1] === 'object') { - options = args.pop(); - } else { - options = {}; - } - actions = { - index: true, - "new": true, - show: true, - edit: true - }; - if (options.except) { - _ref = options.except; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - actions[k] = false; - } - delete options.except; - } else if (options.only) { - for (k in actions) { - v = actions[k]; - actions[k] = false; - } - _ref1 = options.only; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - k = _ref1[_j]; - actions[k] = true; - } - delete options.only; - } - for (_k = 0, _len2 = resourceNames.length; _k < _len2; _k++) { - resourceName = resourceNames[_k]; - resourceRoot = Batman.helpers.pluralize(resourceName); - controller = Batman.helpers.camelize(resourceRoot, true); - childBuilder = this._childBuilder({ - controller: controller - }); - if (callback != null) { - callback.call(childBuilder); - } - for (action in actions) { - included = actions[action]; - if (!(included)) { - continue; - } - routeTemplate = this.constructor.ROUTES[action]; - as = routeTemplate.name(resourceRoot); - path = routeTemplate.path(resourceRoot); - routeOptions = Batman.extend({ - controller: controller, - action: action, - path: path, - as: as - }, options); - childBuilder[routeTemplate.cardinality](action, routeOptions); - } - } - return true; - }; - - RouteMapBuilder.prototype.member = function() { - return this._addRoutesWithCardinality.apply(this, ['member'].concat(__slice.call(arguments))); - }; - - RouteMapBuilder.prototype.collection = function() { - return this._addRoutesWithCardinality.apply(this, ['collection'].concat(__slice.call(arguments))); - }; - - RouteMapBuilder.prototype.root = function(signature, options) { - return this.route('/', signature, options); - }; - - RouteMapBuilder.prototype.route = function(path, signature, options, callback) { - if (!callback) { - if (typeof options === 'function') { - callback = options; - options = void 0; - } else if (typeof signature === 'function') { - callback = signature; - signature = void 0; - } - } - if (!options) { - if (typeof signature === 'string') { - options = { - signature: signature - }; - } else { - options = signature; - } - options || (options = {}); - } else { - if (signature) { - options.signature = signature; - } - } - if (callback) { - options.callback = callback; - } - options.as || (options.as = this._nameFromPath(path)); - options.path = path; - return this._addRoute(options); - }; - - RouteMapBuilder.prototype._addRoutesWithCardinality = function() { - var cardinality, name, names, options, resourceRoot, routeOptions, routeTemplate, _i, _j, _len; - cardinality = arguments[0], names = 3 <= arguments.length ? __slice.call(arguments, 1, _i = arguments.length - 1) : (_i = 1, []), options = arguments[_i++]; - if (typeof options === 'string') { - names.push(options); - options = {}; - } - options = Batman.extend({}, this.baseOptions, options); - options[cardinality] = true; - routeTemplate = this.constructor.ROUTES[cardinality]; - resourceRoot = Batman.helpers.underscore(options.controller); - for (_j = 0, _len = names.length; _j < _len; _j++) { - name = names[_j]; - routeOptions = Batman.extend({ - action: name - }, options); - if (routeOptions.path == null) { - routeOptions.path = routeTemplate.path(resourceRoot, name); - } - if (routeOptions.as == null) { - routeOptions.as = routeTemplate.name(resourceRoot, name); - } - this._addRoute(routeOptions); - } - return true; - }; - - RouteMapBuilder.prototype._addRoute = function(options) { - var klass, name, path, route; - if (options == null) { - options = {}; - } - path = this.rootPath + options.path; - name = this.rootName + Batman.helpers.camelize(options.as, true); - delete options.as; - delete options.path; - klass = options.callback ? Batman.CallbackActionRoute : Batman.ControllerActionRoute; - options.app = this.app; - route = new klass(path, options); - return this.routeMap.addRoute(name, route); - }; - - RouteMapBuilder.prototype._nameFromPath = function(path) { - path = path.replace(Batman.Route.regexps.namedOrSplat, '').replace(/\/+/g, '.').replace(/(^\.)|(\.$)/g, ''); - return path; - }; - - RouteMapBuilder.prototype._nestingPath = function() { - var nestingParam, nestingSegment; - if (!this.parent) { - return ""; - } else { - nestingParam = ":" + Batman.helpers.singularize(this.baseOptions.controller) + "Id"; - nestingSegment = Batman.helpers.underscore(this.baseOptions.controller); - return "" + (this.parent._nestingPath()) + "/" + nestingSegment + "/" + nestingParam + "/"; - } - }; - - RouteMapBuilder.prototype._nestingName = function() { - if (!this.parent) { - return ""; - } else { - return this.baseOptions.controller + "."; - } - }; - - RouteMapBuilder.prototype._childBuilder = function(baseOptions) { - if (baseOptions == null) { - baseOptions = {}; - } - return new Batman.RouteMapBuilder(this.app, this.routeMap, this, baseOptions); - }; - - return RouteMapBuilder; - - })(); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.App = (function(_super) { - var name, _fn, _i, _len, _ref, - _this = this; - - __extends(App, _super); - - function App() { - return App.__super__.constructor.apply(this, arguments); - } - - App.classAccessor('currentParams', { - get: function() { - return new Batman.Hash; - }, - 'final': true - }); - - App.classAccessor('paramsManager', { - get: function() { - var nav, params; - if (!(nav = this.get('navigator'))) { - return; - } - params = this.get('currentParams'); - return params.replacer = new Batman.ParamsReplacer(nav, params); - }, - 'final': true - }); - - App.classAccessor('paramsPusher', { - get: function() { - var nav, params; - if (!(nav = this.get('navigator'))) { - return; - } - params = this.get('currentParams'); - return params.pusher = new Batman.ParamsPusher(nav, params); - }, - 'final': true - }); - - App.classAccessor('routes', function() { - return new Batman.NamedRouteQuery(this.get('routeMap')); - }); - - App.classAccessor('routeMap', function() { - return new Batman.RouteMap; - }); - - App.classAccessor('routeMapBuilder', function() { - return new Batman.RouteMapBuilder(this, this.get('routeMap')); - }); - - App.classAccessor('dispatcher', function() { - return new Batman.Dispatcher(this, this.get('routeMap')); - }); - - App.classAccessor('controllers', function() { - return this.get('dispatcher.controllers'); - }); - - App.classAccessor('_renderContext', function() { - return Batman.RenderContext.base.descend(this); - }); - - App.requirePath = ''; - - Batman.developer["do"](function() { - App.require = function() { - var base, name, names, path, _i, _len, - _this = this; - path = arguments[0], names = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - base = this.requirePath + path; - for (_i = 0, _len = names.length; _i < _len; _i++) { - name = names[_i]; - this.prevent('run'); - path = base + '/' + name + '.coffee'; - new Batman.Request({ - url: path, - type: 'html', - success: function(response) { - CoffeeScript["eval"](response); - _this.allow('run'); - if (!_this.isPrevented('run')) { - _this.fire('loaded'); - } - if (_this.wantsToRun) { - return _this.run(); - } - } - }); - } - return this; - }; - App.controller = function() { - var names; - names = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - names = names.map(function(n) { - return n + '_controller'; - }); - return this.require.apply(this, ['controllers'].concat(__slice.call(names))); - }; - App.model = function() { - return this.require.apply(this, ['models'].concat(__slice.call(arguments))); - }; - return App.view = function() { - return this.require.apply(this, ['views'].concat(__slice.call(arguments))); - }; - }); - - App.layout = void 0; - - App.shouldAllowEvent = {}; - - _ref = Batman.RouteMapBuilder.BUILDER_FUNCTIONS; - _fn = function(name) { - return App[name] = function() { - var _ref1; - return (_ref1 = this.get('routeMapBuilder'))[name].apply(_ref1, arguments); - }; - }; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - name = _ref[_i]; - _fn(name); - } - - App.event('ready').oneShot = true; - - App.event('run').oneShot = true; - - App.run = function() { - var layout, layoutClass, - _this = this; - if (Batman.currentApp) { - if (Batman.currentApp === this) { - return; - } - Batman.currentApp.stop(); - } - if (this.hasRun) { - return false; - } - if (this.isPrevented('run')) { - this.wantsToRun = true; - return false; - } else { - delete this.wantsToRun; - } - Batman.currentApp = this; - Batman.App.set('current', this); - if (this.get('dispatcher') == null) { - this.set('dispatcher', new Batman.Dispatcher(this, this.get('routeMap'))); - this.set('controllers', this.get('dispatcher.controllers')); - } - if (this.get('navigator') == null) { - this.set('navigator', Batman.Navigator.forApp(this)); - this.on('run', function() { - Batman.navigator = _this.get('navigator'); - if (Object.keys(_this.get('dispatcher').routeMap).length > 0) { - return Batman.navigator.start(); - } - }); - } - this.observe('layout', function(layout) { - return layout != null ? layout.on('ready', function() { - return _this.fire('ready'); - }) : void 0; - }); - layout = this.get('layout'); - if (layout) { - if (typeof layout === 'string') { - layoutClass = this[Batman.helpers.camelize(layout) + 'View']; - } - } else { - if (layout !== null) { - layoutClass = Batman.View; - } - } - if (layoutClass) { - layout = this.set('layout', new layoutClass({ - context: this, - node: document - })); - } - this.hasRun = true; - this.fire('run'); - return this; - }; - - App.event('ready').oneShot = true; - - App.event('stop').oneShot = true; - - App.stop = function() { - var _ref1; - if ((_ref1 = this.navigator) != null) { - _ref1.stop(); - } - Batman.navigator = null; - this.hasRun = false; - this.fire('stop'); - return this; - }; - - return App; - - }).call(this, Batman.Object); - -}).call(this); - -(function() { - - Batman.Association = (function() { - - Association.prototype.associationType = ''; - - Association.prototype.isPolymorphic = false; - - Association.prototype.defaultOptions = { - saveInline: true, - autoload: true, - nestUrl: false - }; - - function Association(model, label, options) { - var defaultOptions, encoder, getAccessor, self; - this.model = model; - this.label = label; - if (options == null) { - options = {}; - } - defaultOptions = { - namespace: Batman.currentApp, - name: Batman.helpers.camelize(Batman.helpers.singularize(this.label)) - }; - this.options = Batman.extend(defaultOptions, this.defaultOptions, options); - if (this.options.nestUrl) { - if (!(this.model.urlNestsUnder != null)) { - developer.error("You must persist the the model " + this.model.constructor.name + " to use the url helpers on an association"); - } - this.model.urlNestsUnder(Batman.helpers.underscore(this.getRelatedModel().get('resourceName'))); - } - if (this.options.extend != null) { - Batman.extend(this, this.options.extend); - } - encoder = { - encode: this.options.saveInline ? this.encoder() : false, - decode: this.decoder() - }; - this.model.encode(this.label, encoder); - self = this; - getAccessor = function() { - return self.getAccessor.call(this, self, this.model, this.label); - }; - this.model.accessor(this.label, { - get: getAccessor, - set: model.defaultAccessor.set, - unset: model.defaultAccessor.unset - }); - } - - Association.prototype.getRelatedModel = function() { - var className, relatedModel, scope; - scope = this.options.namespace || Batman.currentApp; - className = this.options.name; - relatedModel = scope != null ? scope[className] : void 0; - Batman.developer["do"](function() { - if ((Batman.currentApp != null) && !relatedModel) { - return Batman.developer.warn("Related model " + className + " hasn't loaded yet."); - } - }); - return relatedModel; - }; - - Association.prototype.getFromAttributes = function(record) { - return record.get("attributes." + this.label); - }; - - Association.prototype.setIntoAttributes = function(record, value) { - return record.get('attributes').set(this.label, value); - }; - - Association.prototype.inverse = function() { - var inverse, relatedAssocs, - _this = this; - if (relatedAssocs = this.getRelatedModel()._batman.get('associations')) { - if (this.options.inverseOf) { - return relatedAssocs.getByLabel(this.options.inverseOf); - } - inverse = null; - relatedAssocs.forEach(function(label, assoc) { - if (assoc.getRelatedModel() === _this.model) { - return inverse = assoc; - } - }); - return inverse; - } - }; - - Association.prototype.reset = function() { - delete this.index; - return true; - }; - - return Association; - - })(); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PluralAssociation = (function(_super) { - - __extends(PluralAssociation, _super); - - PluralAssociation.prototype.proxyClass = Batman.AssociationSet; - - PluralAssociation.prototype.isSingular = false; - - function PluralAssociation() { - PluralAssociation.__super__.constructor.apply(this, arguments); - this._resetSetHashes(); - } - - PluralAssociation.prototype.setForRecord = function(record) { - var childModelSetIndex, indexValue, - _this = this; - indexValue = this.indexValueForRecord(record); - childModelSetIndex = this.setIndex(); - Batman.Property.withoutTracking(function() { - return _this._setsByRecord.getOrSet(record, function() { - var existingValueSet, newSet; - if (indexValue != null) { - existingValueSet = _this._setsByValue.get(indexValue); - if (existingValueSet != null) { - return existingValueSet; - } - } - newSet = new _this.proxyClass(indexValue, _this); - if (indexValue != null) { - _this._setsByValue.set(indexValue, newSet); - } - return newSet; - }); - }); - if (indexValue != null) { - return childModelSetIndex.get(indexValue); - } else { - return this._setsByRecord.get(record); - } - }; - - PluralAssociation.prototype.setForKey = Batman.Property.wrapTrackingPrevention(function(indexValue) { - var foundSet, - _this = this; - foundSet = void 0; - this._setsByRecord.forEach(function(record, set) { - if (foundSet != null) { - return; - } - if (_this.indexValueForRecord(record) === indexValue) { - return foundSet = set; - } - }); - if (foundSet != null) { - foundSet.foreignKeyValue = indexValue; - return foundSet; - } - return this._setsByValue.getOrSet(indexValue, function() { - return new _this.proxyClass(indexValue, _this); - }); - }); - - PluralAssociation.prototype.getAccessor = function(self, model, label) { - var relatedRecords, setInAttributes, - _this = this; - if (!self.getRelatedModel()) { - return; - } - if (setInAttributes = self.getFromAttributes(this)) { - return setInAttributes; - } else { - relatedRecords = self.setForRecord(this); - self.setIntoAttributes(this, relatedRecords); - Batman.Property.withoutTracking(function() { - if (self.options.autoload && !_this.isNew() && !relatedRecords.loaded) { - return relatedRecords.load(function(error, records) { - if (error) { - throw error; - } - }); - } - }); - return relatedRecords; - } - }; - - PluralAssociation.prototype.parentSetIndex = function() { - this.parentIndex || (this.parentIndex = this.model.get('loaded').indexedByUnique(this.primaryKey)); - return this.parentIndex; - }; - - PluralAssociation.prototype.setIndex = function() { - this.index || (this.index = new Batman.AssociationSetIndex(this, this[this.indexRelatedModelOn])); - return this.index; - }; - - PluralAssociation.prototype.indexValueForRecord = function(record) { - return record.get(this.primaryKey); - }; - - PluralAssociation.prototype.reset = function() { - PluralAssociation.__super__.reset.apply(this, arguments); - return this._resetSetHashes(); - }; - - PluralAssociation.prototype._resetSetHashes = function() { - this._setsByRecord = new Batman.SimpleHash; - return this._setsByValue = new Batman.SimpleHash; - }; - - return PluralAssociation; - - })(Batman.Association); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.HasManyAssociation = (function(_super) { - - __extends(HasManyAssociation, _super); - - HasManyAssociation.prototype.associationType = 'hasMany'; - - HasManyAssociation.prototype.indexRelatedModelOn = 'foreignKey'; - - function HasManyAssociation(model, label, options) { - if (options != null ? options.as : void 0) { - return (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.PolymorphicHasManyAssociation, arguments, function(){}); - } - HasManyAssociation.__super__.constructor.apply(this, arguments); - this.primaryKey = this.options.primaryKey || "id"; - this.foreignKey = this.options.foreignKey || ("" + (Batman.helpers.underscore(model.get('resourceName'))) + "_id"); - } - - HasManyAssociation.prototype.apply = function(baseSaveError, base) { - var relations, set, - _this = this; - if (!baseSaveError) { - if (relations = this.getFromAttributes(base)) { - relations.forEach(function(model) { - return model.set(_this.foreignKey, base.get(_this.primaryKey)); - }); - } - base.set(this.label, set = this.setForRecord(base)); - if (base.lifecycle.get('state') === 'creating') { - return set.markAsLoaded(); - } - } - }; - - HasManyAssociation.prototype.encoder = function() { - var association; - association = this; - return function(relationSet, _, __, record) { - var jsonArray; - if (relationSet != null) { - jsonArray = []; - relationSet.forEach(function(relation) { - var relationJSON; - relationJSON = relation.toJSON(); - if (!association.inverse() || association.inverse().options.encodeForeignKey) { - relationJSON[association.foreignKey] = record.get(association.primaryKey); - } - return jsonArray.push(relationJSON); - }); - } - return jsonArray; - }; - }; - - HasManyAssociation.prototype.decoder = function() { - var association; - association = this; - return function(data, key, _, __, parentRecord) { - var existingRecord, existingRelations, jsonObject, newRelations, record, relatedModel, savedRecord, _i, _len; - if (relatedModel = association.getRelatedModel()) { - existingRelations = association.getFromAttributes(parentRecord) || association.setForRecord(parentRecord); - newRelations = existingRelations.filter(function(relation) { - return relation.isNew(); - }).toArray(); - for (_i = 0, _len = data.length; _i < _len; _i++) { - jsonObject = data[_i]; - record = new relatedModel(); - record._withoutDirtyTracking(function() { - return this.fromJSON(jsonObject); - }); - existingRecord = relatedModel.get('loaded').indexedByUnique('id').get(record.get('id')); - if (existingRecord != null) { - existingRecord._withoutDirtyTracking(function() { - return this.fromJSON(jsonObject); - }); - record = existingRecord; - } else { - if (newRelations.length > 0) { - savedRecord = newRelations.shift(); - savedRecord._withoutDirtyTracking(function() { - return this.fromJSON(jsonObject); - }); - record = savedRecord; - } - } - record = relatedModel._mapIdentity(record); - existingRelations.add(record); - if (association.options.inverseOf) { - record.set(association.options.inverseOf, parentRecord); - } - } - existingRelations.markAsLoaded(); - } else { - Batman.developer.error("Can't decode model " + association.options.name + " because it hasn't been loaded yet!"); - } - return existingRelations; - }; - }; - - return HasManyAssociation; - - })(Batman.PluralAssociation); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PolymorphicHasManyAssociation = (function(_super) { - - __extends(PolymorphicHasManyAssociation, _super); - - PolymorphicHasManyAssociation.prototype.proxyClass = Batman.PolymorphicAssociationSet; - - PolymorphicHasManyAssociation.prototype.isPolymorphic = true; - - function PolymorphicHasManyAssociation(model, label, options) { - options.inverseOf = this.foreignLabel = options.as; - delete options.as; - options.foreignKey || (options.foreignKey = "" + this.foreignLabel + "_id"); - PolymorphicHasManyAssociation.__super__.constructor.call(this, model, label, options); - this.foreignTypeKey = options.foreignTypeKey || ("" + this.foreignLabel + "_type"); - this.model.encode(this.foreignTypeKey); - } - - PolymorphicHasManyAssociation.prototype.apply = function(baseSaveError, base) { - var relations, - _this = this; - if (!baseSaveError) { - if (relations = this.getFromAttributes(base)) { - PolymorphicHasManyAssociation.__super__.apply.apply(this, arguments); - relations.forEach(function(model) { - return model.set(_this.foreignTypeKey, _this.modelType()); - }); - } - } - return true; - }; - - PolymorphicHasManyAssociation.prototype.getRelatedModelForType = function() { - return this.getRelatedModel(); - }; - - PolymorphicHasManyAssociation.prototype.modelType = function() { - return this.model.get('resourceName'); - }; - - PolymorphicHasManyAssociation.prototype.setIndex = function() { - if (!this.typeIndex) { - this.typeIndex = new Batman.PolymorphicAssociationSetIndex(this, this.modelType(), this[this.indexRelatedModelOn]); - } - return this.typeIndex; - }; - - PolymorphicHasManyAssociation.prototype.encoder = function() { - var association; - association = this; - return function(relationSet, _, __, record) { - var jsonArray; - if (relationSet != null) { - jsonArray = []; - relationSet.forEach(function(relation) { - var relationJSON; - relationJSON = relation.toJSON(); - relationJSON[association.foreignKey] = record.get(association.primaryKey); - relationJSON[association.foreignTypeKey] = association.modelType(); - return jsonArray.push(relationJSON); - }); - } - return jsonArray; - }; - }; - - return PolymorphicHasManyAssociation; - - })(Batman.HasManyAssociation); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.SingularAssociation = (function(_super) { - - __extends(SingularAssociation, _super); - - function SingularAssociation() { - return SingularAssociation.__super__.constructor.apply(this, arguments); - } - - SingularAssociation.prototype.isSingular = true; - - SingularAssociation.prototype.getAccessor = function(self, model, label) { - var parent, proxy, record, recordInAttributes, _ref; - if (recordInAttributes = self.getFromAttributes(this)) { - return recordInAttributes; - } - if (self.getRelatedModel()) { - proxy = this.associationProxy(self); - record = false; - parent = this; - if ((_ref = proxy._loadSetter) == null) { - proxy._loadSetter = proxy.once('loaded', function(child) { - return parent._withoutDirtyTracking(function() { - return this.set(self.label, child); - }); - }); - } - if (!Batman.Property.withoutTracking(function() { - return proxy.get('loaded'); - })) { - if (self.options.autoload) { - Batman.Property.withoutTracking(function() { - return proxy.load(); - }); - } else { - record = proxy.loadFromLocal(); - } - } - return record || proxy; - } - }; - - SingularAssociation.prototype.setIndex = function() { - this.index || (this.index = new Batman.UniqueAssociationSetIndex(this, this[this.indexRelatedModelOn])); - return this.index; - }; - - return SingularAssociation; - - })(Batman.Association); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.HasOneAssociation = (function(_super) { - - __extends(HasOneAssociation, _super); - - HasOneAssociation.prototype.associationType = 'hasOne'; - - HasOneAssociation.prototype.proxyClass = Batman.HasOneProxy; - - HasOneAssociation.prototype.indexRelatedModelOn = 'foreignKey'; - - function HasOneAssociation() { - HasOneAssociation.__super__.constructor.apply(this, arguments); - this.primaryKey = this.options.primaryKey || "id"; - this.foreignKey = this.options.foreignKey || ("" + (Batman.helpers.underscore(this.model.get('resourceName'))) + "_id"); - } - - HasOneAssociation.prototype.apply = function(baseSaveError, base) { - var relation; - if (relation = this.getFromAttributes(base)) { - return relation.set(this.foreignKey, base.get(this.primaryKey)); - } - }; - - HasOneAssociation.prototype.encoder = function() { - var association; - association = this; - return function(val, key, object, record) { - var json; - if (!association.options.saveInline) { - return; - } - if (json = val.toJSON()) { - json[association.foreignKey] = record.get(association.primaryKey); - } - return json; - }; - }; - - HasOneAssociation.prototype.decoder = function() { - var association; - association = this; - return function(data, _, __, ___, parentRecord) { - var record, relatedModel; - if (!data) { - return; - } - relatedModel = association.getRelatedModel(); - record = relatedModel.createFromJSON(data); - if (association.options.inverseOf) { - record.set(association.options.inverseOf, parentRecord); - } - return record; - }; - }; - - return HasOneAssociation; - - })(Batman.SingularAssociation); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.BelongsToAssociation = (function(_super) { - - __extends(BelongsToAssociation, _super); - - BelongsToAssociation.prototype.associationType = 'belongsTo'; - - BelongsToAssociation.prototype.proxyClass = Batman.BelongsToProxy; - - BelongsToAssociation.prototype.indexRelatedModelOn = 'primaryKey'; - - BelongsToAssociation.prototype.defaultOptions = { - saveInline: false, - autoload: true, - encodeForeignKey: true - }; - - function BelongsToAssociation(model, label, options) { - if (options != null ? options.polymorphic : void 0) { - delete options.polymorphic; - return (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args), t = typeof result; - return t == "object" || t == "function" ? result || child : child; - })(Batman.PolymorphicBelongsToAssociation, arguments, function(){}); - } - BelongsToAssociation.__super__.constructor.apply(this, arguments); - this.foreignKey = this.options.foreignKey || ("" + this.label + "_id"); - this.primaryKey = this.options.primaryKey || "id"; - if (this.options.encodeForeignKey) { - this.model.encode(this.foreignKey); - } - } - - BelongsToAssociation.prototype.encoder = function() { - return function(val) { - return val.toJSON(); - }; - }; - - BelongsToAssociation.prototype.decoder = function() { - var association; - association = this; - return function(data, _, __, ___, childRecord) { - var inverse, record, relatedModel; - relatedModel = association.getRelatedModel(); - record = relatedModel.createFromJSON(data); - if (association.options.inverseOf) { - if (inverse = association.inverse()) { - if (inverse instanceof Batman.HasManyAssociation) { - childRecord.set(association.foreignKey, record.get(association.primaryKey)); - } else { - record.set(inverse.label, childRecord); - } - } - } - childRecord.set(association.label, record); - return record; - }; - }; - - BelongsToAssociation.prototype.apply = function(base) { - var foreignValue, model; - if (model = base.get(this.label)) { - foreignValue = model.get(this.primaryKey); - if (foreignValue !== void 0) { - return base.set(this.foreignKey, foreignValue); - } - } - }; - - return BelongsToAssociation; - - })(Batman.SingularAssociation); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PolymorphicBelongsToAssociation = (function(_super) { - - __extends(PolymorphicBelongsToAssociation, _super); - - PolymorphicBelongsToAssociation.prototype.isPolymorphic = true; - - PolymorphicBelongsToAssociation.prototype.proxyClass = Batman.PolymorphicBelongsToProxy; - - PolymorphicBelongsToAssociation.prototype.defaultOptions = Batman.mixin({}, Batman.BelongsToAssociation.prototype.defaultOptions, { - encodeForeignTypeKey: true - }); - - function PolymorphicBelongsToAssociation() { - PolymorphicBelongsToAssociation.__super__.constructor.apply(this, arguments); - this.foreignTypeKey = this.options.foreignTypeKey || ("" + this.label + "_type"); - if (this.options.encodeForeignTypeKey) { - this.model.encode(this.foreignTypeKey); - } - this.typeIndicies = {}; - } - - PolymorphicBelongsToAssociation.prototype.getRelatedModel = false; - - PolymorphicBelongsToAssociation.prototype.setIndex = false; - - PolymorphicBelongsToAssociation.prototype.inverse = false; - - PolymorphicBelongsToAssociation.prototype.apply = function(base) { - var foreignTypeValue, instanceOrProxy, model; - PolymorphicBelongsToAssociation.__super__.apply.apply(this, arguments); - if (instanceOrProxy = base.get(this.label)) { - if (instanceOrProxy instanceof Batman.AssociationProxy) { - model = instanceOrProxy.association.model; - } else { - model = instanceOrProxy.constructor; - } - foreignTypeValue = model.get('resourceName'); - return base.set(this.foreignTypeKey, foreignTypeValue); - } - }; - - PolymorphicBelongsToAssociation.prototype.getAccessor = function(self, model, label) { - var proxy, recordInAttributes; - if (recordInAttributes = self.getFromAttributes(this)) { - return recordInAttributes; - } - if (self.getRelatedModelForType(this.get(self.foreignTypeKey))) { - proxy = this.associationProxy(self); - Batman.Property.withoutTracking(function() { - if (!proxy.get('loaded') && self.options.autoload) { - return proxy.load(); - } - }); - return proxy; - } - }; - - PolymorphicBelongsToAssociation.prototype.url = function(recordOptions) { - var ending, helper, id, inverse, root, type, _ref, _ref1; - type = (_ref = recordOptions.data) != null ? _ref[this.foreignTypeKey] : void 0; - if (type && (inverse = this.inverseForType(type))) { - root = Batman.helpers.pluralize(type).toLowerCase(); - id = (_ref1 = recordOptions.data) != null ? _ref1[this.foreignKey] : void 0; - helper = inverse.isSingular ? "singularize" : "pluralize"; - ending = Batman.helpers[helper](inverse.label); - return "/" + root + "/" + id + "/" + ending; - } - }; - - PolymorphicBelongsToAssociation.prototype.getRelatedModelForType = function(type) { - var relatedModel, scope; - scope = this.options.namespace || Batman.currentApp; - if (type) { - relatedModel = scope != null ? scope[type] : void 0; - relatedModel || (relatedModel = scope != null ? scope[Batman.helpers.camelize(type)] : void 0); - } - Batman.developer["do"](function() { - if ((Batman.currentApp != null) && !relatedModel) { - return Batman.developer.warn("Related model " + type + " for polymorphic association not found."); - } - }); - return relatedModel; - }; - - PolymorphicBelongsToAssociation.prototype.setIndexForType = function(type) { - var _base; - (_base = this.typeIndicies)[type] || (_base[type] = new Batman.PolymorphicUniqueAssociationSetIndex(this, type, this.primaryKey)); - return this.typeIndicies[type]; - }; - - PolymorphicBelongsToAssociation.prototype.inverseForType = function(type) { - var inverse, relatedAssocs, _ref, - _this = this; - if (relatedAssocs = (_ref = this.getRelatedModelForType(type)) != null ? _ref._batman.get('associations') : void 0) { - if (this.options.inverseOf) { - return relatedAssocs.getByLabel(this.options.inverseOf); - } - inverse = null; - relatedAssocs.forEach(function(label, assoc) { - if (assoc.getRelatedModel() === _this.model) { - return inverse = assoc; - } - }); - return inverse; - } - }; - - PolymorphicBelongsToAssociation.prototype.decoder = function() { - var association; - association = this; - return function(data, key, response, ___, childRecord) { - var foreignTypeValue, inverse, record, relatedModel; - foreignTypeValue = response[association.foreignTypeKey] || childRecord.get(association.foreignTypeKey); - relatedModel = association.getRelatedModelForType(foreignTypeValue); - record = relatedModel.createFromJSON(data); - if (association.options.inverseOf) { - if (inverse = association.inverseForType(foreignTypeValue)) { - if (inverse instanceof Batman.PolymorphicHasManyAssociation) { - childRecord.set(association.foreignKey, record.get(association.primaryKey)); - childRecord.set(association.foreignTypeKey, foreignTypeValue); - } else { - record.set(inverse.label, childRecord); - } - } - } - childRecord.set(association.label, record); - return record; - }; - }; - - return PolymorphicBelongsToAssociation; - - })(Batman.BelongsToAssociation); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.Validator = (function(_super) { - - __extends(Validator, _super); - - Validator.triggers = function() { - var triggers; - triggers = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - if (this._triggers != null) { - return this._triggers.concat(triggers); - } else { - return this._triggers = triggers; - } - }; - - Validator.options = function() { - var options; - options = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - if (this._options != null) { - return this._options.concat(options); - } else { - return this._options = options; - } - }; - - Validator.matches = function(options) { - var key, results, shouldReturn, value, _ref, _ref1; - results = {}; - shouldReturn = false; - for (key in options) { - value = options[key]; - if (~((_ref = this._options) != null ? _ref.indexOf(key) : void 0)) { - results[key] = value; - } - if (~((_ref1 = this._triggers) != null ? _ref1.indexOf(key) : void 0)) { - results[key] = value; - shouldReturn = true; - } - } - if (shouldReturn) { - return results; - } - }; - - function Validator() { - var mixins, options; - options = arguments[0], mixins = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - this.options = options; - Validator.__super__.constructor.apply(this, mixins); - } - - Validator.prototype.validate = function(record) { - return Batman.developer.error("You must override validate in Batman.Validator subclasses."); - }; - - Validator.prototype.format = function(key, messageKey, interpolations) { - return Batman.t("errors.messages." + messageKey, interpolations); - }; - - Validator.prototype.handleBlank = function(value) { - if (this.options.allowBlank && !Batman.PresenceValidator.prototype.isPresent(value)) { - return true; - } - }; - - return Validator; - - })(Batman.Object); - -}).call(this); - -(function() { - - Batman.Validators = []; - - Batman.extend(Batman.translate.messages, { - errors: { - format: "%{attribute} %{message}", - messages: { - too_short: "must be at least %{count} characters", - too_long: "must be less than %{count} characters", - wrong_length: "must be %{count} characters", - blank: "can't be blank", - not_numeric: "must be a number", - greater_than: "must be greater than %{count}", - greater_than_or_equal_to: "must be greater than or equal to %{count}", - equal_to: "must be equal to %{count}", - less_than: "must be less than %{count}", - less_than_or_equal_to: "must be less than or equal to %{count}", - not_matching: "is not valid", - invalid_association: "is not valid" - } - } - }); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.RegExpValidator = (function(_super) { - - __extends(RegExpValidator, _super); - - RegExpValidator.triggers('regexp', 'pattern'); - - RegExpValidator.options('allowBlank'); - - function RegExpValidator(options) { - var _ref; - this.regexp = (_ref = options.regexp) != null ? _ref : options.pattern; - RegExpValidator.__super__.constructor.apply(this, arguments); - } - - RegExpValidator.prototype.validateEach = function(errors, record, key, callback) { - var value; - value = record.get(key); - if (this.handleBlank(value)) { - return callback(); - } - if (!(value != null) || value === '' || !this.regexp.test(value)) { - errors.add(key, this.format(key, 'not_matching')); - } - return callback(); - }; - - return RegExpValidator; - - })(Batman.Validator); - - Batman.Validators.push(Batman.RegExpValidator); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.PresenceValidator = (function(_super) { - - __extends(PresenceValidator, _super); - - function PresenceValidator() { - return PresenceValidator.__super__.constructor.apply(this, arguments); - } - - PresenceValidator.triggers('presence'); - - PresenceValidator.prototype.validateEach = function(errors, record, key, callback) { - var value; - value = record.get(key); - if (!this.isPresent(value)) { - errors.add(key, this.format(key, 'blank')); - } - return callback(); - }; - - PresenceValidator.prototype.isPresent = function(value) { - return (value != null) && value !== ''; - }; - - return PresenceValidator; - - })(Batman.Validator); - - Batman.Validators.push(Batman.PresenceValidator); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.NumericValidator = (function(_super) { - - __extends(NumericValidator, _super); - - function NumericValidator() { - return NumericValidator.__super__.constructor.apply(this, arguments); - } - - NumericValidator.triggers('numeric', 'greaterThan', 'greaterThanOrEqualTo', 'equalTo', 'lessThan', 'lessThanOrEqualTo'); - - NumericValidator.options('allowBlank'); - - NumericValidator.prototype.validateEach = function(errors, record, key, callback) { - var options, value; - options = this.options; - value = record.get(key); - if (this.handleBlank(value)) { - return callback(); - } - if (!(value != null) || !(this.isNumeric(value) || this.canCoerceToNumeric(value))) { - errors.add(key, this.format(key, 'not_numeric')); - } else { - if (options.greaterThan && value <= options.greaterThan) { - errors.add(key, this.format(key, 'greater_than', { - count: options.greaterThan - })); - } - if (options.greaterThanOrEqualTo && value < options.greaterThanOrEqualTo) { - errors.add(key, this.format(key, 'greater_than_or_equal_to', { - count: options.greaterThanOrEqualTo - })); - } - if (options.equalTo && value !== options.equalTo) { - errors.add(key, this.format(key, 'equal_to', { - count: options.equalTo - })); - } - if (options.lessThan && value >= options.lessThan) { - errors.add(key, this.format(key, 'less_than', { - count: options.lessThan - })); - } - if (options.lessThanOrEqualTo && value > options.lessThanOrEqualTo) { - errors.add(key, this.format(key, 'less_than_or_equal_to', { - count: options.lessThanOrEqualTo - })); - } - } - return callback(); - }; - - NumericValidator.prototype.isNumeric = function(value) { - return !isNaN(parseFloat(value)) && isFinite(value); - }; - - NumericValidator.prototype.canCoerceToNumeric = function(value) { - return (value - 0) == value && value.length > 0; - }; - - return NumericValidator; - - })(Batman.Validator); - - Batman.Validators.push(Batman.NumericValidator); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.LengthValidator = (function(_super) { - - __extends(LengthValidator, _super); - - LengthValidator.triggers('minLength', 'maxLength', 'length', 'lengthWithin', 'lengthIn'); - - LengthValidator.options('allowBlank'); - - function LengthValidator(options) { - var range; - if (range = options.lengthIn || options.lengthWithin) { - options.minLength = range[0]; - options.maxLength = range[1] || -1; - delete options.lengthWithin; - delete options.lengthIn; - } - LengthValidator.__super__.constructor.apply(this, arguments); - } - - LengthValidator.prototype.validateEach = function(errors, record, key, callback) { - var options, value; - options = this.options; - value = record.get(key); - if (value !== '' && this.handleBlank(value)) { - return callback(); - } - if (value == null) { - value = []; - } - if (options.minLength && value.length < options.minLength) { - errors.add(key, this.format(key, 'too_short', { - count: options.minLength - })); - } - if (options.maxLength && value.length > options.maxLength) { - errors.add(key, this.format(key, 'too_long', { - count: options.maxLength - })); - } - if (options.length && value.length !== options.length) { - errors.add(key, this.format(key, 'wrong_length', { - count: options.length - })); - } - return callback(); - }; - - return LengthValidator; - - })(Batman.Validator); - - Batman.Validators.push(Batman.LengthValidator); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.AssociatedValidator = (function(_super) { - - __extends(AssociatedValidator, _super); - - function AssociatedValidator() { - return AssociatedValidator.__super__.constructor.apply(this, arguments); - } - - AssociatedValidator.triggers('associated'); - - AssociatedValidator.prototype.validateEach = function(errors, record, key, callback) { - var childFinished, count, value, - _this = this; - value = record.get(key); - if (value != null) { - if (value instanceof Batman.AssociationProxy) { - value = typeof value.get === "function" ? value.get('target') : void 0; - } - count = 1; - childFinished = function(err, childErrors) { - if (childErrors.length > 0) { - errors.add(key, _this.format(key, 'invalid_association')); - } - if (--count === 0) { - return callback(); - } - }; - if ((value != null ? value.forEach : void 0) != null) { - value.forEach(function(record) { - count += 1; - return record.validate(childFinished); - }); - } else if ((value != null ? value.validate : void 0) != null) { - count += 1; - value.validate(childFinished); - } - return childFinished(null, []); - } else { - return callback(); - } - }; - - return AssociatedValidator; - - })(Batman.Validator); - - Batman.Validators.push(Batman.AssociatedValidator); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.ControllerActionFrame = (function(_super) { - - __extends(ControllerActionFrame, _super); - - ControllerActionFrame.prototype.operationOccurred = false; - - ControllerActionFrame.prototype.remainingOperations = 0; - - ControllerActionFrame.prototype.event('complete').oneShot = true; - - function ControllerActionFrame(options, onComplete) { - ControllerActionFrame.__super__.constructor.call(this, options); - this.on('complete', onComplete); - } - - ControllerActionFrame.prototype.startOperation = function(options) { - if (options == null) { - options = {}; - } - if (!options.internal) { - this.operationOccurred = true; - } - this._changeOperationsCounter(1); - return true; - }; - - ControllerActionFrame.prototype.finishOperation = function() { - this._changeOperationsCounter(-1); - return true; - }; - - ControllerActionFrame.prototype.startAndFinishOperation = function(options) { - this.startOperation(options); - this.finishOperation(options); - return true; - }; - - ControllerActionFrame.prototype._changeOperationsCounter = function(delta) { - var _ref; - this.remainingOperations += delta; - if (this.remainingOperations === 0) { - this.fire('complete'); - } - if ((_ref = this.parentFrame) != null) { - _ref._changeOperationsCounter(delta); - } - }; - - return ControllerActionFrame; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.DOM.InsertionBinding = (function(_super) { - - __extends(InsertionBinding, _super); - - InsertionBinding.prototype.isTwoWay = false; - - InsertionBinding.prototype.bindImmediately = false; - - function InsertionBinding(node, className, key, context, parentRenderer, invert) { - var result, - _this = this; - this.invert = invert != null ? invert : false; - this.placeholderNode = document.createComment("detached node " + (this.get('_batmanID'))); - result = InsertionBinding.__super__.constructor.apply(this, arguments); - Batman.DOM.onParseExit(this.node, function() { - _this.bind(); - if (_this.placeholderNode != null) { - return Batman.DOM.trackBinding(_this, _this.placeholderNode); - } - }); - result; - - } - - InsertionBinding.prototype.dataChange = function(value) { - var parentNode; - parentNode = this.placeholderNode.parentNode || this.node.parentNode; - if (!!value === !this.invert) { - if (!(this.node.parentNode != null)) { - Batman.DOM.insertBefore(parentNode, this.node, this.placeholderNode); - return parentNode.removeChild(this.placeholderNode); - } - } else { - if (this.node.parentNode != null) { - parentNode.insertBefore(this.placeholderNode, this.node); - return Batman.DOM.removeNode(this.node); - } - } - }; - - InsertionBinding.prototype.die = function() { - if (this.dead) { - return; - } - InsertionBinding.__super__.die.apply(this, arguments); - if (!!this.get('filteredValue') === !this.invert) { - return Batman.DOM.destroyNode(this.placeholderNode); - } else { - return Batman.DOM.destroyNode(this.node); - } - }; - - return InsertionBinding; - - })(Batman.DOM.AbstractBinding); - -}).call(this); - -(function() { - var isEmptyDataObject; - - isEmptyDataObject = function(obj) { - var name; - for (name in obj) { - return false; - } - return true; - }; - - Batman.extend(Batman, { - cache: {}, - uuid: 0, - expando: "batman" + Math.random().toString().replace(/\D/g, ''), - canDeleteExpando: (function() { - var div; - try { - div = document.createElement('div'); - return delete div.test; - } catch (e) { - return Batman.canDeleteExpando = false; - } - })(), - noData: { - "embed": true, - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - hasData: function(elem) { - elem = (elem.nodeType ? Batman.cache[elem[Batman.expando]] : elem[Batman.expando]); - return !!elem && !isEmptyDataObject(elem); - }, - data: function(elem, name, data, pvt) { - var cache, getByName, id, internalKey, ret, thisCache; - if (!Batman.acceptData(elem)) { - return; - } - internalKey = Batman.expando; - getByName = typeof name === "string"; - cache = Batman.cache; - id = elem[Batman.expando]; - if ((!id || (pvt && id && (cache[id] && !cache[id][internalKey]))) && getByName && data === void 0) { - return; - } - if (!id) { - if (elem.nodeType !== 3) { - elem[Batman.expando] = id = ++Batman.uuid; - } else { - id = Batman.expando; - } - } - if (!cache[id]) { - cache[id] = {}; - } - if (typeof name === "object" || typeof name === "function") { - if (pvt) { - cache[id][internalKey] = Batman.extend(cache[id][internalKey], name); - } else { - cache[id] = Batman.extend(cache[id], name); - } - } - thisCache = cache[id]; - if (pvt) { - thisCache[internalKey] || (thisCache[internalKey] = {}); - thisCache = thisCache[internalKey]; - } - if (data !== void 0) { - thisCache[name] = data; - } - if (getByName) { - ret = thisCache[name]; - } else { - ret = thisCache; - } - return ret; - }, - removeData: function(elem, name, pvt) { - var cache, id, internalCache, internalKey, isNode, thisCache; - if (!Batman.acceptData(elem)) { - return; - } - internalKey = Batman.expando; - isNode = elem.nodeType; - cache = Batman.cache; - id = elem[Batman.expando]; - if (!cache[id]) { - return; - } - if (name) { - thisCache = pvt ? cache[id][internalKey] : cache[id]; - if (thisCache) { - delete thisCache[name]; - if (!isEmptyDataObject(thisCache)) { - return; - } - } - } - if (pvt) { - delete cache[id][internalKey]; - if (!isEmptyDataObject(cache[id])) { - return; - } - } - internalCache = cache[id][internalKey]; - if (Batman.canDeleteExpando || !cache.setInterval) { - delete cache[id]; - } else { - cache[id] = null; - } - if (internalCache) { - cache[id] = {}; - return cache[id][internalKey] = internalCache; - } else { - if (Batman.canDeleteExpando) { - return delete elem[Batman.expando]; - } else if (elem.removeAttribute) { - return elem.removeAttribute(Batman.expando); - } else { - return elem[Batman.expando] = null; - } - } - }, - _data: function(elem, name, data) { - return Batman.data(elem, name, data, true); - }, - acceptData: function(elem) { - var match; - if (elem.nodeName) { - match = Batman.noData[elem.nodeName.toLowerCase()]; - if (match) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - return true; - } - }); - -}).call(this); - -(function() { - var buntUndefined, defaultAndOr, - __slice = [].slice; - - buntUndefined = function(f) { - return function(value) { - if (value == null) { - return void 0; - } else { - return f.apply(this, arguments); - } - }; - }; - - defaultAndOr = function(lhs, rhs) { - return lhs || rhs; - }; - - Batman.Filters = { - raw: buntUndefined(function(value, binding) { - binding.escapeValue = false; - return value; - }), - get: buntUndefined(function(value, key) { - if (value.get != null) { - return value.get(key); - } else { - return value[key]; - } - }), - equals: buntUndefined(function(lhs, rhs, binding) { - return lhs === rhs; - }), - and: function(lhs, rhs) { - return lhs && rhs; - }, - or: function(lhs, rhs, binding) { - return lhs || rhs; - }, - not: function(value, binding) { - return !value; - }, - trim: buntUndefined(function(value, binding) { - return value.trim(); - }), - matches: buntUndefined(function(value, searchFor) { - return value.indexOf(searchFor) !== -1; - }), - truncate: buntUndefined(function(value, length, end, binding) { - if (end == null) { - end = "..."; - } - if (!binding) { - binding = end; - end = "..."; - } - if (value.length > length) { - value = value.substr(0, length - end.length) + end; - } - return value; - }), - "default": function(value, defaultValue, binding) { - if ((value != null) && value !== '') { - return value; - } else { - return defaultValue; - } - }, - prepend: function(value, string, binding) { - return (string != null ? string : '') + (value != null ? value : ''); - }, - append: function(value, string, binding) { - return (value != null ? value : '') + (string != null ? string : ''); - }, - replace: buntUndefined(function(value, searchFor, replaceWith, flags, binding) { - if (!binding) { - binding = flags; - flags = void 0; - } - if (flags === void 0) { - return value.replace(searchFor, replaceWith); - } else { - return value.replace(searchFor, replaceWith, flags); - } - }), - downcase: buntUndefined(function(value) { - return value.toLowerCase(); - }), - upcase: buntUndefined(function(value) { - return value.toUpperCase(); - }), - pluralize: buntUndefined(function(string, count, includeCount, binding) { - if (!binding) { - binding = includeCount; - includeCount = true; - if (!binding) { - binding = count; - count = void 0; - } - } - if (count != null) { - return Batman.helpers.pluralize(count, string, void 0, includeCount); - } else { - return Batman.helpers.pluralize(string); - } - }), - humanize: buntUndefined(function(string, binding) { - return Batman.helpers.humanize(string); - }), - join: buntUndefined(function(value, withWhat, binding) { - if (withWhat == null) { - withWhat = ''; - } - if (!binding) { - binding = withWhat; - withWhat = ''; - } - return value.join(withWhat); - }), - sort: buntUndefined(function(value) { - return value.sort(); - }), - map: buntUndefined(function(value, key) { - return value.map(function(x) { - return Batman.get(x, key); - }); - }), - has: function(set, item) { - if (set == null) { - return false; - } - return Batman.contains(set, item); - }, - first: buntUndefined(function(value) { - return value[0]; - }), - meta: buntUndefined(function(value, keypath) { - Batman.developer.assert(value.meta, "Error, value doesn't have a meta to filter on!"); - return value.meta.get(keypath); - }), - interpolate: function(string, interpolationKeypaths, binding) { - var k, v, values; - if (!binding) { - binding = interpolationKeypaths; - interpolationKeypaths = void 0; - } - if (!string) { - return; - } - values = {}; - for (k in interpolationKeypaths) { - v = interpolationKeypaths[k]; - values[k] = this.get(v); - if (!(values[k] != null)) { - Batman.developer.warn("Warning! Undefined interpolation key " + k + " for interpolation", string); - values[k] = ''; - } - } - return Batman.helpers.interpolate(string, values); - }, - withArguments: function() { - var binding, block, curryArgs, _i; - block = arguments[0], curryArgs = 3 <= arguments.length ? __slice.call(arguments, 1, _i = arguments.length - 1) : (_i = 1, []), binding = arguments[_i++]; - if (!block) { - return; - } - return function() { - var regularArgs; - regularArgs = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return block.call.apply(block, [this].concat(__slice.call(curryArgs), __slice.call(regularArgs))); - }; - }, - routeToAction: buntUndefined(function(model, action) { - var params; - params = Batman.Dispatcher.paramsFromArgument(model); - params.action = action; - return params; - }), - escape: buntUndefined(Batman.escapeHTML) - }; - - (function() { - var k, _i, _len, _ref, _results; - _ref = ['capitalize', 'singularize', 'underscore', 'camelize']; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - k = _ref[_i]; - _results.push(Batman.Filters[k] = buntUndefined(Batman.helpers[k])); - } - return _results; - })(); - - Batman.developer.addFilters(); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.RenderContext = (function() { - var ContextProxy; - - RenderContext.deProxy = function(object) { - if ((object != null) && object.isContextProxy) { - return object.get('proxiedObject'); - } else { - return object; - } - }; - - RenderContext.root = function() { - var root; - if (Batman.currentApp != null) { - root = Batman.currentApp.get('_renderContext'); - } - return root != null ? root : root = this.base; - }; - - RenderContext.prototype.windowWrapper = { - window: Batman.container - }; - - function RenderContext(object, parent) { - this.object = object; - this.parent = parent; - } - - RenderContext.prototype.findKey = function(key) { - var base, currentNode, val; - base = key.split('.')[0].split('|')[0].trim(); - currentNode = this; - while (currentNode) { - val = Batman.get(currentNode.object, base); - if (typeof val !== 'undefined') { - val = Batman.get(currentNode.object, key); - return [val, currentNode.object].map(this.constructor.deProxy); - } - currentNode = currentNode.parent; - } - return [Batman.get(this.windowWrapper, key), this.windowWrapper]; - }; - - RenderContext.prototype.get = function(key) { - return this.findKey(key)[0]; - }; - - RenderContext.prototype.contextForKey = function(key) { - return this.findKey(key)[1]; - }; - - RenderContext.prototype.descend = function(object, scopedKey) { - var oldObject; - if (scopedKey) { - oldObject = object; - object = new Batman.Object(); - object[scopedKey] = oldObject; - } - return new this.constructor(object, this); - }; - - RenderContext.prototype.descendWithKey = function(key, scopedKey) { - var proxy; - proxy = new ContextProxy(this, key); - return this.descend(proxy, scopedKey); - }; - - RenderContext.prototype.chain = function() { - var parent, x; - x = []; - parent = this; - while (parent) { - x.push(parent.object); - parent = parent.parent; - } - return x; - }; - - RenderContext.ContextProxy = ContextProxy = (function(_super) { - - __extends(ContextProxy, _super); - - ContextProxy.prototype.isContextProxy = true; - - ContextProxy.accessor('proxiedObject', function() { - return this.binding.get('filteredValue'); - }); - - ContextProxy.accessor({ - get: function(key) { - return this.get("proxiedObject." + key); - }, - set: function(key, value) { - return this.set("proxiedObject." + key, value); - }, - unset: function(key) { - return this.unset("proxiedObject." + key); - } - }); - - function ContextProxy(renderContext, keyPath, localKey) { - this.renderContext = renderContext; - this.keyPath = keyPath; - this.localKey = localKey; - this.binding = new Batman.DOM.AbstractBinding(void 0, this.keyPath, this.renderContext); - } - - return ContextProxy; - - })(Batman.Object); - - return RenderContext; - - }).call(this); - - Batman.RenderContext.base = new Batman.RenderContext(Batman.RenderContext.prototype.windowWrapper); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - Batman.ViewStore = (function(_super) { - - __extends(ViewStore, _super); - - function ViewStore() { - ViewStore.__super__.constructor.apply(this, arguments); - this._viewContents = {}; - this._requestedPaths = new Batman.SimpleSet; - } - - ViewStore.prototype.propertyClass = Batman.Property; - - ViewStore.prototype.fetchView = function(path) { - var _this = this; - return new Batman.Request({ - url: Batman.Navigator.normalizePath(Batman.config.viewPrefix, "" + path + ".html"), - type: 'html', - success: function(response) { - return _this.set(path, response); - }, - error: function(response) { - throw new Error("Could not load view from " + path); - } - }); - }; - - ViewStore.accessor({ - 'final': true, - get: function(path) { - var contents; - if (path[0] !== '/') { - return this.get("/" + path); - } - if (this._viewContents[path]) { - return this._viewContents[path]; - } - if (this._requestedPaths.has(path)) { - return; - } - if (contents = this._sourceFromDOM(path)) { - return contents; - } - if (Batman.config.fetchRemoteViews) { - this.fetchView(path); - } else { - throw new Error("Couldn't find view source for \'" + path + "\'!"); - } - }, - set: function(path, content) { - if (path[0] !== '/') { - return this.set("/" + path, content); - } - this._requestedPaths.add(path); - return this._viewContents[path] = content; - } - }); - - ViewStore.prototype.prefetch = function(path) { - this.get(path); - return true; - }; - - ViewStore.prototype._sourceFromDOM = function(path) { - var node, relativePath; - relativePath = path.slice(1); - if (node = Batman.DOM.querySelector(document, "[data-defineview*='" + relativePath + "']")) { - Batman.setImmediate(function() { - var _ref; - return (_ref = node.parentNode) != null ? _ref.removeChild(node) : void 0; - }); - return Batman.DOM.defineView(path, node); - } - }; - - return ViewStore; - - })(Batman.Object); - -}).call(this); - -(function() { - var __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.View = (function(_super) { - - __extends(View, _super); - - View.YieldStorage = (function(_super1) { - - __extends(YieldStorage, _super1); - - function YieldStorage() { - return YieldStorage.__super__.constructor.apply(this, arguments); - } - - YieldStorage.wrapAccessor(function(core) { - return { - get: function(key) { - var val; - val = core.get.call(this, key); - if (!(val != null)) { - val = this.set(key, []); - } - return val; - } - }; - }); - - return YieldStorage; - - })(Batman.Hash); - - View.store = new Batman.ViewStore(); - - View.option = function() { - var keys; - keys = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return this.accessor.apply(this, __slice.call(keys).concat([{ - get: function(key) { - var _ref; - return (_ref = this.get("argumentBindings." + key)) != null ? _ref.get('filteredValue') : void 0; - }, - set: function(key, value) { - var _ref; - return (_ref = this.get("argumentBindings." + key)) != null ? _ref.set('filteredValue', value) : void 0; - }, - unset: function(key) { - var _ref; - return (_ref = this.get("argumentBindings." + key)) != null ? _ref.unset('filteredValue') : void 0; - } - }])); - }; - - View.prototype.isView = true; - - View.prototype.cache = true; - - View.prototype._rendered = false; - - View.prototype.node = null; - - View.prototype.event('ready').oneShot = true; - - View.accessor('argumentBindings', function() { - var _this = this; - return new Batman.TerminalAccessible(function(key) { - var bindingKey, context, keyPath, node, _ref; - if (!((node = _this.get('node')) && (context = _this.get('context')))) { - return; - } - keyPath = node.getAttribute(("data-view-" + key).toLowerCase()); - if (keyPath == null) { - return; - } - bindingKey = "_argumentBinding" + key; - if ((_ref = _this[bindingKey]) != null) { - _ref.die(); - } - return _this[bindingKey] = new Batman.DOM.ViewArgumentBinding(node, keyPath, context); - }); - }); - - View.accessor('html', { - get: function() { - var source; - if (this.html && this.html.length > 0) { - return this.html; - } - if (!(source = this.get('source'))) { - return; - } - source = Batman.Navigator.normalizePath(source); - return this.html = this.constructor.store.get(source); - }, - set: function(_, html) { - return this.html = html; - } - }); - - View.accessor('node', { - get: function() { - var html; - if (this.node == null) { - html = this.get('html'); - if (!(html && html.length > 0)) { - return; - } - this.node = document.createElement('div'); - this._setNodeOwner(this.node); - Batman.DOM.setInnerHTML(this.node, html); - } - return this.node; - }, - set: function(_, node) { - var updateHTML, - _this = this; - this.node = node; - this._setNodeOwner(node); - updateHTML = function(html) { - if (html != null) { - Batman.DOM.setInnerHTML(_this.node, html); - return _this.forget('html', updateHTML); - } - }; - this.observeAndFire('html', updateHTML); - return node; - } - }); - - View.accessor('yields', function() { - return new this.constructor.YieldStorage; - }); - - View.accessor('fetched?', function() { - return this.get('source') != null; - }); - - View.accessor('readyToRender', function() { - var _ref; - return this.get('node') && (this.get('fetched?') ? ((_ref = this.get('html')) != null ? _ref.length : void 0) > 0 : true); - }); - - function View(options) { - var context, - _this = this; - if (options == null) { - options = {}; - } - context = options.context; - if (context) { - if (!(context instanceof Batman.RenderContext)) { - context = Batman.RenderContext.root().descend(context); - } - } else { - context = Batman.RenderContext.root(); - } - options.context = context.descend(this); - View.__super__.constructor.call(this, options); - Batman.Property.withoutTracking(function() { - return _this.observeAndFire('readyToRender', function(ready) { - if (ready) { - return _this.render(); - } - }); - }); - } - - View.prototype.render = function() { - var node, - _this = this; - if (this._rendered) { - return; - } - this._rendered = true; - this._renderer = new Batman.Renderer(node = this.get('node'), this.get('context'), this); - return this._renderer.on('rendered', function() { - return _this.fire('ready', node); - }); - }; - - View.prototype.isInDOM = function() { - var node; - if ((node = this.get('node'))) { - return (node.parentNode != null) || this.get('yields').some(function(name, nodes) { - var _i, _len; - for (_i = 0, _len = nodes.length; _i < _len; _i++) { - node = nodes[_i].node; - if (node.parentNode != null) { - return true; - } - } - return false; - }); - } else { - return false; - } - }; - - View.prototype.applyYields = function() { - return this.get('yields').forEach(function(name, nodes) { - var action, node, yieldObject, _i, _len, _ref, _results; - yieldObject = Batman.DOM.Yield.withName(name); - _results = []; - for (_i = 0, _len = nodes.length; _i < _len; _i++) { - _ref = nodes[_i], node = _ref.node, action = _ref.action; - _results.push(yieldObject[action](node)); - } - return _results; - }); - }; - - View.prototype.retractYields = function() { - return this.get('yields').forEach(function(name, nodes) { - var node, _i, _len, _ref, _results; - _results = []; - for (_i = 0, _len = nodes.length; _i < _len; _i++) { - node = nodes[_i].node; - _results.push((_ref = node.parentNode) != null ? _ref.removeChild(node) : void 0); - } - return _results; - }); - }; - - View.prototype.pushYieldAction = function(key, action, node) { - this._setNodeYielder(node); - return this.get("yields").get(key).push({ - node: node, - action: action - }); - }; - - View.prototype._setNodeOwner = function(node) { - return Batman._data(node, 'view', this); - }; - - View.prototype._setNodeYielder = function(node) { - return Batman._data(node, 'yielder', this); - }; - - View.prototype.on('ready', function() { - return typeof this.ready === "function" ? this.ready.apply(this, arguments) : void 0; - }); - - View.prototype.on('appear', function() { - return typeof this.viewDidAppear === "function" ? this.viewDidAppear.apply(this, arguments) : void 0; - }); - - View.prototype.on('disappear', function() { - return typeof this.viewDidDisappear === "function" ? this.viewDidDisappear.apply(this, arguments) : void 0; - }); - - View.prototype.on('beforeAppear', function() { - return typeof this.viewWillAppear === "function" ? this.viewWillAppear.apply(this, arguments) : void 0; - }); - - View.prototype.on('beforeDisappear', function() { - return typeof this.viewWillDisappear === "function" ? this.viewWillDisappear.apply(this, arguments) : void 0; - }); - - return View; - - }).call(this, Batman.Object); - -}).call(this); - -(function() { - var Yield, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - - Batman.DOM.Yield = Yield = (function(_super) { - - __extends(Yield, _super); - - Yield.yields = {}; - - Yield.queued = function(fn) { - return function() { - var args, handler, - _this = this; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - if (this.containerNode != null) { - return fn.apply(this, args); - } else { - return handler = this.observe('containerNode', function() { - var result; - result = fn.apply(_this, args); - _this.forget('containerNode', handler); - return result; - }); - } - }; - }; - - Yield.reset = function() { - return this.yields = {}; - }; - - Yield.withName = function(name) { - var _base; - (_base = this.yields)[name] || (_base[name] = new this({ - name: name - })); - return this.yields[name]; - }; - - Yield.forEach = function(f) { - var name, yieldObject, _ref; - _ref = this.yields; - for (name in _ref) { - yieldObject = _ref[name]; - f(yieldObject); - } - }; - - Yield.clearAll = function() { - return this.forEach(function(yieldObject) { - return yieldObject.clear(); - }); - }; - - Yield.cycleAll = function() { - return this.forEach(function(yieldObject) { - return yieldObject.cycle(); - }); - }; - - Yield.clearAllStale = function() { - return this.forEach(function(yieldObject) { - return yieldObject.clearStale(); - }); - }; - - function Yield() { - this.cycle(); - } - - Yield.prototype.cycle = function() { - return this.currentVersionNodes = []; - }; - - Yield.prototype.clear = Yield.queued(function() { - var child, _i, _len, _ref, _results; - this.cycle(); - _ref = (function() { - var _j, _len, _ref, _results1; - _ref = this.containerNode.childNodes; - _results1 = []; - for (_j = 0, _len = _ref.length; _j < _len; _j++) { - child = _ref[_j]; - _results1.push(child); - } - return _results1; - }).call(this); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - _results.push(Batman.DOM.removeOrDestroyNode(child)); - } - return _results; - }); - - Yield.prototype.clearStale = Yield.queued(function() { - var child, _i, _len, _ref, _results; - _ref = (function() { - var _j, _len, _ref, _results1; - _ref = this.containerNode.childNodes; - _results1 = []; - for (_j = 0, _len = _ref.length; _j < _len; _j++) { - child = _ref[_j]; - _results1.push(child); - } - return _results1; - }).call(this); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - if (!~this.currentVersionNodes.indexOf(child)) { - _results.push(Batman.DOM.removeOrDestroyNode(child)); - } - } - return _results; - }); - - Yield.prototype.append = Yield.queued(function(node) { - this.currentVersionNodes.push(node); - return Batman.DOM.appendChild(this.containerNode, node, true); - }); - - Yield.prototype.replace = Yield.queued(function(node) { - this.clear(); - return this.append(node); - }); - - return Yield; - - })(Batman.Object); - -}).call(this); - -(function() { - - - -}).call(this); diff --git a/pydashie/assets/javascripts/d3.v2.min.js b/pydashie/assets/javascripts/d3.v2.min.js deleted file mode 100644 index 5feea01..0000000 --- a/pydashie/assets/javascripts/d3.v2.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(){function d(a,b){try{for(var c in b)Object.defineProperty(a.prototype,c,{value:b[c],enumerable:!1})}catch(d){a.prototype=b}}function f(a){var b=-1,c=a.length,d=[];while(++b=0?a.substring(b):(b=a.length,""),d=[];while(b>0)d.push(a.substring(b-=3,b+3));return d.reverse().join(",")+c}function H(a,b){var c=Math.pow(10,Math.abs(8-b)*3);return{scale:b>8?function(a){return a/c}:function(a){return a*c},symbol:a}}function N(a){return function(b){return b<=0?0:b>=1?1:a(b)}}function O(a){return function(b){return 1-a(1-b)}}function P(a){return function(b){return.5*(b<.5?a(2*b):2-a(2-2*b))}}function Q(a){return a}function R(a){return function(b){return Math.pow(b,a)}}function S(a){return 1-Math.cos(a*Math.PI/2)}function T(a){return Math.pow(2,10*(a-1))}function U(a){return 1-Math.sqrt(1-a*a)}function V(a,b){var c;return arguments.length<2&&(b=.45),arguments.length<1?(a=1,c=b/4):c=b/(2*Math.PI)*Math.asin(1/a),function(d){return 1+a*Math.pow(2,10*-d)*Math.sin((d-c)*2*Math.PI/b)}}function W(a){return a||(a=1.70158),function(b){return b*b*((a+1)*b-a)}}function X(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375}function Y(){d3.event.stopPropagation(),d3.event.preventDefault()}function Z(){var a=d3.event,b;while(b=a.sourceEvent)a=b;return a}function $(a){var b=new z,c=0,d=arguments.length;while(++c360?a-=360:a<0&&(a+=360),a<60?d+(e-d)*a/60:a<180?e:a<240?d+(e-d)*(240-a)/60:d}function g(a){return Math.round(f(a)*255)}var d,e;return a%=360,a<0&&(a+=360),b=b<0?0:b>1?1:b,c=c<0?0:c>1?1:c,e=c<=.5?c*(1+b):c+b-c*b,d=2*c-e,bj(g(a+120),g(a),g(a-120))}function bv(a,b,c){return new bw(a,b,c)}function bw(a,b,c){this.h=a,this.c=b,this.l=c}function bx(a,b,c){return by(c,Math.cos(a*=Math.PI/180)*b,Math.sin(a)*b)}function by(a,b,c){return new bz(a,b,c)}function bz(a,b,c){this.l=a,this.a=b,this.b=c}function bE(a,b,c){var d=(a+16)/116,e=d+b/500,f=d-c/200;return e=bG(e)*bB,d=bG(d)*bC,f=bG(f)*bD,bj(bI(3.2404542*e-1.5371385*d-.4985314*f),bI(-0.969266*e+1.8760108*d+.041556*f),bI(.0556434*e-.2040259*d+1.0572252*f))}function bF(a,b,c){return bv(Math.atan2(c,b)/Math.PI*180,Math.sqrt(b*b+c*c),a)}function bG(a){return a>.206893034?a*a*a:(a-4/29)/7.787037}function bH(a){return a>.008856?Math.pow(a,1/3):7.787037*a+4/29}function bI(a){return Math.round(255*(a<=.00304?12.92*a:1.055*Math.pow(a,1/2.4)-.055))}function bJ(a){return i(a,bP),a}function bQ(a){return function(){return bK(a,this)}}function bR(a){return function(){return bL(a,this)}}function bS(a,b){function c(){this.removeAttribute(a)}function d(){this.removeAttributeNS(a.space,a.local)}function e(){this.setAttribute(a,b)}function f(){this.setAttributeNS(a.space,a.local,b)}function g(){var c=b.apply(this,arguments);c==null?this.removeAttribute(a):this.setAttribute(a,c)}function h(){var c=b.apply(this,arguments);c==null?this.removeAttributeNS(a.space,a.local):this.setAttributeNS(a.space,a.local,c)}return a=d3.ns.qualify(a),b==null?a.local?d:c:typeof b=="function"?a.local?h:g:a.local?f:e}function bT(a){return new RegExp("(?:^|\\s+)"+d3.requote(a)+"(?:\\s+|$)","g")}function bU(a,b){function d(){var d=-1;while(++d0&&(a=a.substring(0,e)),b?g:f}function ca(a,b){for(var c=0,d=a.length;cb?q():(m.active=b,d.forEach(function(b,c){(c=c.call(a,n,h))&&j.push(c)}),e.start.call(a,n,h),p(f)||d3.timer(p,0,c),1)}function p(c){if(m.active!==b)return q();var d=(c-k)/l,g=f(d),i=j.length;while(i>0)j[--i].call(a,g);if(d>=1)return q(),ch=b,e.end.call(a,n,h),ch=0,1}function q(){return--m.count||delete a.__transition__,1}var j=[],k=a.delay,l=a.duration,m=(a=a.node).__transition__||(a.__transition__={active:0,count:0}),n=a.__data__;++m.count,k<=g?o(g):d3.timer(o,k,c)})},0,c),a}function co(a){var b=ch,c=cn,d=cl,e=cm;return ch=this.id,cn=this.ease(),ca(this,function(b,c,d){cl=b.delay,cm=b.duration,a.call(b=b.node,b.__data__,c,d)}),ch=b,cn=c,cl=d,cm=e,this}function cq(a,b,c){return c!=""&&cp}function cr(a,b){return d3.tween(a,bg(b))}function cv(){var a,b=Date.now(),c=cs;while(c)a=b-c.then,a>=c.delay&&(c.flush=c.callback(a)),c=c.next;var d=cw()-b;d>24?(isFinite(d)&&(clearTimeout(cu),cu=setTimeout(cv,d)),ct=0):(ct=1,cx(cv))}function cw(){var a=null,b=cs,c=Infinity;while(b)b.flush?b=a?a.next=b.next:cs=b.next:(c=Math.min(c,b.then+b.delay),b=(a=b).next);return c}function cz(a,b){var c=a.ownerSVGElement||a;if(c.createSVGPoint){var d=c.createSVGPoint();if(cy<0&&(window.scrollX||window.scrollY)){c=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var e=c[0][0].getScreenCTM();cy=!e.f&&!e.e,c.remove()}return cy?(d.x=b.pageX,d.y=b.pageY):(d.x=b.clientX,d.y=b.clientY),d=d.matrixTransform(a.getScreenCTM().inverse()),[d.x,d.y]}var f=a.getBoundingClientRect();return[b.clientX-f.left-a.clientLeft,b.clientY-f.top-a.clientTop]}function cA(){}function cB(a){var b=a[0],c=a[a.length-1];return b2?cM:cL,i=d?bi:bh;return e=g(a,b,i,c),f=g(b,a,i,d3.interpolate),h}function h(a){return e(a)}var e,f;return h.invert=function(a){return f(a)},h.domain=function(b){return arguments.length?(a=b.map(Number),g()):a},h.range=function(a){return arguments.length?(b=a,g()):b},h.rangeRound=function(a){return h.range(a).interpolate(d3.interpolateRound)},h.clamp=function(a){return arguments.length?(d=a,g()):d},h.interpolate=function(a){return arguments.length?(c=a,g()):c},h.ticks=function(b){return cJ(a,b)},h.tickFormat=function(b){return cK(a,b)},h.nice=function(){return cD(a,cH),g()},h.copy=function(){return cF(a,b,c,d)},g()}function cG(a,b){return d3.rebind(a,b,"range","rangeRound","interpolate","clamp")}function cH(a){return a=Math.pow(10,Math.round(Math.log(a)/Math.LN10)-1),a&&{floor:function(b){return Math.floor(b/a)*a},ceil:function(b){return Math.ceil(b/a)*a}}}function cI(a,b){var c=cB(a),d=c[1]-c[0],e=Math.pow(10,Math.floor(Math.log(d/b)/Math.LN10)),f=b/d*e;return f<=.15?e*=10:f<=.35?e*=5:f<=.75&&(e*=2),c[0]=Math.ceil(c[0]/e)*e,c[1]=Math.floor(c[1]/e)*e+e*.5,c[2]=e,c}function cJ(a,b){return d3.range.apply(d3,cI(a,b))}function cK(a,b){return d3.format(",."+Math.max(0,-Math.floor(Math.log(cI(a,b)[2])/Math.LN10+.01))+"f")}function cL(a,b,c,d){var e=c(a[0],a[1]),f=d(b[0],b[1]);return function(a){return f(e(a))}}function cM(a,b,c,d){var e=[],f=[],g=0,h=Math.min(a.length,b.length)-1;a[h]0;j--)e.push(c(f)*j)}else{for(;fi;g--);e=e.slice(f,g)}return e},d.tickFormat=function(a,e){arguments.length<2&&(e=cO);if(arguments.length<1)return e;var f=Math.max(.1,a/d.ticks().length),g=b===cQ?(h=-1e-12,Math.floor):(h=1e-12,Math.ceil),h;return function(a){return a/c(g(b(a)+h))<=f?e(a):""}},d.copy=function(){return cN(a.copy(),b)},cG(d,a)}function cP(a){return Math.log(a<0?0:a)/Math.LN10}function cQ(a){return-Math.log(a>0?0:-a)/Math.LN10}function cR(a,b){function e(b){return a(c(b))}var c=cS(b),d=cS(1/b);return e.invert=function(b){return d(a.invert(b))},e.domain=function(b){return arguments.length?(a.domain(b.map(c)),e):a.domain().map(d)},e.ticks=function(a){return cJ(e.domain(),a)},e.tickFormat=function(a){return cK(e.domain(),a)},e.nice=function(){return e.domain(cD(e.domain(),cH))},e.exponent=function(a){if(!arguments.length)return b;var f=e.domain();return c=cS(b=a),d=cS(1/b),e.domain(f)},e.copy=function(){return cR(a.copy(),b)},cG(e,a)}function cS(a){return function(b){return b<0?-Math.pow(-b,a):Math.pow(b,a)}}function cT(a,b){function f(b){return d[((c.get(b)||c.set(b,a.push(b)))-1)%d.length]}function g(b,c){return d3.range(a.length).map(function(a){return b+c*a})}var c,d,e;return f.domain=function(d){if(!arguments.length)return a;a=[],c=new j;var e=-1,g=d.length,h;while(++e1){h=b[1],f=a[i],i++,d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(var j=2;j9&&(f=c*3/Math.sqrt(f),g[h]=f*d,g[h+1]=f*e));h=-1;while(++h<=i)f=(a[Math.min(i,h+1)][0]-a[Math.max(0,h-1)][0])/(6*(1+g[h]*g[h])),b.push([f||0,g[h]*f||0]);return b}function dG(a){return a.length<3?dk(a):a[0]+ds(a,dF(a))}function dH(a){var b,c=-1,d=a.length,e,f;while(++c1){var d=cB(a.domain()),e,f=-1,g=b.length,h=(b[1]-b[0])/++c,i,j;while(++f0;)(j=+b[f]-i*h)>=d[0]&&e.push(j);for(--f,i=0;++id&&(c=b,d=e);return c}function ex(a){return a.reduce(ey,0)}function ey(a,b){return a+b[1]}function ez(a,b){return eA(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function eA(a,b){var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];while(++c<=b)f[c]=e*c+d;return f}function eB(a){return[d3.min(a),d3.max(a)]}function eC(a,b){return d3.rebind(a,b,"sort","children","value"),a.links=eG,a.nodes=function(b){return eH=!0,(a.nodes=a)(b)},a}function eD(a){return a.children}function eE(a){return a.value}function eF(a,b){return b.value-a.value}function eG(a){return d3.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function eI(a,b){return a.value-b.value}function eJ(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function eK(a,b){a._pack_next=b,b._pack_prev=a}function eL(a,b){var c=b.x-a.x,d=b.y-a.y,e=a.r+b.r;return e*e-c*c-d*d>.001}function eM(a){function n(a){c=Math.min(a.x-a.r,c),d=Math.max(a.x+a.r,d),e=Math.min(a.y-a.r,e),f=Math.max(a.y+a.r,f)}if(!(b=a.children)||!(m=b.length))return;var b,c=Infinity,d=-Infinity,e=Infinity,f=-Infinity,g,h,i,j,k,l,m;b.forEach(eN),g=b[0],g.x=-g.r,g.y=0,n(g);if(m>1){h=b[1],h.x=h.r,h.y=0,n(h);if(m>2){i=b[2],eQ(g,h,i),n(i),eJ(g,i),g._pack_prev=i,eJ(i,h),h=g._pack_next;for(j=3;j0&&(a=d)}return a}function eZ(a,b){return a.x-b.x}function e$(a,b){return b.x-a.x}function e_(a,b){return a.depth-b.depth}function fa(a,b){function c(a,d){var e=a.children;if(e&&(i=e.length)){var f,g=null,h=-1,i;while(++h=0)f=d[e]._tree,f.prelim+=b,f.mod+=b,b+=f.shift+(c+=f.change)}function fc(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function fd(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function fe(a){return{x:a.x,y:a.y,dx:a.dx,dy:a.dy}}function ff(a,b){var c=a.x+b[3],d=a.y+b[0],e=a.dx-b[1]-b[3],f=a.dy-b[0]-b[2];return e<0&&(c+=e/2,e=0),f<0&&(d+=f/2,f=0),{x:c,y:d,dx:e,dy:f}}function fg(a,b){function f(a,c){d3.text(a,b,function(a){c(a&&f.parse(a))})}function g(b){return b.map(h).join(a)}function h(a){return d.test(a)?'"'+a.replace(/\"/g,'""')+'"':a}var c=new RegExp("\r\n|["+a+"\r\n]","g"),d=new RegExp('["'+a+"\n]"),e=a.charCodeAt(0);return f.parse=function(a){var b;return f.parseRows(a,function(a,c){if(c){var d={},e=-1,f=b.length;while(++e=a.length)return f;if(j)return j=!1,d;var b=c.lastIndex;if(a.charCodeAt(b)===34){var g=b;while(g++0}function fC(a,b,c){return(c[0]-b[0])*(a[1]-b[1])<(c[1]-b[1])*(a[0]-b[0])}function fD(a,b,c,d){var e=a[0],f=b[0],g=c[0],h=d[0],i=a[1],j=b[1],k=c[1],l=d[1],m=e-g,n=f-e,o=h-g,p=i-k,q=j-i,r=l-k,s=(o*p-r*m)/(r*n-o*q);return[e+s*n,i+s*q]}function fF(a,b){var c={list:a.map(function(a,b){return{index:b,x:a[0],y:a[1]}}).sort(function(a,b){return a.yb.y?1:a.xb.x?1:0}),bottomSite:null},d={list:[],leftEnd:null,rightEnd:null,init:function(){d.leftEnd=d.createHalfEdge(null,"l"),d.rightEnd=d.createHalfEdge(null,"l"),d.leftEnd.r=d.rightEnd,d.rightEnd.l=d.leftEnd,d.list.unshift(d.leftEnd,d.rightEnd)},createHalfEdge:function(a,b){return{edge:a,side:b,vertex:null,l:null,r:null}},insert:function(a,b){b.l=a,b.r=a.r,a.r.l=b,a.r=b},leftBound:function(a){var b=d.leftEnd;do b=b.r;while(b!=d.rightEnd&&e.rightOf(b,a));return b=b.l,b},del:function(a){a.l.r=a.r,a.r.l=a.l,a.edge=null},right:function(a){return a.r},left:function(a){return a.l},leftRegion:function(a){return a.edge==null?c.bottomSite:a.edge.region[a.side]},rightRegion:function(a){return a.edge==null?c.bottomSite:a.edge.region[fE[a.side]]}},e={bisect:function(a,b){var c={region:{l:a,r:b},ep:{l:null,r:null}},d=b.x-a.x,e=b.y-a.y,f=d>0?d:-d,g=e>0?e:-e;return c.c=a.x*d+a.y*e+(d*d+e*e)*.5,f>g?(c.a=1,c.b=e/d,c.c/=d):(c.b=1,c.a=d/e,c.c/=e),c},intersect:function(a,b){var c=a.edge,d=b.edge;if(!c||!d||c.region.r==d.region.r)return null;var e=c.a*d.b-c.b*d.a;if(Math.abs(e)<1e-10)return null;var f=(c.c*d.b-d.c*c.b)/e,g=(d.c*c.a-c.c*d.a)/e,h=c.region.r,i=d.region.r,j,k;h.y=k.region.r.x;return l&&j.side==="l"||!l&&j.side==="r"?null:{x:f,y:g}},rightOf:function(a,b){var c=a.edge,d=c.region.r,e=b.x>d.x;if(e&&a.side==="l")return 1;if(!e&&a.side==="r")return 0;if(c.a===1){var f=b.y-d.y,g=b.x-d.x,h=0,i=0;!e&&c.b<0||e&&c.b>=0?i=h=f>=c.b*g:(i=b.x+b.y*c.b>c.c,c.b<0&&(i=!i),i||(h=1));if(!h){var j=d.x-c.region.l.x;i=c.b*(g*g-f*f)m*m+n*n}return a.side==="l"?i:!i},endPoint:function(a,c,d){a.ep[c]=d;if(!a.ep[fE[c]])return;b(a)},distance:function(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}},f={list:[],insert:function(a,b,c){a.vertex=b,a.ystar=b.y+c;for(var d=0,e=f.list,g=e.length;dh.ystar||a.ystar==h.ystar&&b.x>h.vertex.x)continue;break}e.splice(d,0,a)},del:function(a){for(var b=0,c=f.list,d=c.length;bo.y&&(p=n,n=o,o=p,t="r"),s=e.bisect(n,o),m=d.createHalfEdge(s,t),d.insert(k,m),e.endPoint(s,fE[t],r),q=e.intersect(k,m),q&&(f.del(k),f.insert(k,q,e.distance(q,n))),q=e.intersect(m,l),q&&f.insert(m,q,e.distance(q,n));else break}for(i=d.right(d.leftEnd);i!=d.rightEnd;i=d.right(i))b(i.edge)}function fG(){return{leaf:!0,nodes:[],point:null}}function fH(a,b,c,d,e,f){if(!a(b,c,d,e,f)){var g=(c+e)*.5,h=(d+f)*.5,i=b.nodes;i[0]&&fH(a,i[0],c,d,g,h),i[1]&&fH(a,i[1],g,d,e,h),i[2]&&fH(a,i[2],c,h,g,f),i[3]&&fH(a,i[3],g,h,e,f)}}function fI(a){return{x:a[0],y:a[1]}}function fL(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function fU(a){return a.substring(0,3)}function fV(a,b,c,d){var e,f,g=0,h=b.length,i=c.length;while(g=i)return-1;e=b.charCodeAt(g++);if(e==37){f=gh[b.charAt(g++)];if(!f||(d=f(a,c,d))<0)return-1}else if(e!=c.charCodeAt(d++))return-1}return d}function fW(a){return new RegExp("^(?:"+a.map(d3.requote).join("|")+")","i")}function fX(a){var b=new j,c=-1,d=a.length;while(++c68?1900:2e3)}function gs(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.m=d[0]-1,c+=d[0].length):-1}function gt(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.d=+d[0],c+=d[0].length):-1}function gu(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.H=+d[0],c+=d[0].length):-1}function gv(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.M=+d[0],c+=d[0].length):-1}function gw(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+2));return d?(a.S=+d[0],c+=d[0].length):-1}function gx(a,b,c){gy.lastIndex=0;var d=gy.exec(b.substring(c,c+3));return d?(a.L=+d[0],c+=d[0].length):-1}function gz(a,b,c){var d=gA.get(b.substring(c,c+=2).toLowerCase());return d==null?-1:(a.p=d,c)}function gB(a){var b=a.getTimezoneOffset(),c=b>0?"-":"+",d=~~(Math.abs(b)/60),e=Math.abs(b)%60;return c+fY(d)+fY(e)}function gD(a){return a.toISOString()}function gE(a,b,c){function d(b){var c=a(b),d=f(c,1);return b-c1)while(gb?1:a>=b?0:NaN},d3.descending=function(a,b){return ba?1:b>=a?0:NaN},d3.mean=function(a,b){var c=a.length,d,e=0,f=-1,g=0;if(arguments.length===1)while(++f1&&(a=a.map(b)),a=a.filter(r),a.length?d3.quantile(a.sort(d3.ascending),.5):undefined},d3.min=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++cf&&(e=f)}else{while(++cf&&(e=f)}return e},d3.max=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++ce&&(e=f)}else{while(++ce&&(e=f)}return e},d3.extent=function(a,b){var c=-1,d=a.length,e,f,g;if(arguments.length===1){while(++cf&&(e=f),gf&&(e=f),g1);return a+b*c*Math.sqrt(-2*Math.log(e)/e)}},logNormal:function(a,b){var c=arguments.length;c<2&&(b=1),c<1&&(a=0);var d=d3.random.normal();return function(){return Math.exp(a+b*d())}},irwinHall:function(a){return function(){for(var b=0,c=0;c>>1;a.call(b,b[f],f)>>1;c0&&(e=f);return e},d3.last=function(a,b){var c=0,d=a.length,e=a[0],f;arguments.length===1&&(b=d3.ascending);while(++c=b.length)return e?e.call(a,c):d?c.sort(d):c;var h=-1,i=c.length,k=b[g++],l,m,n=new j,o,p={};while(++h=b.length)return a;var e=[],f=c[d++],h;for(h in a)e.push({key:h,values:g(a[h],d)});return f&&e.sort(function(a,b){return f(a.key,b.key)}),e}var a={},b=[],c=[],d,e;return a.map=function(a){return f(a,0)},a.entries=function(a){return g(f(a,0),0)},a.key=function(c){return b.push(c),a},a.sortKeys=function(d){return c[b.length-1]=d,a},a.sortValues=function(b){return d=b,a},a.rollup=function(b){return e=b,a},a},d3.keys=function(a){var b=[];for(var c in a)b.push(c);return b},d3.values=function(a){var b=[];for(var c in a)b.push(a[c]);return b},d3.entries=function(a){var b=[];for(var c in a)b.push({key:c,value:a[c]});return b},d3.permute=function(a,b){var c=[],d=-1,e=b.length;while(++db)d.push(g/e);else while((g=a+c*++f)=200&&a<300||a===304?d:null)}},d.send(null)},d3.text=function(a,b,c){function d(a){c(a&&a.responseText)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)},d3.json=function(a,b){d3.text(a,"application/json",function(a){b(a?JSON.parse(a):null)})},d3.html=function(a,b){d3.text(a,"text/html",function(a){if(a!=null){var c=document.createRange();c.selectNode(document.body),a=c.createContextualFragment(a)}b(a)})},d3.xml=function(a,b,c){function d(a){c(a&&a.responseXML)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)};var y={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:y,qualify:function(a){var b=a.indexOf(":"),c=a;return b>=0&&(c=a.substring(0,b),a=a.substring(b+1)),y.hasOwnProperty(c)?{space:y[c],local:a}:a}},d3.dispatch=function(){var a=new z,b=-1,c=arguments.length;while(++b0&&(d=a.substring(c+1),a=a.substring(0,c)),arguments.length<2?this[a].on(d):this[a].on(d,b)},d3.format=function(a){var b=B.exec(a),c=b[1]||" ",d=b[3]||"",e=b[5],f=+b[6],g=b[7],h=b[8],i=b[9],j=1,k="",l=!1;h&&(h=+h.substring(1)),e&&(c="0",g&&(f-=Math.floor((f-1)/4)));switch(i){case"n":g=!0,i="g";break;case"%":j=100,k="%",i="f";break;case"p":j=100,k="%",i="r";break;case"d":l=!0,h=0;break;case"s":j=-1,i="r"}return i=="r"&&!h&&(i="g"),i=C.get(i)||E,function(a){if(l&&a%1)return"";var b=a<0&&(a=-a)?"-":d;if(j<0){var m=d3.formatPrefix(a,h);a=m.scale(a),k=m.symbol}else a*=j;a=i(a,h);if(e){var n=a.length+b.length;n=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,C=d3.map({g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){return d3.round(a,b=D(a,b)).toFixed(Math.max(0,Math.min(20,b)))}}),G=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(H);d3.formatPrefix=function(a,b){var c=0;return a&&(a<0&&(a*=-1),b&&(a=d3.round(a,D(a,b))),c=1+Math.floor(1e-12+Math.log(a)/Math.LN10),c=Math.max(-24,Math.min(24,Math.floor((c<=0?c+1:c-1)/3)*3))),G[8+c/3]};var I=R(2),J=R(3),K=function(){return Q},L=d3.map({linear:K,poly:R,quad:function(){return I},cubic:function(){return J},sin:function(){return S},exp:function(){return T},circle:function(){return U},elastic:V,back:W,bounce:function(){return X}}),M=d3.map({"in":Q,out:O,"in-out":P,"out-in":function(a){return P(O(a))}});d3.ease=function(a){var b=a.indexOf("-"),c=b>=0?a.substring(0,b):a,d=b>=0?a.substring(b+1):"in";return c=L.get(c)||K,d=M.get(d)||Q,N(d(c.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(a){var b=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(a){b.setAttribute("transform",a);var c=b.transform.baseVal.consolidate();return new _(c?c.matrix:be)})(a)},_.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var bd=180/Math.PI,be={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(a,b){var c=d3.interpolators.length,d;while(--c>=0&&!(d=d3.interpolators[c](a,b)));return d},d3.interpolateNumber=function(a,b){return b-=a,function(c){return a+b*c}},d3.interpolateRound=function(a,b){return b-=a,function(c){return Math.round(a+b*c)}},d3.interpolateString=function(a,b){var c,d,e,f=0,g=0,h=[],i=[],j,k;bf.lastIndex=0;for(d=0;c=bf.exec(b);++d)c.index&&h.push(b.substring(f,g=c.index)),i.push({i:h.length,x:c[0]}),h.push(null),f=bf.lastIndex;f180?k+=360:k-j>180&&(j+=360),d.push({i:c.push(c.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(j,k)})):k&&c.push(c.pop()+"rotate("+k+")"),l!=m?d.push({i:c.push(c.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(l,m)}):m&&c.push(c.pop()+"skewX("+m+")"),n[0]!=o[0]||n[1]!=o[1]?(e=c.push(c.pop()+"scale(",null,",",null,")"),d.push({i:e-4,x:d3.interpolateNumber(n[0],o[0])},{i:e-2,x:d3.interpolateNumber(n[1],o[1])})):(o[0]!=1||o[1]!=1)&&c.push(c.pop()+"scale("+o+")"),e=d.length,function(a){var b=-1,f;while(++b180?f-=360:f<-180&&(f+=360),function(a){return bu(c+f*a,d+g*a,e+h*a)+""}},d3.interpolateLab=function(a,b){a=d3.lab(a),b=d3.lab(b);var c=a.l,d=a.a,e=a.b,f=b.l-c,g=b.a-d,h=b.b-e;return function(a){return bE(c+f*a,d+g*a,e+h*a)+""}},d3.interpolateHcl=function(a,b){a=d3.hcl(a),b=d3.hcl(b);var c=a.h,d=a.c,e=a.l,f=b.h-c,g=b.c-d,h=b.l-e;return f>180?f-=360:f<-180&&(f+=360),function(a){return bx(c+f*a,d+g*a,e+h*a)+""}},d3.interpolateArray=function(a,b){var c=[],d=[],e=a.length,f=b.length,g=Math.min(a.length,b.length),h;for(h=0;h=0;)if(f=c[d])e&&e!==f.nextSibling&&e.parentNode.insertBefore(f,e),e=f;return this},bP.sort=function(a){a=b$.apply(this,arguments);for(var b=-1,c=this.length;++b=db?e?"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"Z":e?"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L"+e*m+","+e*n+"A"+e+","+e+" 0 "+j+",0 "+e*k+","+e*l+"Z":"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L0,0"+"Z"}var a=dc,b=dd,c=de,d=df;return e.innerRadius=function(b){return arguments.length?(a=p(b),e):a},e.outerRadius=function(a){return arguments.length?(b=p(a),e):b},e.startAngle=function(a){return arguments.length?(c=p(a),e):c},e.endAngle=function(a){return arguments.length?(d=p(a),e):d},e.centroid=function(){var e=(a.apply(this,arguments)+b.apply(this,arguments))/2,f=(c.apply(this,arguments)+d.apply(this,arguments))/2+da;return[Math.cos(f)*e,Math.sin(f)*e]},e};var da=-Math.PI/2,db=2*Math.PI-1e-6;d3.svg.line=function(){return dg(m)};var dj=d3.map({linear:dk,"linear-closed":dl,"step-before":dm,"step-after":dn,basis:du,"basis-open":dv,"basis-closed":dw,bundle:dx,cardinal:dr,"cardinal-open":dp,"cardinal-closed":dq,monotone:dG});dj.forEach(function(a,b){b.key=a,b.closed=/-closed$/.test(a)});var dz=[0,2/3,1/3,0],dA=[0,1/3,2/3,0],dB=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var a=dg(dH);return a.radius=a.x,delete a.x,a.angle=a.y,delete a.y,a},dm.reverse=dn,dn.reverse=dm,d3.svg.area=function(){return dI(m)},d3.svg.area.radial=function(){var a=dI(dH);return a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1,a},d3.svg.chord=function(){function f(c,d){var e=g(this,a,c,d),f=g(this,b,c,d);return"M"+e.p0+i(e.r,e.p1,e.a1-e.a0)+(h(e,f)?j(e.r,e.p1,e.r,e.p0):j(e.r,e.p1,f.r,f.p0)+i(f.r,f.p1,f.a1-f.a0)+j(f.r,f.p1,e.r,e.p0))+"Z"}function g(a,b,f,g){var h=b.call(a,f,g),i=c.call(a,h,g),j=d.call(a,h,g)+da,k=e.call(a,h,g)+da;return{r:i,a0:j,a1:k,p0:[i*Math.cos(j),i*Math.sin(j)],p1:[i*Math.cos(k),i*Math.sin(k)]}}function h(a,b){return a.a0==b.a0&&a.a1==b.a1}function i(a,b,c){return"A"+a+","+a+" 0 "+ +(c>Math.PI)+",1 "+b}function j(a,b,c,d){return"Q 0,0 "+d}var a=dJ,b=dK,c=dL,d=de,e=df;return f.radius=function(a){return arguments.length?(c=p(a),f):c},f.source=function(b){return arguments.length?(a=p(b),f):a},f.target=function(a){return arguments.length?(b=p(a),f):b},f.startAngle=function(a){return arguments.length?(d=p(a),f):d},f.endAngle=function(a){return arguments.length?(e=p(a),f):e},f},d3.svg.diagonal=function(){function d(d,e){var f=a.call(this,d,e),g=b.call(this,d,e),h=(f.y+g.y)/2,i=[f,{x:f.x,y:h},{x:g.x,y:h},g];return i=i.map(c),"M"+i[0]+"C"+i[1]+" "+i[2]+" "+i[3]}var a=dJ,b=dK,c=dO;return d.source=function(b){return arguments.length?(a=p(b),d):a},d.target=function(a){return arguments.length?(b=p(a),d):b},d.projection=function(a){return arguments.length?(c=a,d):c},d},d3.svg.diagonal.radial=function(){var a=d3.svg.diagonal(),b=dO,c=a.projection;return a.projection=function(a){return arguments.length?c(dP(b=a)):b},a},d3.svg.mouse=d3.mouse,d3.svg.touches=d3.touches,d3.svg.symbol=function(){function c(c,d){return(dT.get(a.call(this,c,d))||dS)(b.call(this,c,d))}var a=dR,b=dQ;return c.type=function(b){return arguments.length?(a=p(b),c):a},c.size=function(a){return arguments.length?(b=p(a),c):b},c};var dT=d3.map({circle:dS,cross:function(a){var b=Math.sqrt(a/5)/2;return"M"+ -3*b+","+ -b+"H"+ -b+"V"+ -3*b+"H"+b+"V"+ -b+"H"+3*b+"V"+b+"H"+b+"V"+3*b+"H"+ -b+"V"+b+"H"+ -3*b+"Z"},diamond:function(a){var b=Math.sqrt(a/(2*dV)),c=b*dV;return"M0,"+ -b+"L"+c+",0"+" 0,"+b+" "+ -c+",0"+"Z"},square:function(a){var b=Math.sqrt(a)/2;return"M"+ -b+","+ -b+"L"+b+","+ -b+" "+b+","+b+" "+ -b+","+b+"Z"},"triangle-down":function(a){var b=Math.sqrt(a/dU),c=b*dU/2;return"M0,"+c+"L"+b+","+ -c+" "+ -b+","+ -c+"Z"},"triangle-up":function(a){var b=Math.sqrt(a/dU),c=b*dU/2;return"M0,"+ -c+"L"+b+","+c+" "+ -b+","+c+"Z"}});d3.svg.symbolTypes=dT.keys();var dU=Math.sqrt(3),dV=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function k(k){k.each(function(){var k=d3.select(this),l=h==null?a.ticks?a.ticks.apply(a,g):a.domain():h,m=i==null?a.tickFormat?a.tickFormat.apply(a,g):String:i,n=dY(a,l,j),o=k.selectAll(".minor").data(n,String),p=o.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),q=d3.transition(o.exit()).style("opacity",1e-6).remove(),r=d3.transition(o).style("opacity",1),s=k.selectAll("g").data(l,String),t=s.enter().insert("g","path").style("opacity",1e-6),u=d3.transition(s.exit()).style("opacity",1e-6).remove(),v=d3.transition(s).style("opacity",1),w,x=cC(a),y=k.selectAll(".domain").data([0]),z=y.enter().append("path").attr("class","domain"),A=d3.transition(y),B=a.copy(),C=this.__chart__||B;this.__chart__=B,t.append("line").attr("class","tick"),t.append("text");var D=t.select("line"),E=v.select("line"),F=s.select("text").text(m),G=t.select("text"),H=v.select("text");switch(b){case"bottom":w=dW,p.attr("y2",d),r.attr("x2",0).attr("y2",d),D.attr("y2",c),G.attr("y",Math.max(c,0)+f),E.attr("x2",0).attr("y2",c),H.attr("x",0).attr("y",Math.max(c,0)+f),F.attr("dy",".71em").attr("text-anchor","middle"),A.attr("d","M"+x[0]+","+e+"V0H"+x[1]+"V"+e);break;case"top":w=dW,p.attr("y2",-d),r.attr("x2",0).attr("y2",-d),D.attr("y2",-c),G.attr("y",-(Math.max(c,0)+f)),E.attr("x2",0).attr("y2",-c),H.attr("x",0).attr("y",-(Math.max(c,0)+f)),F.attr("dy","0em").attr("text-anchor","middle"),A.attr("d","M"+x[0]+","+ -e+"V0H"+x[1]+"V"+ -e);break;case"left":w=dX,p.attr("x2",-d),r.attr("x2",-d).attr("y2",0),D.attr("x2",-c),G.attr("x",-(Math.max(c,0)+f)),E.attr("x2",-c).attr("y2",0),H.attr("x",-(Math.max(c,0)+f)).attr("y",0),F.attr("dy",".32em").attr("text-anchor","end"),A.attr("d","M"+ -e+","+x[0]+"H0V"+x[1]+"H"+ -e);break;case"right":w=dX,p.attr("x2",d),r.attr("x2",d).attr("y2",0),D.attr("x2",c),G.attr("x",Math.max(c,0)+f),E.attr("x2",c).attr("y2",0),H.attr("x",Math.max(c,0)+f).attr("y",0),F.attr("dy",".32em").attr("text-anchor","start"),A.attr("d","M"+e+","+x[0]+"H0V"+x[1]+"H"+e)}if(a.ticks)t.call(w,C),v.call(w,B),u.call(w,B),p.call(w,C),r.call(w,B),q.call(w,B);else{var I=B.rangeBand()/2,J=function(a){return B(a)+I};t.call(w,J),v.call(w,J)}})}var a=d3.scale.linear(),b="bottom",c=6,d=6,e=6,f=3,g=[10],h=null,i,j=0;return k.scale=function(b){return arguments.length?(a=b,k):a},k.orient=function(a){return arguments.length?(b=a,k):b},k.ticks=function(){return arguments.length?(g=arguments,k):g},k.tickValues=function(a){return arguments.length?(h=a,k):h},k.tickFormat=function(a){return arguments.length?(i=a,k):i},k.tickSize=function(a,b,f){if(!arguments.length)return c;var g=arguments.length-1;return c=+a,d=g>1?+b:c,e=g>0?+arguments[g]:c,k},k.tickPadding=function(a){return arguments.length?(f=+a,k):f},k.tickSubdivide=function(a){return arguments.length?(j=+a,k):j},k},d3.svg.brush=function(){function g(a){a.each(function(){var a=d3.select(this),e=a.selectAll(".background").data([0]),f=a.selectAll(".extent").data([0]),l=a.selectAll(".resize").data(d,String),m;a.style("pointer-events","all").on("mousedown.brush",k).on("touchstart.brush",k),e.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.enter().append("rect").attr("class","extent").style("cursor","move"),l.enter().append("g").attr("class",function(a){return"resize "+a}).style("cursor",function(a){return dZ[a]}).append("rect").attr("x",function(a){return/[ew]$/.test(a)?-3:null}).attr("y",function(a){return/^[ns]/.test(a)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),l.style("display",g.empty()?"none":null),l.exit().remove(),b&&(m=cC(b),e.attr("x",m[0]).attr("width",m[1]-m[0]),i(a)),c&&(m=cC(c),e.attr("y",m[0]).attr("height",m[1]-m[0]),j(a)),h(a)})}function h(a){a.selectAll(".resize").attr("transform",function(a){return"translate("+e[+/e$/.test(a)][0]+","+e[+/^s/.test(a)][1]+")"})}function i(a){a.select(".extent").attr("x",e[0][0]),a.selectAll(".extent,.n>rect,.s>rect").attr("width",e[1][0]-e[0][0])}function j(a){a.select(".extent").attr("y",e[0][1]),a.selectAll(".extent,.e>rect,.w>rect").attr("height",e[1][1]-e[0][1])}function k(){function x(){var a=d3.event.changedTouches;return a?d3.touches(d,a)[0]:d3.mouse(d)}function y(){d3.event.keyCode==32&&(q||(r=null,s[0]-=e[1][0],s[1]-=e[1][1],q=2),Y())}function z(){d3.event.keyCode==32&&q==2&&(s[0]+=e[1][0],s[1]+=e[1][1],q=0,Y())}function A(){var a=x(),d=!1;t&&(a[0]+=t[0],a[1]+=t[1]),q||(d3.event.altKey?(r||(r=[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]),s[0]=e[+(a[0]0?e=c:e=0:c>0&&(b.start({type:"start",alpha:e=c}),d3.timer(a.tick)),a):e},a.start=function(){function p(a,c){var d=t(b),e=-1,f=d.length,g;while(++ee&&(e=h),d.push(h)}for(g=0;g0){f=-1;while(++f=i[0]&&o<=i[1]&&(k=g[d3.bisect(j,o,1,m)-1],k.y+=n,k.push(e[f]))}return g}var a=!0,b=Number,c=eB,d=ez;return e.value=function(a){return arguments.length?(b=a,e):b},e.range=function(a){return arguments.length?(c=p(a),e):c},e.bins=function(a){return arguments.length?(d=typeof a=="number"?function(b){return eA(b,a)}:p(a),e):d},e.frequency=function(b){return arguments.length?(a=!!b,e):a},e},d3.layout.hierarchy=function(){function d(e,g,h){var i=b.call(f,e,g),j=eH?e:{data:e};j.depth=g,h.push(j);if(i&&(l=i.length)){var k=-1,l,m=j.children=[],n=0,o=g+1,p;while(++k0){var k=b*j/2;fa(g,function(a){a.r+=k}),fa(g,eM),fa(g,function(a){a.r-=k}),j=Math.max(2*g.r/h,2*g.r/i)}return eP(g,h/2,i/2,1/j),f}var a=d3.layout.hierarchy().sort(eI),b=0,c=[1,1];return d.size=function(a){return arguments.length?(c=a,d):c},d.padding=function(a){return arguments.length?(b=+a,d):b},eC(d,a)},d3.layout.cluster=function(){function d(d,e){var f=a.call(this,d,e),g=f[0],h,i=0,j,k;fa(g,function(a){var c=a.children;c&&c.length?(a.x=eS(c),a.y=eR(c)):(a.x=h?i+=b(a,h):0,a.y=0,h=a)});var l=eT(g),m=eU(g),n=l.x-b(l,m)/2,o=m.x+b(m,l)/2;return fa(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=(1-(g.y?a.y/g.y:1))*c[1]}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=eV,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},eC(d,a)},d3.layout.tree=function(){function d(d,e){function h(a,c){var d=a.children,e=a._tree;if(d&&(f=d.length)){var f,g=d[0],i,k=g,l,m=-1;while(++m0&&(fc(fd(g,a,d),a,m),i+=m,j+=m),k+=g._tree.mod,i+=e._tree.mod,l+=h._tree.mod,j+=f._tree.mod;g&&!eX(f)&&(f._tree.thread=g,f._tree.mod+=k-j),e&&!eW(h)&&(h._tree.thread=e,h._tree.mod+=i-l,d=a)}return d}var f=a.call(this,d,e),g=f[0];fa(g,function(a,b){a._tree={ancestor:a,prelim:0,mod:0,change:0,shift:0,number:b?b._tree.number+1:0}}),h(g),i(g,-g._tree.prelim);var k=eY(g,e$),l=eY(g,eZ),m=eY(g,e_),n=k.x-b(k,l)/2,o=l.x+b(l,k)/2,p=m.depth||1;return fa(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=a.depth/p*c[1],delete a._tree}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=eV,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},eC(d,a)},d3.layout.treemap=function(){function i(a,b){var c=-1,d=a.length,e,f;while(++c0)d.push(g=f[o-1]),d.area+=g.area,(k=l(d,n))<=h?(f.pop(),h=k):(d.area-=d.pop().area,m(d,n,c,!1),n=Math.min(c.dx,c.dy),d.length=d.area=0,h=Infinity);d.length&&(m(d,n,c,!0),d.length=d.area=0),b.forEach(j)}}function k(a){var b=a.children;if(b&&b.length){var c=e(a),d=b.slice(),f,g=[];i(d,c.dx*c.dy/a.value),g.area=0;while(f=d.pop())g.push(f),g.area+=f.area,f.z!=null&&(m(g,f.z?c.dx:c.dy,c,!d.length),g.length=g.area=0);b.forEach(k)}}function l(a,b){var c=a.area,d,e=0,f=Infinity,g=-1,i=a.length;while(++ge&&(e=d)}return c*=c,b*=b,c?Math.max(b*e*h/c,c/(b*f*h)):Infinity}function m(a,c,d,e){var f=-1,g=a.length,h=d.x,i=d.y,j=c?b(a.area/c):0,k;if(c==d.dx){if(e||j>d.dy)j=d.dy;while(++fd.dx)j=d.dx;while(++f50?b:f<-140?c:g<21?d:a)(e)}var a=d3.geo.albers(),b=d3.geo.albers().origin([-160,60]).parallels([55,65]),c=d3.geo.albers().origin([-160,20]).parallels([8,18]),d=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(f){return arguments.length?(a.scale(f),b.scale(f*.6),c.scale(f),d.scale(f*1.5),e.translate(a.translate())):a.scale()},e.translate=function(f){if(!arguments.length)return a.translate();var g=a.scale()/1e3,h=f[0],i=f[1];return a.translate(f),b.translate([h-400*g,i+170*g]),c.translate([h-190*g,i+200*g]),d.translate([h+580*g,i+430*g]),e},e.scale(a.scale())},d3.geo.bonne=function(){function g(g){var h=g[0]*fh-c,i=g[1]*fh-d;if(e){var j=f+e-i,k=h*Math.cos(i)/j;h=j*Math.sin(k),i=j*Math.cos(k)-f}else h*=Math.cos(i),i*=-1;return[a*h+b[0],a*i+b[1]]}var a=200,b=[480,250],c,d,e,f;return g.invert=function(d){var g=(d[0]-b[0])/a,h=(d[1]-b[1])/a;if(e){var i=f+h,j=Math.sqrt(g*g+i*i);h=f+e-j,g=c+j*Math.atan2(g,i)/Math.cos(h)}else h*=-1,g/=Math.cos(h);return[g/fh,h/fh]},g.parallel=function(a){return arguments.length?(f=1/ -Math.tan(e=a*fh),g):e/fh},g.origin=function(a){return arguments.length?(c=a[0]*fh,d=a[1]*fh,g):[c/fh,d/fh]},g.scale=function(b){return arguments.length?(a=+b,g):a},g.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],g):b},g.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function c(c){var d=c[0]/360,e=-c[1]/360;return[a*d+b[0],a*e+b[1]]}var a=500,b=[480,250];return c.invert=function(c){var d=(c[0]-b[0])/a,e=(c[1]-b[1])/a;return[360*d,-360*e]},c.scale=function(b){return arguments.length?(a=+b,c):a},c.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],c):b},c},d3.geo.mercator=function(){function c(c){var d=c[0]/360,e=-(Math.log(Math.tan(Math.PI/4+c[1]*fh/2))/fh)/360;return[a*d+b[0],a*Math.max(-0.5,Math.min(.5,e))+b[1]]}var a=500,b=[480,250];return c.invert=function(c){var d=(c[0]-b[0])/a,e=(c[1]-b[1])/a;return[360*d,2*Math.atan(Math.exp(-360*e*fh))/fh-90]},c.scale=function(b){return arguments.length?(a=+b,c):a},c.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],c):b},c},d3.geo.path=function(){function e(c,e){typeof a=="function"&&(b=fj(a.apply(this,arguments))),g(c);var f=d.length?d.join(""):null;return d=[],f}function f(a){return c(a).join(",")}function i(a){var b=l(a[0]),c=0,d=a.length;while(++c0){d.push("M");while(++h0){d.push("M");while(++kd&&(d=a),fe&&(e=f)}),[[b,c],[d,e]]};var fl={Feature:fm,FeatureCollection:fn,GeometryCollection:fo,LineString:fp,MultiLineString:fq,MultiPoint:fp,MultiPolygon:fr,Point:fs,Polygon:ft};d3.geo.circle=function(){function e(){}function f(a){return d.distance(a)=k*k+l*l?d[f].index=-1:(d[m].index=-1,o=d[f].angle,m=f,n=g)):(o=d[f].angle,m=f,n=g);e.push(h);for(f=0,g=0;f<2;++g)d[g].index!==-1&&(e.push(d[g].index),f++);p=e.length;for(;g=0?(c=a.ep.r,d=a.ep.l):(c=a.ep.l,d=a.ep.r),a.a===1?(g=c?c.y:-1e6,e=a.c-a.b*g,h=d?d.y:1e6,f=a.c-a.b*h):(e=c?c.x:-1e6,g=a.c-a.a*e,f=d?d.x:1e6,h=a.c-a.a*f);var i=[e,g],j=[f,h];b[a.region.l.index].push(i,j),b[a.region.r.index].push(i,j)}),b.map(function(b,c){var d=a[c][0],e=a[c][1];return b.forEach(function(a){a.angle=Math.atan2(a[0]-d,a[1]-e)}),b.sort(function(a,b){return a.angle-b.angle}).filter(function(a,c){return!c||a.angle-b[c-1].angle>1e-10})})};var fE={l:"r",r:"l"};d3.geom.delaunay=function(a){var b=a.map(function(){return[]}),c=[];return fF(a,function(c){b[c.region.l.index].push(a[c.region.r.index])}),b.forEach(function(b,d){var e=a[d],f=e[0],g=e[1];b.forEach(function(a){a.angle=Math.atan2(a[0]-f,a[1]-g)}),b.sort(function(a,b){return a.angle-b.angle});for(var h=0,i=b.length-1;h=g,j=b.y>=h,l=(j<<1)+i;a.leaf=!1,a=a.nodes[l]||(a.nodes[l]=fG()),i?c=g:e=g,j?d=h:f=h,k(a,b,c,d,e,f)}var f,g=-1,h=a.length;h&&isNaN(a[0].x)&&(a=a.map(fI));if(arguments.length<5)if(arguments.length===3)e=d=c,c=b;else{b=c=Infinity,d=e=-Infinity;while(++gd&&(d=f.x),f.y>e&&(e=f.y);var i=d-b,j=e-c;i>j?e=c+i:d=b+j}var m=fG();return m.add=function(a){k(m,a,b,c,d,e)},m.visit=function(a){fH(a,m,b,c,d,e)},a.forEach(m.add),m},d3.time={};var fJ=Date,fK=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];fL.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){fM.setUTCDate.apply(this._,arguments)},setDay:function(){fM.setUTCDay.apply(this._,arguments)},setFullYear:function(){fM.setUTCFullYear.apply(this._,arguments)},setHours:function(){fM.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){fM.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){fM.setUTCMinutes.apply(this._,arguments)},setMonth:function(){fM.setUTCMonth.apply(this._,arguments)},setSeconds:function(){fM.setUTCSeconds.apply(this._,arguments)},setTime:function(){fM.setTime.apply(this._,arguments)}};var fM=Date.prototype,fN="%a %b %e %H:%M:%S %Y",fO="%m/%d/%y",fP="%H:%M:%S",fQ=fK,fR=fQ.map(fU),fS=["January","February","March","April","May","June","July","August","September","October","November","December"],fT=fS.map(fU);d3.time.format=function(a){function c(c){var d=[],e=-1,f=0,g,h;while(++e=12?"PM":"AM"},S:function(a){return fY(a.getSeconds())},U:function(a){return fY(d3.time.sundayOfYear(a))},w:function(a){return a.getDay()},W:function(a){return fY(d3.time.mondayOfYear(a))},x:d3.time.format(fO),X:d3.time.format(fP),y:function(a){return fY(a.getFullYear()%100)},Y:function(a){return f$(a.getFullYear()%1e4)},Z:gB,"%":function(a){return"%"}},gh={a:gi,A:gj,b:gk,B:gl,c:gm,d:gt,e:gt,H:gu,I:gu,L:gx,m:gs,M:gv,p:gz,S:gw,x:gn,X:go,y:gq,Y:gp},gy=/^\s*\d+/,gA=d3.map({am:0,pm:1});d3.time.format.utc=function(a){function c(a){try{fJ=fL;var c=new fJ;return c._=a,b(c)}finally{fJ=Date}}var b=d3.time.format(a);return c.parse=function(a){try{fJ=fL;var c=b.parse(a);return c&&c._}finally{fJ=Date}},c.toString=b.toString,c};var gC=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?gD:gC,gD.parse=function(a){var b=new Date(a);return isNaN(b)?null:b},gD.toString=gC.toString,d3.time.second=gE(function(a){return new fJ(Math.floor(a/1e3)*1e3)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*1e3)},function(a){return a.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=gE(function(a){return new fJ(Math.floor(a/6e4)*6e4)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*6e4)},function(a){return a.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=gE(function(a){var b=a.getTimezoneOffset()/60;return new fJ((Math.floor(a/36e5-b)+b)*36e5)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*36e5)},function(a){return a.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=gE(function(a){var b=new fJ(0,a.getMonth(),a.getDate());return b.setFullYear(a.getFullYear()),b},function(a,b){a.setDate(a.getDate()+b)},function(a){return a.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(a){var b=d3.time.year(a);return Math.floor((a-b-(a.getTimezoneOffset()-b.getTimezoneOffset())*6e4)/864e5)},fK.forEach(function(a,b){a=a.toLowerCase(),b=7-b;var c=d3.time[a]=gE(function(a){return(a=d3.time.day(a)).setDate(a.getDate()-(a.getDay()+b)%7),a},function(a,b){a.setDate(a.getDate()+Math.floor(b)*7)},function(a){var c=d3.time.year(a).getDay();return Math.floor((d3.time.dayOfYear(a)+(c+b)%7)/7)-(c!==b)});d3.time[a+"s"]=c.range,d3.time[a+"s"].utc=c.utc.range,d3.time[a+"OfYear"]=function(a){var c=d3.time.year(a).getDay();return Math.floor((d3.time.dayOfYear(a)+(c+b)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=gE(function(a){return a=d3.time.day(a),a.setDate(1),a},function(a,b){a.setMonth(a.getMonth()+b)},function(a){return a.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=gE(function(a){return a=d3.time.day(a),a.setMonth(0,1),a},function(a,b){a.setFullYear(a.getFullYear()+b)},function(a){return a.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var gM=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],gN=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],gO=[[d3.time.format("%Y"),function(a){return!0}],[d3.time.format("%B"),function(a){return a.getMonth()}],[d3.time.format("%b %d"),function(a){return a.getDate()!=1}],[d3.time.format("%a %d"),function(a){return a.getDay()&&a.getDate()!=1}],[d3.time.format("%I %p"),function(a){return a.getHours()}],[d3.time.format("%I:%M"),function(a){return a.getMinutes()}],[d3.time.format(":%S"),function(a){return a.getSeconds()}],[d3.time.format(".%L"),function(a){return a.getMilliseconds()}]],gP=d3.scale.linear(),gQ=gJ(gO);gN.year=function(a,b){return gP.domain(a.map(gL)).ticks(b).map(gK)},d3.time.scale=function(){return gG(d3.scale.linear(),gN,gQ)};var gR=gN.map(function(a){return[a[0].utc,a[1]]}),gS=[[d3.time.format.utc("%Y"),function(a){return!0}],[d3.time.format.utc("%B"),function(a){return a.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(a){return a.getUTCDate()!=1}],[d3.time.format.utc("%a %d"),function(a){return a.getUTCDay()&&a.getUTCDate()!=1}],[d3.time.format.utc("%I %p"),function(a){return a.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(a){return a.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(a){return a.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(a){return a.getUTCMilliseconds()}]],gT=gJ(gS);gR.year=function(a,b){return gP.domain(a.map(gV)).ticks(b).map(gU)},d3.time.scale.utc=function(){return gG(d3.scale.linear(),gR,gT)}})(); diff --git a/pydashie/assets/javascripts/dashing.coffee b/pydashie/assets/javascripts/dashing.coffee deleted file mode 100644 index ae4fee6..0000000 --- a/pydashie/assets/javascripts/dashing.coffee +++ /dev/null @@ -1,111 +0,0 @@ -#= require jquery -#= require es5-shim -#= require batman -#= require batman.jquery - - -#Batman.Filters.prettyNumber = (num) -> -# num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") unless isNaN(num) -# -#Batman.Filters.dashize = (str) -> -# dashes_rx1 = /([A-Z]+)([A-Z][a-z])/g; -# dashes_rx2 = /([a-z\d])([A-Z])/g; -# -# return str.replace(dashes_rx1, '$1_$2').replace(dashes_rx2, '$1_$2').replace('_', '-').toLowerCase() -# -#Batman.Filters.shortenedNumber = (num) -> -# return num if isNaN(num) -# if num >= 1000000000 -# (num / 1000000000).toFixed(1) + 'B' -# else if num >= 1000000 -# (num / 1000000).toFixed(1) + 'M' -# else if num >= 1000 -# (num / 1000).toFixed(1) + 'K' -# else -# num - -#class window.Dashing extends Batman.App -# @root -> -#Dashing.params = Batman.URI.paramsFromQuery(window.location.search.slice(1)); -# -#class Dashing.Widget extends Batman.View -# constructor: -> -# # Set the view path -# @constructor::source = Batman.Filters.underscore(@constructor.name) -# super -# -# @mixin($(@node).data()) -# Dashing.widgets[@id] ||= [] -# Dashing.widgets[@id].push(@) -# @mixin(Dashing.lastEvents[@id]) # in case the events from the server came before the widget was rendered -# -# type = Batman.Filters.dashize(@view) -# $(@node).addClass("widget widget-#{type} #{@id}") -# -# @accessor 'updatedAtMessage', -> -# if updatedAt = @get('updatedAt') -# timestamp = updatedAt.toString().match(/\d*:\d*/)[0] -# "Last updated at #{timestamp}" -# -# @::on 'ready', -> -# Dashing.Widget.fire 'ready' -# -# receiveData: (data) => -# @mixin(data) -# @onData(data) -# -# onData: (data) => -# # Widgets override this to handle incoming data -# - -Dashing.AnimatedValue = - get: Batman.Property.defaultAccessor.get - set: (k, to) -> - if !to? || isNaN(to) - @[k] = to - else - timer = "interval_#{k}" - num = if (!isNaN(@[k]) && @[k]?) then @[k] else 0 - unless @[timer] || num == to - to = parseFloat(to) - num = parseFloat(num) - up = to > num - num_interval = Math.abs(num - to) / 90 - @[timer] = - setInterval => - num = if up then Math.ceil(num+num_interval) else Math.floor(num-num_interval) - if (up && num > to) || (!up && num < to) - num = to - clearInterval(@[timer]) - @[timer] = null - delete @[timer] - @[k] = num - @set k, to - , 10 - @[k] = num - -Dashing.widgets = widgets = {} -Dashing.lastEvents = lastEvents = {} -Dashing.debugMode = false - -source = new EventSource('/events') -source.addEventListener 'open', (e) -> - console.log("Connection opened") - -source.addEventListener 'error', (e)-> - console.log("Connection error") - if (e.readyState == EventSource.CLOSED) - console.log("Connection closed") - -source.addEventListener 'message', (e) => - data = JSON.parse(e.data) - if Dashing.debugMode - console.log("Received data for #{data.id}", data) - lastEvents[data.id] = data - if widgets[data.id]?.length > 0 - for widget in widgets[data.id] - widget.receiveData(data) - - -$(document).ready -> - Dashing.run() diff --git a/pydashie/assets/javascripts/dashing.gridster.coffee b/pydashie/assets/javascripts/dashing.gridster.coffee deleted file mode 100644 index fd782ad..0000000 --- a/pydashie/assets/javascripts/dashing.gridster.coffee +++ /dev/null @@ -1,25 +0,0 @@ -#= require_directory ./gridster - -# This file enables gridster integration (http://gridster.net/) -# Delete it if you'd rather handle the layout yourself. -# You'll miss out on a lot if you do, but we won't hold it against you. - -Dashing.gridsterLayout = (positions) -> - Dashing.customGridsterLayout = true - positions = positions.replace(/^"|"$/g, '') - positions = $.parseJSON(positions) - widgets = $("[data-row^=]") - for widget, index in widgets - $(widget).attr('data-row', positions[index].row) - $(widget).attr('data-col', positions[index].col) - -Dashing.showGridsterInstructions = -> - data = $(".gridster ul:first").gridster().data('gridster').serialize(); - $('#save-gridster').slideDown(); - return $('#gridster-code').text(" ") - -$ -> - $('#save-gridster').leanModal() - - $('#save-gridster').click -> - $('#save-gridster').slideUp() diff --git a/pydashie/assets/javascripts/es5-shim.js b/pydashie/assets/javascripts/es5-shim.js deleted file mode 100644 index ce79780..0000000 --- a/pydashie/assets/javascripts/es5-shim.js +++ /dev/null @@ -1,1021 +0,0 @@ -// vim: ts=4 sts=4 sw=4 expandtab -// -- kriskowal Kris Kowal Copyright (C) 2009-2011 MIT License -// -- tlrobinson Tom Robinson Copyright (C) 2009-2010 MIT License (Narwhal Project) -// -- dantman Daniel Friesen Copyright (C) 2010 XXX TODO License or CLA -// -- fschaefer Florian Schäfer Copyright (C) 2010 MIT License -// -- Gozala Irakli Gozalishvili Copyright (C) 2010 MIT License -// -- kitcambridge Kit Cambridge Copyright (C) 2011 MIT License -// -- kossnocorp Sasha Koss XXX TODO License or CLA -// -- bryanforbes Bryan Forbes XXX TODO License or CLA -// -- killdream Quildreen Motta Copyright (C) 2011 MIT Licence -// -- michaelficarra Michael Ficarra Copyright (C) 2011 3-clause BSD License -// -- sharkbrainguy Gerard Paapu Copyright (C) 2011 MIT License -// -- bbqsrc Brendan Molloy XXX TODO License or CLA -// -- iwyg XXX TODO License or CLA -// -- DomenicDenicola Domenic Denicola XXX TODO License or CLA -// -- xavierm02 Montillet Xavier XXX TODO License or CLA -// -- Raynos Raynos XXX TODO License or CLA -// -- samsonjs Sami Samhuri XXX TODO License or CLA -// -- rwldrn Rick Waldron Copyright (C) 2011 MIT License -// -- lexer Alexey Zakharov XXX TODO License or CLA - -/*! - Copyright (c) 2009, 280 North Inc. http://280north.com/ - MIT License. http://github.com/280north/narwhal/blob/master/README.md -*/ - -// Module systems magic dance -(function (definition) { - // RequireJS - if (typeof define == "function") { - define(definition); - // CommonJS and - - - - - - - -
-
-
    -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
-
- - diff --git a/pydashie/templates/small.html b/pydashie/templates/small.html deleted file mode 100644 index 911efa7..0000000 --- a/pydashie/templates/small.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - {{title}} - - - - - - - - - - -
-
-
    -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • - -
  • -
    -
  • -
-
- - diff --git a/pydashie/widgets/clock/clock.coffee b/pydashie/widgets/clock/clock.coffee deleted file mode 100644 index ae71db5..0000000 --- a/pydashie/widgets/clock/clock.coffee +++ /dev/null @@ -1,18 +0,0 @@ -class Dashing.Clock extends Dashing.Widget - - ready: -> - setInterval(@startTime, 500) - - startTime: => - today = new Date() - - h = (today.getHours() % 13) + 1 - m = today.getMinutes() - s = today.getSeconds() - m = @formatTime(m) - s = @formatTime(s) - @set('time', h + ":" + m + ":" + s) - @set('date', today.toDateString()) - - formatTime: (i) -> - if i < 10 then "0" + i else i diff --git a/pydashie/widgets/clock/clock.html b/pydashie/widgets/clock/clock.html deleted file mode 100644 index df3aac2..0000000 --- a/pydashie/widgets/clock/clock.html +++ /dev/null @@ -1,2 +0,0 @@ -

-

diff --git a/pydashie/widgets/clock/clock.scss b/pydashie/widgets/clock/clock.scss deleted file mode 100644 index d507ad0..0000000 --- a/pydashie/widgets/clock/clock.scss +++ /dev/null @@ -1,13 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #666666; - -// ---------------------------------------------------------------------------- -// Widget-clock styles -// ---------------------------------------------------------------------------- -.widget-clock { - - background-color: $background-color; - -} diff --git a/pydashie/widgets/comments/comments.coffee b/pydashie/widgets/comments/comments.coffee deleted file mode 100644 index 1e81b56..0000000 --- a/pydashie/widgets/comments/comments.coffee +++ /dev/null @@ -1,24 +0,0 @@ -class Dashing.Comments extends Dashing.Widget - - @accessor 'quote', -> - "“#{@get('current_comment')?.body}”" - - ready: -> - @currentIndex = 0 - @commentElem = $(@node).find('.comment-container') - @nextComment() - @startCarousel() - - onData: (data) -> - @currentIndex = 0 - - startCarousel: -> - setInterval(@nextComment, 8000) - - nextComment: => - comments = @get('comments') - if comments - @commentElem.fadeOut => - @currentIndex = (@currentIndex + 1) % comments.length - @set 'current_comment', comments[@currentIndex] - @commentElem.fadeIn() \ No newline at end of file diff --git a/pydashie/widgets/comments/comments.html b/pydashie/widgets/comments/comments.html deleted file mode 100644 index 844800f..0000000 --- a/pydashie/widgets/comments/comments.html +++ /dev/null @@ -1,7 +0,0 @@ -

-
-

-

-
- -

\ No newline at end of file diff --git a/pydashie/widgets/comments/comments.scss b/pydashie/widgets/comments/comments.scss deleted file mode 100644 index 40e2a6b..0000000 --- a/pydashie/widgets/comments/comments.scss +++ /dev/null @@ -1,33 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #eb9c3c; - -$title-color: rgba(255, 255, 255, 0.7); -$moreinfo-color: rgba(255, 255, 255, 0.7); - -// ---------------------------------------------------------------------------- -// Widget-comment styles -// ---------------------------------------------------------------------------- -.widget-comments { - - background-color: $background-color; - - .title { - color: $title-color; - margin-bottom: 15px; - } - - .name { - padding-left: 5px; - } - - .comment-container { - display: none; - } - - .more-info { - color: $moreinfo-color; - } - -} \ No newline at end of file diff --git a/pydashie/widgets/hotness/attribution b/pydashie/widgets/hotness/attribution deleted file mode 100644 index 935d282..0000000 --- a/pydashie/widgets/hotness/attribution +++ /dev/null @@ -1,6 +0,0 @@ -Direct port of the Hotness Widget from Shopify's Dashie Widget Challenge to pydashie - -All attribution to Dashboard Dude - - - https://gist.github.com/rowanu/6246149 - http://dashboarddude.com/blog/2013/08/16/dashing-dashboard-widget-challenge-the-hotness/ diff --git a/pydashie/widgets/hotness/hotness.coffee b/pydashie/widgets/hotness/hotness.coffee deleted file mode 100644 index 58d491e..0000000 --- a/pydashie/widgets/hotness/hotness.coffee +++ /dev/null @@ -1,26 +0,0 @@ -class Dashing.Hotness extends Dashing.Widget - - @accessor 'value', Dashing.AnimatedValue - - constructor: -> - super - - onData: (data) -> - node = $(@node) - value = parseInt data.value - cool = parseInt node.data "cool" - warm = parseInt node.data "warm" - - level = switch - when value <= cool then 0 - when value >= warm then 4 - else - bucketSize = (warm - cool) / 3 # Total # of colours in middle - Math.ceil (value - cool) / bucketSize - - backgroundClass = "hotness#{level}" - - lastClass = @get "lastClass" - - node.toggleClass "#{lastClass} #{backgroundClass}" - @set "lastClass", backgroundClass \ No newline at end of file diff --git a/pydashie/widgets/hotness/hotness.html b/pydashie/widgets/hotness/hotness.html deleted file mode 100644 index 37576f2..0000000 --- a/pydashie/widgets/hotness/hotness.html +++ /dev/null @@ -1,5 +0,0 @@ -

- -

- -

\ No newline at end of file diff --git a/pydashie/widgets/hotness/hotness.scss b/pydashie/widgets/hotness/hotness.scss deleted file mode 100644 index 6812451..0000000 --- a/pydashie/widgets/hotness/hotness.scss +++ /dev/null @@ -1,59 +0,0 @@ -//----------------------------------------------------------------------------- -// Direct port of the Hotness Widget from Shopify's Dashie Widget Challenge to pydashie -// All attribution to Dashboard Dude - -// https://gist.github.com/rowanu/6246149 -// http://dashboarddude.com/blog/2013/08/16/dashing-dashboard-widget-challenge-the-hotness/ -//----------------------------------------------------------------------------- - -// ---------------------------------------------------------------------------- -// Mixins -// ---------------------------------------------------------------------------- -@mixin transition($transition-property, $transition-time, $method) { - -webkit-transition: $transition-property $transition-time $method; - -moz-transition: $transition-property $transition-time $method; - -o-transition: $transition-property $transition-time $method; - transition: $transition-property $transition-time $method; -} - -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #000000; -$value-color: #FFFFFF; -$title-color: rgba(255, 255, 255, 0.7); -$updated-at-color: rgba(0, 0, 0, 0.3); - -// ---------------------------------------------------------------------------- -// Widget-hotness styles -// ---------------------------------------------------------------------------- -.widget-hotness { - - background-color: $background-color; - @include transition(background-color, 1s, linear); - - .title { - color: $title-color; - } - - .value { - color: $value-color; - } - - .updated-at { - color: $updated-at-color; - } - -} - -.hotness0 { background-color: #00C176; } -.hotness1 { background-color: #88C100; } -.hotness2 { background-color: #FABE28; } -.hotness3 { background-color: #FF8A00; } -.hotness4 { background-color: #FF003C; } - -// // More colour-blind friendly palette -// .hotness0 { background-color: #046D8B; } -// .hotness1 { background-color: #309292; } -// .hotness2 { background-color: #2FB8AC; } -// .hotness3 { background-color: #93A42A; } -// .hotness4 { background-color: #ECBE13; } \ No newline at end of file diff --git a/pydashie/widgets/iframe/iframe.coffee b/pydashie/widgets/iframe/iframe.coffee deleted file mode 100644 index 4d4ca9a..0000000 --- a/pydashie/widgets/iframe/iframe.coffee +++ /dev/null @@ -1,9 +0,0 @@ -class Dashing.Iframe extends Dashing.Widget - - ready: -> - # This is fired when the widget is done being rendered - - onData: (data) -> - # Handle incoming data - # You can access the html node of this widget with `@node` - # Example: $(@node).fadeOut().fadeIn() will make the node flash each time data comes in. \ No newline at end of file diff --git a/pydashie/widgets/iframe/iframe.html b/pydashie/widgets/iframe/iframe.html deleted file mode 100644 index bfccba4..0000000 --- a/pydashie/widgets/iframe/iframe.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pydashie/widgets/iframe/iframe.scss b/pydashie/widgets/iframe/iframe.scss deleted file mode 100644 index 7c757bf..0000000 --- a/pydashie/widgets/iframe/iframe.scss +++ /dev/null @@ -1,8 +0,0 @@ -.widget-iframe { - padding: 3px 0px 0px 0px !important; - - iframe { - width: 100%; - height: 100%; - } -} \ No newline at end of file diff --git a/pydashie/widgets/image/image.coffee b/pydashie/widgets/image/image.coffee deleted file mode 100644 index 418e385..0000000 --- a/pydashie/widgets/image/image.coffee +++ /dev/null @@ -1,9 +0,0 @@ -class Dashing.Image extends Dashing.Widget - - ready: -> - # This is fired when the widget is done being rendered - - onData: (data) -> - # Handle incoming data - # You can access the html node of this widget with `@node` - # Example: $(@node).fadeOut().fadeIn() will make the node flash each time data comes in. \ No newline at end of file diff --git a/pydashie/widgets/image/image.html b/pydashie/widgets/image/image.html deleted file mode 100644 index cf2b228..0000000 --- a/pydashie/widgets/image/image.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pydashie/widgets/image/image.scss b/pydashie/widgets/image/image.scss deleted file mode 100644 index d7e1e1c..0000000 --- a/pydashie/widgets/image/image.scss +++ /dev/null @@ -1,13 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #FFFFFF; - -// ---------------------------------------------------------------------------- -// Widget-image styles -// ---------------------------------------------------------------------------- -.widget-image { - - background-color: $background-color; - -} diff --git a/pydashie/widgets/list/list.coffee b/pydashie/widgets/list/list.coffee deleted file mode 100644 index 3cbf7a1..0000000 --- a/pydashie/widgets/list/list.coffee +++ /dev/null @@ -1,6 +0,0 @@ -class Dashing.List extends Dashing.Widget - ready: -> - if @get('unordered') - $(@node).find('ol').remove() - else - $(@node).find('ul').remove() \ No newline at end of file diff --git a/pydashie/widgets/list/list.html b/pydashie/widgets/list/list.html deleted file mode 100644 index 07e0471..0000000 --- a/pydashie/widgets/list/list.html +++ /dev/null @@ -1,18 +0,0 @@ -

- -
    -
  1. - - -
  2. -
- -
    -
  • - - -
  • -
- -

-

diff --git a/pydashie/widgets/list/list.scss b/pydashie/widgets/list/list.scss deleted file mode 100644 index 1342099..0000000 --- a/pydashie/widgets/list/list.scss +++ /dev/null @@ -1,61 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #118E9E; -$value-color: #fff; - -$title-color: rgba(255, 255, 255, 1); -$label-color: rgba(255, 255, 255, 1); -$moreinfo-color: rgba(255, 255, 255, 1); - -// ---------------------------------------------------------------------------- -// Widget-list styles -// ---------------------------------------------------------------------------- -.widget-list { - - background-color: $background-color; - vertical-align: top; - - .title { - color: $title-color; - } - - ol, ul { - margin: 0 15px; - text-align: left; - color: $label-color; - } - - ol { - list-style-position: inside; - } - - li { - margin-bottom: 5px; - } - - .list-nostyle { - list-style: none; - } - - .label { - color: $label-color; - } - - .value { - float: right; - margin-left: 12px; - font-weight: 600; - color: $value-color; - } - - .updated-at { - color: rgba(0, 0, 0, 0.6); - font-size: 0.8em; - } - - .more-info { - color: $moreinfo-color; - } - -} \ No newline at end of file diff --git a/pydashie/widgets/meter/meter.coffee b/pydashie/widgets/meter/meter.coffee deleted file mode 100644 index b823ec7..0000000 --- a/pydashie/widgets/meter/meter.coffee +++ /dev/null @@ -1,14 +0,0 @@ -class Dashing.Meter extends Dashing.Widget - - @accessor 'value', Dashing.AnimatedValue - - constructor: -> - super - @observe 'value', (value) -> - $(@node).find(".meter").val(value).trigger('change') - - ready: -> - meter = $(@node).find(".meter") - meter.attr("data-bgcolor", meter.css("background-color")) - meter.attr("data-fgcolor", meter.css("color")) - meter.knob() diff --git a/pydashie/widgets/meter/meter.html b/pydashie/widgets/meter/meter.html deleted file mode 100644 index 7d51b15..0000000 --- a/pydashie/widgets/meter/meter.html +++ /dev/null @@ -1,7 +0,0 @@ -

- - - -

- -

\ No newline at end of file diff --git a/pydashie/widgets/meter/meter.scss b/pydashie/widgets/meter/meter.scss deleted file mode 100644 index 47e0336..0000000 --- a/pydashie/widgets/meter/meter.scss +++ /dev/null @@ -1,37 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #5B7F97; - -$title-color: rgb(255, 255, 255); -$moreinfo-color: rgb(255, 255, 255); - -$meter-background: darken($background-color, 20%); - -// ---------------------------------------------------------------------------- -// Widget-meter styles -// ---------------------------------------------------------------------------- -.widget-meter { - - background-color: $background-color; - - input.meter { - background-color: $meter-background; - color: #fff; - } - - .title { - color: $title-color; - } - - .more-info { - color: $moreinfo-color; - font-size: 1em; - } - - .updated-at { - color: rgba(0, 0, 0, 0.6); - font-size: 0.8em; - } - -} diff --git a/pydashie/widgets/nagios/nagios.coffee b/pydashie/widgets/nagios/nagios.coffee deleted file mode 100644 index 72f47e5..0000000 --- a/pydashie/widgets/nagios/nagios.coffee +++ /dev/null @@ -1,9 +0,0 @@ -class Dashing.Nagios extends Dashing.Widget - - ready: -> - # This is fired when the widget is done being rendered - - onData: (data) -> - # Handle incoming data - # You can access the html node of this widget with `@node` - # Example: $(@node).fadeOut().fadeIn() will make the node flash each time data comes in. \ No newline at end of file diff --git a/pydashie/widgets/nagios/nagios.html b/pydashie/widgets/nagios/nagios.html deleted file mode 100644 index e4c6a37..0000000 --- a/pydashie/widgets/nagios/nagios.html +++ /dev/null @@ -1,21 +0,0 @@ -
    -
  • -

    -
    -

    Error querying Icinga

    -
    -
    -
    -

    -

    critical

    -

    criticals

    -
    -
    -

    -

    warning

    -

    warnings

    -
    -

    -
    -
  • -
diff --git a/pydashie/widgets/nagios/nagios.scss b/pydashie/widgets/nagios/nagios.scss deleted file mode 100644 index 0499ccb..0000000 --- a/pydashie/widgets/nagios/nagios.scss +++ /dev/null @@ -1,51 +0,0 @@ -$background: #444; -$text: #fff; -$success: #86d751; -$warning: #edde43; -$failure: #e3394f; -$error: #f75f00; - -.widget-nagios { - li { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding-top: 25px; - - h3 { - font-size: 60px; - font-weight: bold; - } - - h4 { - font-size: 20px; - font-weight: bold; - text-transform: uppercase; - } - - p { - &.updated-at { - color: rgba(0, 0, 0, 0.6); - font-size: 0.8em; - } - } - - &.green { - background-color: $success; - } - - &.yellow { - background-color: $warning; - } - - &.red { - background-color: $failure; - } - - &.error { - background-color: $error; - } - } -} diff --git a/pydashie/widgets/nagios_list/nagios_list.coffee b/pydashie/widgets/nagios_list/nagios_list.coffee deleted file mode 100644 index b7ce2e0..0000000 --- a/pydashie/widgets/nagios_list/nagios_list.coffee +++ /dev/null @@ -1 +0,0 @@ -class Dashing.NagiosList extends Dashing.Widget \ No newline at end of file diff --git a/pydashie/widgets/nagios_list/nagios_list.html b/pydashie/widgets/nagios_list/nagios_list.html deleted file mode 100644 index caf787e..0000000 --- a/pydashie/widgets/nagios_list/nagios_list.html +++ /dev/null @@ -1,22 +0,0 @@ -

- -

- -
    -
  • - - -
  • -
- -

- -
    -
  • - - -
  • -
- -

-

diff --git a/pydashie/widgets/nagios_list/nagios_list.scss b/pydashie/widgets/nagios_list/nagios_list.scss deleted file mode 100644 index ca8bbff..0000000 --- a/pydashie/widgets/nagios_list/nagios_list.scss +++ /dev/null @@ -1,68 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #5B7F97; -$value-color: #fff; - -$title-color: rgba(255, 255, 255, 1); -$label-color: rgba(255, 255, 255, 1); -$moreinfo-color: rgba(255, 255, 255, 0.7); - -// ---------------------------------------------------------------------------- -// Widget-nagios-list styles -// ---------------------------------------------------------------------------- -.widget-nagios-list { - - background-color: $background-color; - vertical-align: top; - - .title { - color: $title-color; - font-size: 1.2em; - } - - .subtitle { - color: $title-color; - font-size: 1em; - } - - ol, ul { - margin: 0 15px; - text-align: left; - color: $label-color; - } - - ol { - nagios-list-style-position: inside; - } - - li { - font-size: 1.1em; - } - - .nagios-list-nostyle { - nagios-list-style: none; - } - - .label { - color: $label-color; - font-weight: 600; - } - - .value { - float: right; - margin-left: 10px; - font-weight: 600; - color: $value-color; - } - - .updated-at { - color: rgba(0, 0, 0, 0.6); - font-size: 0.8em; - } - - .more-info { - color: $moreinfo-color; - } - -} \ No newline at end of file diff --git a/pydashie/widgets/number/number.coffee b/pydashie/widgets/number/number.coffee deleted file mode 100644 index b16f968..0000000 --- a/pydashie/widgets/number/number.coffee +++ /dev/null @@ -1,21 +0,0 @@ -class Dashing.Number extends Dashing.Widget - @accessor 'current', Dashing.AnimatedValue - - @accessor 'difference', -> - if @get('last') - last = parseInt(@get('last')) - current = parseInt(@get('current')) - if last != 0 - diff = Math.abs(Math.round((current - last) / last * 100)) - "#{diff}%" - else - "" - - @accessor 'arrow', -> - if @get('last') - if parseInt(@get('current')) > parseInt(@get('last')) then '+' else '-' - #if parseInt(@get('current')) > parseInt(@get('last')) then 'icon-arrow-up' else 'icon-arrow-down' - - onData: (data) -> - if data.status - $(@get('node')).addClass("status-#{data.status}") \ No newline at end of file diff --git a/pydashie/widgets/number/number.html b/pydashie/widgets/number/number.html deleted file mode 100644 index d7eeab9..0000000 --- a/pydashie/widgets/number/number.html +++ /dev/null @@ -1,11 +0,0 @@ -

- -

- -

- -

- -

- -

diff --git a/pydashie/widgets/number/number.scss b/pydashie/widgets/number/number.scss deleted file mode 100644 index 608624b..0000000 --- a/pydashie/widgets/number/number.scss +++ /dev/null @@ -1,39 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #47bbb3; -$value-color: #fff; - -$title-color: rgba(255, 255, 255, 0.7);; -$moreinfo-color: rgba(255, 255, 255, 0.7);; - -// ---------------------------------------------------------------------------- -// Widget-number styles -// ---------------------------------------------------------------------------- -.widget-number { - - background-color: $background-color; - - .title { - color: $title-color; - } - - .value { - color: $value-color; - } - - .change-rate { - font-weight: 500; - font-size: 30px; - color: $value-color; - } - - .more-info { - color: $moreinfo-color; - } - - .updated-at { - color: rgba(0, 0, 0, 0.3); - } - -} \ No newline at end of file diff --git a/pydashie/widgets/progress_bars/attribution b/pydashie/widgets/progress_bars/attribution deleted file mode 100644 index c801629..0000000 --- a/pydashie/widgets/progress_bars/attribution +++ /dev/null @@ -1,5 +0,0 @@ -Direct port of the Progress Bars Widget from Shopify's Dashie Widget Challenge to pydashie - -All attribution to mdirienzo - - - https://gist.github.com/mdirienzo/6716905 \ No newline at end of file diff --git a/pydashie/widgets/progress_bars/progress_bars.coffee b/pydashie/widgets/progress_bars/progress_bars.coffee deleted file mode 100644 index 98dfc69..0000000 --- a/pydashie/widgets/progress_bars/progress_bars.coffee +++ /dev/null @@ -1,205 +0,0 @@ -class Dashing.ProgressBars extends Dashing.Widget - - @accessor 'title' - - ready: -> - @drawWidget( @get('progress_items') ) - - onData: (eventData) -> - @drawWidget(eventData.progress_items) - - drawWidget: (progress_items) -> - container = $(@node) - rowsContainer = container.find('.rows-container') - - if progress_items.length == 0 - rowsContainer.empty() - else - # Float value used to scale the rows to use the entire space of the widget - rowHeight = 100 / progress_items.length - counter = 0 - @clearIntervals() - - # Add or move rows for each project. Checks first if the row already exists. - progress_items.forEach (item) => - normalizedItemName = item.name.replace(/\W+/g, "_") - referenceRow = rowsContainer.children().eq(counter) - existingRow = rowsContainer.find("."+normalizedItemName) - - if existingRow.length - if referenceRow.attr("class").indexOf(normalizedItemName) == -1 - existingRow.detach().insertBefore(referenceRow) - existingRow.hide().fadeIn(1200) - else - row = createRow(item) - if referenceRow.length - row.insertBefore(referenceRow) - else - rowsContainer.append(row) - row.hide().fadeIn(1200) - - elem = rowsContainer.find("."+normalizedItemName+" .inner-progress-bar") - if elem.length - @animateProgressBarContent(elem[0], parseFloat(elem[0].style.width), - parseFloat(item.progress), parseFloat(item.value), - parseFloat(item.max), 1000) - ++counter - - # Remove any nodes that were not in the new data, these will be the rows - # at the end of the widget. - currentNode = rowsContainer.children().eq(counter-1) - while currentNode.next().length - currentNode = currentNode.next() - currentNode.fadeOut(100, -> $(this).remove() ) - - # Set the height after rows were added/removed. - rows = rowsContainer.children() - percentageOfTotalHeight = 100 / progress_items.length - applyCorrectedRowHeight(rows, percentageOfTotalHeight) - - applyZebraStriping(rows) - - - #***/ - # Create a JQuery row object with the proper structure and base - # settings for the item passed in. - # - # The Row DOM Hierarchy: - # Row - # Row Content (here so we can use vertical alignment) - # Project Name - # Outer Bar Container (The border and background) - # Inner Bar Container (The progress and text) - # - # @item - object representing an item and it's progress - # / - createRow = (item) -> - - row = ( $("
") - .attr("class", "row " + item.name.replace(/\W+/g, "_") ) ) - - rowContent = ( $("
") - .attr("class", "row-content") ) - - projectName = ( $("
") - .attr("class", "project-name") - .text(item.name) - .attr("title", item.name) ) - - outerProgressBar = ( $("
") - .attr("class", "outer-progress-bar") ) - - innerProgressBar = $("
") - .attr("class", "inner-progress-bar") - .text("0%") - innerProgressBar.css("width", "0%") - - # Put it all together. - outerProgressBar.append(innerProgressBar) - rowContent.append(projectName) - rowContent.append(outerProgressBar) - row.append(rowContent) - - return row - - - #***/ - # Does calculations for the animation and sets up the javascript - # interval to perform the animation. - # - # @element - element that is going to be animated. - # @from - the value that the element starts at. - # @to - the value that the element is going to. - # @value - the actual value (not percentage) to display. - # @max - the max value (used for percentage). - # @baseDuration - the minimum time the animation will perform. - # / - animateProgressBarContent: (element, from, to, value, max, baseDuration) -> - endpointDifference = (to-from) - - if endpointDifference != 0 - currentValue = from - - # Every x milliseconds, the function should run. - stepInterval = 16.667 - - # Change the duration based on the distance between points. - duration = baseDuration + Math.abs(endpointDifference) * 25 - - numberOfSteps = duration / stepInterval - valueIncrement = endpointDifference / numberOfSteps - - interval = setInterval( - -> - currentValue += valueIncrement - if Math.abs(currentValue - from) >= Math.abs(endpointDifference) - setProgressBarValue(element, to, value, max) - clearInterval(interval) - else - setProgressBarValue(element, currentValue, value, max) - stepInterval) - - @addInterval(interval) - - #***/ - # Sets the text and width of the element in question to the specified value - # after making sure it is bounded between [0-100] - # - # @element - element to be set - # @value - the numeric value to set the element to. This can be a float. - # @literal - the actual value (not in percentage). - # @max - the max value (which was used for percentage). - # / - setProgressBarValue = (element, value, literal, max) -> - if (value > 100) - value = 100 - else if (value < 0) - value = 0 - element.textContent = Math.floor(value) + "% - " + Math.floor(literal) + "/" + Math.floor(max) + "" - element.style.width = value + "%" - - #***/ - # Applies a percentage-based row height to the list of rows passed in. - # - # @rows - the elements to apply this height value to - # @percentageOfTotalHeight - The height to be applied to each row. - # / - applyCorrectedRowHeight = (rows, percentageOfTotalHeight) -> - height = percentageOfTotalHeight + "%" - for row in rows - row.style.height = height - - #***/ - # Adds a class to every other row to change the background color. This - # was done mainly for readability. - # - # @rows - list of elements to run zebra-striping on - # / - applyZebraStriping = (rows) -> - isZebraStripe = false - for row in rows - # In case elements are moved around, we don't want them to retain this. - row.classList.remove("zebra-stripe") - if isZebraStripe - row.classList.add("zebra-stripe") - isZebraStripe = !isZebraStripe - - #***/ - # Stops all javascript intervals from running and clears the list. - #/ - clearIntervals: -> - if @intervalList - for interval in @intervalList - clearInterval(interval) - @intervalList = [] - - #***/ - # Adds a javascript interval to a list so that it can be tracked and cleared - # ahead of time if the need arises. - # - # @interval - the javascript interval to add - #/ - addInterval: (interval) -> - if !@intervalList - @intervalList = [] - @intervalList.push(interval) diff --git a/pydashie/widgets/progress_bars/progress_bars.html b/pydashie/widgets/progress_bars/progress_bars.html deleted file mode 100644 index d2a42a9..0000000 --- a/pydashie/widgets/progress_bars/progress_bars.html +++ /dev/null @@ -1,6 +0,0 @@ -

- -
-
- -

\ No newline at end of file diff --git a/pydashie/widgets/progress_bars/progress_bars.scss b/pydashie/widgets/progress_bars/progress_bars.scss deleted file mode 100644 index bbdc25c..0000000 --- a/pydashie/widgets/progress_bars/progress_bars.scss +++ /dev/null @@ -1,104 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- - -// row-size is a magic number used for scaling. It will make things bigger -// or smaller but always in proportion with each other. Feel free to change -// this to reflect your personal needs. -$row-size: 1em; - -$blue: #30A2BD; -$white: #ffffff; -$base-color: darken($blue, 20%); - -$base-color-dark: darken($base-color, 10%); -$base-color-light: lighten($base-color, 10%); -$base-color-lighter: lighten($base-color, 5%); -$base-color-lightest: lighten($base-color, 45%); - -$text-color: $white; - -// ---------------------------------------------------------------------------- -// Widget-project-completion styles -// ---------------------------------------------------------------------------- -.widget.widget-progress-bars { - height: 100%; - width: 100%; - padding: 5px; - position:relative; - background-color: $base-color; - vertical-align: baseline; - - * { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing:border-box; - } - - .title { - color: $text-color; - margin-bottom: 5px; - } - - .rows-container { - height: 85%; - width:100%; - color: $text-color; - font-size: $row-size; - text-align:center; - padding-bottom: 12px; - } - - .row { - height:0%; - width:100%; - vertical-align: middle; - display:table; - transition-property: height; - transition-duration: 0.3s; - transition-timing-function: linear; - } - - .row-content { - padding-left: 5px; - display:table-cell; - vertical-align: middle; - } - - .project-name { - display:inline-block; - width:35%; - padding-right: $row-size; - text-align: left; - vertical-align: middle; - text-overflow: ellipsis; - overflow:hidden; - white-space: nowrap; - } - - .outer-progress-bar { - display:inline-block; - width: 65%; - vertical-align: middle; - border: ($row-size / 3) solid $base-color-dark; - border-radius: 2 * $row-size; - background-color: $base-color-lighter; - - .inner-progress-bar { - background-color: $base-color-dark; - border-radius: $row-size / 2; - color: $white; - white-space: pre; - } - } - - .zebra-stripe { - background-color: $base-color-light; - } - - .updated-at { - color: rgba(0, 0, 0, 0.6); - font-size: 0.8em; - } - -} \ No newline at end of file diff --git a/pydashie/widgets/rickshawgraph/rickshawgraph.coffee b/pydashie/widgets/rickshawgraph/rickshawgraph.coffee deleted file mode 100644 index e2f23cf..0000000 --- a/pydashie/widgets/rickshawgraph/rickshawgraph.coffee +++ /dev/null @@ -1,446 +0,0 @@ -# Rickshawgraph v0.1.0 - -class Dashing.Rickshawgraph extends Dashing.Widget - - DIVISORS = [ - {number: 100000000000000000000000, label: 'Y'}, - {number: 100000000000000000000, label: 'Z'}, - {number: 100000000000000000, label: 'E'}, - {number: 1000000000000000, label: 'P'}, - {number: 1000000000000, label: 'T'}, - {number: 1000000000, label: 'G'}, - {number: 1000000, label: 'M'}, - {number: 1000, label: 'K'} - ] - - # Take a long number like "2356352" and turn it into "2.4M" - formatNumber = (number) -> - for divisior in DIVISORS - if number > divisior.number - number = "#{Math.round(number / (divisior.number/10))/10}#{divisior.label}" - break - - return number - - getRenderer: () -> return @get('renderer') or @get('graphtype') or 'area' - - # Retrieve the `current` value of the graph. - @accessor 'current', -> - answer = null - - # Return the value supplied if there is one. - if @get('displayedValue') != null and @get('displayedValue') != undefined - answer = @get('displayedValue') - - if answer == null - # Compute a value to return based on the summaryMethod - series = @_parseData {points: @get('points'), series: @get('series')} - if !(series?.length > 0) - # No data in series - answer = '' - - else - switch @get('summaryMethod') - when "sum" - answer = 0 - answer += (point?.y or 0) for point in s.data for s in series - - when "sumLast" - answer = 0 - answer += s.data[s.data.length - 1].y or 0 for s in series - - when "highest" - answer = 0 - if @get('unstack') or (@getRenderer() is "line") - answer = Math.max(answer, (point?.y or 0)) for point in s.data for s in series - else - # Compute the sum of values at each point along the graph - for index in [0...series[0].data.length] - value = 0 - for s in series - value += s.data[index]?.y or 0 - answer = Math.max(answer, value) - - when "none" - answer = '' - - else - # Otherwise if there's only one series, pick the most recent value from the series. - if series.length == 1 and series[0].data?.length > 0 - data = series[0].data - answer = data[data.length - 1].y - else - # Otherwise just return nothing. - answer = '' - - answer = formatNumber answer - - return answer - - - ready: -> - @assignedColors = @get('colors').split(':') if @get('colors') - @strokeColors = @get('strokeColors').split(':') if @get('strokeColors') - - @graph = @_createGraph() - @graph.render() - - clear: -> - # Remove the old graph/legend if there is one. - $node = $(@node) - $node.find('.rickshaw_graph').remove() - if @$legendDiv - @$legendDiv.remove() - @$legendDiv = null - - # Handle new data from Dashing. - onData: (data) -> - series = @_parseData data - - if @graph - # Remove the existing graph if the number of series has changed or any names have changed. - needClear = false - needClear |= (series.length != @graph.series.length) - if @get("legend") then for subseries, index in series - needClear |= @graph.series[index]?.name != series[index]?.name - - if needClear then @graph = @_createGraph() - - # Copy over the new graph data - for subseries, index in series - @graph.series[index] = subseries - - @graph.render() - - # Create a new Rickshaw graph. - _createGraph: -> - $node = $(@node) - $container = $node.parent() - - @clear() - - # Gross hacks. Let's fix this. - width = (Dashing.widget_base_dimensions[0] * $container.data("sizex")) + Dashing.widget_margins[0] * 2 * ($container.data("sizex") - 1) - height = (Dashing.widget_base_dimensions[1] * $container.data("sizey")) - - if @get("legend") - # Shave 20px off the bottom of the graph for the legend - height -= 30 - - $graph = $("
") - $node.append $graph - series = @_parseData {points: @get('points'), series: @get('series')} - - graphOptions = { - element: $graph.get(0), - renderer: @getRenderer(), - width: width, - height: height, - series: series - } - - if !!@get('stroke') then graphOptions.stroke = true - if @get('min') != null then graphOptions.max = @get('min') - if @get('max') != null then graphOptions.max = @get('max') - - try - graph = new Rickshaw.Graph graphOptions - catch err - if err.toString() is "x and y properties of points should be numbers instead of number and object" - # This will happen with older versions of Rickshaw that don't support nulls in the data set. - nullsFound = false - for s in series - for point in s.data - if point.y is null - nullsFound = true - point.y = 0 - - if nullsFound - # Try to create the graph again now that we've patched up the data. - graph = new Rickshaw.Graph graphOptions - if !@rickshawVersionWarning - console.log "#{@get 'id'} - Nulls were found in your data, but Rickshaw didn't like" + - " them. Consider upgrading your rickshaw to 1.4.3 or higher." - @rickshawVersionWarning = true - else - # No nulls were found - this is some other problem, so just re-throw the exception. - throw err - - graph.renderer.unstack = !!@get('unstack') - - xAxisOptions = { - graph: graph - } - if Rickshaw.Fixtures.Time.Local - xAxisOptions.timeFixture = new Rickshaw.Fixtures.Time.Local() - - # x_axis = new Rickshaw.Graph.Axis.Time xAxisOptions - y_axis = new Rickshaw.Graph.Axis.Y(graph: graph, tickFormat: Rickshaw.Fixtures.Number.formatKMBT) - - if @get("legend") - # Add a legend - @$legendDiv = $("
") - $node.append(@$legendDiv) - legend = new Rickshaw.Graph.Legend { - graph: graph - element: @$legendDiv.get(0) - } - - return graph - - # Parse a {series, points} object with new data from Dashing. - # - _parseData: (data) -> - series = [] - - # Figure out what kind of data we've been passed - if data.series - dataSeries = if isString(data.series) then JSON.parse data.series else data.series - for subseries, index in dataSeries - try - series.push @_parseSeries subseries - catch err - console.log "Error while parsing series: #{err}" - - else if data.points - points = data.points - if isString(points) then points = JSON.parse points - - if points[0]? and !points[0].x? - # Not already in Rickshaw format; assume graphite data - points = graphiteDataToRickshaw(points) - - series.push {data: points} - - if series.length is 0 - # No data - create a dummy series to keep Rickshaw happy - series.push {data: [{x:0, y:0}]} - - @_updateColors(series) - - # Fix any missing data in the series. - if Rickshaw.Series.fill then Rickshaw.Series.fill(series, null) - - return series - - # Parse a series of data from an array passed to `_parseData()`. - # This accepts both Graphite and Rickshaw style data sets. - _parseSeries: (series) -> - if series?.datapoints? - # This is a Graphite series - answer = { - name: series.target - data: graphiteDataToRickshaw series.datapoints - color: series.color - stroke: series.stroke - } - else if series?.data? - # Rickshaw data. Need to clone, otherwise we could end up with multiple graphs sharing - # the same data, and Rickshaw really doesn't like that. - answer = { - name: series.name - data: series.data - color: series.color - stroke: series.stroke - } - else if !series - throw new Error("No data received for #{@get 'id'}") - else - throw new Error("Unknown data for #{@get 'id'}. series: #{series}") - - answer.data.sort (a,b) -> a.x - b.x - - return answer - - # Update the color assignments for a series. This will assign colors to any data that - # doesn't have a color already. - _updateColors: (series) -> - # If no colors were provided, or of there aren't enough colors, then generate a set of - # colors to use. - if !@defaultColors or @defaultColors?.length != series.length - @defaultColors = computeDefaultColors @, @node, series - - for subseries, index in series - # Preferentially pick supplied colors instead of defaults, but don't overwrite a color - # if one was supplied with the data. - subseries.color ?= @assignedColors?[index] or @defaultColors[index] - subseries.stroke ?= @strokeColors?[index] or "#000" - - # Convert a collection of Graphite data points into data that Rickshaw will understand. - graphiteDataToRickshaw = (datapoints) -> - answer = [] - for datapoint in datapoints - # Need to convert potential nulls from Graphite into a real number for Rickshaw. - answer.push {x: datapoint[1], y: (datapoint[0] or 0)} - answer - - # Compute a pleasing set of default colors. This works by starting with the background color, - # and picking colors of intermediate luminance between the background and white (or the - # background and black, for light colored backgrounds.) We use the brightest color for the - # first series, because then multiple series will appear to blend in to the background. - computeDefaultColors = (self, node, series) -> - defaultColors = [] - - # Use a neutral color if we can't get the background-color for some reason. - backgroundColor = parseColor($(node).css('background-color')) or [50, 50, 50, 1.0] - hsl = rgbToHsl backgroundColor - - alpha = if self.get('defaultAlpha')? then self.get('defaultAlpha') else 1 - - if self.get('colorScheme') in ['rainbow', 'near-rainbow'] - saturation = (interpolate hsl[1], 1.0, 3)[1] - luminance = if (hsl[2] < 0.6) then 0.7 else 0.3 - - hueOffset = 0 - if self.get('colorScheme') is 'rainbow' - # Note the first and last values in `hues` will both have the same hue as the background, - # hence the + 2. - hues = interpolate hsl[0], hsl[0] + 1, (series.length + 2) - hueOffset = 1 - else - hues = interpolate hsl[0] - 0.25, hsl[0] + 0.25, series.length - for hue, index in hues - if hue > 1 then hues[index] -= 1 - if hue < 0 then hues[index] += 1 - - for index in [0...series.length] - defaultColors[index] = rgbToColor hslToRgb([hues[index + hueOffset], saturation, luminance, alpha]) - - else - hue = if self.get('colorScheme') is "compliment" then hsl[0] + 0.5 else hsl[0] - if hsl[0] > 1 then hsl[0] -= 1 - - saturation = hsl[1] - saturationSource = if (saturation < 0.6) then 0.7 else 0.3 - saturations = interpolate saturationSource, saturation, (series.length + 1) - - luminance = hsl[2] - luminanceSource = if (luminance < 0.6) then 0.9 else 0.1 - luminances = interpolate luminanceSource, luminance, (series.length + 1) - - for index in [0...series.length] - defaultColors[index] = rgbToColor hslToRgb([hue, saturations[index], luminances[index], alpha]) - - return defaultColors - - - -# Helper functions -# ================ -isString = (obj) -> - return toString.call(obj) is "[object String]" - -# Parse a `rgb(x,y,z)` or `rgba(x,y,z,a)` string. -parseRgbaColor = (colorString) -> - match = /^rgb\(\s*([\d]+)\s*,\s*([\d]+)\s*,\s*([\d]+)\s*\)/.exec(colorString) - if match - return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3]), 1.0] - - match = /^rgba\(\s*([\d]+)\s*,\s*([\d]+)\s*,\s*([\d]+)\s*,\s*([\d]+)\s*\)/.exec(colorString) - if match - return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3]), parseInt(match[4])] - - return null - -# Parse a color string as RGBA -parseColor = (colorString) -> - answer = null - - # Try to use the browser to parse the color for us. - div = document.createElement('div') - div.style.color = colorString - if div.style.color - answer = parseRgbaColor div.style.color - - if !answer - match = /^#([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})/.exec(colorString) - if match then answer = [parseInt(match[1], 16), parseInt(match[2], 16), parseInt(match[3], 16), 1.0] - - if !answer - match = /^#([\da-fA-F])([\da-fA-F])([\da-fA-F])/.exec(colorString) - if match then answer = [parseInt(match[1], 16) * 0x11, parseInt(match[2], 16) * 0x11, parseInt(match[3], 16) * 0x11, 1.0] - - if !answer then answer = parseRgbaColor colorString - - return answer - -# Convert an RGB or RGBA color to a CSS color. -rgbToColor = (rgb) -> - if (!3 of rgb) or (rgb[3] == 1.0) - return "rgb(#{rgb[0]},#{rgb[1]},#{rgb[2]})" - else - return "rgba(#{rgb[0]},#{rgb[1]},#{rgb[2]},#{rgb[3]})" - -# Returns an array of size `steps`, where the first value is `source`, the last value is `dest`, -# and the intervening values are interpolated. If steps < 2, then returns `[dest]`. -# -interpolate = (source, dest, steps) -> - if steps < 2 - answer =[dest] - else - stepSize = (dest - source) / (steps - 1) - answer = (num for num in [source..dest] by stepSize) - # Rounding errors can cause us to drop the last value - if answer.length < steps then answer.push dest - - return answer - -# Adapted from http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c -# -# Converts an RGBA color value to HSLA. Conversion formula -# adapted from http://en.wikipedia.org/wiki/HSL_color_space. -# Assumes r, g, and b are contained in the set [0, 255] and -# a in [0, 1]. Returns h, s, l, a in the set [0, 1]. -# -# Returns the HSLA representation as an array. -rgbToHsl = (rgba) -> - [r,g,b,a] = rgba - r /= 255 - g /= 255 - b /= 255 - max = Math.max(r, g, b) - min = Math.min(r, g, b) - l = (max + min) / 2 - - if max == min - h = s = 0 # achromatic - else - d = max - min - s = if l > 0.5 then d / (2 - max - min) else d / (max + min) - switch max - when r then h = (g - b) / d + (g < b ? 6 : 0) - when g then h = (b - r) / d + 2 - when b then h = (r - g) / d + 4 - h /= 6; - - return [h, s, l, a] - -# Adapted from http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c -# -# Converts an HSLA color value to RGBA. Conversion formula -# adapted from http://en.wikipedia.org/wiki/HSL_color_space. -# Assumes h, s, l, and a are contained in the set [0, 1] and -# returns r, g, and b in the set [0, 255] and a in [0, 1]. -# -# Retunrs the RGBA representation as an array. -hslToRgb = (hsla) -> - [h,s,l,a] = hsla - if s is 0 - r = g = b = l # achromatic - else - hue2rgb = (p, q, t) -> - if(t < 0) then t += 1 - if(t > 1) then t -= 1 - if(t < 1/6) then return p + (q - p) * 6 * t - if(t < 1/2) then return q - if(t < 2/3) then return p + (q - p) * (2/3 - t) * 6 - return p - - q = if l < 0.5 then l * (1 + s) else l + s - l * s - p = 2 * l - q; - r = hue2rgb(p, q, h + 1/3) - g = hue2rgb(p, q, h) - b = hue2rgb(p, q, h - 1/3) - - return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), a] - diff --git a/pydashie/widgets/rickshawgraph/rickshawgraph.html b/pydashie/widgets/rickshawgraph/rickshawgraph.html deleted file mode 100644 index da62631..0000000 --- a/pydashie/widgets/rickshawgraph/rickshawgraph.html +++ /dev/null @@ -1,5 +0,0 @@ -

- -

- -

diff --git a/pydashie/widgets/rickshawgraph/rickshawgraph.scss b/pydashie/widgets/rickshawgraph/rickshawgraph.scss deleted file mode 100644 index ca0ed38..0000000 --- a/pydashie/widgets/rickshawgraph/rickshawgraph.scss +++ /dev/null @@ -1,114 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #59615F; - -$title-color: rgba(255, 255, 255, 1); -$moreinfo-color: rgba(255, 255, 255, 1); -$tick-color: rgba(0, 0, 0, 1); - - -// ---------------------------------------------------------------------------- -// Widget-graph styles -// ---------------------------------------------------------------------------- -.widget-rickshawgraph { - - background-color: $background-color; - position: relative; - - .rickshaw_graph { - position: absolute; - left: 0px; - top: 0px; - } - - h2{ - font-size: 16px; - white-space: pre; - } - - svg { - position: absolute; - fill-opacity: 0.6; - left: 0px; - top: 0px; - } - - .title, .value { - position: relative; - z-index: 99; - } - - .title { - color: $title-color; - } - - .more-info { - color: $moreinfo-color; - font-weight: 600; - font-size: 18px; - margin-top: 0; - margin-bottom: 20px; - z-index: 20; - } - - .x_tick { - position: absolute; - bottom: 0; - .title { - font-size: 20px; - color: $tick-color; - opacity: 0.5; - padding-bottom: 3px; - } - } - - .y_ticks { - font-size: 20px; - fill: $tick-color; - text { - opacity: 0.5; - } - } - - .domain { - display: none; - } - - .rickshaw_legend { - position: absolute; - left: 0px; - bottom: 0px; - white-space: nowrap; - overflow-x: hidden; - font-size: 15px; - height: 20px; - padding: 5px 0px; - overflow-y: hidden; - - ul { - margin: 0; - padding: 0; - list-style-type: none; - text-align: center; - } - - ul li { - display: inline; - } - - .swatch { - display: inline-block; - width: 14px; - height: 14px; - margin-left: 5px; - } - - .label { - display: inline-block; - margin-left: 5px; - font-size: 17px; - } - } - -} diff --git a/pydashie/widgets/text/text.coffee b/pydashie/widgets/text/text.coffee deleted file mode 100644 index 05974b8..0000000 --- a/pydashie/widgets/text/text.coffee +++ /dev/null @@ -1 +0,0 @@ -class Dashing.Text extends Dashing.Widget \ No newline at end of file diff --git a/pydashie/widgets/text/text.html b/pydashie/widgets/text/text.html deleted file mode 100644 index 45322ca..0000000 --- a/pydashie/widgets/text/text.html +++ /dev/null @@ -1,7 +0,0 @@ -

- -

- -

- -

\ No newline at end of file diff --git a/pydashie/widgets/text/text.scss b/pydashie/widgets/text/text.scss deleted file mode 100644 index 4e6c6e3..0000000 --- a/pydashie/widgets/text/text.scss +++ /dev/null @@ -1,32 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #ec663c; - -$title-color: rgba(255, 255, 255, 0.7); -$moreinfo-color: rgba(255, 255, 255, 0.7); - -// ---------------------------------------------------------------------------- -// Widget-text styles -// ---------------------------------------------------------------------------- -.widget-text { - - background-color: $background-color; - - .title { - color: $title-color; - } - - .more-info { - color: $moreinfo-color; - } - - .updated-at { - color: rgba(255, 255, 255, 0.7); - } - - - &.large h3 { - font-size: 65px; - } -} \ No newline at end of file diff --git a/pydashie/widgets/usage_gauge/attribution b/pydashie/widgets/usage_gauge/attribution deleted file mode 100644 index 0dc8969..0000000 --- a/pydashie/widgets/usage_gauge/attribution +++ /dev/null @@ -1,5 +0,0 @@ -Direct port of the Usage Gauge Widget from Shopify's Dashie Widget Challenge to pydashie - -All attribution to kamisama - - - https://gist.github.com/kamisama/6587791 diff --git a/pydashie/widgets/usage_gauge/usage_gauge.coffee b/pydashie/widgets/usage_gauge/usage_gauge.coffee deleted file mode 100644 index 13cd533..0000000 --- a/pydashie/widgets/usage_gauge/usage_gauge.coffee +++ /dev/null @@ -1,20 +0,0 @@ -class Dashing.UsageGauge extends Dashing.Widget - @accessor 'value', Dashing.AnimatedValue - - ready: -> - $(@node).find(".value").before("
") - $(@node).find(".gauge").append("
") - @meter = $(@node).find(".gauge-meter"); - - onData: (data) -> - @meter.animate({height: Batman.mixin Batman.Filters.percentage(data.value, @get("max")) + "%"}) - - @accessor "total", -> - @get("max") - - @accessor "suffix", -> - " %" - -Batman.mixin Batman.Filters, - percentage: (n, total) -> - Math.round(n * 100 / total) \ No newline at end of file diff --git a/pydashie/widgets/usage_gauge/usage_gauge.html b/pydashie/widgets/usage_gauge/usage_gauge.html deleted file mode 100644 index 25b921c..0000000 --- a/pydashie/widgets/usage_gauge/usage_gauge.html +++ /dev/null @@ -1,5 +0,0 @@ -

- -

- -

\ No newline at end of file diff --git a/pydashie/widgets/usage_gauge/usage_gauge.scss b/pydashie/widgets/usage_gauge/usage_gauge.scss deleted file mode 100644 index ebce552..0000000 --- a/pydashie/widgets/usage_gauge/usage_gauge.scss +++ /dev/null @@ -1,56 +0,0 @@ -// ---------------------------------------------------------------------------- -// Sass declarations -// ---------------------------------------------------------------------------- -$background-color: #ec223f; - -$title-color: rgba(255, 255, 255, 0.7); -$updated-at-color: rgba(255, 255, 255, 0.5); - -$meter-background: darken($background-color, 15%); - -// ---------------------------------------------------------------------------- -// Widget-meter styles -// ---------------------------------------------------------------------------- -.widget-usage-gauge { - - background-color: $background-color; - - .title { - color: $title-color; - } - - .value { - font-weight: 600; - font-size: 30px - } - - .gauge { - width: 100px; - height: 180px; - display: block; - margin: 0 auto 10px; - position: relative; - } - - .gauge-meter, .gauge::after { - display: block; - background: url("/assets/images/usage-gauge-background.png") repeat-y center bottom; - } - - .gauge::after { - content: ""; - height: 100%; - opacity: 0.15; - } - - .gauge-meter { - width: 100px; - position: absolute; - bottom: 0; - opacity: 0.6; - } - - .updated-at { - color: $updated-at-color - } -} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 05d9d4a..0000000 --- a/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -Flask -CoffeeScript -pyyaml -python-novaclient -python-neutronclient -python-cinderclient -python-keystoneclient -paramiko -pynag - diff --git a/setup.py b/setup.py deleted file mode 100644 index 30b88cb..0000000 --- a/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -#! /usr/bin/env python - -try: - from setuptools import setup, find_packages -except ImportError: - from ez_setup import use_setuptools - use_setuptools() - from setuptools import setup, find_packages - -from pip.req import parse_requirements - -install_reqs = parse_requirements('requirements.txt') - -reqs = [str(ir.req) for ir in install_reqs] - - -setup( - name='Cloud-PyDashie', - version='0.2', - packages=['pydashie',], - include_package_data=True, - install_requires=reqs, - entry_points={ - 'console_scripts': ['pydashie = pydashie.main:run_sample_app'] - }, - license='MIT', - long_description=open('README.rst').read(), -)