././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1653243713.665464 graphite-web-1.1.10/0000755000000000000000000000000000000000000014107 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/LICENSE0000664000000000000000000002616300000000000015126 0ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2008-2012 Chris Davis; 2011-2020 The Graphite Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/MANIFEST.in0000664000000000000000000000053000000000000015645 0ustar00rootroot00000000000000include LICENSE include README.md include MANIFEST.in include check-dependencies.py include examples/* include conf/*.example include webapp/graphite/local_settings.py.example recursive-include distro/ * recursive-include webapp/graphite/ *.html recursive-include webapp/content/ * exclude webapp/graphite/local_settings.py exclude conf/*.conf ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1653243713.665464 graphite-web-1.1.10/PKG-INFO0000644000000000000000000000505000000000000015204 0ustar00rootroot00000000000000Metadata-Version: 2.1 Name: graphite-web Version: 1.1.10 Summary: Enterprise scalable realtime graphing Home-page: http://graphiteapp.org/ Author: Chris Davis Author-email: chrismd@gmail.com License: Apache Software License 2.0 Classifier: Intended Audience :: Developers Classifier: Natural Language :: English Classifier: License :: OSI Approved :: Apache Software License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Description-Content-Type: text/markdown License-File: LICENSE # Graphite-Web [![Codacy Badge](https://api.codacy.com/project/badge/Grade/5e94ef79c2ea441aaf209cfb2851849e)](https://www.codacy.com/app/graphite-project/graphite-web?utm_source=github.com&utm_medium=referral&utm_content=graphite-project/graphite-web&utm_campaign=badger) [![Build Status](https://travis-ci.org/graphite-project/graphite-web.png?branch=master)](https://travis-ci.org/graphite-project/graphite-web) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fgraphite-project%2Fgraphite-web.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fgraphite-project%2Fgraphite-web?ref=badge_shield) [![codecov](https://codecov.io/gh/graphite-project/graphite-web/branch/master/graph/badge.svg)](https://codecov.io/gh/graphite-project/graphite-web) ## Overview Graphite consists of three major components: 1. Graphite-Web, a Django-based web application that renders graphs and dashboards 2. The [Carbon](https://github.com/graphite-project/carbon) metric processing daemons 3. The [Whisper](https://github.com/graphite-project/whisper) time-series database library ![Graphite Components](https://github.com/graphite-project/graphite-web/raw/master/webapp/content/img/overview.png "Graphite Components") ## Installation, Configuration and Usage Please refer to the instructions at [readthedocs](http://graphite.readthedocs.io/). ## License Graphite-Web is licensed under version 2.0 of the Apache License. See the [LICENSE](https://github.com/graphite-project/graphite-web/blob/master/LICENSE) file for details. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/README.md0000664000000000000000000000305600000000000015374 0ustar00rootroot00000000000000# Graphite-Web [![Codacy Badge](https://api.codacy.com/project/badge/Grade/5e94ef79c2ea441aaf209cfb2851849e)](https://www.codacy.com/app/graphite-project/graphite-web?utm_source=github.com&utm_medium=referral&utm_content=graphite-project/graphite-web&utm_campaign=badger) [![Build Status](https://travis-ci.org/graphite-project/graphite-web.png?branch=master)](https://travis-ci.org/graphite-project/graphite-web) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fgraphite-project%2Fgraphite-web.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fgraphite-project%2Fgraphite-web?ref=badge_shield) [![codecov](https://codecov.io/gh/graphite-project/graphite-web/branch/master/graph/badge.svg)](https://codecov.io/gh/graphite-project/graphite-web) ## Overview Graphite consists of three major components: 1. Graphite-Web, a Django-based web application that renders graphs and dashboards 2. The [Carbon](https://github.com/graphite-project/carbon) metric processing daemons 3. The [Whisper](https://github.com/graphite-project/whisper) time-series database library ![Graphite Components](https://github.com/graphite-project/graphite-web/raw/master/webapp/content/img/overview.png "Graphite Components") ## Installation, Configuration and Usage Please refer to the instructions at [readthedocs](http://graphite.readthedocs.io/). ## License Graphite-Web is licensed under version 2.0 of the Apache License. See the [LICENSE](https://github.com/graphite-project/graphite-web/blob/master/LICENSE) file for details. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5934644 graphite-web-1.1.10/bin/0000755000000000000000000000000000000000000014657 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/bin/build-index0000775000000000000000000000152600000000000017017 0ustar00rootroot00000000000000#!/usr/bin/env python from graphite import settings from optparse import OptionParser import os import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "graphite.settings") django.setup() from graphite.storage import write_index if __name__ == "__main__": description = "A tool to generate the search index file used by"\ " graphite-web." prog = "build-index" version = "1.0" epilog = "Defaults are read from graphite.settings, it is unlikely"\ " that you would want to run this program with anything except the"\ " defaults." parser = OptionParser(description=description, prog=prog, version=version, epilog=epilog) parser.add_option("-i", "--index", default=settings.INDEX_FILE, help="default: %default") (options, args) = parser.parse_args() write_index(options.index) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/bin/build-index.sh0000775000000000000000000000022400000000000017422 0ustar00rootroot00000000000000#!/bin/bash export PYTHONPATH="/opt/graphite/webapp/:$PYTHONPATH" BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ${BINDIR}/build-index ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/bin/run-graphite-devel-server.py0000775000000000000000000000271100000000000022245 0ustar00rootroot00000000000000#!/usr/bin/env python import os import sys from optparse import OptionParser from django.core import management option_parser = OptionParser(usage=''' %prog [options] GRAPHITE_ROOT ''') option_parser.add_option('--port', default=8080, action='store', type=int, help='Port to listen on') option_parser.add_option('--interface', default='0.0.0.0', action='store', help='Interface to listen on') option_parser.add_option('--libs', default=None, help='Path to the directory containing the graphite python package') option_parser.add_option('--noreload', action='store_true', help='Disable monitoring for changes') option_parser.add_option('--settings', default='graphite.settings', help='configure alternative settings module') (options, args) = option_parser.parse_args() if not args: option_parser.print_usage() sys.exit(1) graphite_root = args[0] python_path = os.path.join(graphite_root, 'webapp') if options.libs: libdir = os.path.expanduser(options.libs) print('Adding %s to your PYTHONPATH' % libdir) os.environ['PYTHONPATH'] = libdir + ':' + os.environ.get('PYTHONPATH','') print("Running Graphite from %s under django development server\n" % graphite_root) command = [ 'django-admin.py', 'runserver', '--pythonpath', python_path, '--settings', options.settings, '%s:%d' % (options.interface, options.port) ] if options.noreload: command.append('--noreload') print(' '.join(command)) management.execute_from_command_line(command) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/check-dependencies.py0000775000000000000000000001325200000000000020172 0ustar00rootroot00000000000000#!/usr/bin/env python import sys if sys.version_info <= (2,7): # SystemExit defaults to returning 1 when printing a string to stderr raise SystemExit("You are using python %s, but version 2.7 or greater is " "required" % sys.version_info) required = 0 optional = 0 # Test for whisper try: import whisper except ImportError: # No? test for ceres try: import ceres # We imported ceres, but not whisper so it's an optional dependency sys.stderr.write("[OPTIONAL] Unable to import the 'whisper' module. " "Without it the webapp will be unable to read .wsp files\n") optional += 1 except ImportError: sys.stderr.write("[REQUIRED] Unable to import the 'whisper' or 'ceres' modules, " "please download this package from the Graphite project page and install it.\n") required += 1 # Test for cairocffi or pycairo try: import cairocffi as cairo except ImportError: sys.stderr.write("[REQUIRED] Unable to import the 'cairocffi' module, attempting to fall back to pycairo\n") try: import cairo except ImportError: sys.stderr.write("[REQUIRED] Unable to import the 'cairo' module, " "do you have pycairo installed for python %s?\n" % sys.version_info.major) cairo = None required += 1 # Test that pycairo has the PNG backend try: if cairo: surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 10, 10) del surface except Exception: sys.stderr.write("[REQUIRED] Failed to create an ImageSurface with cairo, " "you probably need to recompile cairo with PNG support\n") required += 1 # Test that cairo can find fonts try: if cairo: surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 10, 10) context = cairo.Context(surface) context.font_extents() del surface, context except Exception: sys.stderr.write("[REQUIRED] Failed to create text with cairo, " "this probably means cairo cant find any fonts. " "Install some system fonts and try again\n") # Test for django try: import django except ImportError: sys.stderr.write("[REQUIRED] Unable to import the 'django' module, " "do you have Django installed for python %s?\n" % sys.version_info.major) django = None required += 1 # Test for pytz try: import pytz except ImportError: sys.stderr.write("[REQUIRED] Unable to import the 'pytz' module, " "do you have pytz module installed for python %s?\n" % sys.version_info.major) required += 1 # Test for pyparsing try: import pyparsing except ImportError: sys.stderr.write("[REQUIRED] Unable to import the 'pyparsing' module, " "do you have pyparsing module installed for python %s?\n" % sys.version_info.major) required += 1 # Test for django-tagging try: import tagging except ImportError: sys.stderr.write("[REQUIRED] Unable to import the 'tagging' module, " "do you have django-tagging installed for python %s?\n" % sys.version_info.major) required += 1 if django and django.VERSION[:2] < (1,8): sys.stderr.write("[REQUIRED] You have django version %s installed, " "but version 1.8 or greater is required\n" % django.get_version()) required += 1 # Test for python-memcached try: import memcache except ImportError: sys.stderr.write("[OPTIONAL] Unable to import the 'memcache' module, " "do you have python-memcached installed for python %s? " "This feature is not required but greatly improves performance.\n" % sys.version_info.major) optional += 1 # Test for python-ldap try: import ldap except ImportError: sys.stderr.write("[OPTIONAL] Unable to import the 'ldap' module, " "do you have python-ldap installed for python %s? " "Without python-ldap, you will not be able to use " "LDAP authentication in the graphite webapp.\n" % sys.version_info.major) optional += 1 # Test for txamqp try: import txamqp except ImportError: sys.stderr.write("[OPTIONAL] Unable to import the 'txamqp' module, " "this is required if you want to use AMQP as an input to Carbon. " "Note that txamqp requires python 2.5 or greater.\n") optional += 1 # Test for python-rrdtool try: import rrdtool except ImportError: sys.stderr.write("[OPTIONAL] Unable to import the 'python-rrdtool' module, this is required for reading RRD.\n") optional += 1 # Test for whitenoise try: import whitenoise except ImportError: sys.stderr.write("[OPTIONAL] Unable to import the 'whitenoise' module. This is useful for serving static files.\n") optional += 1 # Test for pyhash try: import pyhash except ImportError: sys.stderr.write("[OPTIONAL] Unable to import the 'pyhash' module. This is useful for fnv1_ch hashing support.\n") optional += 1 if optional: sys.stderr.write("%d optional dependencies not met. Please consider the optional items before proceeding.\n" % optional) else: print("All optional dependencies are met.") if required: sys.stderr.write("%d necessary dependencies not met. Graphite will not function until these dependencies are fulfilled.\n" % required) sys.exit(1) else: print("All necessary dependencies are met.") # suppress unused-import warnings __all__ = [ 'whisper', 'ceres', 'cairo', 'django', 'pytz', 'pyparsing', 'tagging', 'memcache', 'ldap', 'txamqp', 'rrdtool', 'whitenoise', 'pyhash', ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5934644 graphite-web-1.1.10/conf/0000755000000000000000000000000000000000000015034 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/conf/dashboard.conf.example0000664000000000000000000000354300000000000021273 0ustar00rootroot00000000000000# This configuration file controls the behavior of the Dashboard UI, available # at http://my-graphite-server/dashboard/. # # This file must contain a [ui] section that defines values for all of the # following settings. [ui] default_graph_width = 400 default_graph_height = 250 automatic_variants = true refresh_interval = 60 autocomplete_delay = 375 merge_hover_delay = 750 # You can set this 'default', 'white', or a custom theme name. # To create a custom theme, copy the dashboard-default.css file # to dashboard-myThemeName.css in the content/css directory and # modify it to your liking. theme = default [keyboard-shortcuts] toggle_toolbar = ctrl-z toggle_metrics_panel = ctrl-space erase_all_graphs = alt-x save_dashboard = alt-s completer_add_metrics = alt-enter completer_del_metrics = alt-backspace give_completer_focus = shift-space # These settings apply to the UI as a whole, all other sections in this file # pertain only to specific metric types. # # The dashboard presents only metrics that fall into specified naming schemes # defined in this file. This creates a simpler, more targeted view of the # data. The general form for defining a naming scheme is as follows: # #[Metric Type] #scheme = basis.path... #field1.label = Foo #field2.label = Bar # # # Where each will be displayed as a dropdown box # in the UI and the remaining portion of the namespace # shown in the Metric Selector panel. The .label options set the labels # displayed for each dropdown. # # For example: # #[Sales] #scheme = sales... #channel.label = Channel #type.label = Product Type #brand.label = Brand # # This defines a 'Sales' metric type that uses 3 dropdowns in the Context Selector # (the upper-left panel) while any deeper metrics (per-product counts or revenue, etc) # will be available in the Metric Selector (upper-right panel). ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/conf/graphTemplates.conf.example0000664000000000000000000000461500000000000022325 0ustar00rootroot00000000000000[default] background = white foreground = black minorLine = grey majorLine = rose lineColors = blue,green,red,purple,brown,yellow,aqua,grey,magenta,pink,gold,rose fontName = Sans fontSize = 10 fontBold = False fontItalic = False [solarized-light] background = #fdf6e3 foreground = #657b83 majorLine = #073642 minorLine = #586e75 lineColors = 268bd2aa,859900aa,dc322faa,d33682aa,db4b16aa,b58900aa,2aa198aa,6c71c4aa fontName = Sans fontSize = 10 fontBold = False fontItalic = False [solarized-dark] background = #002b36 foreground = #839496 majorLine = #fdf6e3 minorLine = #eee8d5 lineColors = 268bd2aa,859900aa,dc322faa,d33682aa,db4b16aa,b58900aa,2aa198aa,6c71c4aa fontName = Sans fontSize = 10 fontBold = False fontItalic = False [classic] background = black foreground = white majorLine = white minorLine = grey lineColors = blue,green,red,purple,brown,yellow,aqua,grey,magenta,pink,gold,rose fontName = Sans fontSize = 10 fontBold = False fontItalic = False [noc] background = black foreground = white majorLine = white minorLine = grey lineColors = blue,green,red,yellow,purple,brown,aqua,grey,magenta,pink,gold,rose fontName = Sans fontSize = 10 fontBold = False fontItalic = False [summary] background = black lineColors = #6666ff, #66ff66, #ff6666 [alphas] background = white foreground = black majorLine = grey minorLine = rose lineColors = 00ff00aa,ff000077,00337799 [grafana] background = white foreground = black minorLine = grey majorLine = rose lineColors = #7eb26d,#eab839,#6ed0e0,#ef843c,#e24d42,#1f78c1,#ba43a9,#705da0,#508642,#cca300,#447ebc fontName = Sans fontSize = 10 fontBold = False fontItalic = False [ocean1] lineColors = f7fcf0,e0f3db,ccebc5,a8ddb5,7bccc4,4eb3d3,2b8cbe,0868ac,084081 [ocean2] lineColors = 084081,0868ac,2b8cbe,4eb3d3,7bccc4,a8ddb5,ccebc5,e0f3db,f7fcf0 [forest1] lineColors = f7fcf5,e5f5e0,c7e9c0,a1d99b,74c476,41ab5d,238b45,005a32 [forest2] lineColors = 005a32,238b45,41ab5d,74c476,a1d99b,c7e9c0,e5f5e0,f7fcf5 [sunset1] lineColors = fff5eb,fee6ce,fdd0a2,fdae6b,fd8d3c,f16913,d94801,8c2d04 [sunset2] lineColors = 8c2d04,d94801,f16913,fd8d3c,fdae6b,fdd0a2,fee6ce,fff5eb [moonlight1] lineColors = fcfbfd,efedf5,dadaeb,bcbddc,9e9ac8,807dba,6a51a3,4a1486 [moonlight2] lineColors = 4a1486,6a51a3,807dba,9e9ac8,bcbddc,dadaeb,efedf5,fcfbfd [lava1] lineColors = fff5f0,fee0d2,fcbba1,fc9272,fb6a4a,ef3b2c,cb181d,99000d [lava2] lineColors = 99000d,cb181d,ef3b2c,fb6a4a,fc9272,fcbba1,fee0d2,fff5f0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/conf/graphite.wsgi.example0000775000000000000000000000036400000000000021174 0ustar00rootroot00000000000000import sys # In case of multi-instance graphite, uncomment and set appropriate name # import os # os.environ['GRAPHITE_SETTINGS_MODULE'] = 'graphite.local_settings' sys.path.append('/opt/graphite/webapp') from graphite.wsgi import application ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5854642 graphite-web-1.1.10/distro/0000755000000000000000000000000000000000000015413 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5854642 graphite-web-1.1.10/distro/redhat/0000755000000000000000000000000000000000000016662 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5934644 graphite-web-1.1.10/distro/redhat/misc/0000755000000000000000000000000000000000000017615 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/distro/redhat/misc/postinstall0000664000000000000000000000170500000000000022121 0ustar00rootroot00000000000000#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH GRAPHITE_PATH=/opt/graphite CONFFILES="graphite.wsgi" for i in $CONFFILES; do if [ ! -f ${GRAPHITE_PATH}/conf/$i ]; then echo "No pre-existing $i - creating from example." cp ${GRAPHITE_PATH}/conf/$i.example ${GRAPHITE_PATH}/conf/$i fi done if [ ! -f /etc/httpd/conf.d/graphite.conf ]; then cat <<-EOF --IMPORTANT-- Graphite VirtualHost configuration not found in default location. Graphite won't work without it. See sources for an example vhost configuration for WSGI! This script will now attempt to install the vHost file needed. --IMPORTANT-- EOF cp ${GRAPHITE_PATH}/examples/example-graphite-vhost.conf /etc/httpd/conf.d/graphite.conf fi PYTHONPATH=${GRAPHITE_PATH}/webapp/ django-admin.py syncdb --noinput --settings=graphite.settings chown -R apache.apache ${GRAPHITE_PATH}/storage chown -R apache.apache ${GRAPHITE_PATH}/webapp ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5934644 graphite-web-1.1.10/examples/0000755000000000000000000000000000000000000015725 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/examples/example-client.py0000664000000000000000000000377500000000000021224 0ustar00rootroot00000000000000#!/usr/bin/python """Copyright 2008 Orbitz WorldWide Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.""" import sys import time import os import platform import subprocess from socket import socket CARBON_SERVER = '127.0.0.1' CARBON_PORT = 2003 delay = 60 if len(sys.argv) > 1: delay = int( sys.argv[1] ) def get_loadavg(): # For more details, "man proc" and "man uptime" if platform.system() == "Linux": return open('/proc/loadavg').read().strip().split()[:3] else: command = "uptime" process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) os.waitpid(process.pid, 0) output = process.stdout.read().replace(',', ' ').strip().split() length = len(output) return output[length - 3:length] sock = socket() try: sock.connect( (CARBON_SERVER,CARBON_PORT) ) except Exception: print("Couldn't connect to %(server)s on port %(port)d, is carbon-agent.py running?" % { 'server': CARBON_SERVER, 'port': CARBON_PORT }) sys.exit(1) while True: now = int( time.time() ) lines = [] #We're gonna report all three loadavg values loadavg = get_loadavg() lines.append("system.loadavg_1min %s %d" % (loadavg[0],now)) lines.append("system.loadavg_5min %s %d" % (loadavg[1],now)) lines.append("system.loadavg_15min %s %d" % (loadavg[2],now)) message = '\n'.join(lines) + '\n' #all lines must end in a newline print("sending message\n") print('-' * 80) print(message) print() sock.sendall(message) time.sleep(delay) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/examples/example-graphite-vhost.conf0000664000000000000000000000646100000000000023202 0ustar00rootroot00000000000000# Enable virtualhosts, perhaps by adding this to your server's config somewhere, # probably the main httpd.conf # NameVirtualHost *:80 # This line also needs to be in your server's config. # LoadModule wsgi_module modules/mod_wsgi.so # You need to manually edit this file to fit your needs. # This configuration assumes the default installation prefix # of /opt/graphite/, if you installed graphite somewhere else # you will need to change all the occurrences of /opt/graphite/ # in this file to your chosen install location. LoadModule wsgi_module modules/mod_wsgi.so # XXX You need to set this up! # Read http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGISocketPrefix # For example, create a directory /var/run/wsgi and use that. WSGISocketPrefix run/wsgi ServerName graphite DocumentRoot "/opt/graphite/webapp" ErrorLog /opt/graphite/storage/log/webapp/error.log CustomLog /opt/graphite/storage/log/webapp/access.log common # I've found that an equal number of processes & threads tends # to show the best performance for Graphite (ymmv). WSGIDaemonProcess graphite processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120 WSGIProcessGroup graphite WSGIApplicationGroup %{GLOBAL} WSGIImportScript /opt/graphite/conf/graphite.wsgi process-group=graphite application-group=%{GLOBAL} # XXX You will need to create this file! There is a graphite.wsgi.example # file in this directory that you can safely use, just copy it to graphite.wgsi WSGIScriptAlias / /opt/graphite/conf/graphite.wsgi # XXX To serve static files, either: # * Install the whitenoise Python package (pip install whitenoise) # * Collect static files in a directory by running: # django-admin.py collectstatic --noinput --settings=graphite.settings # And set an alias to serve static files with Apache: Alias /static/ /opt/graphite/static/ ######################## # URL-prefixed install # ######################## # If using URL_PREFIX in local_settings for URL-prefixed install (that is not located at "/")) # your WSGIScriptAlias line should look like the following (e.g. URL_PREFX="/graphite" # WSGIScriptAlias /graphite /srv/graphite-web/conf/graphite.wsgi/graphite # Alias /graphite/static /opt/graphite/webapp/content # # SetHandler None # # XXX In order for the django admin site media to work you # must change @DJANGO_ROOT@ to be the path to your django # installation, which is probably something like: # /usr/lib/python2.6/site-packages/django Alias /media/ "@DJANGO_ROOT@/contrib/admin/media/" # The graphite.wsgi file has to be accessible by apache. It won't # be visible to clients because of the DocumentRoot though. Order deny,allow Allow from all = 2.4> Require all granted ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1653243713.665464 graphite-web-1.1.10/setup.cfg0000664000000000000000000000231200000000000015730 0ustar00rootroot00000000000000[bdist_rpm] requires = Django => 1.8 django-tagging carbon whisper ceres mod_wsgi pycairo pycairo-devel python-hashlib pytz pyparsing scandir;python_version<"3.5" post-install = distro/redhat/misc/postinstall provides = graphite obsoletes = graphite <= 0.9.9 [flake8] exclude = .tox per-file-ignores = webapp/graphite/util.py:E111,E114 webapp/graphite/browser/views.py:E111,E114 webapp/graphite/metrics/views.py:E111,E114 webapp/graphite/dashboard/views.py:E111,E114 webapp/graphite/render/evaluator.py:E111,E114 webapp/graphite/render/functions.py:E111,E114 webapp/graphite/render/datalib.py:E111,E114 webapp/graphite/render/glyph.py:E111,E114 webapp/graphite/render/views.py:E111,E114 webapp/tests/test_tags.py:E111,E114 webapp/tests/test_storage.py:E111,E114 webapp/tests/test_render_glyph.py:E111,E114 webapp/tests/test_render_datalib.py:E111,E114 webapp/tests/test_finders_remote.py:E111,E114 contrib/memcache_whisper.py:E111,E114 ignore = E121, E126, E128, E201, E202, E203, E221, E222, E225, E226, E231, E241, E251, E261, E262, E265, E266, E501, W504, E701, E731, [install] prefix = /opt/graphite install-lib = %(prefix)s/webapp [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/setup.py0000664000000000000000000001147400000000000015632 0ustar00rootroot00000000000000#!/usr/bin/env python from __future__ import with_statement import os try: from ConfigParser import ConfigParser, DuplicateSectionError # Python 2 except ImportError: from configparser import ConfigParser, DuplicateSectionError # Python 3 from glob import glob from collections import defaultdict # io.StringIO is strictly unicode only. Python 2 StringIO.StringIO accepts # bytes, so we'll conveniently ignore decoding and reencoding the file there. try: from StringIO import StringIO # Python 2 except ImportError: from io import StringIO # Python 3 # Graphite historically has an install prefix set in setup.cfg. Being in a # configuration file, it's not easy to override it or unset it (for installing # graphite in a virtualenv for instance). # The prefix is now set by ``setup.py`` and *unset* if an environment variable # named ``GRAPHITE_NO_PREFIX`` is present. # While ``setup.cfg`` doesn't contain the prefix anymore, the *unset* step is # required for installations from a source tarball because running # ``python setup.py sdist`` will re-add the prefix to the tarball's # ``setup.cfg``. with open('setup.cfg', 'r') as f: orig_setup_cfg = f.read() cf = ConfigParser() cf.readfp(StringIO(orig_setup_cfg), 'setup.cfg') if os.environ.get('GRAPHITE_NO_PREFIX') or os.environ.get('READTHEDOCS'): cf.remove_section('install') else: try: cf.add_section('install') except DuplicateSectionError: pass if not cf.has_option('install', 'prefix'): cf.set('install', 'prefix', '/opt/graphite') if not cf.has_option('install', 'install-lib'): cf.set('install', 'install-lib', '%(prefix)s/webapp') with open('setup.cfg', 'w') as f: cf.write(f) if os.environ.get('USE_SETUPTOOLS'): from setuptools import setup setup_kwargs = dict(zip_safe=0) else: from distutils.core import setup setup_kwargs = dict() storage_dirs = [] for subdir in ('whisper/dummy.txt', 'ceres/dummy.txt', 'rrd/dummy.txt', 'log/dummy.txt', 'log/webapp/dummy.txt'): storage_dirs.append( ('storage/%s' % subdir, []) ) webapp_content = defaultdict(list) for root, dirs, files in os.walk('webapp/content'): for filename in files: filepath = os.path.join(root, filename) webapp_content[root].append(filepath) conf_files = [ ('conf', glob('conf/*.example')) ] examples = [ ('examples', glob('examples/example-*')) ] def read(fname): with open(os.path.join(os.path.dirname(__file__), fname)) as f: return f.read() try: setup( name='graphite-web', version='1.1.10', url='http://graphiteapp.org/', author='Chris Davis', author_email='chrismd@gmail.com', license='Apache Software License 2.0', description='Enterprise scalable realtime graphing', long_description=read('README.md'), long_description_content_type='text/markdown', package_dir={'' : 'webapp'}, packages=[ 'graphite', 'graphite.account', 'graphite.account.migrations', 'graphite.browser', 'graphite.composer', 'graphite.dashboard', 'graphite.dashboard.migrations', 'graphite.events', 'graphite.events.migrations', 'graphite.finders', 'graphite.functions', 'graphite.functions.custom', 'graphite.metrics', 'graphite.readers', 'graphite.render', 'graphite.tags', 'graphite.tags.migrations', 'graphite.url_shortener', 'graphite.url_shortener.migrations', 'graphite.version', 'graphite.whitelist', 'graphite.worker_pool', ], package_data={'graphite' : ['templates/*', 'local_settings.py.example']}, scripts=glob('bin/*'), data_files=list(webapp_content.items()) + storage_dirs + conf_files + examples, install_requires=['Django>=1.8,<3.1', 'django-tagging==0.4.3', 'pytz', 'pyparsing', 'cairocffi', 'urllib3', 'scandir;python_version<"3.5"', 'six'], classifiers=[ 'Intended Audience :: Developers', 'Natural Language :: English', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', ], **setup_kwargs ) finally: with open('setup.cfg', 'w') as f: f.write(orig_setup_cfg) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5894642 graphite-web-1.1.10/webapp/0000755000000000000000000000000000000000000015365 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5854642 graphite-web-1.1.10/webapp/content/0000755000000000000000000000000000000000000017037 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5934644 graphite-web-1.1.10/webapp/content/css/0000755000000000000000000000000000000000000017627 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5974643 graphite-web-1.1.10/webapp/content/css/darkX/0000755000000000000000000000000000000000000020700 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/button-close-focused.png0000775000000000000000000000161000000000000025455 0ustar00rootroot00000000000000‰PNG  IHDR©¥–bKGDÿÿÿ ½§“ pHYs  d_‘tIMEÔ.6è†tEXtCommentCreated By roberTOÑ­íïIDATxÚí”ËkQÅϽsÇLf’Ì$ƤÓW2¶1µV«h…Tu£èJDºp!¸ðOq'¸péVºQ» à ¥[û°)m5I2™43¹×•‚ÚøWâÙ^îsÏ÷Ýü×ßùÙ¡,˺ïû€!$ € !VÌ1Ææ<Ï«®wµRJÓAE9iõôíì4³ªªšàN­¶”_Zš\X\œhµZ78çùßsJiZW” Û³ÙSÇéÙ½sXŠ:„X-–ðäù oâîùÉ™™kv£qߥuz, œHvœMv¤ú)¡#™~$$ ƒs¨Žƒòë×kzѺïu­5½exÇ9o®%@þlÄ8—Kš#´þá 330N>Ç·&PšC”1²Êºí8µ•ºóT¥¶™n±º™¼µ¯¹&m5˜®40ûö ì•E.PªTСGÐÅ<ÏcsT. ÒµñþkzßCûˆdv ÒÕ` Ž]½0´ å2J‰pCfaÊ‘ 0t XiBã?¾)j hèô¸!Ii%pB@„B´¨âyh´ŠHjAµŽØWÑÖilpÀÕÑz ¤€i*Þ/¯„ ³+B“sÌ,€i!ÈZasSmã`¶ñÍòüœF(<Ù€$ì5œ1X[2Øè ö<€Tßfø”¢êµ°F$!ëú3chÛ|»ç Èåž/ 7óÕrfo|“¡ušHmƒT 6 ,¿›­»˜´«Ÿüˆ1¾%—›Â•+íž«ª;w—¢±ë/Ëv¡¡ª¢èû¨1G–QPSñÊq vÒí¹}vlÌýåBË—.eÄÂìqE´N(;d""Lf¿EÊN³ù¬Üfœ¿xqŠÂ»P=|~zÿ^Æ™žê…[‹x®k+ñ¤£X}ó#‡ÏŽŽŽúÜR_äº.©V«@+‘HüC%ýƒ/(©Ik¼üIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/button-maximize-focused.png0000775000000000000000000000156200000000000026201 0ustar00rootroot00000000000000‰PNG  IHDR©¥–bKGDÿÿÿ ½§“ pHYs ¿CfStIMEÔ0l„pêÿIDATxÚíÔßkWðï™{wgÌd7›q71º1‰ Æ@$(­(>(T|úÞA‘Bÿ€¾‰¥ˆÐÇ> ík¡­B*ˆ"[)­£ ¤Y²«nÜüh~ÌìÌììܹ>•¶Á¨-}ÏÓ…î=çܼÿ;Èò)½„!¤ @(„h!,°þ-ZÔ4íL¡P8™ÏçKš3Ú–]¯×ë³µZí†ã8ßxþ¶h1O^è/õŸ;yúxÏØøˆlt&¬66ðËýí[7nWæ+×mÇúz;,¿êÉ”ÒÍ^ó“ÎLŽž’ºŠ1LýúêV#c}H墲øF£¾Òí6½œóyþŸ€²íÖÀ®”™8–> ÷˜%â°E81ûÆáÿâê•RÝŸþœfíöfµb>O:)ëÖªgaenÍj7:¦rløò§>{Hy=*„ ×¾úòÐ3û·Ãñ´r–Åøa•L’dÎÛê¦Ó”žx[ä[3:Z¾xþÒ#B«¿/„@¹|/rçþOÃÁ|É —i;hµ´HÞΰÁGÆOLONN¶ÿË–¸®+Y–E„ÙlV¼;Kú%sÛù7äÑIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/button-minimize-focused.png0000775000000000000000000000150700000000000026176 0ustar00rootroot00000000000000‰PNG  IHDR©¥–bKGDÿÿÿ ½§“ pHYs ¿CfStIMEÔ &³}–xÔIDATxÚíÔÍkuÇñ÷ofvvžº»3»yr7ÙMLP[©Y=(X zÐ =y<(ˆž<ùÁƒÞ  ŃT‹Òª ¦]óÔd“m÷a2û03?/ !6Ö‚Ç~®ß/¾_ø}¿p7ÿwÄmêY |Q6c’Év×b¸tîMAe̲žŸž*?3Q,ÎY¶5!%IÐínnmnþòûõ/aøÅ6þš†JÅq^ypzö̩瞞<±ø°ê²ÈvM–¿¿0üú«oê—®^ý°´ßï‚Õ[<¥êgç‹ã/~¶V>µtR©LeÈ;àÚ’Q/EiÄVÓýžÛÞh{ðzSÆ+Àào@;ÔµÌAiÚµŸZô³“'0Ä1edo ÿzèê ÜoŠÝK¹jÐm?¹½Ûÿ¶ Ý[¡T¾ï¦î›)T3üŽáš@(B( @Ê’;’ÌLÆÚ•uí¡ê.ÅeX==ᨳãjѯ¸|yƒf+UA( H Hd”0>¢3åð¯à÷v´Âr;âH´t¯kŒ•Òf® ³ClD ªHEA@&Åd<7“b¬dXÝ«ósãhTŸ™ëéùN¨Yš½P›@±L„n ÕB€Œ#è‡$aH£Þ$=jia÷¢ÊaT»gî×a:}±)RÚY7’÷ÐòjÞEó\T/´3´†"ŽMó¼Rœ]=hD%@uá‰óMYø|eOßß b";‡ðFn‘o”ÈɱD¬¶Ò[-i}P]xüâ¿þÓ?ýL.~± †åv°_¦¤†uL#C_jìµêkÛýßVÂõ­Ná“aöÑ^~õõ›·Ý()%ï¾sn±wã‡ùl!õ‚éÄ †;R¢ ú°èº7xO±Ž/¿öÆ›+wzPxûÜ[Ç[7,ÇÑzZ(Šj˜~ä8ó‹-ýT«Õ’»7ùùÒȵ¢äŠKIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/frame-bottom-left-focused.png0000775000000000000000000000021600000000000026364 0ustar00rootroot00000000000000‰PNG  IHDR[6ÅøbKGDÿÿÿ ½§“ pHYsÁÁÃiTStIMEÔ$_0ö`IDATxÚc”‘‘ùÏ€X˜0YXX0QÈm e IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/frame-bottom-mid-focused.png0000775000000000000000000000021600000000000026203 0ustar00rootroot00000000000000‰PNG  IHDR[6ÅøbKGDÿÿÿ ½§“ pHYsÁÁÃiTStIMEÔ%$þ–b.IDATxÚc”‘‘ùÏ€X˜0YXX0QÈm e IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/frame-bottom-right-focused.png0000775000000000000000000000021600000000000026547 0ustar00rootroot00000000000000‰PNG  IHDR[6ÅøbKGDÿÿÿ ½§“ pHYsÁÁÃiTStIMEÔ$$çSoIDATxÚc”‘‘ùÏ€X˜0YXX0QÈm e IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/frame-left-focused.png0000775000000000000000000000021600000000000025062 0ustar00rootroot00000000000000‰PNG  IHDR€qV¢bKGDÿÿÿ ½§“ pHYsÁÁÃiTStIMEÔ'êy0IDATxÚcTRTüÿçφÿÿ301 "9©T]orá(IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/frame-right-focused.png0000775000000000000000000000021600000000000025245 0ustar00rootroot00000000000000‰PNG  IHDR€qV¢bKGDÿÿÿ ½§“ pHYsÁÁÃiTStIMEÔ'0ÖzÔÑIDATxÚc”‘‘ùÏÄÈÈÀÂÂÂÀÄ€ˆäVvmÏqÛ¾IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/titlebar-left-focused.png0000775000000000000000000000026400000000000025601 0ustar00rootroot00000000000000‰PNG  IHDRêì*bKGDÿÿÿ ½§“ pHYsˆœ/–žtIMEÔk×VAIDATxڵ˹À@CQ3ÍÓ$P8plE» ßè“»?ÿQwIf.¨ªŽ…ôÎ ‰ÈUb^¼T‰7!™ÐµÚÍþº÷yIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/darkX/titlebar-mid-focused.png0000775000000000000000000000025700000000000025422 0ustar00rootroot00000000000000‰PNG  IHDR0SbKGDÿÿÿ ½§“ pHYs  šœtIMEÔ-Ç[–;³8>²8=±8>±8=¯7<¬6<«6:¨5:¦49¥40‰+.…**y&(s$&l"$i!#f Y?·:@·:<­7;ª6:§59¤48¡3*w&"a9¡48ž32Œ-=¬88œ3>©87•2-~*.{*.y*3‡/:’5'm".ƒ):3+s&>¥8?¥9>—8.q*K¬EV­PT¢LSŸKYªQY©RTžMh­bW¦No¡hb¤Ws¢kŽÃ…•¿Ž_·O~Âr‚µwÀ”]£B\ŸB] Dv²`­Ôž]¡AP†:`šF„°p™¾‰©ËšcGbœGj¢NgžM‚¯lŒ´xŒ³y–¿ƒ˜Á…j¡Mm£Qs¨W™¾†pªM‘¾w¥ÌÂã¯s­Or¬N{²X~´\€µ^„¹bŒ¼m¨ÎªÈ—¸×¤;Y%¬Ï”Xq;fFxŒ_DP&rZnW£‡J¢†JîvêyøvïÝdáhÿÿ†!ÿwæw!ëŠ@þÖ¸«Hôcõ¨r½M±Q¶WÈd%Ëk-Ís8ÿ’M÷µöµþÍ®¹D¹E¸E¼B»Bÿÿÿÿÿÿ!ù•,Ó+ XéÂ@ 4@`…•0 Ì á n8Pi †„qA JÖ DÍ€ l#Í2IdðG Å 0j€1#Æ(AZ°È¡Cˆ6eÆ,á‘…K—’ÈÆËX¶DyâA Mìø‚ä†•)R蚉à Dt\ÑÒ¤Ž"F%"¨@‘*Tœj´ÈO@¢HÑãÇŒIŽ(iÎ#)á *Ä= Vú ÑŸ;z ©ha$I©+;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/close.gif0000775000000000000000000000176400000000000023064 0ustar00rootroot00000000000000GIF89a÷Ÿ#$¥)*¥*+}%&ß´µKMp=?n=?^78\67ܰ²Þ´µZY“&,KGu%*u&*LN ‰5:‰6:Q@AiUVhUV®›œ­›œV@B?34=23ž”•ÔËÌMEFŽŽŒ“9-€NFNF‹XQʈö­£ùµªâ¤šù¶¬ŸC8©H=¨H=«NB«NC«`Xú“úž”ú¡—ú¤™ú¨ŸÍŠƒú«¡õ© ßŸ—|ƒˆ%›/%š.%›1'¦8/¦9/ÖSIÒUKÎUKâh]åi_Ûqhßwo¯d]‡UPï˜ð›“Œb^‡_[•ˆ‡”ˆ‡n u v  ˆ‡‚Ã9/ª1)À80ª1*.)ÊB;“1,ÉJAÌKDÒQHÏZRÜcZàe\ÚaZÖ`YÅc]Åc^ØohØpi¡($ž)$ÄA;ÇVQ³%#±&#´(%·)& $$ƒ7687#"Ž{{{{vv™˜œ••ÖÍÍ›••åÞÞæàà877ÃÁÁËÊÊÂÁÁ„ƒƒƒ‚‚ÊÊʽ½½¼¼¼ŽŽŽvvv<<<ÿÿÿ!ù’,Ñ% lôR¤H5ÈÐQ¡}üüé¢#†#ôdÐb¡@0ä!©‘‡( °@Á€:0R4¡‚*ZÖ¨ÑBÅŠ ‰.D°3çJ•,Xª\‘@ètãƒc¶Ôqð 8dÌéÑÈ™"`08àå’!?„ùA$‰.ø¼Ió‚D‹4ZpÆÍCxâ°QãF1””¹ƒHÒ‡/mœèPÁ"Å“%a>0ÔDŠ+p09!ˆ¡ÀCS¢˜(EÊ"†;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/inspect.gif0000775000000000000000000000105400000000000023414 0ustar00rootroot00000000000000GIF89aætv‡°åù°ÆÐ„‡™¸‡\æçíÞÀ—æÿýÁ´‹ÌÏ×Íäì‚~Ž¢¬éìñÌÌ̧ÛìŸovÐóþùèÈò¸_ü⪠³È¹ÏÞ¶òÿ¡€Gÿÿÿ™™™ÎÙèƒqs‰—æÿõ¸×鬲ÂÂåößøÿ¾ÅÑâææÅÑÞÉëõöùÿÆ{X¿æòœ¦·ÖØß‰’­üâĘ’¢€•¡«µ÷øøÁ‚LÙÚÏû籘w|²Ûï–§º¿èûÖþÿññòÇõþÓîõÞßä¼ÈÚîÿÿxyƒ³¿ËˆuŽ­Þ÷¡ut½÷ÿ™™™ÑÛâ´¶»ÃÃÈŸ¬ÞýÿÅïþÑ×ÙðµjÌÿÿìÿúºÕéÅÓݽã÷¢¥±ïï÷ÿÿÿ!ùW,‰€W‚ƒ„…‚ >B+†‚$7R8M"H †1 ;8@% …KL99T! N…I*@L;)S…J@@9F6…:A#§M:… <&,?†=..0U4Ž1Î1/E2O-ÎŽWC5(Oï‚ ÷.?føtâ„ @;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/maximize.gif0000775000000000000000000000200000000000000023562 0ustar00rootroot00000000000000GIF89a÷,(,+',ãçæÕÙÖÔØÕ«²¬~œ€I[Jœ€dcX¬È¬¬²¬jmjkmkåçåÅÆÅ¡¢¡cb7p67o5­É¬KGJ[IL‚G,C*.E*QVP"M¤¨£mJ‹7K‹8VuMr#?VpMÇÛÀŽ—‹$@Ž–‹$y$x&QN—.P–/i£Nj£OÉÜÀ¤¨¢*y*xXzE/xb6;„:€cœ7a†<_„;ž¥—¢£¡j¤,k£.ˆ¸Uˆ¹VK‹IŠKŠfªe¨h© ž¤—bžl«bšb™f‘/ÃN“¾_”½^r§*‚»0s§+’ÈF’ÆG”ÆO¢×W£×XœÎU®ßi°ák­Þi¤Óe°àm¯Þl½îz»êy¼êz¸çyºçy¶âwÆó†ÉøŠËúŒÉõ‰|˜UwSÇðz³ „»0„¹0l•/›ÊS’·X˜½]Óü“ÌóŽx±„¸0Öü”Öùœˆœe„—c‚§=‚¦=y“GØøx‘F¸Õ}»ÕƒÌå’áû¥Ðç–âû¤§¨£ÐÐÏÆÆÅìììéééèèèçççæææãããÒÒÒÅÅÅÃÃÜœœ›››ššš’’’‰‰‰‡‡‡YYYXXXLLLKKKDDDCCC???ÿÿÿ!ù¤,ÝI œ´ÉÓ¨QŸ6MȰ¨Nš$üÐÄ)T%†—8h@@„°DŠ’¨œ°aCÆDQÊ´AŒ!R,ˆ"$˜:TxOž â¼9âÂB‡!’(QãÆ $0‘ÂÃ*,t1b„HŽpp´0䊖0f–,!Ó%‹ #T8™Ãe š)UÒˆ³¥ Š= œYcç=jÊ`á±(ÒŒ'_ÜìAd(Ð/rfD"õ(Q:ƒ "T‡Í‡G !)RÒG >>$AbȰ£FÀñ;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/minimize.gif0000775000000000000000000000177700000000000023604 0ustar00rootroot00000000000000GIF89a÷wTU¡ˆ‰X*-—gj–gj2j;?XKLb:>ÿû”ÜÖ{ÿù“ü÷—ìçÿû ÿú¡ÃºT˜’BÛÓxüõ” œaíç’ÿõøí‰ÿõŽš•`¿²QÿðŠÿíƒÿî‰øç‡¤¢–ÿê‚êÐdÿæ ‘T¥¢–äÆ_ÿàrûØnÿÞqýÛqÿÝsÿÞzÿà{ŒR°Œ)ÿÛs¡r qžr¬‡)ÿÒ`ÿÑbÿÓbÿÓc¡qÿÈNøÂMêºI¡j¡mì£ ê¢ õ­ ï«"î«#ï®,úº?÷½MèµIä—ä™èœòª"ð¬,ø·<æ˜ÒÐé³Zê´[ê´]êµ]ª§¢«¨£]_œ_Ü•-Ù“-§{;¨|<æªTä©T¡\¡^×3XÕ3­¨¢œTÔ†.Ôƒ.דLðÚÃïÚÄÈÆÄšIÆz5Äz5î×Á™GîÖÁ£”Š—iLâÀ«@@šiNãÀ¬¿oF½oG¥”‹‰‡†ÈÆÅŸS.®\5Ç‘~È‘~+~)w-"’PF˜‘‰4)–QHVKJâ×ÖË­«xPO[CBZCBW))xPPxWW¡ˆˆ´¡¡³¡¡˜‘‘íååìääž››žœœœšš‰‡‡ÑÐÐìììêêêéééèèèæææÒÒÒÄÄÄÃÃÃÿÿÿ!ù¥,ÜK µé@‰øŒÈ0S#(M’ÉQ&†š X¤ÈÒ%E‹ÀTŠ‚B€ð¼Q“&@ˆ 2D(š.Q¦HâžC• ù9sä‡%C‚ø@bæ£AnšÀ)cË•+bØ$i#ÈÎ%_xà#F0@ÂÔ™£…I/V°Pa#‘,wä<)R…ˆ@˜¸¡ÃÉž>[ŒœaaA Rìದ™%dˆ Q¡\ ÕéÓ'OŸ\;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/overlay.png0000775000000000000000000000540200000000000023450 0ustar00rootroot00000000000000‰PNG  IHDR 2Ͻ pHYs  šœ MiCCPPhotoshop ICC profilexÚSwX“÷>ß÷eVBØð±—l"#¬ÈY¢’a„@Å…ˆ VœHUÄ‚Õ Hˆâ (¸gAŠˆZ‹U\8îܧµ}zïííû×û¼çœçüÎyÏ€&‘æ¢j9R…<:ØOHÄɽ€Hà æËÂgÅðyx~t°?ü¯opÕ.$ÇáÿƒºP&W ‘à"ç RÈ.TÈȰS³d ”ly|B"ª ìôI>Ø©“ÜØ¢©™(G$@»`UR,À ¬@".À®€Y¶2G€½vŽX@`€™B,Ì 8CÍ L 0Ò¿à©_p…¸HÀ˕͗KÒ3¸•Ðwòðàâ!âÂl±Ba)f ä"œ—›#HçLÎ ùÑÁþ8?çæäáæfçlïôÅ¢þkðo">!ñßþ¼ŒNÏïÚ_ååÖpǰu¿k©[ÚVhßù]3Û  Z Ðzù‹y8ü@ž¡PÈ< í%b¡½0ã‹>ÿ3áoà‹~öü@þÛzðqš@™­À£ƒýqanv®RŽçËB1n÷ç#þÇ…ýŽ)Ñâ4±\,ŠñX‰¸P"MÇy¹R‘D!É•âé2ñ–ý “w ¬†OÀN¶µËlÀ~î‹XÒv@~ó-Œ ‘g42y÷“¿ù@+Í—¤ã¼è\¨”LÆD *°A Á¬ÀœÁ¼ÀaD@ $À<Bä€ ¡–ATÀ:ص° šá´Á18 çà\ëp`žÂ¼† AÈa!:ˆbŽØ"ΙŽ"aH4’€¤ éˆQ"ÅÈr¤©Bj‘]H#ò-r9\@úÛÈ 2ŠüмG1”²QÔu@¹¨ŠÆ sÑt4]€–¢kÑ´=€¶¢§ÑKèut}ŠŽc€Ñ1fŒÙa\Œ‡E`‰X&ÇcåX5V5cX7vÀžaï$‹€ì^„Âl‚GXLXC¨%ì#´ºW ƒ„1Â'"“¨O´%zùÄxb:±XF¬&î!!ž%^'_“H$É’äN !%2I IkHÛH-¤S¤>ÒiœL&ëmÉÞä²€¬ —‘·O’ûÉÃä·:ňâL ¢$R¤”J5e?奟2B™ ªQÍ©žÔªˆ:ŸZIm vP/S‡©4uš%Í›Cˤ-£ÕКigi÷h/étº ݃E—ЗÒkèéçéƒôw † ƒÇHb(k{§·/™L¦Ó—™ÈT0×2™g˜˜oUX*ö*|‘Ê•:•V•~•çªTUsU?Õyª T«U«^V}¦FU³Pã© Ô«Õ©U»©6®ÎRwRPÏQ_£¾_ý‚úc ²†…F †H£Tc·Æ!Æ2eñXBÖrVë,k˜Mb[²ùìLvûv/{LSCsªf¬f‘fæqÍƱàð9ÙœJÎ!Î Î{--?-±Öj­f­~­7ÚzÚ¾ÚbírííëÚïup@,õ:m:÷u º6ºQº…ºÛuÏê>Ócëyé õÊõéÝÑGõmô£õêïÖïÑ7046l18cðÌcèk˜i¸Ñð„á¨Ëhº‘Äh£ÑI£'¸&î‡gã5x>f¬ob¬4ÞeÜkVyVõV׬IÖ\ë,ëmÖWlPW› ›:›Ë¶¨­›­Äv›mßâ)Ò)õSnÚ1ìüì ìšìí9öaö%ömöÏÌÖ;t;|rtuÌvlp¼ë¤á4éĩÃéWgg¡só5¦KË—v—Sm§Š§nŸzË•åîºÒµÓõ£›»›Ü­ÙmÔÝÌ=Å}«ûM.›É]Ã=ïAôð÷XâqÌã§›§Âóç/^v^Y^û½O³œ&žÖ0mÈÛÄ[à½Ë{`:>=eúÎé>Æ>ŸzŸ‡¾¦¾"ß=¾#~Ö~™~üžû;úËýø¿áyòñN`Áå½³k™¥5»/ >B Yr“oÀòùc3Üg,šÑÊZú0Ì&LÖކÏß~o¦ùLé̶ˆàGlˆ¸i™ù})*2ª.êQ´Stqt÷,Ö¬äYûg½Žñ©Œ¹;Ûj¶rvg¬jlRlc웸€¸ª¸x‡øEñ—t$ í‰äÄØÄ=‰ãsçlš3œäšT–tc®åÜ¢¹æéÎËžwç|þü/÷„óû%ÒŸ3gAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚb´>ÝÓÀ@`b Œ*¤ŽBÿÿ]*&<ƒhIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/resize.gif0000775000000000000000000000021200000000000023243 0ustar00rootroot00000000000000GIF89a³ÿÿÿéééÜÜÜÛÛÛÚÚÚÙÙÙ×××ÕÕÕ‡‡‡ÿÿÿ!ù ,7°ÈIk8k}·ÇÝ— @( H)b¨bûÂ^ᤙ7Jï7ÂMÇ{ g¦C0H;œBtùÒ­";././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/sizer.gif0000775000000000000000000000031100000000000023076 0ustar00rootroot00000000000000GIF89a Äÿÿÿðððìì쬬¬©©©§§§¥¥¥£££¢¢¢¡¡¡   ŸŸŸ˜˜˜ŽŽŽ………|||tttÿÿÿ!ù, Fà!Ž¢"œ¨˜é¹p¼2 ,­‹çwm/¾Ù®u´·ÖC58T+ÔÒHœ¦‚àUu€0ÆhÂ~8 Ä ;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/top_left.gif0000775000000000000000000000054600000000000023570 0ustar00rootroot00000000000000GIF89a ÕóóóòòòñññïïïíííëëëêêêéééèèèçççæææäääãããâââáááàààßßßÞÞÞÝÝÝÜÜÜÛÛÛÙÙÙ×××ÖÖÖÕÕÕÔÔÔÓÓÓÑÑÑÏÏÏÎÎÎÌÌÌËËËÊÊÊÅÅÅÃÃÃÀÀÀ»»»···³³³¯¯¯¬¬¬©©©§§§¥¥¥£££ŒŒŒÿÿÿ!ù., ƒ@—P8éŒFÉÈ#9 „–% \“PÄJ(\¢K÷P(&„a6w.D¹=¢”xü(ÃX0þ# ƒ„ #‰Š‰#ŽŽ#“”“u˜™$ž%¢£¢&©ª'­®­(²³²)·¸*½¾½+ ÂÃÂ,-ÇÈÇA;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/top_mid.gif0000775000000000000000000000022500000000000023401 0ustar00rootroot00000000000000GIF89aÄùùùïïïèèèæææäääãããâââàààßßßÝÝÝÛÛÛÙÙÙ×××ÖÖÖÓÓÓÑÑÑÏÏÏÌÌÌÊÊÊÀÀÀŒŒŒÿÿÿ!ù,àÂ`…q ‰²0ó@‘D…;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default/top_right.gif0000775000000000000000000000054500000000000023752 0ustar00rootroot00000000000000GIF89a ÕùùùóóóòòòñññïïïíííëëëêêêéééèèèçççæææäääãããâââáááàààßßßÞÞÞÝÝÝÜÜÜÛÛÛÙÙÙ×××ÖÖÖÕÕÕÔÔÔÓÓÓÑÑÑÏÏÏÎÎÎÌÌÌËËËÊÊÊÅÅÅÃÃÃÀÀÀ»»»···³³³¯¯¯¬¬¬©©©§§§¥¥¥£££ŒŒŒÿÿÿ!ù/, ‚@ÉCy Ää3* ƒ€ "º†T"*. l3z}¿‰Cd>+Œ‡A§ƒ+¤†^ÏhhH‚$‡ˆ‡$ŒŒ$‘’‘$–—–$›œ›% ¡ &¥¦'«¬«(°±°)µ¶*»¼»+!ÀÁÀ,.ÅÆÅ-A;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/default.css0000664000000000000000000000522300000000000021771 0ustar00rootroot00000000000000.overlay_dialog { background-color: #666666; filter:alpha(opacity=60); -moz-opacity: 0.6; opacity: 0.6; } .overlay___invisible__ { background-color: #666666; filter:alpha(opacity=0); -moz-opacity: 0; opacity: 0; } .dialog_nw { width: 9px; height: 23px; background: transparent url(default/top_left.gif) no-repeat 0 0; } .dialog_n { background: transparent url(default/top_mid.gif) repeat-x 0 0; height: 23px; } .dialog_ne { width: 9px; height: 23px; background: transparent url(default/top_right.gif) no-repeat 0 0; } .dialog_e { width: 2px; background: transparent url(default/center_right.gif) repeat-y 0 0; } .dialog_w { width: 2px; background: transparent url(default/center_left.gif) repeat-y 0 0; } .dialog_sw { width: 9px; height: 19px; background: transparent url(default/bottom_left.gif) no-repeat 0 0; } .dialog_s { background: transparent url(default/bottom_mid.gif) repeat-x 0 0; height: 19px; } .dialog_se { width: 9px; height: 19px; background: transparent url(default/bottom_right.gif) no-repeat 0 0; } .dialog_sizer { width: 9px; height: 19px; background: transparent url(default/sizer.gif) no-repeat 0 0; cursor:se-resize; } .dialog_close { width: 14px; height: 14px; background: transparent url(default/close.gif) no-repeat 0 0; position:absolute; top:5px; left:8px; cursor:pointer; z-index:2000; } .dialog_minimize { width: 14px; height: 15px; background: transparent url(default/minimize.gif) no-repeat 0 0; position:absolute; top:5px; left:28px; cursor:pointer; z-index:2000; } .dialog_maximize { width: 14px; height: 15px; background: transparent url(default/maximize.gif) no-repeat 0 0; position:absolute; top:5px; left:49px; cursor:pointer; z-index:2000; } .dialog_title { float:left; height:14px; font-family: Tahoma, Arial, sans-serif; font-size:12px; text-align:center; width:100%; color:#000; } .dialog_content { overflow:auto; color: #DDD; font-family: Tahoma, Arial, sans-serif; font-size: 10px; /* background-color:#123; */ background:#5E5148; } .top_draggable, .bottom_draggable { cursor:move; } .status_bar { font-size:12px; } .status_bar input{ font-size:12px; } .wired_frame { display: block; position: absolute; border: 1px #000 dashed; } /* DO NOT CHANGE THESE VALUES*/ .dialog { display: block; position: absolute; } .dialog table.table_window { border-collapse: collapse; border-spacing: 0; width: 100%; margin: 0px; padding:0px; } .dialog table.table_window td , .dialog table.table_window th { padding: 0; } .dialog .title_window { -moz-user-select:none; } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/css/table.css0000664000000000000000000000202600000000000021432 0ustar00rootroot00000000000000body { color: #4f6b72; background: #E6EAE9; } a { color: #c75f3e; } .g_canvas { border-right: 1px solid #C1DAD7; border-bottom: 1px solid #C1DAD7; background: #fff; color: #4f6b72; } #title { font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; color: #4f6b72; border-right: 1px solid #C1DAD7; border-bottom: 1px solid #C1DAD7; border-top: 1px solid #C1DAD7; letter-spacing: 2px; text-transform: uppercase; text-align: left; padding: 6px 6px 6px 12px; background: #CAE8EA; } .styledtable th { font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; color: #4f6b72; border-right: 1px solid #C1DAD7; border-bottom: 1px solid #C1DAD7; border-top: 1px solid #C1DAD7; letter-spacing: 2px; text-transform: uppercase; text-align: left; padding: 6px 6px 6px 12px; background: #CAE8EA; } .styledtable td { border-right: 1px solid #C1DAD7; border-bottom: 1px solid #C1DAD7; background: #fff; padding: 6px 6px 6px 12px; color: #4f6b72; } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.5974643 graphite-web-1.1.10/webapp/content/html/0000755000000000000000000000000000000000000020003 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/html/completerHelp.html0000664000000000000000000000161400000000000023500 0ustar00rootroot00000000000000

Using the AutoCompleter

The AutoCompleter is designed to allow keyboard navigation of the Graphite name hierarchy. As you type it will show all matches at the current hierarchy level. You may hit Tab to auto-complete a name. Once you have found what you are looking for, press Enter to view it in the composer.

././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/html/searchHelp.html0000664000000000000000000000201100000000000022743 0ustar00rootroot00000000000000

Searching Graphite


The search box may contain multiple search strings separated by spaces. Queries with multiple strings are treated as an inclusive search, returning results that match either string. For example,

lfs busy

Will match metric names that contain either the word "lfs" or the word "busy".

Advanced users may note that every search string can be a regular expression.

././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.6014643 graphite-web-1.1.10/webapp/content/img/0000755000000000000000000000000000000000000017613 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/blank.gif0000664000000000000000000000007000000000000021370 0ustar00rootroot00000000000000GIF89a€ÿÿÿ!ù,Œ©Ëí£œ´Ú‹³Þ;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/calendar.png0000664000000000000000000000031600000000000022074 0ustar00rootroot00000000000000‰PNG  IHDRóÿa•IDATxœí±Â0 EŸ}´)d–0ˆ»ÔÙ„ª° ¤ (EìCÄQLGÿótÏþú– !Õ—X÷À•·Læ”Á4€žÀI˜ì .ÕÀë#Ÿ2™€KÔÙbCJÐ*PŘ[Z³s2ÐzM– ´³¨^ ¿3ñ+¥ëE‰Qgýï¿ðßÁ’à^ˆi±À ¾N.ëÁ’/„IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/carbon-fiber.png0000664000000000000000000001017600000000000022661 0ustar00rootroot00000000000000‰PNG  IHDR@@ªiqÞ AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœÞiTXtXML:com.adobe.xmp 1 1 72 1 72 64 1 64 2013-03-17T23:03:00 Pixelmator 2.1.4 ñé­ûùIDATxí–± ƒPÄ b¦H“ÕÒ0Mz– c)–H‹›Î¢º»÷%û¾†Ëwžç…†ažgðÓþ¿NÓû–å‹Öõ~ÚýŒÛ¶ážþæïùô0Ç7þô7ϧ¿€1ÀðAàÛœ‰óöá£<À·9çìÃGy€os&Î؇òßæLœ°å¾Í™8`>Ê|›3qÀ>|”ø6gâ<€}ø(ðmÎÄyûðQàÛœ‰óöá£<À·9çìÃGy€os&Î؇òßæLœ°å¾Í™8`>Ê|›3ñжÖ<öîIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/clock.png0000664000000000000000000000060700000000000021421 0ustar00rootroot00000000000000‰PNG  IHDRóÿaNIDATxœ¥Ó¿KÕaÇñ×5Z®Ñu®Á@hı CqgQŠZ"¢¹I]Ô*²¥P$ðÐù&„5t±†ç\y|ü:ùY>çû|Ÿó>‡ï9ßZ³ÙtuUœ à9vpˆla—ËËÝÅsó¨çWq OñŸª:¸•H~ô¢/Þ}E?Ö0Zú£r 3¸‹Ïø‰ïXżÁ,áJ˜ˆjñ¢hÿwø¦±k‘s h„¿vZ—²ø^Fü0ÜÿV(µ~3´Ã/fÿDŶ“êÉs:€½ðá¢õZ…Ûá»9`9ü‰êåê¨Ï"^̳Ҹ†ñ**W%¿ÅZÒØ?ðXÕÖ¥e©ã:`ãø‹1üêP;ZÇ=,Dò¨ÓjEò—¼­\0(-ICU[ú`ï0'ý`ÎÀ¾´åFVê?P¹>á 1ß³IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/clock_16.png0000664000000000000000000000663500000000000021736 0ustar00rootroot00000000000000‰PNG  IHDRóÿa pHYs  ÒÝ~ü OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÈIDATxÚ”“Mh#uÆÿ™ÌL“™$v²µ†~míîX-t­tôàÁ\ ÷fOJ„žŠÁ‹7 ìm/‚(Q°…\´^„à²9VèaµìG·Mg23™2ž"U¼ø»=‡çå…çyÄvó€FÝbL«í«@Ønyà 8>mÔ­ï¸@î¢hµý«ÀçÀºe ™,¤˜†$ˆsöù@ÛèGêF«í ¼×¨['Êó«Àošš­_›õ¸ñ¼Ëµšä~gëWÞx)áõRLƒMà^«íÏˆíæ€åõáÔúü9“å<•J…b±ˆaÄqÌ`0 Š"úþ€sôútuë•ñïS/>çQ²t–——q‡jµÊÎÎÕj•……æææ( ¬Õ€µVÛßx«81Ä6‡,..R.—ɲŒS*•XZZ¢41¢œ—ï(@X¹d&dYFš¦!HÓ€ÃÃC„(ŠÂh4BJ‰m¦k `h*ìïïE®ë’$ §§§t:šÍ&[[[ÄqŒëºìíí‘)€-¶›eàüò³#^[™@UU4M#ŸÏcš&RJ …q¾ï“e?w}î?TåxðÄóŠ¢Eaa¢ë:žçI’ „À0 öT€»ã"}Dâ£OaÖÖð<^¯‡ªª!‡H)ÑuJ¥Âñ™J?à«q ·³ŸºONضýwa"¥Ä²,¦§§9é ¸sopøBhÔ­3àf"³ä‡nŽ£Ç‚™™9ÇawwÇq¨Õ.s|®±ßÕIdvÜlÔ­¡¸8¦VÛ_¾Vôœ`ö’JÉÔ臒?ŸJâ4øx·Q·Žÿ1¦ÕÕÕåÍg>xóí7¦fœëGŒ—AB–úîãî¿ÿúËon} Ìò!“€/þ«qÿ‡¿K'Ý!*ÌIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/favicon.ico0000664000000000000000000000252600000000000021743 0ustar00rootroot00000000000000@(ÄøööfgŽdeÁ©ªVVe*.Tм½Ë¸¸p9=þýýüûûúùùêââ¡€€‘iiF›vzÀªªYYXQWñííäØÙáÖÖϽ½þþþs<>PŠ^c«­l47j45À©«ùöö÷ôôãÙÙº¡¢Ÿwyòììa()ðêên03›qrl78ûùùqDDˆ__Ñ¿ÁÞÒÒZ##UUt@AVýüüûúúúøùëããèßàhhØÈÉ‹bcÁ««¿©©k05¯’’\&&ÞÓÓ†V[ÿÿÿ{PPˆ_d§†‡ëääêâã˹º{QQìåæÛÎÎxBDjj¶š›úøøi45EEEEEEEEEEEEEEEEEC.P+1EEEEEERE%:EEEEEN?EEE9@EEEEE FL#M &-EEEEEEEB6E5AEEEEEEE=8E7(3EEEEEEE0E 2/7EEEEEEQ,;4OS'EEEEEEE"I)6 E././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/graphite-logo.png0000664000000000000000000012070300000000000023067 0ustar00rootroot00000000000000‰PNG  IHDRn PEgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYs  šœ©iTXtXML:com.adobe.xmp 2015-12-05T19:12:18 Pixelmator 3.4 72 1 2 5 72 2412 1 656 q_w@IDATxì€ÝEµÿçÞ»½ïfw³é›B ¡‰T%tÁ* l(ˆ¨ÏÞŸOlXÞÿÿ¬ÏŠ Ï*( Š:¡†ÔMÛd“í½ß{ÿŸïùýæî½›»iþw’»óûÍœ9sæÌ™s¦ÿÜ7ÞXïpÉd2"Òýós@u•þûç§x’ÂILrà…È Õ©‚E"‘ä ±€/´2a8bÔU<½\„EõNx"=|òy’“˜äÀsÉœ‘‘S>d¢Ȥyn¸­ƒøœ>ÊKì¯ÂרCÆãª /,¹ðª«ª ÜO<ÑAX—ÈV|˜‡¯SËɰ¨n= qÒLÖµ83é&90ÉçÀ¯ýëª0uºr;p„“)38*õŒ0ÿ"£þ¼â÷Qf ”V?ê(†Ÿ«ÈÞÞÞ÷õöõmìä×Õ×׿©««çú†††§ïÃðîØ$È$&90É 9 )¬I7Ž(WõÔõ³QB¨lõ®!À>OIñkİ`Á‚ü»ï¾{Ennî2F|ÕEEE›;:ž$îô¬Ã|Ž(ßô‚¦¬âßûÑŽÉÍÉùj^~~z²2^êssc¯êëí½;'mvñᦼ¼Ü ­í]}Éœ¼åÅ……ó :–íéëë[uÿý÷ÿ üÍÊo\>éx'Ÿ'90ÉI왓#Lþ„Æ#30íø\~±«¯¾Z£ëÅËW¿ùwÝu—ù>Ywoï-„s‰DwGûOŸ|ä‘å÷ßqÇT`c^Ï÷ÜsÏô 6ÌúÕ¯~8}õêÕ't´µ}utxp(ùLcëè«·'ÞÔœ¸oÃÎįhùÂík’?}x{òÖ5mÉGwô'ŸnêIvöË3xÞÐÖÖ6Kù29Icüäã$&9°ï˜„¼ i=ò‘§Ÿ~zv]]Ý›óò ŽˆÅ"5€ô ¸¶îÚõ=âŸñìňØcØ‹ÏXØVįÿô§º“ZþþÒââsy%>ɨBú:éîŠ å½©nÁÂ7åÆ:ûûvÄ¢‘-C㽉htan,¶ ''ÇMŸ~q¿œÑKÎC›ZÜí ­ÉûÚ‡b½an 0æF£9EÑh²¿¥5ÙKAF’.ÙOFÎ.Ïs/ªJέ)ŽTå¹âÂ|žrûûûK·lÙ¢•œn=CÁÃüQF嘆¢hŽIð”LTT”wòÉ'ßÏtÖæ¡‘‘û·ljüüXbLyá4Ýh* íA‡4»MÝ¥L>Nr`’/`¼à ˆ7SJKK¿^XPðÚ\7Æ×é­k6¹¿ïho‰ä1„(ÐhÂt’^|ÄU0@ÍG‹uŽ&“ÍÃÉ;úܦŽîäñu•‘9Ue‘ºŠR–1"ÉG67E¯]½ÝM/ȳUx€ ㎠,ʈXqŒ‚ŒVq~Œ´¹î³Ï´¹yUÅîˆÙµîߎžåÚïßìV÷ »íX…ºÜWŠá ðØ $D”ƒÑèC#ÊïI¹UýqwNyÔ-™^îÈ&JP"/àÃb¦ç—/[xÁè@ϯ€ßˆ'¶ô ïjjiiZ¹jÕàËO?ý8Xr™H^v?=kÖ¬û1Cž¿ãù9ù>ÉI¼ð9ð‚7 T¡FqF—²®qIX¥˜›øAÏ¢\·îp?Þ¸#Z“—›†Òg6IJ–ž{¨„IÄBAJÑk¥= \Âhàñ®¡È­-îä²÷‘S–ºü¼ÜH,e´O.-αQ†ð™CÑûG{W°¶ë2r!´Ò.Cå™ëzëÌRWSZhV¦¬ü+s}CncK·ûñS-¸›‰µ("¿B¦Ä )iªw Æ#}"¼¹”o˜ÂœU‘ëÎ]Påˆj -ÙÝ7ÍË%Ùö›Ili(Oæ\9¥8ÏEÃ.7/gdv}}ïÂÃæÅsr ªÞðÓt ¶¯îèèø8¬¸^‚2ûÔ`zºÉçILrà…Ţιkooÿ}qqñ™(Ð3ð QxÉ®þÈVot÷·÷ÚhAZË’ÒñRê^±{_¸ Âñ‹,)Îwwvö»×4w¸¥3kÝâi•î55-‘;+'n*†Fã„cdÝ΂¹M¯Y¸â Kë"îçÝî#G×¹ºÊR—Hhù%â8âjËõ+v‹Y tk»ku=C®‰Æ–¾ I$ò†YÅn*ÆK¦¨½Ä-©-rGÏžâ ˜Jkíîw_ßùëÖ^W‘ŸÃh+ÙÕ?}²/žÜwñrRM‹E£3 c¹S s+©-tg-©J”Ù.ŸYº˜ã,Ë2 òw7oÞ|´5MŽDÄšI7É-¼à ˆ E¨Ü¶Pµ¯|衇N>bùòßæçåÕ ŽŒ$noéŠN-ÈgU€…lП¡{R€Þ¤àÇ;­M Æãî]õ5nZE1Ñ,V£è¯8a‘»¨È=¶½Í}wí.7Ä(¡„Þ¾Ö04-¦ÅóîÑ„ùZX2âéOÄÝ’ÂwòZ7»ºÜ²¿òQ7?Ž1iétýÃnI]y±¯y†À%JËØ²‹ °g &•YIwëãÛÜ×t¹]¬hÔäÆÜ–¡Q ¦sŒ¦fbLfC–F^lv;8BÒ00ìnÞ5ènßÒ9sVQμ)…nze!F­ØÖDvîܹ©¾¾^Æ#Ê‚»hÍÆ"…OºILràȼQ…FD3O£Çwܽƒƒƒ­×çç%ç³Ö°zp8Y•“)¶u@²® a‚Yý3 ŠÐÈEÂW£È_]Sâ.<æ0½2X Ê>?77YSž=«¼$ZÃôÓ»ºmC#É&FÍC£‘Ö¸‹ÎÊ‹EŽ­.LVæçF†1ý€£¦–¹£fMqÅùÉ®¾ÈíOos÷7õ˜’Ïgº©g$Yß;â6 &\ ùÔ`¦为¢ÜäìÒÜȹ˦'cQÛf†S{§©*Öå#›±’Ë‹s“£‰6ÃT¾FT†Ói*k>“{ÄWåæ$“‘/®îÁØô¸é„}ö„êØq j\Muõ²uëÖ½†òÞ@lTj×ä][bȤÛg¨“°z=AÌ’9S›tÿDø—0 :.ãñü£rþܹŸ„ÿ‹UEyyÑÑánGwŸ»¥a»{¬wÈaHèéÓW¿-‰Õ"¸F z–j–Rîqž_S?gÁ4¡ÓXfÈÔÆwW¹£f׸£æLU¼9f›ÜŽÖŽxUQ~´¼8ßÖLl…|X¬v=Cî×7DîÜÑã¶r–£”0Å2’ˆ‘7‡݂˜M·iKﺾ¸{’“…Í}nUË€{ÕaUnFeQ¤‚‘H!ÓV2wvDþÚØë°@ßµ°VÊ” qª+.N˜ÖVÄhÝGVî=÷´F>?˜Hœ¹lj#ßnß¾ý=œƒùxœÚ‘¥k\ØžzOå1ù0É,@v$‰“ò’…7ÿÌA/X’Ö£A6#£×]w]ñÑÇó·â¢¢åêšk¨€ÄFªJŠ]UiI¤ª¨À%žÜèºFã®…s=(YvÚš1™ÂÑ va©Ã>€õÐÂô…³§&œQãêÊKÌ0ôôôìdå>NGrrsk˜jjì|ð‘UÜ[YYSÞ;X¿ØÎÈ$Þþüê WÂT—¶Æj ¸dQA~$É´S{W×-mm¿øëí·ÿþ]ïz×¶ GÖ̃|Â×ݼÂ]»v}µ¶¶ö>¡ÔnÜh'‡ÿ¼¦ÉÝÔØƒ²Ž¦”¼¬ÎHv}I}aƒ™65 [ ddÖÆÝ…uùî'×3És›vuºwÞ¹Õm¸i¬Lá$£Ô»Ö<ô“×^{mÕ9çœwZõ”² ò ÎpÑXuSgWbgO_n±¦©¢‘d#-ݽîva•¢P§²{©ÐU3©))r ¦N‡V¯R©ŽJ$bk×®}çÒ¥K¿ëB¡’”1ë\˜@ )KüÀÔ©S¯|òÉ'ÇŒ3ËËË/Á¸Í&±zGGôêumnÛ‚Ù œžL8Æœ°™vO¡µ8%aÚÉ¢–å¸néw˪›ÝÙËgº¹S+Ü7NKºÇ0N;Ý]-ö­·–«N¤áe$R£ Þe4ê醑6ínm<âþøL‡;zN9#î–43$¸ 9eZÄ,×ð~¶…Nþ™äÀÄ’M0u»H Œ>†‘±Ôt/A,ÍEò‡GGV<ÎàƒÇçç/mY3~zM´åñ> Ü¥‡pÖÓ¨ña>MZÔØãiǧCÒ€¤1>É•Ž>}úÙ —>›¢âí(±³ÍÔV¶Ÿjjvnß¼³7ÖÉÌ• ­^û¨m& Ycq+;út1”õô§Ðûÿøq‹¸N¤ÂªÁª“Þ4îØàÀÀS¿ùÍo¾¯@òJ-ûž¶È?éÒþŠ~½s;Þíܼ{cUUÕßX@É?vNMòß¶t¸»G"Óòs5ªÐt•?“°Zz|…éY³_á4AÖ./jÿÑ¢ wòÂZº¯[ÈcýFi½¾µ×]ûȮ䚇Ýlšˆ¦æ´SL‡õc rRk0C u–¢XDíKº/ÖD^}Äy%O³1ý®°¨Ð¾[Â4V¿›BŠ'½I쉦|1 KC )lÄÕ¢LGñ¼nOHž«8òÕ:NgoþìÙ³¯¢côRòÒ”Úúîöîw˸¼­U®_¿>ŸNâÅÄé¦m6RÒëÂQN*Ÿ÷ûHû7ðãíf€zH¸C΀¤3¼»»ûËœ¦þ†"ëPñ¯ë7%nÙÖ”lå@Ú¹$'–¬¥ƒ‘PWÚîAF¥‰M)—§Í¥‹#(Ïï=¾Ñ6}Š›SQêæÔT²»)ªµ“è¶ÆÆÛžy晫®¾úꄦЀñW}˜äO$^`$œÀ ·#÷·´´ü˜QÈ•(åøk׿4<Üè:ƒµ˜ÈtÖAÔ–d‘RˆÍˆ9xÛ"c¢i.Æ NÒ'7²ÂNRvtq8RÛÃ@¡)89-Öϯ«H~âôâØ«·w%[{‡ã;8O²^}ñHÃ@<º¤$×½q^±«-É×”X¤¹w(¹¨¦(rÌÜJF.Ör˜zؾiÓ¦kš››c b.¨{vìØñÔk_ûÚåCÙ‚ õ2é&90ŽȇzéQäqž¢egµs^¥]£’ÝáþþMŠÇ=oò¤ö)ùݶmÛ%ƒop#¶ÿøžèXÊšÌù¬{¾ƒÎß÷µQJ˜&ÎmÞ'–””üX€ÙŸTø áãgåÌs(„r¦J鯙g¿„QÇGôL¥I[/;Á#»œ::#7lÝ¡Þy´–»¤t\S;qÎE¤)aSÌÈÚHÂÒ*^ÛX[YøÞ†®À5¹¯œ²,R[^Š@GI“üïsÎ9½¹©`îܹƒ–èÀþ¨ Ý{ï½µôH– yG–`´¾~v©k댬ÜÒæ~³¥Ç±FÃLS°;ŒÑY?F Ü‹1#H<0C4ÉõѳXߟY–çFãñÑœXLu>5`çGî„Uqȸ€×Ê•)¹ÑD¼¢¸ `¨A«QKÞ1Dñx”òÿüûßÿþ‡ÿë¿þk§E;·2ôÅ#H;t{V¾“þsÇ/#7n,%—zËI=æÔõÝ–ÎÞ^?I5ß1°ƒÿDžfššš.Äxü\dfz†Ü¤kâèš\®GºšvðGâw–¢÷cDÆoÏFTJÇO3yÜÅ÷4Ïr©4Áë¡õ÷P4 Æa¶Çvc@ôlJ©b17êú#kš[ÝÍ[¶£Lƒƒ{é§ËMEïVgªÃL¹T7GS:³ ó\ËЈÛÕÓÏ ðRær\”Åï—}û\Œ‡„Çë8 Ùƒ …Mü9öØc¿Ï(ê$Ât®/«ÀaÀ|~nnm¹«.Üæ~±¾5‘(;Ä´“ŠSé”AÓLý Jɾë‚isíC.¢5Ï.¯r'ΫNrŠ –ƒÁ¥·t<Ëg^2ÊwG†F†þñøSOý9?§ §®®vQiiq=,ç—”M/ËÍÍ/(ª&q‚C–2Òêшâz‹bO”Ùõ2Äåñn‹i=Ǧ1åyë)’÷¤;49` ÙŸ‹LÍ ‹`)½8(á†yóæµ(,lkéÑýYmzåÓUS¦Lù/å Z‹‘®1úxÖÈ(N[šÆÌÁ©„ÿ/?u¶ÔÞá‡ÉÓøŽ›â,=ßZ­øCÝr„ ±…)vøÜôèC7¥¶ömôÎç3¯šçIþiÍF÷«¦7¯°À €Œƒ‰=ד6@u2`u'ÕŽáÀ€ðÁ/oâ샾¸zU5ùûßÿžÐõç„™)\ˆR†;Å,ˆm®RÆR¸ÚVžchDŠãbiìà'ƒ crβÙîÔÃê\/'Ç[{SIng÷ÛÊo1§Ã—M+çFìð}˜bF\ÕåÅ&¬š®kiÞyÇš5ë>»bÅŠ‡”½,o?ã%¾Ü_Ïþ\yåûê>}õǾT7uêØÚEÃð<40 ‰9†éK€ÖΙôõŸ44““Ø#L¨ØD²€ÎŸ¾â©N‡4%´Ž ½õMz&Þ¦”ñ; ùèŒÃgœE'iùJ¾¥+Õ¦RŽ0ÿ,”oCyúÈtŸ4QFïà\Ÿ~¨>rÄ3:¦[|ðÁU(²“©Ê:u•û㣑Y\M’OårUl†4iS•îQág ¤%™ùÜò¹n9g>ÈS€Izñ³Y¸ÿ&ó˜ ö¯ÿwEEŇO;í4ǺˆàÔ1¤Œ”tº¢˜5 æV/(++ÿ`Qaá,Â’CÃ#fyò¹iW üƒ¬¬ÝÙéZú†Ý¬Š"WÍ¡ÃYÜλ°®ÜvO‘¹(›1úÃ[%Ä>¥ÛÿÄc½ó%/yÉu¼ýУ!µ~ziÄ —nà€üîw¿¶™ßE<òÈÍ”õ¢’â’%¹y¹¬±G/Áð.>¹kxI®òLºIì/Lpé­/JŽvÓIÈé“a¼ÚÕó!kfèÔé#qj'~ä“jha˜F!Ž #FÃz Éz ídnHs*PñÓ{3zæ}õÍîôv«¬C¥(6õœ€Îrw‡ÑMUô3ZØÊ9ŽùÕ”¤-½ÇêÐRÔuXX•:œ—Ã"ñ¦þ¡È{Îp/ž;ÃîÊ’Ð_qðs´ˆ¿yëÖ¡ßµöõuž|Ì1M¡’¬cЧø¢‹.š±©Åðô·¶¶¶1z:®²ªêùù§f`x$¹jӮțÛMP¹Ú„¯&ܶÞa·3ú¦G2Ù¦P%9 ™U˜ëªp·¨V á ¯µ K@g£Ý×Î-½ƒôîl7$Ûi|²³µ"à;Þ°‰9Šê$9Ók?çýçoûÛ§^yå•%Lß¹›nºiØŸy/hÆF\–zòÏ$öjG’UdÓµ½òÇš.òµV8ƒŸÓ¿–/²Ý¦\Òä[ù41{@xîÐÐÐCï~÷»m‹1#|£¯º¬l:p5J‹¼OgñÍsçε5p<Ñy.þ’„ŠÕPVÓ?.>%Õ3…0UtäÜõî°ö®äÊæ6Ç–]mØfá|Lòü˜Dµj’Àn%á @´‹)šìæ4úÀ0Fˆi¡9܆«hÐ7&ÞYåÏ™5ëSX˜-t‘]#ÃÃ;‡†‡7ÐKAÉçæßW3Ý3‚Kƒ2_ڋѱ!/'Ϋ[“·nj>Æ¢u÷g1P vr©Wˆ°åO×Ëk*‹¢DØLæú±OöŽFš;F’ulsï;f$²dFײ› … ÚP,4l`§šŒ Õ i|•iO.^C"cc½>ÒìºöÚkwùD„Â>|ÒŸäÀ¾p@òƒ‹3bçs5‘yJ£¼tyŠÑ†Fè­oV<.=.ynþZ>†ý;£NÛÓ¥oÔäôá¸\Ú—cý“Œâ‡µ3ˆbº°pm¾„4©þ+EãÕ:žújéºv|y=ŠCÆ?ä u`ó [¶lYÊ×·ÙJ÷RÉUskª¿È’ê*÷ùGŸr=¬{éî(‹`+Dª;0„’ÕúÆH"ŽäòC¦ù9ŽFŽ*+t'M¯fm¡†^|¾v1Eº8!Îê³]m¢u•ξ÷ÔÎŽh7ÖÎ,/ŽO-)ÌZQ2³²¨`fqnî‹ÆK€èƒñ»‚GfÛÉŸ=²1ö“ýn·ïj±ž mÃue©£dc·ïš@¤¥²YÀà v>pÅj 7°»ß·Ã:¥-²xJQrqm Ƥ’†M2âqþóŸ?qÁôŸí(OÓ>¼«•›á‡„]?§›w ?¤{NûPöIç—^pA´@Y!cRЈVО5ŠFÙ6óÉ€M!)Ï‹‘Ì‹üG™1øzæ]<ëv ïbL[ °]ýŠÃ?üöVï`íÀpô¡S!È4uÑçn“µù±d%[nÿíˆ9nW ŒÆE"²²é%t|$:ÌÚý|nÒ-at£Ë}ÿJ²¦Ÿw’:{E‰ËØ)Në;|×Õ1Jº¿cÄý±¥ÓU¬iwמëfL)M2ÊqÌÇžCÒ;ùÙHBXé‹§ž üI7ÉgËëâÚÚzd«NíB %ÍIÞ$·ëN:é¤v…‡2˜òœ>Z“cÆàݬi<¾y½Ñ™H´ö ¬Z³fÍ÷ÙÊÿô™N )±4¬éd]@W—¶…7Lvèz‡”a‡SD‹ÔŽE¡ñà"B)hSŒÚÆ+k 3ÆÓÍw§QÃÜmïtm}ѦÞþˆ .¬­b·RßÓP§!’d;£"½ƒîɦ¦äÝ-‘Çùö†¶ëFÜíì‚’ÖUî%à(3y@f4Z@¼™DÚ.<Ã¶%ßzT”ÏÜ–™t¨ð“írC#£É•šÜÃN‡ùb`F˱A*þ¦EÙ08P¨YðVpøc*g)·ñq©ëoJ¾ÿTÆ\ÐËúLJùfÇÝðçf¡“°Ëù¥ÇçÊ©ž"ôÎ"i‹ó©¼Â­¾fèS/À«ï Ó*1£ áIé˜âɈùÿôò<Òl<áÅíè#ßTžxÕŽ¥±‚øÔ(z/4?C¾0•^ùÈ?ì°Ã¾"ýôžn~V_ħŒG«&©ƒÁ¶¦Ã³9âÌø®òt¢³6)Âo`  ž³¿*ˆxUEÃêÕ«“´WS'ûKÅ!e@(œòöÛoðôÓOÿ=CËó›[Å­¸›;ÚÛŸ)-+ÓížõTZ]Iaa¬„©¨iåŽ+pUùÆLÁ !0º–Ãü®¾~÷X\38Ê­µQWË%„JÂl—»ˆ·ˆf ˜ÛÁ(HdDp?¡›Í¨à¾ûñ™•ëÝÉ5¥nAU‰;†ïškB#–¿¯kt_½+y\Q>FÇ’MðdãðïöNJ.IHö2ºš^“¼®iÐ-}º)ò²å35ØŠq:ü;O=õws=F9m ƒr§‚Œ÷;8MHÉÆæ¶÷X2e :ðTj©Y8„ønn|šý€ߨöD«Wò»åŸ- K™ö„ÛPÆvÃal³Õ=• ôí v<¿<ý¤Q¨.|=½C‘ê\…øôº'§¼öXÞôÄ!í¾³(º÷š6-Í~ñì2 b„ Š€a³ë\®8’!áÞ›X0~’BaMµE.Æ¢ïÌÅË–Í«*+;œ»±–2 ½˜_=U¼ÍW²& ©/[#iéés¸kNA^$ŽRÖz‡œþ†µ ”ñÇÉçc~®„u } ð| ªqS›»Žé²Ãê¦Øa5ena~Ò"¥\Tñîµ¼oD ë*Ì Ó`‹‰”êþ¦ó(÷ÌÅ‹ÝÆ­¹, Þ‡ð~þÝgéÂ/xàLoÔ9 ûë˜F›ÊHqF¾Z½Lø>„BØ®C LCn!àñ ̳Ҩ&«aÉFúÞ`Ói6#Ÿlø|˜Òí >¼:£ñq6¨‚pÓ™Ò˜Î1ÏY|øEÕÄ®Žxs_oo[2Û¹`Á‚MàïÌ‘Wª§­€0ï=òÀÓ·/°A.Á_àÅs•Mù ”£ü裞IÝMç7Úcôš• …ÎY3ïMsçÎÝ–…fѸÏ<ÖÊ>»DQxná1HÞ~½ ÅÛ÷¿ÿý…øÀf·€Nâtd+‚àz·ÑÍÈØ¶9sæˆ>Ûd#žÐ˶…ÿ¾ø! ¾<)þ®çÔ{.³xŒ¨fVC¾Š ¬`:ª‡F1b|ªÞÓ@²>†uëéÉ ƒÞ‹j–&Äëqç0Ý6 >O£#]C¥–öº$·%Ù ÐÍuD¤ÙRKCœ7>ÙÊ™‘÷!e@D9UáŤA¶˜ÞH~N >ÎÖÓ-Dèw—è<…ýø¨r£_ѼúáhµnKK»ûåš­œêF QÆéÜÕŠ>£„é…Ã@‚ÕE—NG¡sÞ=¾£C$B¥¹9ÕeÉãÊó#+;‡X‹!/„†BÏ2Ô ïa¸ŸŸÀ Ó7ô G>t;yÑ4)kñJ’’`:+ËəɄ݅4¸ 1"o­¬¬üIȧôbfÒ°‡7ã\|L¿œM›6Ì´Ù+عr2Êg02 é‹Rˆš©¯¯ß†BZÅ6È;YŒü3x”ñR²ÖÇÈ”°‹íËÔW=áC„cï¹_%/æùÄ}‡ð”°c˜.Ï¥Äõ©ìÂC|1¿Û¸—èk„© ­‘@ëQŒÎŽ¡aÕ£€fÁ¯*|Ý ˆêÏæFKð¾Iº›Á‘¡Ø ˆ?¡á½†—é€9l=‹ò¿Œßá0h&߀±­|>|x ²¶qCÀxp´ÿeæÌ™÷€‡þ‡•I´òI t.€—®ksL2ðÙ“é…¾âë³ÂF‹»¯!Ï·Sð,­E—Åm¥î?¬zÑVHžæ;î¸cêGq6R^F>L¼FgëÌyd8:k¢©™ŽÈFh^9Ô7ô§i³¦é0í°E7Ï{•'à‹$¨ƒüya&V<[ù׋o@xݾyóIÅåå¯)(,™pé´ÅÖÖIyýúMèBÚ’É;‹Êʾ„¶™µ&{a"Õµxs7³/xø4„K‘Q®¨NŠ·Ú½å£¬|¤9–º¾Ú»(Ÿê!0(ÿa„Rç÷Eò¼\Yù+H«8íjsçž{nþøÃÓhç"ƒ/‚Wó™Ê³Ï"ås¤@†dÇ@_ßS’ÃöÎÎ?çqF2¥úÜFà3 "œBQ¶€iaAT@1Q;„$*´ÍÃË"‡qÊ}e5­¬´ôrN®O¥­†ÄŸ¿¬ip¿ØÜìŠYÑ!DMOÙ‚…âÆ8ÈS`s‚ˆð¯2ƒ õ®+ÙµFñצnwFo?w*RddÅœ*wGË6· C¥5–rî´Í˜ÎʆL£f¨%„¹ÄÉùÖ+c‚¯¢¨Q„;^Ò—X¹~4‹¸l(•&«#W¦ñn¸¡vÅŠ¯E9½ås¢xšî€M@åNFe†fŠýµÐÓ‰Qûáï~÷»kˆn'âGüå(µ«Òñùgv™iaUóÒB_¹re!ø>Fþ~JăÊtêå¶Ûn«¢wý: Ç€;‰ŸÝ…“Ìò€²¼`­!…ì €Ä7ž¬Ñ*„]g`”ßL#=:Âóœ)X“IÒX€&o¥Ÿ+N†w'CÓGÉëöæö«‰¾M€À›1çåà<×§ýAa&éA~– &~F<{»hH³G`[ÙÍô^ºÄ/¢ÀÓ¡z'ù¿†ŸzÎ)GÞ"Ö‹“ÂUoÊC‚©ÔËI‰òćP†Rwßœ5kÖ/À+ƒíeCiö託ZÒÌ Œ~=+kÂuÜÄ"öfdõ :&ggòCµ¦œò3¦ ž²+®˜jÊ£Ë ?ÖÛÝ}{skëWˆ¿PåÁãå]8â=EEG—¾;•Ó¸FÒÒÆ_ìàýaãÃÂwë«&ò£Šb·½³ÏÝÅÂû:†ø¾yk-áȇl2ªZ |D_GRÌa›Lk°£×íd•ƒ;s#},ôKg“¯23’áU Wþ1îÅ’à쯓åöJ3‡„ßK#}/U(§¢©·G––©‡bCyáO4Fhtü>xÉ%—¼ê¬³ÎÒ–I)mÞÅòQ4úF„WêäÓ[RÏRÎüÂ… «×á-Ñ )JÚ`yîàÛ-gp÷wÀ™jà¢%VQ:¼1å¢wz³ —j@„{%ÇpœÂZÜÐ`ÏÁ8 ñ‹g¼bÑ"~«Ü¦Hðåôn£-ò¢”/œSx+uóÝo¼ñ#„õ|ï{ßcGDtº'“êé›!N=Ó§hì2¢T°ø3<,ùŠNûž#žUs9¼¦¸U«VÕïÂó7£lýèHõ&§ú5šñ2dD‘$7¥MœòŒ¢¬^Ìïg’7³åõß {0ŽT9ñ#Ɉfù—‡xÓaM`{{z«oåðê å§ìùYÝâ‹¢ÕÒ…qz6c-Üy9¥¥/Ÿ]Tôr.Eü,°Ÿ6€qõ¬°4 tÎä¼}¤óÁd ƒ¼2Lcòdzx##¶ ßÍ ËÊ`§èni*à©ã8²îOâ[#^tZ[d´QúêW¿úßùÚê»ùõÕ“µ/|ã“÷}6¼ª1%‰A)ä÷zäù|êó³ð/Èx„iSmÀã8d ˆ/À¾úT<0¦K¸;èyéÿOXz*Š Bmé¢b²cÌVÕeìöjHh½f<ά-v—;ßåÑñF ˆ£e¢lê¸&^¿#gV»YmvßÞÔåê9….¡ÓðšS6ØR˜‹ ð<„å ʈ4±fs^M~äÂ#f¸yS­=J)¥ ½Ñß½Ü!z­Ÿb‡”¦=$X» …N÷Ë»gœ+Lô –o"d'†0ÌÂÍ»ø›Jšþ¬ÀNC@©0Ñrçf¿ ¸Ep¿‚‚3¨àtW’vÉù4k”–)#Ë ˜94ÞZ‚Kj'ŒŒó\wó~†ÂŒÖ§ñH°rÞžY‹·Á¯uI˜ü§”XŠþs¥%¥ÊÉͱIeâd8D_V¼Ä mz>ÊØ`%ÄIÙGÉ\yñÅ} 'œ‰ÑãÔQ3ФW¹”Æ”3i¶ÏŸ?ߦ¤Ž£D¦"WS‰V¯â›)!z–W€ÿóðÚNJ'\Òl‰Çþ(ï Ôç ¤PFäLêk% ÿu¼ß Þ=c8 Þ¯¨þSò*|¤OV×Tk ã ~zoc:K0ã]¦Ã¥D¸8r£þÿ³­­­ cÿ~¥#ð±ÎB.«g/{„+¿tÚ,cF ë}šW‚õ×"ž­La˜I÷•o _ziR²ŒÚ°ê¥}¸»ÛÝy6ÚPè ·¶È(ò ìW‘qÛù3°Ä &ƒWà#hÌ…ï ä1ˆ#½\œ¶’¯>Oe1£¿7ŸÕˆü˱ &sôLƒ@ø‡Ëç5Y˜‹lå”jvcIy‡ƒš{­öô×te±O5˜‡Œž»hº}‹­¢CĘq !¹W,庸‡}3ßãhbØ.æ³ô©YZ¡+Fgê[ìJ7¯ ™Âw:¼oëu…ûïGL底jÝjÆ€2Åz{z¶oÞ²åk —‡1\‹•šžÌ:îVæH× ™„BþÞt¦ ðýŒ:¾DË#\ÊXqãåȈo •{Ë v»ÝTÁýrCCC5C÷Ó™Ú³”‡Õ¨×InZ ¡åE9èØ@Kó¬4zŸÖLô¨òf8Þ³9áTý4Ô××ÛÎ5ñn=zh;’uŽÐh ÃÅáÏE§ñ†7ö Zq2’‚Æ8ÏüMäõÐâÅ‹«Âp/<€[ïÔŒ(ðRHqx0²kâ#8¨Œþ< óOàÅ›cÖ½Ó,Ø=8Ñá•õJ§¾ü‘)§W¾7#¢6¸L¸ÇÑë³³ÆÊ‹ê,¥ }ä>ú¢Ï.iÄ3ây<äùãäiJ8 kÀxã–¢º±û¯?Ï{…©^’Çü Ä× x†·»#o $ŒHÞ=.…°/¯¯oTñ)%®™:0A¹kPѪOÕÅx¢‚Q¶åxI„eð °íïÒž®®œÒòò‹Ãü•,(ã3|ƒ`€…Äz¥ró¦T¸ËfLá3c®‘m+Pêζè´?cüNq1-V¢¤ËQ4úÐÖÚ]L) s5Šœ*Qi‚z³ ž-Ææ»+N^äú‡]¿vnÝm‚–&>òÔÐ=ì¦åºÓTó©ÝBWÀT—põp˜‘ί«à3¼8kh¶cñð‡ßýîw?ó…/|a[Kæ_Ò¦ BfÌîoÀJiƯºêª’/~ñ‹ßF Þ((ÂÕÓÙ“2VQýOIä$|žÞb‚H-:ªçåæÎûa …ò‘¤[ ÄØGP+ßPÙ&T˜¦l´Â£W8a´ƒ˜ô>¸D”÷Áª°h|ìX¥qzدGIþc­ÅùÂÕ†&âƒð–‘‡#¨R|$É/2ÎqF +0+”—Jâ“2BòJÌ`Óç^8á÷½u…Káé,Ãùê¨'%$d6J³„™ˆÎ W±žæLÈÌ7-’GFê\zy<@˜ÉO&h0ì‚0|7YH ߭ΈÏW¥÷¿0i†'hFÚ>¦ŸAÛÿާw‚#IíòÂ÷$6å«Ñævðm s°0=£KfâéZ%! £3<ɶÉwFhö«CòÙÈB„ŒƒÚÉ#q¶ÿþà?¸ãñoJJœÚb È€ iP^"Ä:`þ ‚ NS—ŠO°åGÜHIYÙElÕÚQV^þAáâ'ÚÌýK˜!>6ïØñ²¢ÒÒ¯PáÒ¼ÔQ":½²Ì½ùEK]w¿»}ý6wÛÎ.¶cª9*#Øg)O#9úÆ&ÑæÒ7:®ƒ›t.Íwï^ZÏwDŠU¡v$Ha’à]Gï€ëìrSJ ¸–=×M+(áÌJ‰ó«ÁÜÒKÚ¨”d˜F2Ë£%9m£`ê"Jïj ÛgßÇÉÝ?+œ§’îÖhÃpyâ„ÍÊ(šÓ]ø®jSDª|é0<{c*ZSô‘¯x F,><#geC> ^3ÿ¯E{ÁeSнúùø ¢ O¥GF\Znêíˈcd¯¿ÿþûO Ý.„Óê)È&’D¦t³ól¥%n"|)Ô¤Ó³èo³ò)6S|©„áƒò<Çôõ—YÒοNOÃO~üã×H"ý2D‹VùKal¿ùæ›ít|˜Î<ʽL2 ˜)ÿô8ž·øVwãâ²½š RǶ#Š©Úœ¥K—ßü‹›+W¼zÅï™2|)ùX;‚¦ô¶(FÙý]øºKÌ1 »…]i[o†¾NpNg´:ö¼Ÿ=C6RÏF³êE¸ãœ«ûkžw›±#1=càž_§ú GÿSÁõóïÖEäeB¬Å>˜ÿá%Ìt~(–yYQ‘{ÕáóÜ“m»GYXg›­M#Ñ]£†BiµöÐÃAN‘‡]^>òD»îºÅÜ–ûö…uî¨Y5®Ð"’¹¦©ÍõbXjŠ 4Ã÷=FÜ–ö>÷ׯN×À)òÙ\k2ƒ´³K Üô²W‹_Q©bÔ!Æp–C¤ªÅœ t§4‚¢eûºŒåÒͧKÉ¥;kÄé=‡üÒî¦*Î*ÜBïöxÂÔÊÖsUþ¾a›²cú©‹)³­nANµ(^‹¿€ŸõØÁ•Mh­‘g[ ƒTòlå¤QØ¡2p£RFø¦ŒH§zÎV,èåJi :µH?LÞ” Ê£Ÿg¾¢Úo‹ùÄÉx\ƒñø8 ÈÞÖ+vk;ä­†+”]n¿öÜXlWôK1ÑpëùéÊoå/Å,?›b1cêéNŠHë3­Ð½- à¬D0М•/!Íâ¹åNõH[(û(£YmpÐç Š¨³ª^µ›¬õÒ"#¢é¬úeË–}…°7óó¼×.I='é=O_=Ïr©øàu·¿*sJ¾àç(;´š)“6ô‚GgVæ@§õ¨tÓ³ñS2%Úæ0"{+i¿ÊOp*œÑÁô¡Fº³Î*Æbʼ_ÿÖ·¾U“3âáÀëGÁ>‰÷E{t×Î][»níÍЩo¢‡•®ìÃfÈ1ȉ$¹“±°]õs!‘ñÐÓ^~š:rúøœ¶{sWìëx·|Ó]]lŽëø#›nøä'?yÿ_þò—fOLèçÝyçGÍ;÷B¶ò^Æ´´¦IU÷©vÂ¥ÞÏvø¥W”±õPC¸ç× UÅeTRú;0кÛôÂ~ «h¶1N£ò$ÔjPv³GF>ƺ…ìÞà.«%s"G¶t8íÎÚÚ7dSQ} ¸kÕ]Æö‘\ºXÈ¡­¿2 -#îè©eî„ú:¾C®¥2¸µ­Ëýe}“ûÓÎ^¾ ÅN¯°Òû‘.utS™’ªO;Õ²­sØÝÑ6ÄȧÓU2ÄÑ®¬±ÆqÊ¢l) §ÀH „‡ò‰QŽs¦DÉU‚J¥Q±_B¾+}þòåËïï»`¥4Õ ´@ßÇ(è]íí7­ohXõº×½náCü¼+åÌÁQ‹.¼ rÊ”ËhZñÏ&´¯2es4¾§Ãp`QXÊm–ÂH“=Q@ ¾¦ÜÙ7¼¡¯¿ÿè}-½¦­Ô´ukdW{{º:þóŸ·B«øÂx\$Kãó û^Ÿcè)6*üŒiÒ;¹/I´Ù¿óïÔcèO¥—þ~+„N| ÖhK‡Ÿïªõ,™ª4¥@Xüá‡.§<_iÃúKG#¾d¼ ŒŸÑ ¼ëlo”í®7BûÝ=öØ&®ë ÞÝpýõ•³æÏ_ÂÂù,ؾeSDœM}xütgk9(ÀKÁ÷]ò¾<¤˜âl«wš¿g*t!u¦Eg•Gò3‘3¥HdŒó0[©¯ß±Žwã™gž©Í mü¤Ì*P† Y3Ò·ËßA¾ùàÍÊO`-/”ýßóž÷|š¸V.¥g<“‡6›ñ8,žp¿+ÊË—âñùãœâ¢t¢=½=<õÔS¿¯¯ÑóÎ;ï—Þx(Ãxð®{Œ@‚µ‘pˆõ+ìjlðÈUFžSôBëðgœñ a^{íµß{ÅË_þõ©uuçñ¨ñÃ'•/^hdytoW×ëKÊËÉ»ÚA\¡ªBH<=áAqú…ˆó°+²Ï±Úÿ+ÚðŸXü½Ëyõã?>W0i°L‹ «Äà_@ÃÓ°U‡Ñ覯ôï9¡Nœwz¦ÞGã\oßÒÒ‘xhÓöäoW­MÞøØºäv®Œ§‡ˆìÍÞÃä¢]=Éë^—¼ø÷&/øýÃÉwÞòXòª?=–¼â–Ç—ã¿ãO'ßÉïò›K¾í¦Ç“oçw9¿+nzÂ~oÿãÉK~ÿDòâß­J>±E3©Ì´ûÅÿ<Iæ%âÙž¤@öèHoŠŒ:ù¦eÊ6Ú´ü|¾òÅ€$|Æ8ÿð§?øÁòñˆ‰¶ºö¾¿þºë– oSz\z]€6(U¢<伟P} § é¬Ç‰²>]Hмޓ¡ÎhvÃO<ñ’ûí«B5¡cAøòToOø@àî¿!W˜|Ç-&¯ºeUòò›W%ßn¿Çðe4K^vóã ó1—ý1ø½ÿÍx<ù~oȼ#òŠ_¯Jþø¾ ‰'·µ$ÛºûÂyaÚ:Øßÿû¿ÜqÇ/¢ÇØý²”ÏQÀ“Ÿ—·¤ °ˆ/ æç… Ä$M§Ù²R8ëhnKG_¤êò~}wDd ÔZ™7~ТŸté± ÐL©Î,sM¼ûå¶ÞÈÿnëÑxÒ}ñ„™îˆÙö™]Ì1´µi>«)ÁÑ´À~»g£|&X×åY“g4êAN,ã£ï`þôb‚ZËáÎ!Ñ¢:™ÈùUÙ7ä¹n~”©¡7¡ÝI2cGÓ´]˪‡zÓKN;í¶·ÖwÄŸ”ÌzZ¼OÃKè§wz®yÌoïdî<ÎÝW\R|eôÓ6>Én>ÊÊ/ [må=@«x’¡<òõ§›r ¹mݺuˆ|¸ @IDATsÌ1w„iöF³p½àoDß'9 ™Ãy ð.>ŽŸ;—‘Ô´Ê4Îô¬ þúÆê˜:[À»dÉÓ¦Wßž„_SVý,V¿úÒK/½\y¬Ÿd[×S2/W2ZšÚi8ýôÓß·hÑ¢_+'ú•ÏËä¸)RŽt¼F’J-îÏSïò¼3TM#Šæ00‰ü¯=Œ:(T„tOg>:FSn¢/]/eÀ¤¿„ôÄu-I)çvÂ8ñ9Õ>€±i+:P OÏ%®0ɶvî³>Â8n?ù¢½èåL[û5 ¢­,2þ:SSÂTæi _Ïtäóc@ÈXLVÁtˆíJÐÞ#bø©’$)†[Í"¤"šŠ¼‚‘Ê̈ÖÓ(õ]„§7ú(óÌKQø )ð ð !tëò“Ÿ<\¯òÅ7ÁÇçÕ„¤ëË_þò‡Èós0mAeIeî¶­Ûº/»ò²„¥Ï×kžSB/Wó‡?üaæ²Ãã¼ ÞYø…ÙøúXU)kö‘*C±ûU‹•w÷¨0Â*Î`JnùÙÌö¡„»aM‹[<­Bg?,5È}¥tJY‹{÷€ÖŽ,C®CøÏŸÙÊ©F,…üWÈR@‚Ýg'ãAcÍ‘ÿä“O¾çÅ/~ñý(ëRhW}e(Ài(ɵL£hÞZ0& õž/cŒûÛß^*<ÊZ'l`ÂK|œ^ÖñÌ¥¿‹$í¶qÀ ¨ð2ýseÐ(E½ß‰œ²Îê´8‘¾-[·¼ŸÅÝÛQ®&¬$`,¥x Ë ã)$9ã r°0xð¯hÎAÙ42ÍqÞùçŸÿdX®ý¢Y¼AÎÄû$‡>?Š,£=Ÿ‡b5ž¤ç~S”çtÂ}[rtt—ÔlÁ“jûzÇ‘ˆ¯orWÓ¢‡ÆCºc8ˆÞó_Á…8C§ðêð”Ð ç¥ÚŽŒÀ˜Ð…‹øqÖüæ w¦†¹¤Ò€×ËåfÖÛȃ «&ã?k«6*!"ÂäcðkÇã‹Íúdôü⿸Œ¶xãÛ¢­_!í\Ñ#ÙîÓˆœ¼'”í¬¹„ú)4ªml¡~~Až’ý ƒÅ»•˜Syþ>¿DÊšñrÐÉ8ˆ¡bþ “3QïUF(D±Y½½¦•˜~úèôJ§q"«¦LÙ…@¬z¬o`àA„¢«{ÊãÔ†ñ‚£'ç>ü᯾ü­—_A¾÷‚7#˜Âº`Ú#Jã§—žŽ“u%\Ä©7Ô¶Ñž‡†—#”j¬â õVU £ˆ{¸®ýö–^>@¥«Ið.³¨Am„qã¢ÒBýÎ/>\=úvÈ´¼¨»½mؽ¢±Ã;·V ª£ðàHö¯_Fãþ6‰óðGø¥çî©Èê«BYâÌoCùÞYÙ|ø£Oö(½7*pJhW3ÿ:²ñÄù†j`ĉ5©‰î”¡—ïG™Ñ”T½pª³tglíëéùüå—_®E¤}n`U•UŸF¶´ j¼b”È…n1Qñh3熆Ý/^ë¾±¦ÉU²ýW£†¬.Ÿ"0K@*ŽtzFëroVÌÝ´®Õ sp¬áÇÇ¿õ­oMá}(l䪓}ªc}›@ünÚ•x*¾§²æÙz<(ήѿ”÷?‚àùÙ8S*ÌY_Oãì‡vujRŒƒŽtô}¿ÆÊÅèSÓsBR°¤S=ǘ{Þ|×ßÿî{¿*Ó„Ž$j¤ Î ½¤ °@S¢m¼7…MÃýOFM+ÃÑÃ4bŒöѡџ‡azOñAa*“|ø´ƒÝP¾œhhh˜ Ýs‡Kñ x ŒŽ’nojzûé/{Ùã<ˆRÑùYb«îCÔÉ]a¤ñÆ’ÑÂ¥zÖˆTOV×´Ù%´-$ë=^_g]ŒJÿ;N{/¾ñ Y}:P!)EhÉ<]ŠSg1ÝÑó¶©@ÂÆÓftÒIŸ:¤HqÂ?<Oø¬òè#Rš iðaYàÆ™lŸuúéЩZLZé¡T;æY|ŽÒfþÊ¢vDY›Á—Þ=àŸ7¢àxšÉGÊ-6ãÁõð­VÊx¿HUá÷c¹ ´<.…GXˆ= e®›o_Åu¶¯ÂÛ:;¤y]g.èm8¶PºŽÁ·®½Ý=ØÎY ºí|LÂÍ.*ŽÎ)-N-)qµÅÅÉâà÷V)à÷%-f¼”'´)\×rÏãæU4ÊŒ§•G#^p‡…MôG|$N ±R0ñüâG}ôeÌí^@þÁÆê#\'ýænWζÞÝ2r±_˜„oœbÌNˆÕ—RÎÒ1¼¸&7ê~Ú<èÎÙÔêN\8ÍzÊÿÌ7½éM7Ð#¹ŽE½‡ õ % é¶ÆbÊðÂø8Sº"[;räÆ+N#‘uOráá32¨Ì•P6@Ÿúkx™‚ÛÀ”Гä¯ó&ÖcDÈ{=jêFSŒëô‚³tÀ/¡® •†0±Ýéô®ÆôüÐ⦇0z"ÏΜó›Õ© éHáÔ;áZCxB÷ £‡ƒÁ¡²úéìé|¼´¢´™2Õ¢à$ëŠ3çyA¸zÁÊWÓf#ýéø5üäÆð–!ÆTÓ/¹7ëÞÕé9X4›˜S/wÕYÊ<Ý¥hDtSr9q¶v@ùÞzF¯6šƒâÿ=Û]7…´f´Ûtü=Ó“¶(ø¤é\uMÁzxÏGèUG‹ÙñÌä ßO‡fð‘p“ƒ´ˆ.jðK¶lÝZ‡\¨äRéÈ[õ'ÔD»ÙD§ò _³z& …%%+–ôj¨gò² ]Äí±cd ÷ã:­“™–^:ì¾ý¥Ê$4ä_Êìä­i¿ Ä!Ø øo|#Ÿ!|mYAA=½ä–µM»r"\w>`Þ 'yºé¦lhmŽ=ÐÜy²§[ó®2Gò¯ G]Op8‹Ó߹܈›ãÚ9ÿ°½«Ëý­£ÓÉòР_2eJô‹yf¦ÊW¾|Yë„§Öæoô†Ïì©ÜšêA!õ²ù[ýáÞ‹h É/QVX=¥¶äÄSâÄûƤsÿ—ð¡ƒ4S>rF¯|½å-oé”Q4¥ˆh4ÀdÒ6LðìßeDu¦BÊÖháÔØc4½~v4~Ya^¹êù 8£ÑT¸ U9_g Ò³øšäÜG*Z}o]a©pÁòSyo“³÷àqßÿúÑ4*ÜÔÔšê]¸|^æC·Éájf¨à×’´œT£_àc'#Ï->^†Gæ¼òòD«Ý(Êçã}Ç7± ¯&†Ë§Ïæc픩ä%´EÓŸJl€<0$¶FD§ë½Lõ½ŒhÝÌl²’ ç^ÃÀœ0³º¢¯“‘O/HÐ;?Ñ‘Êç¾@H'…bLfñTÔ…TЉ › ÓuW‡›ÁuÑ‚cÔ1#$:ÑÕߟXÝÒ»¿egîÆ~—q(×­¨ô&@ÇC×tÔØ5º]ÖˆäL—Ÿ“c»–Ľ6î“ÚÜÛ¢EÛ…'àmLÞÖCÔs³_ç`‘æ½St§?‹Œ‡ ÝA¡i`^ÅóBŠ¡ãÉѹ•Å‘!Ö&ìâµ šîô.)eÀ³Ê&g’ 6=ŽtX‰H?[³ã0ûÛŸíJ >tnAéôÁ·bð‰¦tD{š-l%ßmÞŒ>p*›‡UáUg€­%\nBƒDOø×p"ÿž/Â#C" ©Dž§~:ÔYOÓçhg…X¸E)½daëÀ¶m-a¼Êix€ÑÁÃðûŽ—„iÕ>ýú‡à÷&3–!À—@K‰p’&c6@º¯ëðO'N¿çÄ)Ïñgô€.°ÁÇ>@Hl ƒùÿ#Y{øû2&<Ž/¯Í¶ ½«§Ë=¶kGìÁöæè.æéK05ùRvH…5Hj” 4ÙpF†CÎþZcâ» ‚¹Ü0æ6 ¹G·»ãfÏ î…"^0¾’¡)ÊЫ텟à{ß>âöVaÛ/NXb«9ùUÒ7Ð2 Ç,¾ñQb#L]m¢y¯4ÔéÏ>XÊ‘¶[ÔnA}û£i0î^7»ÜŒ3‚ô2ƒ¼C”ª#ˆu‘©Lµ‰2"ÖKý!¬·v»Í¥Á­ð0̃ØèÑÉä/a`*½:>øG5lö:õ¨¼,¿°!úFÿõÕWçQåÖc„fÀÇø ÖÐZÁé’”À^ü:C@àË(#è”>J}ÿñ¾ßüf€hÑwêÀ‡âôÏÞ=’o)jF½„`¯(=¸ùâ€ÿß0bŒAaÀÁð IS‹ÃütÁ¤µGùr"çíÒF¬Œ`+ «W.¥D|:ê¸=³ÙbÃzŸ÷dzÌQ²¶xnc.÷†ÊÞQȳѦ 9 ùCžŸrJé¬Íà[>¹Ì@„p^ùWóéÄøcFø/íÑœ¯, i7PÂÕÆmYÏ»„*óžâ³¥S~¤‘|+Úó,4I;5Ý«‘ÌE0ø'(Í(QÏ26ôK/íÄ‚YäÉÛc×6<Í—b6ÅHv%Çhj$IJRK%#Ð’.øÉ]×°Ù­íèpGTW»…µÜ5ÅhB´E!ÚÚÒòØu?ûÙ>øÁ®n1o éÁ}òS4Œ•L× ¹¦¸¿ªØ-çÅ•ƒ\µã“s1ʶiÖCúˆ³ÈàqìÆsdf‰S{>"4O)-NB;GôYþ-`Î:…h—ó>Bë§,‚)·é¦› ÉÀ 8øcÀ›Á!~rîÓ½ò•¯œÆ]´~ze<ÔûçVë.S"¾þ}Úgë‡ep¬ñL¡.*³àóejÄëÊSpwÜqÇtàëBøͼu”L®Ÿ³páVÅûº ašÞE(^[k€®Ýh lÍ[¹|PÒ™™f,—¢gkOÈYC¸Ou–B>øüµ–Nø0ÞÅ“™*Û&³¼á£XÚï@ý7Œ%ynžb¹¹G…˜¦´gÍ÷rÿ¨xšý¥wbkºÂñéýÔâ3‘Suëìlx¦3>½‡×»æšhØ^éø¸ƒå‹FMÏ-‡EËs+£ùr¿Ö E}?Z²¸ñ¹Ó]†¥—e<ØžÞ­.Ù2¼*ÅFøið<«½áÚÆ®´n…i²¼Þ ‡ü0½ÉSéòg0\pÁ4ÒÕ(ŸOø,œ6büÕ¯~åe&k™Ÿîà·^_Œ$< >€gòTøXe{£%&¡ØÛ»`&r>-<éfsN›à&4 b,.É®#­¸kQÑ4’ü0N¾ ¢ Fýî/›×º•]­ì¤Ê³ÅpÈ8–mVZ QJFæ4Ì™D†)¢5‘p˜/ 1 zš‹}Ne¶QÛdßQQYù)2#È ˜ª?ÖnUµ ,›Uë.â{{j§;¦8ßF9Ô=öÞ¤6®mâ5ˆ‚ï‹D§Ê8¥(ôØ€Uøf®{?¼8Ç}ê˜Yné¬j+#ÊD »zÖµZ?@c]qD9¦×v²cè[õõõ_P˜x'?›>@š-2³äÄÑ#á✧ÐVÈÓB,P¥¡®½ykó¶0(`øØb¬«O£8±NÓM^éu¯E¨ÏÇ NG¤p3Ò¦ÏùNÈà à|Ñú¢ò¥¼¦€„†çTÛc”Q&h^Dû´ÍÀ¥¦3x_µØÚx€¤ì1Yˆ?®Ï¸’Ç9!°W¸öJþ¢Kõð€‡Ö¥ã F° §|~]â@ù,<‰®J¡.už)c:Š| /·rj$©g[˺âŠ+Ô1^À»\ªâ 3£];™~kPdxÐØ`À_Œ¦~…+•Žç ŸDbý>ð­™í‹·ôŒXt»´åå@?†–gÝ7iokk$ƒv„ƒFA™Œ¡>ºôÖ2!P!X4•y< `¥Ôáõá!à‰¯2¡8z˜=äwp]v…È¢Z‰ðLö0ôxóvw7»+Ûâ#®‚©+]AžÁK•ߨ)bÒ¨ÒÞÆ-<{””­Påñƒ8¥IB“7 ¢SŸ-W¥9 =¾ò׿.d—ÄåBB˜4Ó¯¢RtËwAÞÒÖç¶ô »m‚.¨Ò.³vŸòás$×¶fìà“¶Rü3òa±¯x}Ѱƒï޼iN™;ù,F6ZObÔA¯!³|Ù®ü}®gùÆE¯»hjQYQ=–Ã^¼­_ÿüçºîÆ­§Ò>!?ŠPFDúîŽ2©—{Ðww©'=ÊZ…¶ÏÔ3?+4K±Íðeã¢[!‰·0Êï{³e8XéÉù©ƒ=–ͧdJÌàÄ+–î˜5<æ@žÃºÑÉãh8/Ä‘‘|°w:~ÅxÏóy† öêŸáC‰?ȾôUüÄOÔ)ô#(ƒx—nÀÌ(`<¶ña)[ƒ¡“P ]³C:Lßé™0é­K°ç¡o£ÂPÒʪâ÷æbyy~41OÀ×q[¡?÷¹Ïͦ XGÜ‚ñü·ôô(¶óQ'›¶aû®Â,þkìw?J–½³xÊ´. ðø|ü„>t¨S™-^<Žb`k§N=™gu¨¤ ³þ\9m˜P½íõ*#ŒÊüÐG?úÑvå],¤kX0™¾mÓwkÇNîi*tå±ÜðìÃ>Ð}€EFBQ²Aï]ÏV0;zá&4Ì 6ÌÌ)k”a²æè£5_¨Š“K5„àuì/tè#P®¼¨À½ë¤Å|@jصñ©Ú]=®ƒ²±{Ðmêq›nù"ÖLŽYi‘*´kP’?Ž…ul¡“†ñU×4UʤuÓ† ïYvä‘×+ׯ~õ«~Ê&EtªQïÕ˜Ò«‰ÒRéÒŒ4„ùiaå1¬ŸÑë®»®˜!û{…TaéÈy— Ê°zÅ©N>tU½óBØTÁÓžO'­­!Œß' aNÄÃÏ4dS©5¦ÓxžÅø‘³Ï>û"Ú˜ ‚ßiæQ‹~­/êô¹)XÞ¥LTV¯(õšÍ)ÞzÙø*Ç>ñ""Ö‘)36|0 Wñº‡ìv¾caSË:|½õ!|F©Ž)ßNÎ÷lU¼”´ÎX€3¾ ~a;•p‘½³•­Aï{gÉ^ý‚ŠòÎÊE»ÛÄÁÙ~Ê.ùSû·p”ýDKÝâí«D¨CÖ$t2†íNø)ßiÎ û\ªþqF\Vá3€yׇè?ÕÐЀý¨ºŠw»IÓVú»Ýœ‚"+l|dSXSüу2]Q2}(Ó¶¿hÚT>éšgÛxa´,¿öE%ð z1×ñü_Ь¹_¼g?o„ô(Üy4ö”Â##ÞŠDÅË׉٠×ÖEìW_S᎟›´o¥wõºÆÎ>WÌÌÓÂéSR°þ¡ ã#gÓbtò´Ë×[ÿÂWrÇÓ&h‹©ÇF£sôè-Câ“Zè….öê€ëŸÈ FCYÎéó"Á,ž’ŸêmôU¯zÕÇiKÁ›}xZÈÏX ÏýÔÊŸ={¶˜UÂ¥˜Âk§ˆÞR¼ÇÂNèÑØ™=´ìÆÃ¨!èvƒJ Ý‹‰”1:ÆîﻦBßÈÝwß]ÃôÕ§”>äo ñ¦Œ ßÎZ«"‹ßó‡?h瓦VŠNfç€æÀ¯!Þ¬ “í«'šG™Æ}'ü8¼’1Õ¥9ÞEŸ ^’NÝOÂ`GùÂÃRâECŠ^`­|„­c#ó‘/P.-èg3 ÊWt±,Øk¢>iV¶‘„‘O{·ÍitÓ •Á…,“t¾ã“?ѳá¤-´ ¿}£M% ó¼òS„³)ç„߫ì+V¬Ø§6>Q¦ûNÞF§ÒíÑ€@À¸ˆæÂc¦wœÛÑÝéšã#É*¦­ÐÔZÈN!V™'øÝ\7Æ`òË@öŒ 2åOœŒGçHÜ-àK¯]¶82»ªJûñ´*&"- „Ss¾‹™¾ÁÇâÿå†6¨ƒÙß?”A CŠX·ÇVÓ ù$ünŒ§ÝípYXFè0R ;¤Au«w´EôóÚ²"WZG\¨ë ];¶jÊKì'ºèÖ¼åY|W˜ž„RÓÄôè’›6mú Û7?ͰÇf=0Åí£3úô­‚§¼É Cë ‘sgÎ\Îóýüžµò$Í9ëS±g3·üñ0SË+|&:5µ!£m‹Ç¾Çˆ2šM]×€Ç,_eQù…Ç.ÑÖcä}OÎpè¦Z¦&ÓÄYè_ /=Õó ¼aOÈö5.¤Í?7ü¹MØx#J58ª6ŸœC°ÎÌÂOÔºQúÚ•ç…HPÃÕõÛUL?¿‚w]{!¾ì¯|dÌÓòf—“>wð¥0ÆdˆgŸ¿Ú‹î!»ñÒX]S_óCxÑ våáÍί|‘^íÆÑÑÕ7Íg…y™L‡uô&“ÉmÐf†Ø~¸ñøe!¼hñtéÁzlÈ_Êè"É5kÖh=`¶Ï'-´k¯_ ¹Îàuâ¿t€;Ð]š.óċϚºÎÅp_Àó½”®ð@ê«\¤ÕÏhU÷†k¯¤êmĹ áx½˜wÕ’*Ø­ël•Dr`+ÌÇŒð5EÉx2B¸ÐB€ ”i0cáŠÒö`nîãÌÃÒÂ"÷æåËø\lxú:(¬H‘iÖh W§á/iîêú Ïë Ï£gž¥ÎÂ¥QyD®Å ÏÖ£^ Ú±Îp ñ?0³¤èiÌv°««oÀõ°3ª¦´È$bDô­ómí=î®Í-|ž¶ßéó·3ø\ó¼’üȼŠ"7§²$É·Î#Eù2x¶¦¡<4b!?=ÊÙƒ…&“ZÂwýô§?ýod=A=? gùÐ@¬‡eù«.Rd°E›ÅcJ,¿¤ä bd@Æb cè6…‚!<Š;¥~ ê‰z~¢DuÓN£Ú¢¬d@åS äã¼2 Þ¿Œ&üŽ¥7%‘åå™gžÙÉ'Q¡G½WŸ·) ÞMè8¼åù%ø´:äÿõþ‘‡¥ekðW™ z9øô>¾MŠ×Æoâín3ÞU&}F·@¤/à¦êEõ<^Dߢ£ÕñÜC'#ÊoŸø¡<ÒøÌx\sÍ55œ)ºÙ-•l€×x¬òW»Ð7v#”ÿ¦èŠFÕkj Ø.åH3¾—oáûú‡³9â‹n˜ƒ¯ÝtJ ú?¾Ê-Yk`*R;°R²AÜB+,•€WRjm&ÁY­xœ ¡ví‰÷å Ä),È(€QÆ=ðÈ샜àðÃ6íä·9œ ~3FiI¬î‘Ã7!‡_#McHóÕ©Ç Óó¼ï•NŸFþxaMóÏÆ„õ $e; ‡sú‡ÝƾnWÌÕ$lBö°Ù}cwö¨1z=ï3áʲ+Åf]¸x¡ 'Bš ÈÌT˜1Z »º^ÂûzÂmMD‘rb^£â´›€ø %À» d†cˆ 'O©«»†þR¥e.t”i$-ÒGVmirÿ»n‡kŽ»z>%fjyûÿµw&p~U¾¯¯I'Ýéì{Ò ÙȆaßpÄ ”F‡™#¢£Ž£0Žòæ ¢‘™yŠqƇ"* l1 HÒÙ;kw'é%é%ý¾¿s«îÿþÿýïNwÒÈ»õÿÜÿ­[uêÔ©SUçÔ^;ùÞ¸¿Ã a¥˜Ü¥pvsâÆÝ­î;ZÞíÆq ÕÔ!enîˆ wÑÜɶ!Pø{1â½v€ŽýÒ—¾´ˆK•öŒï›÷ â:÷ï_ÎnÂÆù+ü ^œ!ðC•NCW²¡ôA¾âÛ”À¡cÈBF™¦ ÚÎ2À39´íAòidžÊð6ü·?ýôÓõ.‘ÇïÏ+„ Âȃõü¤™à@O5¿¨•M@«B& ™)RÂ`”Ì?â÷~žN°}6Ƀ(Y ò]Z›6, ‚d|1>è3;å>(ÅàV4)þ ăŸêC8dóxO‹Ç—æ,Öü‚ÒÂB"E€”G;çßæÀ·©óq&1˜„?BþÑÕÎSTZ\lB{\¶°‹‡¶è…< Î}¦ð±aÈÖð’GR¬Â)Zºñ÷  T5²0”÷qBÄ;Æ\˜OÛ:xp×fï!Ú ˆúT6Ù€ÞŸð™§ü6åmŽœá;ß$ä4è– $ÎÊàÛ[¤qô„ñãoâûÏåÆ#ºúÍ7âÝ¡!Z ½·’#ø¸ü0½â,X`AhÆ'¦C;t©TË7 ³©±Þ-oÞcÊ#ɹ(dþsÈÊbÈÚ"¥´Þ÷uv¸·ŽîFWUYk½ò1=ãÆûZ¬O0ÞùÏì:½”fà`ŠZMR|–ÑRzŒ»…uÞÿ;½qû:UwL¬©ù­”Áêú’º†½™;—¼â¾¾bƒ«ç\*Ö1º /òÏZ‡ÚÈêqT•±—qP¾u¬ÉvOa…-fÚQˆ+›:Ü?r1Ôú]{¬àjuUoÞ«•vôÔ÷׿°!î/®¹f%ñ÷T•-¶d˜‰»ªçÿÚ¡GGr÷Z†D‹`x$€l(ÞÜÇP¿¦ŒÁ]B¨[%÷i°RB^Ëd¶RtȰ֚õpáe­5ÒÑJnð޽3Õ…¹#z.x§ü¢¨<2¡ÄÐÍ¥”ͱ)=´ì8í@Coà¾D§Ó#¨$ÿ/½Z]Ç ÉŃnqâ&hU™C(b|3zŒÌ{@ŸåeøoÙ| ßæÒ˜=ñ¨Í”4â‡NÓ­CI†aIñ­«~íZ]­0YÀ¼sÒé¿÷0„¸Î#ëSž%#NÚÁ&¶O ?‹—:ʹ}/X°`2 ™0Ó£Þo]¶lecOÖêc€Y·ˆ¿êµ—i$Ä{ØÕÀÅø“òí”ßGåæy“ã •£.nU½Š‘¡«€Ñ\o|spÀ'ó¶ƒy²“‘}Ï ?MYùòòàU4ùyœƒ±GOa‚æZÅ£ ÇM åœkçÆUs×M›ç³|wSû~WÁ±%=æzo}übcw9é±ÚD9ÛË!ŠLšO©Ô|aïF-}šŠjuI)'”žÍ·£Ð“^BH<ÇÉb¤ñ ÑãÆ]‡r´¹ÁÉÆÒÍ¢L ëBÝSk·¸ûkw¢$4,es?ÖÃd#¥Qhè‘£>yQyQš˜ÿ§ ‚;C­fAµsÇW”¹ûVÖ¹ë9Ckˆ?Q° ÿ#„‘ÝZ{ßsžÐ y(ƒc€Ã´øB¢HCc¿‚_o!½ù­5‹ÐAüsôûåÀ<& À%¤zR$&dñ?øàƒŽ¹à‚ n¢Åý—>\'ïË `d¨ðk#›õ^:4öL#bŠÜw »ñŒ%—ø¹Ñ‡é4¼)øÝ[¶üš Ô@:³« ="½ˆCES'ß@ï3E«?Mü­ ¿nŒS0`Ôh±8è}]@/æ6ʘê”ê˜ø/…ŒÂª÷³Véf`U „9àBá‚›¤€”@ëý(ï¿ -á®H•oÖWø —Œå›î"AEšoTþ{šóóMt¯YÀñyòy p‚±4· 2ÿ¾e’‰µâNo¢Q±5ò>ìã ií6-*VFi,Zy ói EM&ÆaÀ(|>mVþhlêhx•55 !¯ZniöiO†µ¸À}<ÿÿ:Tª<^K«Ñž9çœs^E6ÙIßváÀ®rho }ü’Õß—î&:± O~Ù·¼–ðò?ȵ£97ðzèüø¦“Ft@¬ß×¹Úú—Øu@®¥øn&¿ˆc;Xñ1ŸVü •ø8³¤’ß°Š!î$ž9£Æº­~Ámlkuåä¥>?aÌOJþ·Q ‹À£^G Êã¤Ê*w G¸O9Ró†YŠ"ß(…ô7À[T0#ÄJ’l›¾–hç9féÈó¿ 8ä]ÂÄá¼ÁÙUüÚö]în\ÑtÀ-+uƒñÌ*‰(0N–ÎîÔ™Oö †Ù9¦>ã^jjw·>½Æ]qÂ$7u´†TE8µß#,ªœ%ûöîÝY»~ýµx)M=fªîÇ_8׋VÇR`¯óI$F„x\b14uÂÃqTö_1v»N=Æ} QæˆW=?ÊÑÇá»VíŒ,†`=öI˜']~Ô‘…<1ló-Ò'q{…·!Uêuè~‘<§’Ž·*¬pb$ºñ7·[š(«.¼ðÂfÂÙÜ•_ŠØxÊûP¼*)á:Hëh;—Þøbh}œ|{º4Ù«<¯R¾ÁßS¡ù,;¦ƒ Ú›bí4`b#”„mç)e~ì·(ÒÏxO¥OÆh£<„åÆrï–gl~ y¬´ÊÈa®ëD\}à˜/Ð ·®®ZVþíòþF#ð6Ÿ¦¼É3æ@^•/ê£G·þm ü ÂEù”@>S"ð³”:õy ¡p¶RßvR_Lö0ã;Öû€ùZ@Áá÷QrIƒc,õ@2+É7YžâÞþ«¸ø(_BÓO¡y%=äúeË–i{CÇù—SC~žLÞ¿šÎåaÿ…ÕIÅ/Üâ½Ê§ÊåAFl>Bïæàÿnª³‚Ë1qö 2´,€p¸B¸[…—»¾ƒYìÐÜÑîZðÃqÑeGVJù³âªØ ¨ñÑFÁ ¾!½Ÿñ8…tùÌ7oì8&dc"xeÈ$·“ën—lÞêªYÊ;†Û KèÍڜ׺߭jØÓõÒÞ&À‰Œ[¶§Ùjç8z Ó†T¸éÃ*Ý”jÊÐ!™Šr.·¤Y™2ü½ýqD+GÑ—º6º£NZN¥Oé‰þ‚—\äã`—Bò’•GJD»ÒÕùü “ìßÚ°×]=aûôÙjHYx«t O\¨qÿ{y&¬f çòåË¿ºhÑ¢‹)ÈZa¢c…*/㟠5…pÏ{ð×Ó£. •¹CÒ¬å9oÜfCá)±µ0ñËÇcß 5†1nÑ )Ëz@›†'TQž¦u›†§ðU¯¢, •c“‚³Æ4-ГãÛýCøE£èÒ¹«NaƼCB̾³¨Zide#FÔ»EaMñ¶Ar¶žD¤y‚“ê¿Ê€…Ë÷Ã]óbŠ¿´nëÖ'&Lœø>ìš릸QH ñ+d,=Ž @ ÁôÅMüìd˜m*4露íŸè† À‡²1ÃG`´x»å‚¾ƒÆA˜{ò^ö²øh4ü†¼¸—œø ñš¶á[ueïéz@â7B_~2"_åp+WSü½ýïŠÏñ5‚ÈþKI)šNprÕRéex]ÝMÌW¶ré”ÑEÙ”²©&’2ßæN›Sǰj”£®ßx ¦/F€1„Êz šê ¾U„Ø`°[áÒ[F‘„¤ ‚¦YångG›]Å% ̉”0q,”f'" bs¥|T2_2œ]ë¤{ÛÛ2;7©t{Í4·püÇý—šU4 ­a©}--(ŽÍî7u;œÎy¦5FHŹQRDà×EUCËJñ‹3 ´­tìÅÿ÷ûÜïê÷ZB¦¢®=iž>Tw`Å<‘%$ÇH¿‚ïžÖ6VZu¸a(#$€÷ïá%,†-R9PÁ/é蕉J²PW3ñ~NU9WûîwÛP‚ã‡W’ܨàPˆ>Æì[à}=´ó2”ÄvØvpáÉæö5M ü^Ülè¤>#sÐ+~ #¥ÖÈç­>ÊÝ8áÝTøs8@P ¡•)Á[Ù a©;¾÷½ïm‘{bVX}dðòÃÈè4a¤Uv‡aL¨ ˆ¾ÈDù¹¼O€¶¤ i2ÔЬÈ®pªÉ²ÛŸw·r†»ÜôüâciÈë~ó÷øtOŽC…ù$,ŒÐò„ü4¾B‹ÑäýDN¦|BzŒD9z£•O ²nqàh.BÈý–õÕ„Óec±òÀ.œ:¢EçéMÇ_&Ð!»ðZ/“^ìz9`Œÿ‘µ_ÿ†—ò48•'jø&å›!këèXí±ŠN­ÀªFèNKÄdü ¼-GÆ]Ëdë¼’fçîö{)—Ÿ¥— —hÏÉ_N´…ºãÞ¼Å#žRz‚a™6ŸÑ>Güü+åð”Ã÷áfåPá°{Ôq} øE‡TåÍ5L9, ¨ñEEgŽ'ß*Ö(9½™­œ6þ·rïÉå|¦“ñËÓéÞjn@…O~1•àðBÙs‹&Õ¸…ã&ºÝÍMnI­Û[ïÖµ4qìøJC3¡¤Ü½mì$7½z„Á~޲(a®ºuÛ›ö¹‰Ã†Ù¼Š4Íg´2iý–­î×<[«æº[ ~Ûùóì)QíE±ˆdåKXZ¬a±*”I†®Žà7s¶T+{J†cœÏ‡8Â%ƒÞñò]î‰õuŽlãxO¥[¸Í‹UØnh=LT™å ÿ (SoD+¶¶aYY×h 'UˆNZ“Ù@øn‚©E  Öá€X«^‚Æ21‰ÞoˆÝ5 ÆBCq‹~kÁ¨,˜C”Er·´™cöOn H 2TVƒ÷xŒÕØWÝxãÚ!nžpÔ‰’0YÙ(D#p>Z§èÎ;>²KÞ 8t€¨®-ná¨ôr ÇcÔ‰Éà J$¡ÇàiÔLŒñ ¼¢ àÈ©ø|›¦„Iê}GkS{+œÂë.x]¡z ‚Ò†]âȲ–ЭV>Lu"'’ôçä›è“ ô&ìq`„ßN¢`2ºS†["¿)X¼bå¡ï`˜ª†Þ)úö0ÁËâ‚Æz„UP1DŸ-Úzïéä­ÀbØg21$‡-­âîÊÏ Ìßíy| zÃ<ÿ¤¹%@B/[à…LN^x|–Ǧܾš$V?~øá«ÞûîwÏàäo-å0[…ßc¼…×xB˜&æ(&E†]uR]£"æk∡ko¸á† xÌ×$2EÐEE¹jùK{kÂ+‡i €Q&¸„{‘È+çÞ (=‹Nesg>5íukw³¢Ì4~7èiê9×hSàH¿ÂŠÌ²a U¤—¶os¿Ù´Ù½ÆðT•­[ÅMW„GJÁ¾¤ ŒIIìNo¥E=–N žÛ²ÝM> % §)``¤Â,=™ÇW¯woßãF¿&ͧÅEk0úsŠ-±W–$Šd0 “é"ªÅ[÷ºsfæ^ÅÃå ”Iï1ŽþzÀU ^™›©št½‘2!ž´ƒ+§Q‘;ÁC%§›_1*¤\%ôv—±fõ©§žú1ÂâôdÀD«La2~] ¬ #ÞÉx„\s×SO=µÉã8,%æ„Ö,Y²äíŒC?Êxð$ñ€GóOÉx“äæ”#Ñ“ôL“p’¶q &´¾òÊ+?sÏ=÷|÷·ñ˜ðâmiâ½EKcy˨î©BÏÒ‡x–Àköf†”^-}ùHõ¡±ž£ŽãŸ.øÀ—àÇ·V`m£Ñ²^þaVi¶''ÙfôÊ߇Ó:É^¼’°ˆf6g^NOù>êÊ;„wã·p\É€Á.f«¨¬‘öf ¿ ¼Ö}á _8÷ºë®ûeáøÇq+>ïÐ…Ç¥èNq*¿X[5æBlܵcÇ¿ÿßþ훜4P'ùczTÂ2Ód!Ã?7GÎѱªÇÈ·ˆTjgÀ=¬e¿Ìx™ ®ˆ˜g3 ü¡Ô¹MîH±„w¥Ú“Ý o"7ëêÛ37¿´"ójKKfdiY¦ yíçB¢p ›÷;Ê¡ˆAÁ`ˆ$žrž©€ÎÖÖ¹]òRæéµ3»˜|ADg„+³lã¶ÌívfX²kîÂcñܾ»ÅáÊÒÀüŒÁ$èÊÇp±PŒænæ…- ž_–ƈ*òµBÁ[k¶­•â3\ÎGlÀiåA8§M›ö-ZôgÒ¥ý9]l¼L¨ÜFy­.ôÈÍìÁO¸x$dJ(+]ZÕÁRÆ·IyCr»>áßz…²ae¿-”±0.l41Œ7ØRÃPF §¡ µ²‘bkõÆ„²}Æ¿6šBCñ?øÁ׸Wþ,”éßCOƒçÒ$¬ªˆ‚‹y€]FîÆÁ+c ”ë!·Q¾õƒþ`‘”þ®qlj.å¨t·Ê‹à{ 7áSx™)ĬsÀd</õ­÷J½isùòçßÍÏò©r#šerò ?áý^½Í–wôjZ‘w=ùä“§¢<¾ŠP‚"ÆRÈ ÐÂ*')“+ÀÅyÖ~à@Ò‡›g–çŸ~ eCŠUô¨ )Å)eê˜Oв[¥Ù%}´ù·¥‰3LmÓ(XøVtûí·7Àï‹7Ônø»¦}ûq7™ÈXÖãÓ]àm´‘Ç›Î8㌂s›„Ñý¯<”çÆ?Âõj¬@ XLàý+6i}"¿D«aŒ.Cooç>jº­½øâ‹wqzê2µ á²p„qo«ªª>ÖáI„‹Î†¡¸æá²¯NÁ³®©É bnd(ñ"< –J!,˜“‰Þ¨ ¬d8 ÃKK2«š¸ÿZ¹Þ][ÓÊ]³AœíT³©oG‘P:’˜=ò<'ïj#õðÁÏ+–ð)ߤ]ßÊõaÄÿËM{Ü…sp„K¹ƒoÂ㫨гèQî‡Í6iL è°Ï9RœI£2¡oʼn]½€÷°éèí¬ñÿ$ÃhçAƒ„Íùo…—A€m kü“ó÷œ{î¹ÏD®\f°iÓ*ü9ú&lRxXÜ/L›6Í62bn£ÐJÂ4 Ó—6}=çÄÒ#6Ð¥ ©ºÑ6}úôäÈü{X*z“š@™ÍcµšÅÒÞS„4¼ÚP KÂ?AßwõÕW[k“¥šåœËt`PUÕHê›ÕpNp• ½4Û8pÃãi®iˆYÂ'ÀÆÕ „½®v~˜³Y÷ÿ ”àŸCó‰äŸ”I ðæ§š;‰û…ÆúúŸ­xé¥H·•3• ÂHÁPä¿£|ìì ‹Ôc6ãã*‡V×zàÀbïlðÞÞïCðš"Õä±Òó…O³3|µ¾À ,òÞ†C¤¢úÕÔÌòìàÖÓ؃¾îuÖL¯ùs÷žyúé6|ø…ÈÄ9ø‡¶$=1*üÌ9oCkx¨t㫆U‡?†æ‡ÌM<Ì·eØìÄq å°\4Ë„w¾Ý<ù£.n'oŸ­ßUÿóGô¡k®¹f“üú‘¯•Ë ÙF@\=.± 㜥q\ó ÛXºpMöí[sþEÕ³W!U¡ÉI(·“ÍD ŸÅÊÏ38¦XKRaz2Ðô\TˆÜw_xÞí`þC+µ$Ê­4ù"Ù#÷¬¸—tAà™`V#?DÞ(lIDATŠ­[9{õ]”˜L=êï?ʽÁLˆç+[w¸¯-_ëÆ–G»ÍN±)kW¼ÂiñËæíÁ ½IZÄbÁ2Ä'ZsñdaZ“é™ô¹þÄñî„)£ÅmÚp‹÷f¡¶´45}»ªºú« ¼«ñŸÏo!6¼wÞyç$†vNBˆžNy+¸š±äA›Q|7B÷ŒµîàkعsÙý>øÌÍ7ß¼S„€+Ãøs)‹Ú˜8ý Šè&ÜòÇèÕR*¦[ýYüoÅ_•L«‹ÞïxZ‘oïhë ‰šU ÄE„wf?ÂõLŒj¿„¾ŒÂGLR$¡ÌyôÑGO œŸÞB™™ÐQá#€=lj¦ÝÕñ öÇÓ(Oõ¦,¼Òäà7¾jw=‚ Q2ºávjø4Å­EE¼ë´ÓtøŸɱeû¿ ϯçÛ§^1šŠhT\M?¼ÆÓ%|¼9 ¾Æ;­bèÐS‰àQy0ö.â;@¾µ÷«Z¬Ø¸eãÒóÎ;Ot¿Âƒ/4Ô¾9¤´™.  ùdðªÇl-â§¼)aœrÛégŸý+Áá!˜«Ø¹mçÅûÛ÷ëâ*VWÒ†OŸB¬]rWœ«ÿ°zÑž–=óÈ•vÆJÌ]𩲒ââ5'œtÒ“‚í‹ñx“e$óãÿx"ed"qÕÀë2æ0¬0s‰æc¤¤Ä×.òëQê„K€öÎ `¬xšŠj]8uÒ¤3Ë+*NÐycƒWT——ÁoÝj¸zØÄS‡<Þи{÷³KŸ{n GÒli>•ETŸò5„Ó;©@Ìdb@ADŠ ¥ÐüùÃÃc\Hö66ÞÌŠ/@° ¹2RD¦Œt½ò²{dçn4Ôd¹ÊÒ¡H tÏ D1{\²‚Ú™Ds>£ÛþÎ>Ä]uòkÄSø›§qø¯Òpõá-nynöº ¾(þ¡B«·Ptå•W¢ó†ºÛn»­‰o)Æö ·çC\W’~‡°+ßïA„Á£¨ÿ„ï¤ |ÛGœÆ|N 6¾)¸e/H3cîÖ3 ßÚ€;À“ÃkÂçÔûCÐyL{‹˜£R6BÂCûWŸËm/yª:ZÎ(‘Ž®)£7¤ºX(O­LÉš¤‰‰÷Äe(P W`¶8ìY Y› ¸ºÆ iøg ø È;¿) ’µk‚Z’ùÑ5¯ºÿ®Ûê†é:\ G‹åÐ $"Fd+´YEÉ ç…}L8ßzÆ߃9yØ÷‹æ™" tÕïkv7-^É u‘õc²¤ŒbdžÔa,±‚¿9çÄ­8ê¢Xv³ÕýìƒÜugÏ ´š–¶d 0a W­+ ©2Z°_¡ü5œ’-”ôÀXUA˜„TÙ‚•D§ ³Ø—ÜUF:r—£ðtäERjGêS†~ÁP‹Ž8<[î^µ¬ M@&á Á „›§Ci´ü Î|álÑ'á+x`Å"rÊù7¡:—ãʇÒ$7¥‹ƒ¡—^zéR-eN*^âÑx¿z@«Q¼§³L[¦Òwfyæ(Šo’fÜÝÁ»ßï P å™äKOtô;"Kuè‡B×­lwÉ:ùÇÆ—í#¥-CÚ3 ;ieU·|#ÃråÖÊ (Uãt2pX½$½Á^PÏþ¾Uð( ÚOr!ÛçIx•qeB¨D†8SÍÍ]¬[ößݦ<¬¥oR6¹N‰ˆ¨°—„¿*„„Ö“ˆ¼cp³ä…ˆwÂ’«@Z8*wÚಮ¿^47ÃFÆbŠÉ5sÇÇÿZü·aÎ@²õB|T‘žŠãÇ´]¸A'Fd?vù'‡°|z,<~eÄýjK»ûÒ¼1“l'¾ziÞMüy«bHx40T²€y d‡SVx$`†U‰Õ=Öª,ŠXqDINÄŒ•&ì†s}ëbz³ƒTxÑË#¡VŒüS†Bï ahŽU«ñ I\O|HÂôÕ¬7Áb†Ù w<ÃÐÖ_·"f£ˆÑR¼¿Fñ¾x¢?dþçÐìéIÝò®¯t¦po8ròTÔ d9ÌO]þDd¾¿¾!4 Ÿ<‚¹%r5…Z­‚XðÉ*·å›7º6Ôr<ÈAW]FÏÃ[e#ŒƒdÄ–ÅlÚÍnÑ{ü¢VÇ—T°±…#Ú‡ròIŠFM̤ôVø”G¾é%€€ƒ·ÞåìHï«§Ö!‡ÃuÔ6ö-\¼}«kF /-Ó!Iݱ«•Þ“'Ìà^Îjœý%e[Ž¢ÐDzk› U[Xýé|®9±ÎuPÌG´Û`v8ç˰6‹ —¯e¿³ôÄÚ'(—C£›oÍ Gy¬ÞÝ „öñƒ÷BÛ“a~b®‘S^R2Ä<"â­ó"µ‚•v·A_°Š.žRÂIÿ– þa¶Ëp‹‡®|Ú”FCÉ$prAœŸ}‰ïÍC…]àù$Å1,‘h&eµñ-5)^ ¸‘0ðB£hþüù÷Òù¢ ¼Ü}Š2ͬ>hB‰TàÈ Ý*!›Ç°çÂ'¿±'ýcmƒ#4£6 <#¾K:ÂÄ,Mqïž7ÝýÓY Ü_ÍšÀ¶üƒÐÜe'ºd¼rßB/{ü 7Dx‘Ç7Ít×H<Ûš÷gÚá‘d*ZELÍM·¡¨"wßÓsœ<¸.xù÷€¼ˆÇ†PèahièA¿[[›ßì"ù‹ÿ˜»ü”ïÊfSXôk6$^Aê©&‡5•6S(,ø9ç*ýáÁÈ-5¬ôp'Áì|†À+9‰çZ¹eKmóaÒï”Gƒ:„”ÐÐ7¥fó-A÷3XSÆDqãýÅ Û¨ð’=¹‡X ½ áɇ‹`$¨wrwùÛFVºKŽŸîª+Ûü‡h FË‹GVqgó7r˜ûîò56'Âvל!/Á+”Uã¸ïdISÅ­ùË& q=qª¦‰çŸ½ ¡…³v K0_`—ê ¦¿äBmnà·á'ŽÜ˜ÃÙ}ŸûÜç–Ò³¼ºÂÚõü°qÜ,c¬âò2aþ÷,¬Ð¶øØDz2Œ†²JÚÛÚÙ$uƒ<˜tTã&U Y.Oi(ؾ…¬³Ù"mÛÙ¹¯ Þ/΃<Øô3åÀ€qà¨(O]SàO̧¶q‹ÛÏðŒNñ-8|e²‚ƸÀï:Ð*Á¡‰c âKB{9}ã. Á?g€²cd7Xÿ!»©ïáÐ$2z?]ñnP9ø¹Ê#{z< úÒ‚\ö„ÔTu·nnÈœ5tÇ®s‹ÏbùY¤¢!=Ò Ò¤]®•8÷cÑ”æ[Ô‹)'å›tv4´$ó'ÕtMQ©e»â ¡lØÏާ°˜}¥ÿÚ#`å’žœê“ [ä&“VdÄ©0¤hðrHMʣɣ¢@¸ÈGCWgΤÀ§«±m圳Ü.¶ñÖ!¿)` –~)u>xÒÁìT¨‚XUÑÜÆ¤ËIJ7…!) ‡?ÆàITæ§?3øDý‡®Ì[&Œêº¥£³ëµÆæÌª}ûÝÖ¶NëTÒ#)G)(á4·‘þ¦Ü˜3éÐýnê 7np9ÃU·—Ç&æ:Ö´v¸?<Ì}ø„)®bP¹Î^0ÅAtJ‚ÍÏÄó6îÿØ)§œòhDŒ»Ï¿s^ðØæ)rüÃXIË÷Ÿ¶Ò…9ñ‘#^h©G¡ûB$ÅðŽ—ã*fñSå+™r³´oe} ßÿu¸K¦-g1¢»1R—Â%RR¾v.šøÎc!J ¤;†Ô%åÀQàÀQQ çwž•h üÉ*ܾµÊgWÐpë›÷e8oÛàhu“(^àÆéÓ·ùàböàãÅxøÔ;öG$ÿ„øR\œr;ª¬œ}%æÃ_Ü|SoŒþðÜÔæ]5$óîùÓ]Š¡¾¹ÕmlØ—ym÷>÷rc‹«mm§§]OËvk×ÊPÙŸŒ«rgp–Õî7TV"…åÚ;:¹/¥ÍmßÛ⎟0"£Ó¶=!ÑesB¸ŒMw¹üòË×!\“ÂX0zBË^E­ý3Äg >Å0Õ‡øÖižv_^$Dmì o) îwëuàÌ[W÷eNÕ’]…I•G`T÷·1”ús¼÷J®Ê“Ÿ.â²½èèñü]ÕÝÑ¥.)†®@<Ñ¦Š®Ì"‘)A¢R.Á2„ÝÞW¿Ð½¼k§{b×vÆ…Šâ{Ô»%)’CÝœÍA2«'ÿü$Ô5yßÈžÑbFïHFß=ü ^é@'­¹qÕ•öœRÓ…B8€BhvëP&+w7¹º–6wÅ©nþäÑÀGú(ÄYR^Ü5¸¼,3fØP£C8¥X0°z—Ð2€–ùŸa×Дÿ!<3 J#·}BÏdYx«¬H‰HЋÈ(QòÌ3x‡œ‰–ã1Ч <6ÂÕ²Ú×j?÷ÖSÞú;ðe´ƒ16Wúi¼7Þ @l1‚x¢²ÏxÁ@ NuÌ…i–ÓQz§&åÀÑæÀQ9ʄ㪇/X°à‹ a}†‰T­ºQ6ýE²gíŽîk^QsÛ®5Ô´‡•|ûKÚ½®ð#XFðÁ`{ ±nPÄ„‘ÔRÛâ˜Æè™]ãf­q5«yG/o€ª¬F5×ZÿrP¿HÇŸ£ÞÉ~žªŠA‘‚Pe—'±y(¡2)+º¼›â0œÜñõššš/+pGchJ¨{5¢cÉcä‹l ÕɸvÒ,E,ð›D¦p› ÁÝ”†ü÷4ìy…y±ïÌš3ë?øÔÍmJ›ð¾ ,5 À#ë™q´ËT–hÿ~Ã[ ‡ÐûÔ°b)—1Gr&v-r,Vâ8¥&åÀÑáÀ€õ@|Aï¤åÌÝ UwR˜ɸG2ÖÓoÒ·â3ƽ‹{ÔïÞ´Þ°ƒ“‰Ì –ôè—]sû9}Êã½ãFºwΪq,2ÁžæÂ©JãÙ|¹¼í:L Áƒ›VIø+PtéQ]Jï¤L§ø’Náô½‹ÔÞrÏÆ¦ úLKq[¹ÜåšY³fýop^Å“ðuú ^HˆÊÌî8à8ò·cŽ•rÓ©©ß›„¡ÒVr$T$ØÄ6“uüw n~ñðơ뼧m\+2†[fmÀ=6£L!¨µ·âCS&¨2š>àNGÛ›±»­¥T䮘3Ý8™+’q«œU“ +aõV®Y½nÉ’%/²rìL”À\GŠd{.ž½þ“×/}dñ#º­Qé¯BØZìzîæ©^¶lÙ[þºæõ|z&§‚Gwv Ökl½ƒCñÎxöÙguðà17Ž MjÙê‰ç°+’Z{ydž¤+=á‘¿Âå´šcàÔÒgÀ×b”x†²*¾ÇÆ»KŽ˜¶ÔòææÀ)ÀîZ¾‰¡ í÷<ï;NdlYI‰{ç„IneCƒ[Çõf†AÊÙ#¢}"Z5%Ea[Ö@¬žÅü÷r äÆxî ¯d·3+áµTÉmnÝïv±Döm#‡»÷ÌœæFTz„Ñ<ôÅ»º9äñg÷ýð¾k¯ùlt0è_ éI¾UiùÎi9s  î&–€”pl\´hÑo±ë¹ñ••+ÿzÎܹßÁÞgBÖa.Žò0ˆ=GH€ïX1Js¾2R1úðSZôq¬Ò¬ð±ßtà{¿q¤R ${C½ƒLšÏâÞe´Ú«p“аÖt_ˆ À:Ú`¸³iŸ[[_ï^ihtkš›Ý>×(ÁÔ3Ÿ1¹¬ÌÉäûÌQ#ÜðŠ WæË`xªkǾ¦LCK«›7~lþ%ŠJ-4í?hÙ¼yóßÍœ9óÛ¢Q-~®c•@Ô‹àYXMqè»GC´J¯ÂŠíôj&±€àêÐ^ø‘ŒCŠÍvœ3‰þ}z/Wó­á°|!Ý# ©GÊ”)Þô½·Ð:Óf“ÙÉ^yHàõyèJ肦Ñä+Ø» ÕÃí9a­]MMn)“·º©™Myݥƻ3§LqCŠ©AØš]½•I#†Û#7áô½]õ©¨Jëë—._±âœþùÏ£k,‹hñ‡ñúÚ|DЋ¥Ýæ øÞÌÜÉ(w‡æYz ­ÐgiнæfIÿR¤H9ðÇÀîXkûƒ<ïÙ>S>=µ˜uœEkÑÛ›U$xìðïžï.=x˜›pÊtrlÈ–úú®õ;wFü &ÀƒMçY) ÷TEáý·Ü´ñ­‹å]ô:n%a&ÌqíýJo_˜^Óµµµ§ét\Å LóDiÂniã-c4óÖé¹]ìø6åuÀéê í)LÊ”)ú˨éÛßP xZÚ;Ÿ=ZŒa‚Fy†«6¬W V»ZþW·a*õôˆ–Û6aøp7uÔ(ëU¯±³0g ^F,qÁùEThÞ¢Á¼‘³¤ÞÍ%E×ãÜþøã‡]ݽME(ú÷O|RÅÓ¦Mû=w“_‰âœyX¤tZZy+½zÔ;‘)C /{â‰'þL±iW¶Þ©I9r åÀ1Ï#蘠{úé§ÇÐÚÞ‚`T¯€ £ž€ouÛ'ZUd-r„%+~ë~É0Ï.… õJÐfBKÝzÂz&øÆ~=Ù…Gx™ŸyüÔùóí„X>uøÜë"œ‰ÇóóÏ?1{!þÀwAßš·oßþÝÙ£FUª ý<æ WJ`Ê”on®WŠ&ðP–'!C‹;vfòº‹Vù}Ü}÷L…%Þ«V­ú T—q¶bŽ‘"’2)¤,pÎq·¡+9z£06t…ù¤§³\ï×Óš  ­X±â£¤ýûÐóÞÏpœÇOjkk¿Boh~ )Ué;å@Ê?‰Q"”ÖÚæ¼¤KÙ±½œVu {)ºØ §G·Ô­ãŸ;žzꩳSB˜ð}Ï=÷Ìã¶µë°Ñ3i ª$hÞ9ŠDŒ|7ÜMpº %„yˆòuy÷%^Áð¼.=£×%Ñi$)RüÃ#Y…eLb _CSLEd~ŠÃÏžyæ™…åÅÅ5®¤¤ƒù‡:v.¿†û N﫾µ¼v%o=·r|ù|®Q»¼¯`É[‹á••±I;aÌH{wYtvÕ~Ù‚ÿñ†õÄ2lô*ö›¿”œŒJ»¾ÓåºoDæ¤q¦H9pä8ÒH ¡†l‚Sü–ß!üuvV O¬%V®\y–z1¾g¡Wè]Ø ¬ä··ë}0d¶âŽo¬I¼1Q©%å@Ê”)ŽŒ¥@<vÌcû%zÜR ±Rè ¥(Ž2Á1”uCUZL¬@p(dœÜ5a¯ ôÏÖ›üS“r å@Ê”‡Ç#ÂÊ‹VÃGZ{X›ò„kîܹv”ë»ØÑݾaRyñú”òjgÉl)sOr6׿x Ã¦¥P$©[Ê”)RD°9‰c‰^9.0ZEäeцbèU H¿åÁÝ[^zöÙ«Ö¡•Mß±”Æ”–”)R¼)80ÀCX” ;q?ÆG±ËhY¯ö‰dw G+±´„Ws6ïÁ¤}-g[-¸¥CW’)’”)RôÀcQˆT€Íhÿö`´âˆMxxWÍ} lî¹ë®»Æø°©òè!¿Sç”)R Žu¢„rŽÕÕô.V³Ç$(ë‰0×±[›òž_öüÅ!¤Ê#0#}§H9rà(r` 'ÑŒTÍ]`xeº8ÇJ—Uýèù¥K ®¬¬)æfæýÍ;®zñSŸúÔfE lçHiIº¯bÀr!E”r å@Ê^8ðÓŸþ´ºïc«·^…GoþÇDR"R¤H9ð&ä@îL „ûµ_ãõä…z¢O«ªlÉã]%²Ë “îæ~=3#+å@Ê”žÿÁùÉ‘yIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/graphite.png0000664000000000000000000002637000000000000022136 0ustar00rootroot00000000000000‰PNG  IHDRú}‹Y~] pHYs  šœtIMEÖ L¬‘tEXtCommentCreated with The GIMPïd%n IDATxÚíxÕ•÷¿cÏH™‘dI‘-¬(rG15˜CˆEIKÐh—´ÛÖ@!”¦´iI›nYÞþXh_ºK[¶ ͦn·i©Ùò6åG²48üJ!~šRSÅQBEF¶dI3–fìÙ?fF ÙÖÈiáὟçÉãDv®gîÜï½çžsî€@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ A…"]@88í³øsùœŸb~~Šbý²,øÜ!½ô÷‡&]@¨œÀ\ëøøÚáÏdÓ³Æ³É ³ÉÈdÓ%zßë+nmÙp~– ÷-0±îßðBì»@P"B'JÀÐŽ«D)y›öoQJª_Qt(?Ø`µØØ"Ž%Rï©ÈϰßÂ1ÖÖ–ÅP‹ó·òBŒð‰Ð „¸ëjwµ!žÏÍKŽ Ï“eá,W¨.!úƒ¢Ô-¿Ç—ü=Ö ÷àâàv-¾¡§7H„N ”"í: à¤þ3Ž]ûS^ˆmÒ¦Šþà{}½Y^¼,Sü­²G' àtÔäŽð|NÝ›'µo|\ž]|áUô©ús©"C“p:±°Ì¹Àqf¸ëjá´ûÀ±î€7ÞëkŠgŽf±x•G–¡e±k«´YXV19Î §£æY 8þ^__"5ð‹Dr'¢q Å3PE/ø1Ý „òÍö¦¡xÆ™H ÀëñÄžăï“K¼›b_á¸ry÷«‰$nå…/ŸžæœÓîûÇ™_ŽD»î&B'|Piç838ΞÏçsPEÿ>zpÀêðÂél;0Ÿ¡ÿ“H ,I¤ðYÑ XÜ.n¹ÞÑ¥˜îþÑDrä•ò}·¶lXàc W"•„Óî{"‘"B'|pY^ºÊ â!^Ø™ÿ ÞlSãz À&w¨šïsb¾ÏùrOogŒ¬è|@} €íß:Áü€Þ/ à×®. ×=þ~¼^âu'œŽ^‹ó”®Òü¤Ð‡â™Ì âÕ%Âu½¯÷}¹¢75®·‡Â}1´£Ùj±ý0‘Ú.)½¿¥äòHTIŽáX7æz\0fá˜ç?ˆ÷›H \œH)÷Êófpœ–Ixñ*ô à# í¸Øj±]ɦý¢”œ Àʱn‰bï8í¾cu.ëžË âcjêä„68Ö½”b—r¬ûÒ¬ ¶{=þj Ë< o»³ø7®lßh°@“ö'‘š,Êòâ¡ð¶Ÿëž¡¯ D)¹À,0‹¢ØeYØ_¯ôÎ[[6TÇâü Ë,°ÌÂ1gp˜ @ðV,Î?‰öÿÀ øAž°–ká…BáÚÑ#JÝ™÷þÒ4”vçhahG €†1}ƒvî®°Ñ‹µ{å ‘œvß“‰ÔöÓz ŽcךE1‰Õb»$“M/•Ær eYpA9bþE±‘eáI]@ðädíÌàw'/ì§·šÜ@p¨Äš  “¢ØÏ8jjQç²NÙ~VD¢]žî:¼žu.žÏ}@].Ÿ«FÓµ²,ÌU·SÅtÁ+§¹/Nóוñ –oÛÚñmÕ_Qª¹Ü>Íêp¿…c.Ìò¢¶ ý¡ß¥îÑ¢{ey>·?—Ï-+±Ê¯‚+º×³î£‘hÿnmUÑÌtŽ3¿àÑh×ÈD€gœv_@P…Ù.92¼sÑ‚ù¯èЗÄP$Ú•›æZbê,,ƒÃGËÎQS{s"µ}kkˆù6+ý"€ºw¯~’^ð¿D»>?ÍÄf° Àç´OTáesùÜF^ˆývº½wSãú•YA|¦„Yÿ‰žÞÎ]eN°Uë¾^Mß³äìEÅ‚8c÷ÞÍc:‘û•ÁŒ3dlðÿ„ Ëü7Ÿ.1 J±¡á…¢Ô}ÜÀ¸ø%ÏçnÒDÎβÀ_yags‰IóP'€?X¡ß{&Rƒ.‚=e^òen§­âÚ>~À3å…àø\Ïúý'¢Àko;ˆ¹êÝ,lÖê=z‘¯Y½é<Op؛Ό­;phKD×XÿÊöW˜g³ÒmúßbáÚÂz> ãßʽ²“ƒ‘厚Z85p¢F³–J„ÕkdYxÀ¯| §V#ìà…Àï)\ï´û4/¶þ?/`Xè¼°3ï´w¤·8eê>W¡s¬ÀÙ%öÈÁJEî´wœ—Ä}º{^?&©çµ <¥ÏjÁó9ˆb~eÅ^÷mÍw¤3’ëµ7C–x=~¨3ÉfQê>Rf3Ïê.²pɑᵲŒíå?¼ØùÚß#Ñ~m¯u:jþ:×ãúaVÏá…ØêPxÛPÐÓÚ²a•ÍJÀ—6+ýҶ¼9ÅþØàqQJ.P9E±o˲‚åÞ3†â™+³‚2pµU=ç_ŠD» %J>z¬iN½NÔ|Cq<®ùuËbp7€o8´å]{Œ­l߸@€b§æEêŠ_Îêf“e¡E™´•m™ÓQŽ3Ôç’3ôW1Œi»(æo¥î{'i,¤ ýVMûê …Ih6›Ì§®…qK^®$×bŠb¡,2Læ ó ©Ç)8tûùÎH´ë·eügY»}ÿ»ëj]Å XYBomÙàNg¤ÏÛ¬4V´5#‘  ^òzü[¦^'nKõ^uàÏ7Ò5ŶɲPh‡aL89Ù`éœzï7Ü'œ1îéíÌ+æ¾U†eÊ â.žÏ-K¤’úH@F–…ËŒˆø©sô"P=±ûŒ YÚ4Íëñ¡pß“ª˜æŸÌ=a³Òv›µú·ïÞ»yªmEÉUÍf¥Ï,?á¸@ËUi)%Ü4qà{=ë.åùÜö\>·N”ºÿ0Esµ%V-$RC;Þ®DF¼[Ê `µm¦*øžDj;_á¼R{BaûɱnÀ«F'Ž]ËñBl—¶Å¥$©d8‘Â-å™ûÍ&8§ÕþOU´¢Çâü§-,Ãè‚&ø}=½ƒîÖÄY$ø9F:hÑ‚ùízO½ÚÎS íè<9yM–…ŸÍ$viᘟZ8æ#Y–Çù Ÿ›Mæ/$RÛÿdìaº?£9§4¨ˆa¡;í¾6ÍÒï´ûþ£Më-GGéé}Ý `kScóí¡ð¶)}6kuDçµ×SWî5‰Rr¹òU(íGrdF ÌÐó=æVWvXX‹Ìgñ ±¡ágD©{ÿ D^àçzËEýMg¤omOÝß7'G†¡…rùܳ¼°Óèq¡ê\Ó*—"ç~B”¢”¼&6„㢔¼ÚÀDg/Záu¡ ²ú‹Jg¤v Ç Ë2¨s5k9E)@¸‡¡9i,÷YÞ3åÄÃβ]€Ò<ÇôaºŠòÇ›×›ÜuµÚ‚¥%Tš–»¥Ï‡ÜŸý8Óü?¢”¼S”ÊËž<Éé¨iV·Ð > àžJqs´ýE±zÁ÷[á­¢”D$šD‘àËÞóòB¬¡`ŽB”’hjlžoa™ª žÅ3™ž9¼uAƒÇYïf‹¿õÏ=½É šü¢Þ[¯ žc݆Íö,/¶k††ÛÅeÝ®†P–÷<4ÏȉÔÀµ@ðÍÎäórCk~›•vMüÈŠ:—õ à¹q(ž¹"‘X³Ó5d6™/W¾úɦ PÃEˆ•%–¶˜¥Ç™G¢]'*iŒ¡+Õİb«ÈÐÄá´û®Éåsgyîå¬\ Šù»4«N¥Ü oËT*t‰¢XZ–-¤¦ÍÃFnÐ]W»:‘4B:Á?‰Ëí¤öL6]Øër¬'¢ñ*^ˆ…››+>9ıkWðBì“'¢&„ÂJæž*ø—Üo¼ÅÀl:o}a€ðB̰Ð-Ó¦™h:Á? àN Ç8-œss"µÝÐÊr8œY¤MjEI8}V¸bë'‘ÎHI?¬w'RÁ2¬¾@u"5p™æPR^ø6$G†øk%Ï4î[¥Õ©‚¯xÎ0¦• tµYËí‚òùU™lúÛ c*$B© g÷–SWc×.ð8/ÄXm\e²i$RàX÷WxagI ”%t¯Ç‹ 7ˆ’€¢x²CW$Ú™¶Š'’JÞ¹*øå¶’H ´S §]™ùUç8Öý›Px[EÕl»Ïõ¸0Ï€€Ѹ&øÛ*l÷KëfµY[· Œ0\q¥xEWŸ´p̵ ä9Â9CqrùÎ\X¯OÂ)7? ½Ô~Õf¥%Iç{宼ÅΖeAó<V*GMí®œ^\U"TW¡Ð,€eJöŸI·=ŒîÏ/¥ä"QRJYiY¢f“ï©«Ò(Šb¯Åü/¤±«ó7@”’i7ðÂΓzÁËWräQJ6x=~œŒèW(/€·Ês&-ÞåE³ ðzüp¢±¡á×E)YfâHÀ  U³*ڧݧ͈÷U:SG¢ýáXw;PŽ3£ÎÕ¬¤É ±×NDã†ë55®ç²‚ø5žÏAx¨À~ãïù °¡pß¹Ê `Õ¯èŸUk(¼-k|‚ó/UÂsxóˆ2hZ>Ô›•.ËYe³V//áµ7Ay[Ë=½å®t—«Î¨ Ž8Õr¬ð¥Œ®x"RE_¡#Ëx!fÒeë†*úƒFÂjÅÞ 7ý…Ñ4x!‚S® ,°Y–…5ê;ì ŒBË@|ŠcÝëyaç”›Ö²„>×ãzh(nþ§ØÐp!YFݬðÛéE¾a€[-\Á+ˆÑ8x!¯Ç¿)í.wÅ\â´ûLÚÖA›ý•pIð8*çÍ9¨eÛ©埕é½.6³o²pŒ[ Ï™Áó9h™YÂhzŸl°EÕ·Á'¥XX†¶pÌŸ+ÙZpìÚêH´ÿB§ÝWHJ …ûÐӛ̔ãd]³z“Ê)±b¯ýeP_þÛÀ„ó±DrdB~…*ú*Ï8»°Dô€Pѱd†v¬deÛ)å ÇS)Š5p}F–…+´…Rgéí/½Mí8À7|.92\­Ÿ dYø /·ØYޝÜ=úŽ:—µ¯ÎemŠÛÖÐ7"QÜ7UèÃiï°Æâüƒ–±hf§…cpæÂzdy×CámOèïv}FNð;*U8E]Ò ËÂGõƒLͶK¹ëj¨Àsoƒš”£¤Ú*i@9à)£‰V‹­ °MÈж,sê½wF¢]†·¼k`×úðiÑ”½¡ð¶rbÂ{ uûü;wïÝ\–ÕÒÚ²Á“åÅó,¬ €²uJŽ k+ûc•†ÕÚqQ ÇÙ •¾5•aL+5ß’â 4C˽)Ë{ŒÔ‡k×"úëRj#&E±ÿàšL6}¡öfZGM!—è)5Tùˆ‘Zùe =Þ6ÖÚ²áº,/ë\V³rj͆H´¿À6¯gÝúH´«Ä ÌOŽ ßÏqÞ ”‚ùfýyí­Ž1tJÊëñ·kB,ü®J…>§Þ{Ïç(Í#®Ë¶{(íª${ê_ K8ÑåÖ°¾ Xß0ÈdÓíZ6ÏO8!Dûªä¾[[¯‰Åyý™d²ˆRÙþ’öI>å§3Û¬ôGOõOÁk8?RiIfi,·JóÚëÂtíϽžuŒæxäy›Vó ±¼è¼¾ÖÎ p€U í8O³V3Ý^ˆ½Á±îÌ&ó}‰ÔöŠâJeçº÷ôv¾ÜÚ²am–À) +Í8_‰ö/^ÿ¥H´ÊùÝ5Öɲ0+íWfœCñÌ`ý†…cîééí4dÄžŒ´³³lú<{$RG€`¥B·°Ì'-:['ø‹gÃBu0R°ÿ' þ©‡¶Þ ˆR²M½ÿB<^Íöº‡vŠÞúUJ<~bqªé< åÏ´¤3cË'9.{ïî½›s®ãò"¯½vÂpl®ÇõX%áR§½£ÀRÕw£_埫0L× À(ožá8¯æ» ™ˆ8Ö}~‰Ã0€Rã °¡(ö]m~Àn x„fV‡ÞP)©žÞÎG[[6´ø¯,/þƒºGV¨9ûä`äçÚW;k®w¬È²ŒDûïahÇ]‰ÔöAã—8C–…ù¼ @ó`Üuµày[Å5´ö޹¡pß’¦ÆæBøE<ŸÞod/MQ—PÇ¿`žïsþÁf¥¯/ñcû*¸ïzóôŽ*]NW%¿µeÃÙÎÕþ­žC–wÝ o)ç^zuykËâRçãËÞ›¯lßȸ´Ä*›•8´%QÉsM¤V¨æXwÁY+Œ¦!å*J”‰DûWjÖ£V5œŽCŽ8QÌ/,ò–kßP¶x^õI¼*Ë{$ñ4¥2\3®§÷õpScs§…c昣¥Þ-Z0_«X"ó§ÝlG“#Ã=²,<¥ òàh¥ïõøÛ´4K5¿¢˜‡ÕbÛWéÍg²ép¬»PtA'øý‰Ôv#«-˜¿>î»Êp 8U(bfBWN—iƒB'ø©í•Z2Ÿ/ŠÇkÿy™÷ºðD4^ÛÓûºæ´ÔŽËöîÞ»¹·Ü‹°Y«—§3c5“|{× Æõ*ÕQXvß_©í‰ Û[©óÚk¾‘“PªÏ±Ì|Úø×r@Tm£,ï9­µæf ôÀ\¯ÇÿÍH´ÿ†P¸¯†¡‚Ïÿ±pÌozz;‡ß=«žÞ =9iŸSï-¼îG5ËäD*ùL¥mŠRr¹2a(a:]¦ÝsÆ&¡u‹²‚¸¹©±9 à«¡pßóÅâ˜êçR>ph˱ .³]WªK/ø‡*™4›×[|¾( Çìëéí,+¥ùD4ÞîtÔ¨ÖœX8.[ç²õ\®·ŠÂtÌ`¸\T¼N¤*ŸWXQ´§F$ÚÐh±O†vØôÏQ'úqño*ó2„¾fõ&*Û˜ÎHwöô¾Îê`Ÿ …»Á߉E æ·ëcðªÑù'^ØŸA³-úZ\>î+7a»Ö‰öÿžcÝPóE®¦ÆfâÄìƒ&xŽ3Wdy8í¾6e N8. QJþO%í…Â}7y=~‡æÕ þ{<ö˵0Óœz¯þ¸ìÃF…^ÊkŸÎŒ½yàЖÕÜÇ®uñBlI±Ã •gĵ@-\ªó’C– 'Ê@”’³´Õ\¥$ [é fè+NW¢œý›µúG6k5lÖóÎHxóÈ œvßS¯÷Kµ¶l¨pA‰ü33qPP»°8\§fe60è7X `W$ÚÿkŽuW‡×Ä…LÖ±¯ÄµJ…Ò8´…/ußY^\¦8Ô*ÙToòÂÎ Ìö€ À­ZŽ´îpÒŽPx[°|1¹—kŽÿözüǽÿëå¦2¯Y½É¥ür)“þ‘¢~ 8ÀÎ霙s=®g…JsÖêöÁEB\¥Â]S…ðÚ±²ø4*ÐI<î5PŠNÞ[bÒÍdÓ¬&r†vh·,ãhe£8p¡(%Ÿ·MU«,¡ϸKÏ‹Á˜ðϹüÚ;xaçߣVùYPS´|,^ƒDrdÿL•ea¶:p‹+ÞDËqÄqìÚõÂhú˲, ðBì (›MkJ$ÞÀÓz²×³nV:#Ýi³Ò^¿A‰ C›•>[óöP…~ð|î±J&8¯Çÿ=žÏ¹5G©*ø¬Óîûºš%‘Çâ5ަ&’# ›â{ ÿûéÌØ*uRœ2ïÝÂ1iG‹•Skµàù\<“M‡N™ÇŠ¢Øïʲð~§:ÃJ"åVèD¯M)½%œ”5²,üÀ °§¸Î:Ç™‡9ÎìÓm= «Ñý¾z>; $ÕÍhEOgÆDý>êÔßÙï[¸ú±øºŸœŒì‘å=c+•Çâ|{qaEÕS|°§·òv9ÖmÖUDC;´;­Œš×_’ÄN$1 Ø®â…ïw"5° Ì&3"Ñ~íàŸ#Ñ® q•Drä–H´ž×ãïŒD»&K#n+®[¯ ~ŸQkŠ¢.Y‰öÍi÷iÑ -2²!‘Ú^öi®tFZ  zἤ3ê\VÍÂ2úαË'sšëWß5«7­°Êf­~x÷ÞÍÓn±YéUšç>Ñj 0ÏåË_¬”ÀàÀ9¥8â”fme§(öÙRã]-xâ£(v³,ïy×Ëx>w˜ãÌ>%DgÖªÝ “M·‰ž4ø<²,<ªZ:}˜æ¬C9ï^ûtf Ú½àçÔ›W/œWóØ’³ ßëöŽyjqˆÓF"9Òž”wzéÞëõçžÞΙìÏÁ ±m×{¶)еL3“®È âÃnGÏõ¸®ã…¯¨í\ µ²î©Œ3 íßW4I495ßðN"9rûTŽ8݆ÍJÃÂ1ãFßgÆÐWÌV‹2Vg²éBÑ w]íoàì65¿]YëÝ,–ž;w¼©±ùi+s8œ¹¸xL©<Ý ôÆ bIDATªeÕ­Y½‰RLkˆn-ÃÚ8Cµþ }VïfQïfŸ×YRU^ÿG^œ¡wL3>ü¼«ç…8Ö Žuƒ¡“ìÏ×A)«}D–…’¢K¤žDû çE4Á»ëj?é´wÐLÀ)Ë íhahGÀ§§«JSÆŠ.m`³YéÛPÚƒÑVveï^]k³žwm:#]ûÚ‡ÁÐŽˆÕÒ±?‘Ø%à›¡ Û´ÎÖj®ÁPÕIWôÃ.HŽ O(Ä/ËÂY&©ÓøǺäù×;4üUQê~Pgš]˜™xˆEü³§öi&¿³°Œ¹©±ùó¡ð¶©Žú¶•X±^?ph‹õ<`¥ä£xw,þñDJøRݶ<Ë‹ë*‘`³Ò/‡ÂÛÊ>¯ï´ûÎ=zw×ã¿Çi÷EúŠ'À§œöŽ *yìÚ,Í 1D¢ý8#+ˆ3ºÓQsÀé¨, `gÙôŽ›kK¬Š´×³î[ íèæ…˜%92¼Q”º^dRŸµhÁüÂd¤«z\}H€ÿ …û–eñ·¡ð¶ßO±5¨Ñ¯N:^0ÐwsÚ±ïŽÅï•eáSF뜩¯uZ^šÓ‹²&XÎÜ´ ÁŽ3#îßû†pä­m<½©®æ6«“äå´k³V7M’­7¨®øM6+}—ÍJGêÝì·ÊhòC“,<1yßÆÐŽÝ̲,ÜL~þ^”º{дhcúä`‘hÿ6§½Ã?…À«ÀM²,ô0´ã,yUäeÕ`([xƒ±—NzÜ<•ÏóùüxÀlª*˜ù¼Œ|^.ÞÄTÃfåD ÅߦêϨ_86F:‰~h87PH a€ë&vXéÌ;7dz3z:c£¿ì®ó€eF:óÚññÑ¥ ½8)Ëóú€9 á²LÝ;’Ž]3>>šsÚ}ŸFÿø®r=ñ·Éå¬;ÃÄTÃå¬C5Í yëþ‹(¹B€´u47ò{éjË5£¹ÞIýããgÂo½}=CÏ‚Õ2áÖÂysÛÂóæ¶õ½uâ…ÉI»œç¯g”&QÊ*1¤,ür||ôZ 8j´¿â ®±Æ:û[¢8£®_ÕJú€†/‰Rö¾ññQ+Ǻ¿"JOü¦Œ6_¤5í1´cã°ŽæF®d†^óœñ™ÛsmI3]Ý|Ý,3wOUÕ¬ëE)kp%,ûõ´ûŽ]ëv:jÖ[XæÓŽY¬ûVÀ36+ÍàÔËì覿VZâì~†v¬¥ît¿ÿ»f“ùmÏ«Æ0§|g™A‹á×nÔo ´Ü|íP„f¶QÛGW›¯¥î×J›¤{©‹uµÈœzÝ‘j:ÿÀÕÓWú |‡¡?°Z§™zN\ÿ¯)Î$¼àm³ÌIg¤€Oeyq¾þ÷çò¹¼»><ƒ¾ºÀ}Ú;ïT©ÀÙÓÛi`Ò \ `¯^ÒÚ”P¤:Nú[[_ÒÓÛy¬ÜV׬Þt5”·Ñ”r*JÙ§kÚRÖ±^¯gÝ-~\|„¶ˆŒ²78Aø´z´~)õ7}Ú­rÜçò¹/óÂNCiäS=P%Ùþ«ÌšÃªÎeÝoá˜Ûõ‡RV¶oÔú_®˜ð þÍ#ƒOc"5ð"€‹§/ÃxÀE·Á›O‡Ìú V”’¸T÷Š)…@’ëþ±3Ÿj% ÜÄÐŽ_Z-6$Rðzüj¹ˆ¬ fy>÷¯‰ÔÀÏÊ9^ØÔ¸~€+µ$!uð´¶,–lVzv¾mµ= À/Cámé™ô•ÓÞ±5“MEŒêäøl$Ú0æ[Ç$’#æ…Ø™Z;j,^Û= ÷Ýd°þÖ¬ÞT£†ß<%¾=àÚÝ{7—íÝnmÙ° Ë‹Í b¡¤LQlþQŠbo–å=½  „U›Jìå'^]tžözü?ˆD»žªäÙM"ôÀŠbwɲ « àëþÙtñÒ•í«TÁß%™D·pøè1Ì©÷‚çs$RÛ?3Í x ‘IñB¬@?Ǻ‹bþ°(u 8mª8Ö½N‰…ã,Žu×851¯D¢ý»8Ö}?/ìL—1iT‰RòÛnâX·×l2§3ÙôŸ4xº-óëR©Â“ŠªsY߆.6 ÷¡Z-¶8Îünw±ÍJŸ«N¨uuHByÛqÓézz;OKèÓëY÷4€ZžÏËdÓÇD)y ÀA ø¢Ñ¶Z[64Äâü$’#—ðB¬Êû×žá…Ø/Š_hPì‚òN· pPŠ`<`Ëî½›ß1ÚÞÊö—¦3ÒY^l0–Ä#<Ÿ{À½‰ÔöWf8îhŠb?.ËÂZÕ‘èS-3@@/C;( ‘‘—†”%ôÀR(/,E3ÊÍ@p«ÁNª‚òné»ôþ€tF‚v Âi÷]”Hmß‚^è ©pqý¬ nŠD»î&=D0Ju s}?E±uªÓAEÚ¯˜ðƪ5½uâù­/š7·­À?iŸ›MU˜7׃َ:¼=œ2‹Rßò(N‘Ë{>FQÌ'««ÌH¤Ò¨¦Íùu{<ñj„ôÁ(U_î/8í¾ºÚ\üs[žÔÑsàЖtn³ÒXzîÜy ‘e¡M«ú"ŠyƆ1ÏŒf±‡ôaÆBFÓŸM¤ ÕœÖÅÍô¥3Rç©rAðÇð. !õNðbér]Âô‡Ã©‚G!Mñ¶ÇOÃIµ7´ý¹¶š«Œ’ÇpЦÆõæ¬ ¶&’#ªT~žš@(ZÑeY`å-€’µ“H —ÏÕÏôÅâ|•.O錤‰þy §°pÌ ˘œŽšÂKTËŠpz„ _3ÎËòBlÅLQ$Úÿ¡¡x±8"Áï#á=½¯·Êé¼:—^_Ë=xžôát }BR½.1âËuIÕ ×UÉ‘áB®º*øq¿"áN»¯=îC,ÎÃÂ1šàC@p˜ôát } ǺߕÊÈ ±åtµù«•þŽ]ësÚ}7k¥s„Ñ´&øŸõôv¾IÃ)2Ùt›ÓîÏçÐû×ãPOг0#ŠâèÇÓ¢ä:`-0!‰ã㣆(êÌ—•4÷r ¸¥±ñG…Ñø<å}U³!ŒÆ`¯46~##A[Í;ê²BìßGs#ÈåEÔØœˆ Auµ­3yíUÒC„Óµ¢ÞGQìMÆô¯ü…’E÷sYçOװ׳Ž^“ea  ”gNŽ ƒcÝ¿wÚ}—å=9òN‘H ´y=~­¸’#ÃPWw²¢fÄT‡ZÚÔýsáÄZÑ‹áþà)Šb{ØY¶!³ÉœN¤8§Ý×Àqæ ,,s%€9j­wíÿ“eá_”RÅÝ2éþwõùÚñÍÛ®žØK1´c¶(u“þ!ü „x=ëª#ÑþOø2€ë¾Ô;¤´#u±¡aX-6íôãögñžH´ÿA£Åþ?ú†v¬Öœ ^±¡áÇE©ûc¤o3¡ëáØµgðBìb(Y[gCy¿š›¡œ4–«–e! űî˜Ùd>ÊqæÞDrä%³É¼?‘ÚþéêiE^¥0b¡VC;âV‹í{‰Ôö­¤¡þæBwp¬û‹¼;ÅÛ‚)Ò/@ @ @ @ @ @ @ @ @ @ @ @ @ @ „ ÿ ×{ÂÙ‚DèIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/graphite_short.png0000664000000000000000000002604300000000000023352 0ustar00rootroot00000000000000‰PNG  IHDRúFåä‰3bKGDÿÿÿ ½§“ pHYs  šœtIMEÖ  {ïtEXtCommentCreated with The GIMPïd%n IDATxÚí}{xÕ™÷oì)3’,)²…ENâ(¦b±³(i Zí’vÛ(„Ò”6-iÓ-Ë×ËBûÑ]Ú²mh6u»MKÍ–¯)—dip¸%WSjê¢8Jˆ£ÈÈ’,iŽ¥{¾?fF ÙÖÈiáaç}ž¨ÔÎqfpœ<ŸÏç €þ}ôà8€;”àÉé;0Ÿ¡ÿ“H ,I¤ð„!Ñ úÀ’ÛÅ-×:ºdÕÝ?šH޼òA~îÖ– «‰ö7q¬»‰'±ùMÍÕŽÍ:‘W¥3b[Oog«z=ëx>÷»L6½’aL £iHR!®ò' ¸Dï“3ôîºÚ¯ZX¦@½…cä +"ÀÂ2¥r©‘å…£'¢ñZžÄªT3´£Z“U^߉v –ó½kVo2˜`Q:3æWï"ågßC[>>ãhE–‰äÈJ2šn”$Âp¬û$€ç!¿M»÷Vx(ÃfS«]ßÍ@ðÓ0K*Ë øŒ2??ÏçÌsèÏåswòdç1si°Xñ¨ÿš˜Þuø)öC’´çÍiÆ»À׊þtµY›Þ[t>°Zlà8³l¾°…óðÙPxÛýe>ÇþÙi÷}ãÌNžÏ!—ÏAËL‹hÀ¿øI)RЛׯ8ß `Ob`hı$‰äüž¡»1vÚ}T.ŸkåIìK í8ŸaL…I656kíâ¼h0´c— vTy=þ(ÏçÜŠz„P¸¯° îºZ¸]œ ø€Ú‡¶ˆÊ!ºÀ£Y^¨Um©Drf“‰ÔŒÁj‡È à6ŸWµ!MbÈËvx%K„¨…eÆœiᘵ>¥®µÊ"Ñ~x¶LÁPnZÐà9§ÞÍ.²Y«ýæ—ò«¤3cpÛC[î(5ÎÊö«ü8ÏWç@;Uåþµ ä¿$ˆÝc:¥N“ äß,>øÅ®•¤=ÿ3Å9ºÀÎ{c<µ_I§£fE$ÚÕ[Æ<ª!?$ˆIgÓ~@íÔZV€pTa®¥%eù P‰v½3Õ¤¼žut$Úÿu§Ý÷½\>gQ= $âL$GÎ!£é[ØY¶s!_üÝ?‚·ž ®p¯Óî£ë\V Å3ÈåsàIìU†v|F»ûKØ*«Åö£Djà›ªÔ6›ÌÈdÓXÐà™°¹±¡abr ÀR øZ‰… ´ZXæ…ÃGÑ’Dà´ûH  µeñÃ=½W)‡{)€§ØÒÅ\á'y²Ó;ÝSÔ%”$‘kœvßVö"¦´GðÐú#ŽyºøõXœß‰v}m’ ?ÃÂ2ƒ¡pœv¹Ã|Ÿ6+ ›µ$oZ¶{ïæ—Šn°Àº"­G«i˜­Âüþ~G'Я„|—ÕbC.ŸÓjMn 8Tâ ÍÐIQìg5µ¨sY§?K„‘hׇ§›‡×³ÎÅó¹ï¨Ëåsud4]+Id®bNS7¼ršçâ!] ß`Y±ÙÎÐŽo+þŠRÃ¥€àöi¨Àý޹0Ë ª@û!C;¾/ˆÝ£EÏÊò|n.Ÿ[VBʯ‚+º×³î£‘hÿnUª¨j:Ç™_ðáH´kd Qà§ÝPTÛ%G†w.Z0ÿu}ú²DE¢]¹iæPga>*kvŽšÚ›©í[[[6Ì·YéÔ½[ú‰ZÀÿ6íúü4ŒÍ `€Ï©¯(ÀËæò¹<‰ýv:Û»©qýÊ,ž)¡Ö¢§·sW™ ¶ŠcÝדÑô=KÎ^T ø8€3vïÝ<¦¹_>Ì8@ÀVÿ@rYæ¿øt &(Ɔ† b÷qçâ—<Ÿ»I9;ËåÉÎæLóÀcTÉ7às¡ð¶I™ƒÓÞq1Ç™÷P$8Ö AÈïÄîOV䌣¨Kê"Ñþû¼œŒ@’©ÑLÖñ)Aì™z„à8Ø’H T°$RH¤’ðÐTTbóì‘hǺÔ`N½–Á‰h|0¿ydpOb\Scó õnö~ðŸ.”B#sŽùQ$:å†:üÀ ­í™H ¸ö”9åËÜ.N•âª?à™òBp|®gýþQàµ7ƒeÃ\ õn6kõ-È׬Þt€'¸ìMgÆÖ8´%¢¬eûÆ«̳Yé6í·X8†¶°žÏ…Âø·rgvr0²ÜQS §£NÔ¨ÚR‰°Z`$‘ü À· 9%°ƒ'ß'R¸Þi÷©^lí/ è<Ù™wÚ;R€[ŽœRuŸ«Ð9V àì6r°R;íçe‰°€CóÌë§ÃD"5ð¼š'¯Y-x>Aȯ¬Øë¾¢­ùŽtFt½öÆaH×ã‡ÂI6 b÷‘2‡yV3É“#Ãk% ÛËß¼Øùêï‘h¿j«GŽš¿Îõ¸~˜%Â9<‰­…·…=­-VÙ¬ô÷|±Yé/8´åÍ)ìc€Ç1¹ @äž-I$Ë}f Å3Wf‰|pU©‹ó/E¢]º%=Ö4§Þ 'j ¾Š¡¸×€|‰b²ØÜ à›my—Í}àЖ±•í·hPìÔ¼H‘øåH7›$‘™iËf™ÓQŽ3Ôæ’3ôW1Œi» äoÄî{',¤ž íVTûê Ih6›Ì§æÂ¸E/W’ëΓX€¢XÈBf‚Ê\a¾@`a"5ðx"‡ÆžïŒD»~[ÆKê<´ëﮫu °²€ÞÚ²ÁΈŸ·Yi¬hkF:#B¼èõø·L-'š¥Z¯ºðçëYŠbÛ$‰ÆaNFöX:§ÞûM·Á 5Æ=½yY]÷ÊP£LY"ìâùܲD*©d$‰\¦ä@ÀŸH œ£â‰Ý§÷HHiSU4¯Ç_p†Â}O*`šr0÷„ÍJÛmÖê;ܾ{ïæ©ÌŠ’RÍf¥Ï,?á¸@ËU©)9Ü4ñà{=ë.åùÜö\>·N»ÿ0Åpµ%¤)€¡oW#žÄ–ò¬jf*€ïI¤¶ó à•òÙ#ó“cÝÀ«zÇ®åxÛ¥š˜‚˜D"• 'R¸¥ õo‚å2¡Õ àU-‘hë~½˜é”tžÏ]‰öO¨1Vÿ¤>gž¶ªn« WluF‡„¤´×¹¬¨sY‘%µª¿ ^“Keµ38Vñ.¶oìð è‘åXX×oÊÔUŠ'±kT¯¹Ê˜1™‹D“º2ÆZ[6PÚæûœÊ†ö«ï 8z<ú_îºÚ ö _Ÿä‡OÁ©§|ÙûÑÔØ¼\b¨@’$rPvPfø£$‘‰ÔÀ–é|@ì,Û%ÂEp Ù¿Žš‹bCÃÇru[òÏV¨f×h-å@©`¬‹¬—$2*›† í8È0¦GËÑ š×W¸I=±° Z[#Ë ;“UЩsÀ£ð/éy´H´¿‘¡û>íGrdFtpèù‡s+’–Á¢óÃY"|!64üŒ vïŸÈëü\«¹(?£éŒøM½ã)ö}srdj°!—Ï=Ë“z-Ä…ŠsMí\ŠXœGlhø A tbòšØŽ bòjŒÎ^$á5¡ ²Ö‹JgÄv Ç Ë2¨s5«91@¸‡¡9q,÷IÚ3%ãagÙ.@©žcÚ0]EùãMëÍîºZU`©I'•¦å.Géúöy€Ñž3Õÿ#ˆÉ;±¼ìÉÑø—œŽšfÅ „ðQ÷Tꌛ£ÚKÅj߯OÂ9Z1‰H4‰"À—móò$ÖÆÐ0Œ GG!ˆI456Ï·°LÕ‚ÏÆbN¦‡ž9¼uAƒÇYïf‹ßúçžÞÎdC~Që­WϱnÝj{–ÚU C%·‹Ëº] ¡,ïyh(ž‘©kà;:†;Éëå†Öü6+íšø’u.ëAÀsãP®XûI¤3bÀOë݉T° ­/PH \¦:”ä À†äÈð­dOCá¾UÚPøŠís†1­q  «Íj6hԑϨÊdÓßfS!JI8»·œ¾z»v)€ÇycÕs•ɦ‘H €cÝ_áÉÎ’( è^?nD‚¢x²Ž"€+í¿L•≤œw®~g¹£$RíÅÂi—9¿âüǺ o«¨¡’m÷㹆âð8«€¿­Âq¿Ä±nVåÚ)0@wÇ•b‰®>iá˜k @ÎsÖ „s†â>äò9œ¹°^›„Sn~@{){Õf¥9Iç{åJ^ŠbgKQ=ÏI娩Ý5ƒêÅU%Bu=ÀX&gÿ™4æÑkŸ_$ˆÉE‚(·²R³DÍ&ßSw¥ PÅ^'ù_ˆc9Vão€ &ÓnàÉΓzÁËWräAL6x=~œŒh%”À[å9“oÈò‚Y x=~8QƒØÐð나,3q$`Ъj í€ÓîS9â}•rêH´ÿ#ënjÀqfÔ¹šå4Y{íD4®»ÿWSãz.K„¯ñ|dtbQ€ýúïù °¡pß¹²°j%úgÀß oËêgpþ¥rxno‘Mˇ`³Òe9«lÖêå%¼ö&È·µÜØÓÛY®¤»\qFMpÄ)šc…—2¸bF¤€¾BG–ñ$fReë†úƒzÂjÅÞ UýÉh<‰…àÅ5E6KY£Üa2 5ñ)Žu¯çÉÎ)Ö²€>×ãzh(nþ§ØÐp!YF±Vøíô ß0À­®àĉh<‰ÁëñoŠD»Ë•˜KœvŸI5Tî/‡K‚ÇQ9Ý¢:Õl;Å£ü³2½×ÅjöMŽqËá93x>53‹Œ¦÷I:GT|LqRŠ…eh Çü¹Ó‚c×VG¢ý:í¾BRJ(܇žÞd¦'ëšÕ›¬«Äнö—AN|ùo çc‰äÈ„ü ô)Tžqva‰è ¢²d†v¬dÙìÇr…òTŠbuÌ/ÀH¹B”Moi3µãßð¹äÈpµ–AHù OÈmv–ãÀ+×FßQç²öÕ¹¬ÍCqbCÃê}#Å}S…>œök,Î?ha‹ªvZ8g.¬G–wý0Þö”Žõn×fÔi¿£R„SÔ% ’D>ª=dJ¶]Ê]Wû@ž{”¤9ÕVöHr€§ô&VX-¶6À6!o@5YæÔ{ïŒD»t›<‰µ°«køÔhÊÞPx[91á Š=Ð;ÿÎÝ{7—¥µ´¶lðdyá< ë ›NÉ‘aU²?ViX¡•pœ½Pé­© cZ©ú–d¡âXîMIÚ£§?\»éÐÎKîP`ŠbÿÀ5™lúBõfZGM!—è)%Tùˆž^ùe=Þ6ÖÚ²áº,/ë\V³\µfC$Úß`›×³n}$ÚUbCó“#Ã÷sœ÷¹a¾Y[¯½ÕÂ1ºª¤¼» Ä"Àïªèsê½×ñ|ŽR=âšl»‡"Ñ®J²§þš„Mn=ëÛ€õ ½‘L6Ý®fÃñü„ ±h$ÚÿP%ÏÝÚ²xM,ÎkkÉ: ˆeûKÚ'y=”ŸÎl³Ò=µ>¯=àD4þH¥-™Å±Ü*Õk¯ ÓUdŸ{=ëÕñÈó65$¬ä è¢åEõúê8s€À]V1´ãí_ :½ÿK‘hÿ(äúÝ5ÖI™‰öË3΋¡xf°~ÃÂ1÷ôôvêRbOFÚÙY6mž=©#@°¿R [X擊­üƒúÁ³a¡bŒôÿ‰€êÀ¡-ºMAL¶)Ï_ˆÇ+Ù^÷ðd§Pá£_%Çã!硨Σ‹x¦¥tflù$å²÷îÞ»9§c—yíÕ Ã±¹×c•„KöŽKßVÊ?Wa˜®€ožá8¯ê» êaDë>¿D1 ÷8(˜£2Å «ÍOØ ðdf}èuµ’êéí|´µeC€ÿÊòÂ?(ö;²¤æì“ƒ‘Ÿ«6®Zk®u¬HIF¢ý÷0´ã®Djû þ©Î$2Ÿ'‚Ø஫ÏÛ*î¡í´wÌ …û–456Â/ àùäÈð~=¶4E]BHü€y¾Ïù›•¾¾ÄÇöUðÜõæiUšœ®J6¿µeÃÙÎUÿ/žC–wÝ o)çYzuykËâRõñeÛæ+Û72.-!åa³ÒÁ‡¶$*Ù×Dj`€jŽuœµd4 q,WQ¢L$Ú¿RÕÕ®1àtÔèrÄ B~a‘·\}k@6+ð¼â“xU’öˆÂilJ¥»g\Oïëá¦ÆæN ÇÌ0GM½[´`¾Ú±Dâ ˆÓî‹¶£É‘áI"Oɇ<8Zéä½›šf©äCò°Zlû*}øL6ýŽuš.h¿?‘Ú®G*aÑ‚ùëCá¾K ×€‹À©F3º\]¦ à_L¤¶WªÉ|¾(¯þþó2Ÿuá‰h¼¶§÷uÕi©–ËöîÞ»¹·ÜIجÕËÓ™±šIÞÞ5ƒs½JñC¤ ÓîûK"µ=Qáx+5^{Õ7rr÷=š™O=ÿjˆâ m”¤=§µ×Ü €˜ëõø¿‰öß ÷Õ0´ƒ,hðü Çü¦§·søÝ\õôNôä`¤}N½·pÝ¢–I‰Tò™JÇÄär™aÈa:M¦Ýsú˜ÐºEY"lnjlNøj(Ü÷ƒa[´ 0Ô¸|(ÜWnÂ8v­9íÿ=Ǻ9 æ‹\MÍÙ‰Ùðg®HópÚ}mòAP. ALþO%ã…Â}7y=~‡êÕþ{:<öËÕ0Óœz¯¶\öa½@/åµOgÆÞ˜ÜËU†£Æ¿½ÿq¯Çÿz¹©ÌkVoòAn¿\J¥¤hΰs:gæ\ëÃYRC©ÎZ\ôÀeû Ü5U¡+‹«é€Nâq¬ÜtòÞL{4“M³*ÈÚ¡FÜ’„£•âÀ…‚˜|Ü6Uk¬²€^Ìq—ž;ƒ1òϹüÚ;x²óïÑ«ü,()aj >¯A"9²&ƒJ™­ÜâŽ7Ñrq»v=MY’ÈOb7AÉlêXS"ñžÖz½žu³ÒñN›•öø JdÚ¬ôÙª·€â,ôƒçsUÂà¼ÿ÷x>çV¥ à³N»ïë:h–tF\‹×L(MM$G×y>6Å{ÿûéÌØ*…)N™÷nᘋÔÒb¹j­<Ÿ‹g²éÐ)õ8@Qû]I"ÿàwŠ3¬$‰c¹ЫŒ# ·„“²F’È/Ì{Šû¬sœy˜ãÌ>éYPXõÚûÊsøì€œT7#‰žÎŒ Z;êÔïì÷-\ýŠX|ÝONFöHÒž±¿Êcq¾½¸±¢â)>ØÓ[ù¸ë6k:¢€¡êÁFMë/É¡IŒ¶«x²ó àN¤–€ÙdF$Ú¯.ü9íšWI$Gn‰Dûçy=þÎH´k²4â¶â¾õ à÷éÕ¦(ê’e‘hÿלvŸ­P##©íeWs¥3âRÕ çÕ Q粪–Þ;Ç.ŸÌi®•¾kVoZ`•ÍZýðî½›§-n±YéUªç>Q{ 0ÏåË_,·Ã€àÀŒœ’qr ³*Ù)Š}¶ÔyWžø(ŠÝ,I{Þu™ÏçsœÙ'‡èÌj·d²é6AÄ“:÷Ó)IäQEÓéÃ4µåܽöéÌÔZÀÏ©7¯^8¯æ±%g/¿×;í󔿧ɑö,‘ïôÒÜëõçžÞΙØçàIlD•âZÏ6E±–i8éŠ,v»8z®ÇuOv¾¢Œs)”κ§2΀H´_“hr:j¾àDräö©qš ›•†…cÆõÞgÆÐWÌVš2Vg²éBÓ w]íoàë\6%¿]õnKÏ;ÞÔØü´IÄg..>S =ªfÕ­Y½‰’Ukn-CÛ8CÑþ kVïfQïfŸ×hRU^ÿG^œ¡wLs>ü<‰Õó$ŽuƒcÝ`hÇ$öyà:ÈmµH) ºDjàùH´¿P/¢Þ]WûI§½CfNI"O0´£…¡Ÿž®+M]Ü Àf³Ò· ÔQ%»l»W×Ú¬ç]žêcñ {IDAT›Îˆ×¾öÆa0´#bµtìO¤öAøÇfÈ6u±ÕžkÐÕAuR‰~ÀÉ‘á ø%‰œ`’>íq¬ûAžÏq½CÃ_Äî5ªÙ…É‘‰E, àŸ=e§u˜üÎÂ2æ¦ÆæÏ‡ÂÛ¦*õm+!±^?ph‹y° bòQ¼;ÿx"E¾TÁ²-ÏòBA»JgDجôË¡ð¶²ëõvß¹GG­Cq›’7¡Tvæ£7(kpûî½›Ce ½l’×{4šàzçeyá—‚Øý—é"š3¨=7/N4øE±yI"“Õß3´c‡ &¿£xíÕ±àtÔœËqæ5‰ºËä %‰ìp– &EäÓêµÓJôžÞN©§·óû錸,÷iC!ZŽ,^î%· ÁãÍås×x=þ{œv_”¡¯x|Êi蘒“gÀ®rižÄ‰öãD4Ž,f t§£æ€ÓQI"`gÙ´Ž›kKHEÚëY÷-†vtó$fIŽ oÄÔg-Z0¿ÀŒ4B+›DøÏP¸oY–¿ …·ý~ Ó F+4ô‚޵›ËÐŽ½xw,~¯$‘Oéís¦\ë´¼84§=e1XÎÜ´ ÁŽ3#îßû†pä­õ<½©HóF›&yg9ãÚ¬ÕM“dë *¿Éf¥ï²YéH½›ýVC~hÁÓ¨÷m íØ À,IäF`òú{Aìîp@-hQÏôÉÁ"ÑþmN{‡ €W›$‰ô0´ã,yäeõ`(xƒ±—NzÜ<•ÏóùüxÀlª*¨ù¼„|^*ÞÄTÃfå%†âoSõgÔ/£?ÎD? 4œŽëh$аÀu,‹tæ›ãÙ™=±ŽÑ_v×yÀÎ2#y íÀøøèR†^œ”¤y}ÀÐð I¢îIÇ®Í9í¾Ï‘Ñ?¾«]O<Ámr9ëÎ01Õp9ëPM3HgÞǺÿ"ˆ® nÍ|À^ºÚrÍh®wR¿Æøø™ð[o_Ïг`µL(ÂZ8on[xÞܶ¾·N¼0 i—óüuããìƒÐ$ˆY¹CÌÀ/ÇÇG¯‚£z×+žàk¬³¿%ã01ò>+€¿#žxµìdÕÑѹmÉTæã û X8Ž „0’¦æŸk^´2P»Í¦ª€ËvïÝ>:àJ Xv õ´vÇ®u;5ë-,ói Ç,Ö¼ðŒÍJ38u™]BõW[Ck+ÎîghÇzAìN—ñýß5›Ìw¨6¯ÜòÎ2ïܨ5 ÔÜ|µ(BUÛ(Ší£«ÍW b÷k¥UÒŽ½‰ÔÀÅš^äN]w¤¨Îpõô>ßahǬÙi¦Ô‰k?ðšìLÂ+Þ0 ÀœtF øT–æk¿?—ÏàIìf øð Öê÷©wÞ)R€³§·SÓ \ `¯^RÇäP¤rNú[[_ÒÓÛy¬ÜQ׬Þt5äÛhJ9•¹íÓ5m)«¬×ëYw €—ÐQF¶Íƒ:*(ŸVæIk™H©;Ü´i·r¹3Îås_æÉN]iäS=P9Ùþ«ÌªÃªÎeÝoá˜ÛµE)+Û7ª…þ—Ë*|Å€óÈ`ÁÓ˜H ¼àâéÛðpEQÃÀ­@ðæÓs†¾‚ÄäÃ.Õ\1…¢H’cÝ?–cæSIÂÀM íø¥ÕbC"5¯Ç¯ä È!Ëó¹M¤~VNyaSãú]®T“„”Ã?ÒÚ²X´YéÙeøVTi{ @'€_†ÂÛÒ3Y+§½ck&›þŠzæøl$ÚÐæ[Ç$’#æIìLu%¯š@…Â}7éì‡5«7Õ(á7O‰·‡\»{ïæ²½Û­-dyá¯Y"ZÊÅæ¥(öfIÚSAéM 9¬ÚT–ŸxEè<íõø‰v=UÉÞMôÀŠbwIÑ‚Uð ŽuÿlºxéÊöU ào‡œL¢1=†9õ^ð|îDjûg¦9$’#)žÄúôs¬û° ä b7Ái£@Ǻ×ɱpœÅ±î§£&à•H´ǺïçÉÎtL£J“ßpǺ½f“9ɦÿ¼ ÁÓmá˜_—JžPTËú64±ÑP¸ íxÐj±ÝÀqæt»¸‹mVú\…¡:é„|ÛqÓñzz;OKèÓëY÷4€ZžÏËdÓÇ1y ÀA ø¢Þ±Z[64Äâü$’#—ð$VùþµgxûEñ:Áþ!Èwº]€ƒÜã![vïÝüŽÞñV¶o¼4ïÌòB €±,Žð|îi÷&RÛ_™á¹£)Šý¸$‘µŠ#ѧhf@@/C;È‚HÏ¥!e=°rÇ KG¹nÕ¹HUï–¾KëHgD¨N»ï¢Djû~¤ú‚Dj \ÜG?K„M‘h×ÝÆ ¤—ªK¨ëû)Š­Sœ ‰ûe^_·¦·N¼ ½uâ…Cóæ¶õø'õu³© óæz0ÛQ‡·‡SfAìÛalÅ)Êå=£(æ“ÕUf$RiTÓŒêüº=žx5b¬Az©j¢ãËý§Ý×@W›‹?·Uo¥Ž–Úò €®â×mVKÏ0¶a"IiS»¾B±¡a Å3£Y"ô«cÐŒNFÓŸM¤ öœÖÄÍô‹Ò±óT»  ä1¶á]Té(W8À‹¥ÛudÐôT[¤…L4ÙÛ? •jo¨ö¹*Í5¶á55®7g‰ÐšHŽLèBRy=µAItI", ßBÈY;‰Ôrù\ýL¿(ç«4yêHgDôGŒm8EŽYba“ÓQS¸±DѬ  tz€ _Uêey[1Ó/ŠDû?4Ï çQø}Æ6œ¢žÞ×Û¹:¯Îe…×ãWsž7VÇ Óô IõšÄˆ/SÔ%U3ü®«’#Ã…\uðã~elÃ)rÚ}í¡pbqŽQ‚ÃÆêtº€¾…cÝïJeäIl9]mþj¥_±k}N»ïfµuM«€ÿYOoç›Æ6œ¢L6Ýæ´ûÀó9ôþõ8”J1Cm7hFTG?žD×qk Iüý(Ð0DQg¾,§¹—K·86þ(ϓ﫚 2€½âØø@xÌØUšwÔeIìßGs#ÈåÔØœˆ Auµ­3yíUc… :]@ð>Šbo0¦½òrÝÏ%‰<Οn`¯g :¼&Id ·gNŽ ƒcÝ¿wÚ}—¤=9c NQ"5ÐæõøÕæHŽ C‘î†D7hF4UQK›b?*ÖŠ.†û€§(ŠíagÙ†Ì&s:‘àœv_Ç™/°°Ì•æ(½ÞÕ¿?&Iä_äVÅÝ’±üïZó0´ã;ª·]©ØK1´c¶ vëcÐßè€×³®:íÿ$€/ø°öó¥îRKêbCðZlêôãög‰pO$Úÿ ÞfÿË€¾‡¡«U'¨×ãGlhøqAìþ˜±6ýÍ€®%Ž]{ObCÎÚ:òýjn†vpâX®Z’H@ŠcÝ1³É|”ã̽‰äÈKf“y"µýc©§yäÆˆ…^Y íˆ[-¶ï%RÛ·ëcÐßèýÍîàX÷y;ÙÛ‚)c] 2È ƒ 2È ƒ 2È ƒþ×ÐÿÜÂÙ{%bâIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/leaf.gif0000664000000000000000000000202700000000000021214 0ustar00rootroot00000000000000GIF89aç–`a™gg“ghžgh jjœjj¢lm£mn¤oo¦op¥pp¨pq¦ss¤rs©us©tt©uu«uv¬yy©yz¨z{®{{¬{|¯||°~°²‚±„ƒ¬„„§ƒƒ±ƒƒ´……¥ƒ„²‰‰®‰‰°ŠŠª‹‹¸Œ»Žººº‘¸‘‘·‘‘¾‘“µ‘’¾‘’À’“À”–Á––½–—™™À›š¹››µššÄ»ž·œœÅœÄœžÄžÆžžÆŸžÆŸ Á¡¡Ç¤£È£¤È§¦º§§È«©¼ªªÎªªÏ¬¬¿ªªÐ«¬É¯¯Á®­Ó²±Ê±²Ôµ·Ö¶·Õ¶·Ö¶·×¸¸Í¹¸Ë·¸ØººÎººÙ½½Ñ¼½Ý¿¿Í¿¿ÒÃÃÝÄÃßÄÄàÆÆàÆÆâÇÈÖÇÈáÉÈÜÊÊÜÊÊÝËÊÛËËÝÌËÞÍÍÞÍÎäÏÏåÐÐæÐÐéÓÒßÖÕêØ×âÙØíÜÝçÝÜìÝÜíÞÝæÞÞéßÞëáâìååêäåíåæìçæëçæîæçìèèíçèðèèòèéóééõêêíïîõððöñðöññöóó÷ùùýúúýûûýüüýýýþýýÿþýÿþþÿÿþÿþÿýþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with The GIMP,ã- ¬4R$K’Z"¸P "9a¶XÁrçQ•(õ1ó¦—*IbÜ(¤Pà!8ƒè¬áå4)¬TÇP •\žññbß’nðš³2Š‘-Dì™4L1qØt‘r%{V:àB‡3väò¥Fž’h@8ðÀƒ &Y~°ðSrŒ <Ð@‘&gZ*C A„Jè¸æŸ†–ÒL@À6R¨˜B2" @@Á„5KIbhIψ0À‚£H¢’%-²Ce-€á)k…;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/mini-bottom2.gif0000664000000000000000000000020400000000000022620 0ustar00rootroot00000000000000GIF89a# ÂCCE@ÿ@ÑÑÑìììÿÿÿÿÿÿÿÿÿÿÿÿ!þCreated with GIMP!ù,# 4(ºÜþ0ÊÉ‚8ë zß &VzŸ©ä¥ré;°­ŒyöLî® ä4^îg ò(Hã19Ù;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/mini-top2.gif0000664000000000000000000000016100000000000022120 0ustar00rootroot00000000000000GIF89a# ÂCCE@ÿ@ÑÑÑìììÿÿÿÿÿÿÿÿÿÿÿÿ!ù,# 6Òþ0ÆE™¼¸U%†ÿà„¤'l]Ž*xRië´ü½œ=×:Ë´ nðúµ‚<Û)Ãl:Ÿ™;././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/move_down.png0000664000000000000000000000125300000000000022321 0ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆtEXtSoftwarewww.inkscape.org›î<=IDAT8…“MhA†ß™ìækÀ`ÒCüÁªõ"I´àÁ‹ñ"/*âAê¡Uñ*Ò<©P„œ!¢RS[r±ÖUµ-{¨U´TÍš®ý é&³³Ÿ‡Ö›ßã7ß<ó¾óÍ0"BµâÝj„0ê‰ÁÐ{DsuI©i"„o]HÃvlG`É*`É2wݨ×0Æ›y޲]B¡8ƒsch?xµ®)^¯XÊ£øënlˆînP—UÄÖí»`9$½’lH²±\6Q½ïR× 2Ž7 9HEB-Ñ‹'¯û— "Ç+I‚˜¸DQ z9¸ÂpþÔ5/¢‚t6Uš_œK1"B¢[M·E'D“ž÷ùW\@¢Œ{Óó9h-GÛöÓ)ON÷½îí|-rÇ˱ŒñŘ¢Hp/ˆW—BeªÁíãP}.D#Ga.˜4ùaÜ Â™õKÔ5Q!ùpðžååMøƒ(ÑO”]‹p{9Ü>¶mÙƒ¯Ù¡ŒE’º&ŠMA×ÄDE¬t>¼SÚ8›• zVOÞ¼)€ý¡cèË>. QéÔ51QwŒº&zgO/†ÇDk0®0(nŽCáȽ{[ùa~ë×5ÑÛðƒŽ¡‘鈴@»›bØåÁüºL¹Q=ïÈÕÜ º&Š$‘ÌdŸY[±A§OûŸXŽü“»Zlãoü­x—z.Ò¼ó6Ìæ?_Úhý¿8|E½Ã7ÅÙõüsJ*†hËIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/move_up.png0000664000000000000000000000121400000000000021773 0ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆtEXtSoftwarewww.inkscape.org›î<IDAT8•“OhAÆ¿7»3Ù…zhLÿÑ‚íÁ@*¨ÐÕŠhDbE-rkJÉIbÁ«ÇR‘ EO¥BñâM*^DPÐC)´*•”4‰¦š&ÙÙQ¬!©ößûæÇ|ß›!­5ÚÕÉ›|–f½évÖnà¸<ÝßIöuL:.Oï à¸<û²WÎLÇF“Á€f—Gÿ ฼„ʼnsÓÖ–—Ç–·‰øÈ% „EÇåÿáÑèp¢§74HŸKð±ô:Ñ ÂÃ]ŽËÓý"‰³GÇùJþ Æa2ŽWk ˆ ¡ý=‰æ<ØŽÃQÁíl*áÚëåehò „‰:}Ç6ñ.ÿN_ š¦ø+¶Ó÷ÔXÆRä¡"Kà(ËuÛ@A®¢¨VqþÔE‹ØŸ<Øoßñcã݇úb”¯¬Áä87PQT¯6ƒ°–¿½@¸7DG‡‰5ò ‘Œ™èŽdoLܱ@A‡‡×¹¼-<ƒd#$2ÐZC) ^¯áñÓùJ±´9cCêSnÅž¹w¹á‰£z÷ú«,sðmpÁÀL‚Á snWeM[¿ì‰!e.ÍzNÓ&´Ö ¥ú0ƒ`ph@dM[/ç<Úõ€Ò>~Ô‹+û²® Uë?c¶júJ¢ZÛ†25 |Ið½=¤/¼b1ö lܺ?n%&ÂFsï'0÷Å۶К"IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/overview.png0000664000000000000000000022016700000000000022201 0ustar00rootroot00000000000000‰PNG  IHDRÈ჆H/iCCPICC Profile(c``2ptqre``ÈÍ+) rwRˆˆŒR`¿ÀÀÁÀÍ Ì`Ì`˜\\ààÃyùy© |»ÆÀ¹¬ 2 UŽ +¹ ¨¨ê¥¤'300ÙÙå%@qÆ9@¶HR6˜½Ä. rвùÒ!ì+ v„ýÄ.z¨æ H}:˜ÍÄb'AØ2 vIjÈ^çü‚Ê¢ÌôŒ#Ç”ü¤T…àÊâ’ÔÜbϼäü¢‚ü¢Ä’Ô Zˆû@º! A!¦ahii¡ ¥"ŠˆqŸÁáË(v!†°(¹´¨ Êcd2f` ÄG˜1G‚Á)Ë„˜I/Ãþ©15C}†}sïPoì%¬´ pHYsgŸÒR@IDATxì ¼U÷Ç×<ÉTD¦¤Ì•ÈP)*’FRÒ¿Yõ¾M**ÍE•I †*¢¢DBdÈ÷½®{îäžsžsÎwù\çœgØÃw?gŸ½öZ{í\=1€ @€ àr'xý©> @€ @À@AæA€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ à@Aæ1€ @€ xPy @€ @d@€ @€€G™Ç€ @€ àÈĵk×Ú¬Y³lÉ’%¶xñbûóÏ?mëÖ­öÏ?ÿ¸¿}ûöYñâÅ­T©Rî¯\¹rV»vm«S§Ž{-X°`<` €@‚PßöóÏ?ÛÂ… ]ß§>pÕªU®ßÛ½{·{Í—/_rß§>ð¸ãŽs}ß 'œ`•*UJ0bT€ >\=IÿÎB xöîÝkŸ|ò‰Mž<Ù¾úê+ûý÷ß­J•*V½zu«ZµªûÓ@0þü¦ÁažõõêÕ³\¹rÁ€ °P¶éc³âRjlÆ s¿:Øgœa-Z´°òåËg¹RX.]ºÔ~üñGûüóÏí³Ï>sÖg »víj—\r Êr–©r Ód 5j”½ñÆöí·ßº ½3Ï<Óõ 6t“€YÍsûöí6wî\ûúë¯]ß÷ÝwßYÑ¢Eíâ‹/¶+¯¼Òš6mšÕ$¹€ óPc¾ £r™¾ÿþûÕä‚ .°îÝ»[Û¶m-)))ÇHaþðÃ>þ|;ï¼óìú믷³Î:+Çó"A@é8pà€ :Ôúôéã¬Â×\suëÖÍ*V¬˜ÞmÙ:§%)R–‡îú@M:^uÕUvà 7XéÒ¥³•&7A€b r¬µX‚•W¶Þ½{ÛÀ­cÇŽöØcYµjÕ"FAÖ Neµ‘ëb¯^½¬S§N–;7ñí"Öd% ‹î7Þh›7o¶¾}û:e5“‚iáݱc‡}üñÇöÚk¯ÙO?ýd×^{­ÝqÇÎ};­ë9@ˆŒòã¥%ã°Z'wê©§Ú§Ÿ~ê\ ß{h*ÇBZ·n]ëׯŸ-[¶Ì.½ôR»õÖ[ÝZ?Y˜@á  ¥O?ý´É…ú¢‹.r¸d9Ž”r¬:.\غtéâ,ÊS¦Lqãáºë®³uëÖ…£Ú¤ @ä@4…HM`„ Ö Akܸ±Íœ9Ó5j”ú’ˆ~Öº¼»îºË­O–’¬A¢¯Z@È);wî4-#0`€ Bøàƒ:×êœJ?;éh¢rìØ±Î’¬Ù5jÔ°^xÁÿÊNzÜ@2\¬ƒÜ: Z¶I“&97æ—^zÉ­5"E„•ë÷›o¾i·Ür‹=úè£V @ ‹ª 8üñ‡­^½Ú´5•>+жDÑf‹)beË–uÇäJ®HÜ ˆëüóÏw÷¥¿L™2¬¸Êvûí·»]^ýuçé“QAeWÔlýiEÓVß·gÏË›7¯ë?Õß©ÿÓŽÇ{l¶eTÎC€2"€‚œ!ÎG”À_|áˆRޝ¾úêˆæÌ´ÿ¨\µŠ\Àµ¯²/:6mÚ4›:uªÍ˜1ÃfÏžm+W®t®‹ ~£½˜e™ö÷`Ö@qÛ¶m¶~ýz·é–-[ÜY–ô&Mš¸¨µ§vš”úyð Ä}ÿ/¼ðB7q¦húAßjNñ!äþøã»Š÷Ýwß!±ÔשÓ§Ow^@ÚŠOê÷Ž>úhôK}Ÿ¶âÓ¶}:'¥YîÛ²Rk«)m]%ï!í* )Í @ ÜPÃM˜ô3M@k޵]É“O>颦fúÆ(_¨­‚w½úê«öÌ3ÏØQGå”eYµÿrË–-Ýv)èÕªU+ÓÑg7lØ`Š¢­9ßÿ½iò@î—íÛ··Ë.»ÌE×–åbŸÀÍ7ßìÖûjB-–ùd§Üj»¨O<ÑŽ?þøä ÁôZL}ªv.Ф¶àSdmõƒš€ÔTÚ‚OA@€@8  ‡ƒ*if™Àþýû›^ýúõ¢™åpƒbm‰"Wk)°²Éò›S¯å¢¨Á¢öB1b„³Zk-ôm·ÝSê4E€@ Œ3Æí;,%PJd¬ÉÖ­[]´mõMÚO Ï=÷\ç.SuѲ­ƒ~ÿý÷MAÃdQVTm½"€ œ$€‚œ“4I+Ûžþy”FÛ**T(ÛéDûF¹Hk±ÜÃ)šPÐ:@Y¬gÍšåÖÊŠ­È³ ;ÔgÈ•Xûk¿õX)ÊÅŠ {´Žù•W^±—_~ÙY•û÷ïoZ~‚@€r‚ rNP$#" µ¶U«Vuû +@ ’5r?¼óÎ;]à/­ÝîСCÖàj@ j´¿±&»äª¨U2Lÿý÷ß&åøÙgŸu®×šh-Y²d˜r#Y@H(ȉÒÒ®ç#‚ç`éÒ¥në½yóæÙ;ï¼c­Zµ:‚Ô¸€ r¢?¬¿¢3+ðŠ¿Å‡Üñ õ¹çž³_|Ñ.ºè¢–&>³Z¶l™]rÉ%n}²Ö5jð@Ñ%  SúnÊ5XÁ÷ü-Ž„jΜ9öË/¿D·€q»& µwô½÷ÞkO=õ”õìÙ3jE @ P£A=ò”2,×ßo¾ùÆmo¤ ââÅ‹[… Üz¯->´fWû '%%%™ðWQ“×^{­c¯È×D{ ?sr€€O@ñ@ýŸÜ¦Õ÷)B¿Ü§+V¬èW)Jµ¿ÅQ—.]XáÃËWEïØ±£S徎@€²J9«Ä¸>$Y†‡îÜ50¬Q£†µhÑÂícyÒI'¹ÏAßÛ3dåb섬)Ú6f„ n‹(í;Š@á!pàÀ·½‘¢Ë7ÎyÆ(h”öïÕVGuëÖuÛ iÛ7$ü4)¡hÚŠr}Ï=÷„?Cr€ ¸"€‚WÍÊHîׯŸÛ‚ã”SNq[]pÁ¸÷F§9’s•’¬í¦´>ïÛo¿5öLNFÃä­!~ýõ×kïöíÛíòË/wÛ»ibe8Gg;‘™3gZë֭ݤ- ³‘!$$ä„löœ©ôo¿ýfwß}·}ùå—vÍ5ר­·Þ“{xæ `¦²{÷ngÁׄÅã?ÌBR*Ä}ûö¹-†`ð˜cŽqQäC!_¾|1V“ø.îСCYÛâEßmMí ä$䜤™ iipøè£º@(W_}µ=øàƒ >Üö³g϶SO=Õ’Û;dŸ€¾OÝ»w·;wº>ð /Ì~bÜvZ¬¥=C† {^d@ñA9>Ú1bµX½zµ‹’¬H¬šoÒ¤IÄò&£ì…×®]¦5’ =r§¾í¶ÛÜßC=ä‚ f/%îŠ?þøÃ­WÄðZµjE*[ò &€‚Ãé¢k ¡À'7vQ§}‰ óçÏwÁ‚´Õ ®†±Ñf”2Xz÷îíöÿý÷]?¬ÒQšôhë;ížðüóϧwç @Ž@n8@ 3V®\imÚ´±öíÛÛÈ‘#ÝÖL™¹k‚A víÚV¿~}ÓÞÈ 5?ü° <Øm¦IB$¶h)ÐèÑ£c«Ð”€¢F9jèc'ã½{÷º}%›7ontûyÆNé)©Oàì³Ï6틌@™'ðá‡ZÿþýmÒ¤IÎU7ówreP´lÙÒÖ¯_o ,J‘( ˜ r€'(E“õDѵþ.W®\A)åÈ"zõê™\­@ sÖ­[g×^{­ 4È-QÈÜ]\4… ²êÕ«›v^@ @ȓќOlË—/wÖmåT°`ÁĆ㵯X±¢­Y³&ÆkAñ!9}úôqà»té¹LÉ),´™þ/,hI€@Ü@AŽ»&ÍÙ )¨IÛ¶mí”SNÉÙ„I-âòæÍkr—G Œ ¬]»ÖEêŸ1cFÆsEà Ðÿ¾‰(  À@ALS¯ °áÇ۰aÂW8J”e7n´’%Kfù>n€@"P0† ÚI'”ˆÕ»:oÚ´ÉJ•*wõ¢B€ óXƒœóLã&ÅÙ³gÛÎ;­U«VqS§D®ˆ¶éªR¥J"# îÈ4É“'Û\éë¹0Øèÿ‚Ý>”€@  ©5V–_ýÕEm•kû¦OŸnM›6ýŠPD€€ú¿ D §àf¡IÒ­[··€™,ÙÂ… mË–- ßž™ÄÅe€ž rÂ?¡È%­lÙ²¡/àLÌسgM˜0ÁÎ9眘)3…@4 hIB¼÷C‡µ‰'†Ä,ï¡iÓ¦…<+'>þøckÑ¢…)š5@Ȉ rF„ø|þüùÝöN Œ nª>fÌ+\¸°i/kȘ@l×®]_ÃWHqœ:ujÈÌœ93æûŒƒº`k—_~yÈzr€ ’ rJ¼?„ÀqÇg ,8äXP?ÈÚs×]wÙöíÛ“‹øÑGÙû￟üyΜ9vÝu×Ùyçç®Õ§¾ìرÞ|òIëܹ³Ýzë­öûï¿û§Lk×üqw쪫®rLt½ŽuìØÑºvíjŸþyòõA|óÔSO¹zåÎÍW>ˆíC™‚G jÕª&×Ü ‰Ü¾ÕOýüóÏÖ½{w÷§c?ýô“{ÅWÖ;Ö®¼òJÓVU£FJ®Ž0ê^má§@Œ_|ñ…{2eŠ]z饦 º~õêÕÉ÷(¢·Òiß¾½=ôÐCÎmY'wïÞí¶¼ð MŠè'Ÿ|’|O´ßŒ7ÎÖ¯_ïÊí²? ÄF˱ÑNQ)¥¶vÒà(¥²•‚d"ÓÍ›7»š‚ŠùòÙgŸ%»®\¹ÒÎ8ã «V­š,jàÛ®];w©Ü[·nm“&Mr.ÈZsݨQ#›5k–;¿lÙ2—¶kI¾|ù¬Göí·ß:å¸N:Ö¡Cûá‡Üù ý÷î»ïÚ_ýe7ÜpCЊFy XrÉýôÓOU>õÅš˜ÓDßÉ'Ÿìúç³Î:Ë)¥µk×6Y½ÕOù“Ï<óŒë«‰[ýù¿ÿýo»÷Þ{]Ñ^×)RÄEwþþûï­oß¾výõ×[±bÅ,W®\¦‰5MJ¾ùæ°ñØcµK.¹Ä¤x^vÙeîœ&¥KA׺m)ÉR¸£-ÚÖîž{î±»ï¾Û ,íâ? ĶyŠ‘†ŠF15€’¥àå—_¶D£9–§¯¼Þ|óÍn@(åXƒ?Y>¤@j"@J³Œ­¿îׯŸ1 ¥€Ë"-%[¢ÁŸî—ÅYrÌ1ÇØ?ÿüãÞé?YÖï¼óNgu*Z´hŠFY hò iÖ¬™ëÊ—/ˆ²Ji•—Œú¢Š+Z›6mìÄO´!C†¸É=¹«?Sp-)Ä}úô±?ü09öÀ 'œ`çž{®õîÝÛM¾öÚk&ÅZý¼"ÅZÊ´Dý¡&âdEVxþùç'—)ù†¿‘EüÑGu“™ìÄaød@ Æ àbã îâkÀtÓM7¹5iÚ&#–$e€2eÊØÜ¹síÅ_t.ÒRŽå- «®“KaåÊ•“ÿ´¶Xny¾¤`õïßßÀF“ãÇwieí—Y ’e]Ji òÏó ¤O@ý…\‰ß|óÍô/ŒàÙÔ}‘²Î“çð¹n¿ÿ“5×ïÛªW¯îúÀ£>ú°«H+mÿByÛø6þ1ÿU©Z-åXK[äþýÒK/ù§#þª Ny÷<øàƒvê©§F<2„ Ø&€‚Ûí‘ÒË•X ¹%ËÕ8ˆâìR®A–rè‹\¥(vêÔɹŒËZ×Ê*"Kˆ,+rôÿñ9T]uüꫯv÷ÉUñ믿¶Ûo¿Ý>øà?»¨¿ª®?ü°+S¼oUuØ n hé„UÝrË-Îu9–*ª~M¢µÔ~¿vöÙgÛ?þh%J”8¬*rENO4¡èÇeÐuRˆÅG§êõ¡õÍ XøÀØèÑ£ÓK.lçT¹ŒË@¡ @ «P³J,¯—uBÛhM²Ö¥$‡gReõÕ~¿²z¯Zµ*¹x*»K#GŽtAÇÞ~ûmçj(7C¹ *ˆ—ØÈ-oРAÖ³gOgV©Ž\NŸ>Ýþõ¯¹u{ Ö%«Éi§–œ_´ßÈb¤²\'Ožíâ?b–€‚`IÙÓ2õ! ü-IÝ¥þ¬rùÇ´ ¬¨êߤ´ªPtjE²—¶D.Úêó4Q˜‘h—€çŸÞYÓ•–¶mÛÖŠ/nóæÍsë|¥4+=õÁÑêU-¡Q4n‹5ϧŒÚó€ ~I޺ˇŸ 9Ä:Yh±ôï¿ÿ6­kU«Æ&2¨}rwÖ@PŠB­u·ZO'K‚Ü 58p ½õÖ[¶fÍ{å•W\€¹WkÍœ,Àƒvе\¨5ø“Ⱥ,÷BY%$rE”+¡‚ß(=Y/ºè"·uTP¶QÒàX‘n÷íÛç¬Gr/×zÊP.’®bü¤Iàøãw‘ê Jý†b("~¤Åw›–Ò.Ù¿¿mذÁE®ö¿Ûr/Vÿ$7jÅFX±b… ²¨uÈú¬m¢|—lme%åXJ¥‚}iò/¥b«‰C¥uÔQGY½zõœ«¶úO¥%¢Ç{Ì¥¥k´ÔDý¡ú_õ²"ûùD’“8(m9¥²jˆ#ë·Ú d†@.ï‡1}¿ªÌ¤Â5 E@ÑNe=Õ\Y'¤ˆùî| "F*«²&7©[žè"€@Ö Èzüì³Ï:%³V­ZÎõZ“c¾ršõ¹#Ü´ ÃwÜá¬ÉO<ñ„³ ‡;OÒ‡ Ø&€‚ÛíÕÒ˵X­ïÕ`QÖ EzVP?ºjT HæÉdI–{諯¾jм­­^@ {ä¶«ï’¶IR´{}Ÿ´¾·yóæÎºœ½T¹+\B[Pi'õì‰.Ò¤ @ >  ÇG;Fµr·;v¬SÀÖ®]낵h¯Ü–‘`P¤m­¥Ô«,_ }rÀÒëÚ'~øðánù…Öýk­nZ°²Ÿw)íXpÞyç¹] &Nœh… :Ò$¹€â”Aºâ´a#Y-¹îjí®Öæj ¸xñb”ãH6@òºòÊ+r¬W±A ìÐà/¿üÒyÑ(Bþ/¿üâ¢å£gŸi¸î,]º´ ¦¨6ÓúdyÕ € ´  §E…c™& 7CE¶VP,m¤èÏ~„ÔL'Â…% ˱&2.¹ä[´hQDó&3Ä ÃÒ’‚R€*ùS +$¸´}ß'Ÿ|â—)Ž@H‹.ÖiQáX¦(ð‰¶K1b„‹œ©›¸(0´–­i[–hD›  ,øí·ßL‘¤µ–“HñBb‡Àüa 4pÞ4:tˆ‚SR@ˆ,ÈÁ™Üwß}6jÔ(ûî»ïPŽc´ywëÖ­ö /Äh (6"O`Ù²enë#­5Ö!ÊqäÛàHs¬^½º‹F®IÂmÛ¶irÜ@qF rœ5h$ª£­‚´Çð´iÓ\TÐHäIá!0aÂëÒ¥‹-]ºÔíž\HñA@ëV›6mj 6t¬ã£V‰Y XS[j÷…Þ½{'&j @iÀ‚œ&†"°k×.Ó¬ûsÏ=‡r R o×®üñöÆoÄP©)*¢C@ÛÚíØ±Ã­áN È5§(¨ä<àÚrÏž=9•,é@€@@AŽƒFŒd† bŠÚ½{÷HfK^a$pÝu×9WÑ0fAÒˆy²÷ë×Ï{ì1+P @Ìׇ ˜i‚PA%'Mš@€@2äd¼É ‘#GZ=Ü–N™¹žk‚O@ûUÏ™3Ç´‡5¤Mà›o¾±½{÷º-‚Ò¾‚£±F wîÜÖ¾}{›ÙZ·níÚâôÓO7&ÃóÜ“* x%€‚¯-¥ziÿ½÷ÞsÖäU«VY—.]ìŠ+®pûLfe¢Ï‡~h/¿ü²ýôÓOv×]wÙÓO?¥Z#[­¡kÞ¼¹[7œ/_>+X° so/]º´É2R¹re«U«–iq¥J•‚QhJ" ¨ð<òˆ 6Ì7nì,—:t°2eÊd‰ÂÌ™3mèС.Z¶¾çúî'úwZ¿%Ÿ~ú©uÔQ¦þOK|´¼G“bS­Z5çB]§N“Õ d— rvÉq_º¤(k}ò!ClìØ±nÀ¢™| kԨᔹ’%KZžýû÷»¾/3 ¯,̊à‰2íã›””û2Q­ë~ê©§\Ÿ¯˜  @ g Êä‘& 3«+­CîÕ«—yæ™n-Zš‰ÆÑÁiÓ¦9·Ì-Z¸ídPŽã¨q©JÂ’›åX ´ÎVªÔ'\|ñÅ.@_<Ôží ò(÷r¹œ£ÇskS7@Á#€‚¼6¡Dé’<`À»ð í‰'žpèt.ÉS²ª+ ™&TßW_}5a,F1Ù`   |ß|ói}³–¡,^¼8¹F> -ÁQý˜LÛ55lØ0ò… G@Hh(È Ýü±Yyî’UaРAN‰Tp¯xêÑz×^zÉ>ûì3»ãŽ;â¥jÔ8BŠàüÕW_¹>B[iò,^D.çýû÷w[4Éb,ky•*Uâ¥zÔ€bˆ r 5Eýêúõ×_]4ìºu뺵ÉrË‹UѶVwÞy§ Ä¥ï¼yóÜšÃX­å†ÂC@ûÁkmäȑַo_·.ù—_~ OfJuÊ”)®ï{å•Wlüøñε:þüÊl @‡@A>”Ÿbˆ@ñâÅÝ6RcÆŒ1m§R»vm{óÍ7mß¾}1S )ÆÚ¶I{xþøã.Ú·ÖÝi €@(íÚµ³ùóç;dM^uÕU&÷äXYõ”¤sçÎvÅW¸-±ZµjKU ¬€ ‡Pã°Q­J­[·vëÕz÷îmÚ/óøãw®zÚK4¨¢í^zöìiÇsŒMš4É)ø,²Þ.¨-F¹ <š$|öÙgmΜ9n˧?ïÚµËf̘áŠM˜0ÁfÍšå¬%]ºtqV @9M@ýÝ|àú?y¦hõóÎ;ÏÚ´iã¶Ž+X°`NgyXzK–,qJñäÉ“—Œ¶´’+µú?"ÌìW‡%Ì@€@˜   ‡0ÉGŸ€¶Mš9s¦7ÎE†þé§ŸLÑ`5jä\š5x¬Y³¦Sš³3pTú«V­²… š¢P+`Ž”a½ÊRûK1oß¾½•/_>ú@( 06lØ`š ÓŸ”e-=9餓\ß§€€êûô§½–³£´îرÃm9µ`Á\P}ŸúXmGU¿~}Ó)ç§vÛÕ%ÌSGE!Ä6äØn?JŸ Û¶ms–] â4˜Óz`¹&jm\©R¥¬bÅŠVºtiçúW´hQ皭ȱrÜ»w¯É2¬àZh®Y³Æä:­ã*TpÍzõêYƒ ¬qãÆ.pX6ŠÈ-€ÂB@“xš0Tÿ§e(RlÕ‡i Šú0)Êr{ÖŸÖ«ïË;·ëãöìÙcê?ÕÿIñ^¹r¥{¯‰EÅ~P D)ÅŠ¥ Àaê?@€@¬@A޵£¼a!pàÀgþ믿ÜëÆÝÀO®ŠJNJJrƒE e.Y²¤•+WÎ*UªäÖû.\8,e#Q@á$ ¥wÅŠ¦þoݺunòOJ°¶ÎSÿ§þQ ´”e)½êû4‰(…ZýŸ‡9o @€ PPª¹©lj²ïÝ»×Γ'{ÅŠœšŸ!@€ P£©ed=ž3gŽåÍ›×ýåϟߎ:ê(Ó«,ÊD´N‡ @€ ÇPã¸q©Zúúôécùòå³›nºÉþúë/+]º´½óÎ;6xð`«\¹²;–ˆÖé#ä, @€⊠r\5'•É,©S§ZË–-mÅŠöÜsÏ9˱îMJJ²®]»Ú’%Klذa6räÈÌ&Éu€ @€@ŒøÏ¢Ë¯Ň@V 4oÞÜZ´hò6_QN¼+äÅœ€ @€â‚ä¸hF*‘U¹råÊÔ-™½.S‰q @€ h(Èn @€ @‘"€‚)Òä@€ @&€‚èæ¡p€ @€ )(È‘"M>€ @€ h(Èn @€ @‘"€‚)Òä@€ @&€‚èæ¡p€ @€ )(È‘"M>€ @€ h(Èn @€ @‘"€‚)Òä@€ @&€‚èæ¡p€ @€ )(È‘"M>€ @€ h(Èn @€ @‘"€‚)Òä@€ @&€‚èæ¡p€ @€ )(È‘"M>€ @€ h(Èn @€ @‘"€‚)Òä@€ @&€‚èæ¡p€ @€ )(È‘"M>€ @€ h(Èn @€ @‘"€‚)Òä@€ @&€‚èæ¡pá"°nݺL%½víÚL]ÇE€bÀÁƒ-3ýß¾}ûlãÆ±P%Ê@ÈQ(È9Š“Äb…€~ 6´1cƤYäÅ‹ÛÕW_mLó<!Ä"\¹rÙ=÷Ücÿú׿lÍš5‡UAŠñ!C¬Q£F‡ã @   'B+SÇÃÔ®]ÛªT©b;v4½÷åU«VY×®]­FöÞ{ïÙí·ß~ؽ€ Ëî¼óN{á…ì˜cޱ[o½Õ¶lÙb²,K1>öØc­{÷îvÎ9çXéÒ¥c¹š”€ -¹¼Ńٺ“› ãæÏŸouêÔqµÈ—/Ÿ îß¿ßòäÉcz•…¥_¿~1^KŠ@àpš7nœåÍ›×d5V¿'ëòîÝ»-þü¶råJäñq€€ r42U M S§Nn¨bJ‘¬b™2eRæ= ¸ 0oÞ<«W¯ž8pàú(PÀn»í6{òÉ'9Î@€@¢ÀÅ:QZšz¦Ià±ÇKs€(·C”ã4‘qˆ'œp‚þùÎrœ²:r*»ë®»Râ= @ ¡  'TsSÙÔ´þ¸C‡‡ eQQ€@<H=A(ë±â.°ö8ž[ºA€@FP3"Äù¸'r¨"Öã¸or*xR[‘±óX@€ÌPy ž€oEÎ;·s·Æzœð 0ü BÅ]Àzœ0ÍNE!@ (ÈéÀáTâÐ QÖ¬Ç‰ÓæÔøŸY¬Y{Ì@À‚œPÏÀŠ+ìŠ+®°fÍšYµjÕì裶âÅ‹[Ñ¢EÓü{饗Bò¹è¢‹Ò¼Gi-]º4Íû):T^M›6MóÔÅ¡î{øá‡CÞwÝu×…¼ï§Ÿ~:ä>Y‘{ôèáÖW¬X1ÍûªW¯~È=)?|ûí·iÞ£r+"l(¹÷Þ{CÞ7yòäP·¹è³i1)Y²dÈ{´­UZ÷è˜ö~%£G¶öíۻɃÁƒÛœ9sÜdB¨ë9 0`€µk×ÎêÖ­k•+WvëlC}t>”üðÃ!¿G×_}¨Û졇 yߨ±cCÞפI“÷i;º´dÉ’%!ï¹øâ‹»E„ÚùÝwß yß[o½uØ}þ홊åºuëüËyÕÞË¡îiݺõ!צü^û÷ïŸòÒCÞwéÒ%d~êC‰™é^1úä“OlóæÍ¡.å8 Ä @ toïÞ½¦m&Nœ˜©è¹õÝKï»®~1Ô}é}×Óëk¥H†úÞ*/}çSKVËX¶lY»é¦›ìõ×_™×‘”1uùô9½zé\(ŽêóCñHï÷ ½ß,õ)“©ïÓŸž)Åò.òEÏFƒ \pÇûî»Ïõ‘þ9^!@ >°r|´£«…PY[eÝÕúîÝ»Ýß?ÿü“¼•‘\è¤ÜÈz,%VJŸ~ðÓ’:uêØqÇ—Ö)›9sfÈŒfÿÓRU& 6ÒYÎ8㌴NÙêÕ«-µÅ׿PVÝZµjùyýùçŸí¯¿þ:ä˜ÿAVôPÖÖO?ýÔ ¨ýký×üùóÛYgå<äUƒÇéÓ§rÌÿpì±ÇÚ‰'žè<äUƒö?ÿüócþYŽŽ:ê(ÿã!¯_|ñ…íܹócú A¬½iɶmÛì믿Në”{5j”æ¹/¿üÒdáúã?ÜŸ”s_>úè#ëØ±£ÿ‘WDÀ¢E‹Lϸ”õ…»ví2õ}{öìqeš2eŠéY®T©’óœQ•7oÞ4Ë«ãmÛ¶MóœÝï¾û.ÍsJûä“ONóÜï¿ÿî¾?ilذ¡•/_>­Sî;«z¥%ú®ë;ŸZÔ7¨HKÊ•+g7Në”ÉòüÛo¿¥yN{&sÌ1ižSß§>0-QŸ©¾3µhÒB}mZR¢D ;ýôÓÓ:åútõíi‰~ Byúüøã¶fÍš´ns¿=ú J-ú }úé§mñâÅ®í–-[–¬,ׯ_ßý.¥Å?u:|† Ø"€‚[í•fiåf÷Î;ïØ#<â~ÈÇï‰)g½Ó¼‘ƒÈ"=Ssçε¯¾úÊf̘ao¾ù¦s[,\¸°)8HÐÄÍ£>jÆ ³æÍ››–øJq¤ËB~ñM@Vè©S§ºþO“ r½ÖD‹ú¿´,ùñMƒÚAˆ_(È1Þ¶šïÞ½»SZüªôîÝÛn¼ñFÿ#¯ˆC9ŽfÃ$pÞrk•û©\-_xágÍ å>žÀ˜¨zйR?ñÄN9Ö’Y‘ý`y9I@ KvìØá–É[ûK+(@±I96ÛÍ)"Š(,K"RüñÇ.ÀŠ¢1#ˆ&בƒ\°µNoÔ¨QÑ,yÇ!­‰×ZY­ÿ¼á†Üš`yÒ`µ‹ÃÆŽ¡*i Êã?î–:i÷‚:˜‡!€ [’¼­'Š­"SZP`-ÐRôÑW^yÅ @h-²¼) ˜ÖìIAÖ±PAw‚PfÊ;äN­ w À'eä²Ë.3¹÷#3[¾|¹-\¸Ð,XàgJQÖ–Š ÄÖ ÇF;RÊP[ür er5”uOÛDIî¹ç{òÉ'£\*²erã— ¿¿æ8–ëBÙã›ÀðáÃíþûïw;"(ú·¢¨×¨Q#¾+Mí Ä äkHYäÒÚÞ'ƪAq„€¶I‘’¬Á¡¼¾ÿþû[Ì$ª™MÚHʱ–• ˆò¢¹æškÜv‹²"k)@Á'€‚ü6J.!–ãd¼‰!²úÝ}÷Ýn_Ù«®º*ä¾Û1T%Šaz†6lØ€raîdwääAóꫯÚ!CBîkä¹ ä$䜤†´óÜsÏu®ZZw‡@ – hÛ§2eʸàJ±\Ê DøÍ7߸Õì3æä>%K–4mƒ‡@€@°   »}¬Göæ›oº Gš‰.UªTÀKLñ >B… Y‰%Ò¿ˆ³ O`þüùÖ°aCÛµk—Ý|óÍn[»„‡€˜& ¨ë ¬IP¹˜nF $¶y p#9Ò)Ç*âí·ßŽrà¶¢h™' 5ôRz„" }ÞZωö8Ö:v±N@Û@iÛ'½"€ \(Èm›mÛ¶™öQ”4kÖÌYPZTŠ,P°9"g[ÂÜðüóÏÛœ9sœ+þÀ™L˜–ÿŠj=½~ß@.䀶¶ÃY»v­åÏŸßž}öY´(VöÈ‚òùçŸ[ÇŽ]„×ì¥Â]ñH`ýúõncÕ­[·nvÚi§Åc5©SÐ3Þ§O{ýõטU‡ \(Èl›¿þúËž{î9W²k¯½Ö*UªÀRR$dŸ€¶ëiß¾½3Æ^{íµì'ÄqGࡇ2Eì/R¤ˆÝqÇqW?*ÇÜžëÛ·¯i9@Á"ä F V‘(MáÂ…­bŊ΂üÄO8+2T O¨KAsçÎu®´·Ür kâ© .µk×vë45Ò¼yó#H‰[!LÇwœ :Ô¶lÙâÖØ7iÒ$˜¥T€”Q¬ÚðrÁÚ»wo@KG± pä–-[æ ­E–ùÿþïÿŽ|¸]|ñÅöÕW_¥™¶ºùæ›í›o¾qç{õêe×\s)hTvDûú^yå•öôÓO'ß®íöþûï»czÍHäzwùå—Ûwß}—Ñ¥1{^AjXs³Í—#ß¶m›iÂJºÃ |ôÑGÖ´iS»í¶Ûì‘G±[o½Õ}~ë­·¿8‹G´•–ú¬÷Y——+VÌJ•*ešDF @ 8PƒÓN‰¬\¹²½øâ‹*Uö‹²cÇëÚµ«‹Ðyî¹çÚÇlcÇŽµ:8«h=ÜìyösHÿNY«Óˆ’«§ä믿¶O?ýÔ´2;ÒªU+w›,2¾üúë¯î­&üý.ýóþõþµ‰ü*9£öJd>ñ^÷iÓ¦9 y0YrhkÿüóÏN1–«Hž={ºïKïÞ½múôé‡ÞÅO|ï², —ó̇*IB8(ÈG/§oõ-ªi¹çt^‘Hï½÷Þs{ÝÖ¯_ߥ¸qãÆÎ¥XmÚ´q.µ²0«ÞW\q… 2Äžyæg]VùdÉ•Õùì³Ï¶SO=Õ.½ôRûðÓ‹.ë‰î›2eŠ›\ËáM7Ýd«W¯v×ø?}¾úê«]þ]ºtI¥5¯Rˆå}ÿý÷'¯“uFn¿å¡üUvÝ«Áj(‘ uéÒ¥€öø•+¤ò– ·Üèäb.‘‚œ'O;ýôÓÝgY‡Úµkg5rï©S§ºãú/e4¡ {dåÖ¶ ñ&b„$&ßÿÝU\nöyóæML!jýòË/»¾PVÞ‡zÈ4Ù(oõuyÊHÔW¼ôÒKÖ¶m[;å”S¬sçÎ6bÄwNÿ=Úõ—rÓÖ½²F§õ;\pëûöí›lÍWº*Ãgœá\å”2êüƒ>hݺu3ݯÉOyÝu×]&¯$sP3lj« DŠ r¤HgÖ®nÞ¼Ù]¥5³ñ ¾ëòE]䑸uÊ;·½ýöÛ6aÂS$Ï¿ÿþÛYo_xá§/Y²Ä]úÊ+¯8…YÛ¾œxâ‰öË/¿8ˉo]¸p¡»ïÆotʧÖ/ÊmZŠ´ ~"‘Ò­sùóçwîÖþ~»ÊGVãU«V™òð•Q 줜K‘—…Fí¢uÓª~ù\â)þS½Z¶léŽÌœ9Ó|ë±î‘H¹V¤f¥'e¸H‘"nÌ[n¹Å)éZ‡6kÖ,guÿñÇÝ=~™žzê)為}ûv§Ô«Žñ扂ìšúè4®ˆ½Cþ¬B… É…øá‡C–_ý¥tÔÀîÍ7ßtŠ n‚{á…ÚÈ‘#Ý€íüóÏw餎v,«…\4•V¥J•L­dÍð•ËŽ;:×îI“&9ë”ëÔ3öZí[îe5Ö½ƒ rJõĉíwÞ1YJ¤”ê¼ÖŒ)ÿÏ_;î»MK‰÷dÕAG)ø¾rï_'‹D–qM 0À)篾úª;î+ù²0k LŠ©¤bÅŠé&¯I=õ5²(«ÿð'æÔߥMÌÉsFýXJ‘B+EW—šì5j”©W?˜/_>Sÿ9lØ0§\ë¼ä”ýè£>êújMlJÒó¶I™/ï-ÛËz`@á!'<É’jV ¤tG+Z´hVoäõ~”ê”–NYPçÌ™ãMä¹ä’KÌŸhÒ¤‰sô+£àV²dÜ~ûíNõn_ñõ¯kß¾½{«€'r‡–’½téÒd ²¿ÆXCEŽ–…#£{)¼²lk`(×j‰¬Ì)èrÁ–Ë¡/ZÏüÆo¸cRje –’]­Z5çJ.÷k)È~”XYš5 •‹¹®—õFâkI= ·J‰¬àrO—Å-žö –_ùråÊ9¯WYþKŠæ+Ñwùõ êGÕWú}ÃÿÎúN޲ßwß}®¿ô—šøOþdÛe—]–Q?e ~#oYòõ}Ô$œò–EZ“y8U­ZÕå‘Ò›F^1BÔ¹àò_HšdkM¶6hÐÀ ,òZN@€@d  G†s†¹¤T .œáõ±p\†å~'Ë®¬¸YI%rs–¥Bâ+¼©Ç×]w³k]œuR:åF˜Z¤húâ¿×__ŽdM£”nYeRŠz•U–k_4€”("©Ö+"¯l_9×1)îR̵5Ë 'œl5Ò›:å›Rüzé˜?àÕ}ñ"rãÔšuY½d¹B‹€ßÿ¥î‹BÚµ­Q£†›T”÷ˆ¿}œ®”׉&å´&X‘¨¸KV^MÖÝsÏ=ÎÅÚ÷DÑõ¡úY“¤ÕÇøÊZÊsºÖŸ`ô'üt,å{}F2G@ޚؕ(N…–!€ ]¸XG—rîRˆdUT )¹¯Åƒ(¨Œ¬Z&åP ´äÚç+ÇéÕS[*Tȹøi³_Iüž¯‚\é˜ÖûnÇR@³+R@¥—,YÒdÙ’eE[S)Â®Ê å[ç¸Æÿ»þú듳“û´êªk¥KôªteqQ;‹‹”üÊB£ :ÊCÁÀtŸoíñ•Ò¨A©,Dr”øJ¹M,¿úϼ¯üÇr]({Ö èYVß—RÌz*ñy‡¼l$ŠCà»-Ë Gë‚õÙïë´ÌD}мn´^Ù· ûTR÷)þqÿUTyºÈ;EžLêûôÛ$ÅÍ_2¢IOí1¯€„²$#GF e»¤žˆ8²”¹€²Kàf¶ì¦À}9B@ ’”»õë×çHzAHDnÅ}úô1­;Ö«"£j0 —2¹Sk •žH!•%V¨eaš;w®»<åº7Pk‘2+wn±”»Ÿ¯H¦—GÊs¾k»…dÊ*£ ]Š +EVƒQY£eÍNO¤+ú¶ÄWbýWÓy_DG–rMˆ—ê(åÚLë_§µËª£”dY¦åŠ×¬Y3ÿ4¯ˆi²tj‚K“EÈ¡!ú³Ï>sÁ¶´œDË>|wkyæÈb,‘k´ú ]¯~ÂW¦ýþ2õÄ⡹˜Û¿][HùñüPÞL ¦~Pž[Š·Ê'¥×>«òûʯ_Ež•HA—;ž¬Iªs¼ˆ&9d¡’{¡"t#‰G@“[¾ënâÕ>tå]¡åZŸ/ÅXK+ô=Q?*Wjß©~D}•úLõUZ‹,eZ}œ&×Ô—È+ÆïïüÕ/I¹ÖõŠ % Z#¯¥­múÔo«OSêÿÔûËBt\k–Õ_ªlúS9å £?$}âïo›¥Hàâ@€@t äòf•F·äîÂOd¿^ázÕ€nèСÉ{‡+Ò ?í›*WüN:Ù|þ É!p° ®I(PhRŸHÐ$aF°(Y@Hx¹ž @€ @Ö óÄ,­ÇSP­UFb›€Ö¤+À\C@‰B@Ke×B¯þr£D©;õ„ T¸X¨ep±PcP”ˆÐ?©··Šx!È0jp±Žz2òåË'¯'@q( „&€9 ͯm3ÆçW]yå•)Å€ ~ÚÆL} ‚ô¥ ÔþœÉ€ J ò¡<¢öiüøñvþùç;7ÓåË—G­d hÀ‚-òÑÏWÛ–Íž=Ûzõêe={öŒ~("L r„“ t¤+8œ‚ @€ Ä!€‚œ8mMM!@€ @ (ÈéÀá @€ $‚t%N[SS–À'Ÿ|bsçε† Z·nÝ[N @ ' lݺÕ `… ¶;ï¼ÓÊ•+—“É“ dƒäl@ã@ g |õÕWn8f̘œM˜Ô ˜ÀöíÛmРAÖ¿[¿~}€KJÑ $,ÈiëN8ÁžyæÛ¹sg@JD1 D†À]wÝeþù§Õ¯_?2’  @A9˜H®ZµªÛÞ„äH“'?@ Ú.¿ürÛ´i“íÞ½;ÚE!@€œ.Ö þP}@€ @ødž@€ @€€G™Ç€ @€ àÈuÐHƒÀÞ½{‰bŒ¦ &0oÞ<·µZµjÖ¨Q£çNvA Àä ´eˆ4­»Ÿ:uª•*UÊZµjeE‹tÈ€R@AN$šQ£IŸ¼£M H‘"V¬X±hƒü£D9JàÉ6Ê—/o¹rå DY( D'€‹u@ž€3fXûöí­[·n)Å€ ·Ür‹uîÜÙØ;2¼É€ ÐØæ)4›ˆžÑöNS¦L±¤¤¤ˆæKf€¢M`Ú´i6{ölkÚ´i´‹Bþ€ $8,È þP}@€ @ødž@€ @€€G™Ç€ @€ à@Aæ1€¢Nàé§Ÿ¶ XÏž=£^ @ R¤yóæV³fM[´hQ¤²%@H‡AºÒÃ)@ 24H\¼x±­Zµ*2’  ÐöŽK–,q%ùçŸP"Š@(ÈyÚ´ic .´Í›7¤D€@dŒ?ÞÖ­[g ˆL†ä@€B@A&Ò‡ ,hUªT±Â… G:kòƒ U*TpÊñîÝ»£Z2‡ @¬Aæ€ @€ xPy @€ @d@€ e¹råŠr È€D ×AO@ Šf©h¾‘@‘"E¬X±b‰XuêìØ´i“±™G!Q ”/_ÞPµõ©7 4XÒ"°={ö¸¿€‰b@ˆMªÿÛ¿Dò#@€ Š r(2>>a“­zõêΙì D—@Ó¦MM´—_~9º!w@€žÛ<%è#ðÑÆ‡l÷í Z{ªgïaòÕÎÊ-\ ÀØ?}ºí3Ær•)cùî¼3Ýr”gÏ}÷¹kòöèa¹?>Ýë÷~ô‘˜1Ãr×­ky»vM÷Ú«VÙÞÜ5ùî¿ßr-šîõ{ ²ƒË–YÒ™gZï/=Ù?k–í{ÿ}óf]-ïÞé]êÎýóÀæ™ð-Wæ$¯ìéÉ>o2wÿÔ©–Ëc‘Ïc’žܸÑöôëç.k1OOö¼ñ†\´È’š7·<íÛ§w©íŸ7Ïö f–7¯åä‘t¯ÕÉ{ÌlÛ6ËsñÅ–Ô°a†×s $.ämû5{Ø®[´öT;+vØ–•˹&ÛS’,X`IÞk‰%Ò-«ä5Þµ’Â^¥ü\¿Å[G½Ó»>oÙ²¦½wÃÛðß´‹.lI¤½aÅ Ûë]_è”S¬h×îô\Ö·x׿ö®Ë¨ŽªÛê… = ò+乸Ì í­[¶Ø/í|^™3J{ߎ¶þ¿u,Z €åÉ í«WÛïú‚'žhÅ2¸v·>e³ÒöäŒÊ¡:®]¼ØlÞl=6…ÒI{ç¸q¶ë—_ì çÍ•çœst+@ F9Á)ƒ´÷yVã}õêY“NÊ0í<²æ+íÿÜ’<‹º¡ @ áÅ: M>~üx;ÿüó-))É–/_öR Zs¹³ _VåakTæü°çG±Gà®ØAï_ÇRÚqš„µëÖ­³}ûö¹u¨=ÅI, 4°Ù³g[¯^½¬gÏža­¼ÆÌXÃZ,-£GÛ¶~°žž§]»°—SýÞÒ¥K­¬7±R­Z5Ë—/_Øó$@HŸAºÒçÃY@ úyë7nl·Þzkr# @i(Þ¹³÷ÖmGB9V 49x†çyP§N[(Ww€¢Në¨7Á  ý_OôÖ]±-u@„b@#p¼g­ûÇ[[&ƒ N+A€ °PÒô-Z´°Ÿ~úÉÖ¯_Q @‘!0räHÛä¸Ú½{wd2$@€ ‚.Ö!Àp€ @€‹ rbµ7µ… @€ PC€á0 @€ $Ö 'V{S[’À ÞÞ¤í¼-Uš4 ïvR¬<…Šý³fÙÎ?ÿ´¤êÕ­è¹çF,_2‚@( °³Ï>Ûôª` DŸ rôÛ€@ á \}õÕvË-·0@Lø'!¼ö{{-ïñöœ·¦MQËšÔ3I T©RöÖ[o¹=àsåʕɻ¸ €ÂI9œt³öêÕ«í«¯¾²mÛ¶Ùyç—…;¹€@løì³ÏlÅŠV­Z5«îYwÃ%¹:ÊrÕªeùªT W¤ãöþõ—í]¹ÒäÉc¹Ë—ñÚP|@ÈÖ g‡ZîÑOW\q…ÝtÓMaH$!—ÀÝwßm×\sMœ81¬…ÌsþùVü…¬Ì¿ÿÖ|Hn† @€ x!€‹u¼´$õ€ @àˆ”íÕË \½mß½ûˆÒáf@ˆ]Xc·í(y6 TªTɾÿþûlÞÍm€¢GàóÏ?·š5kF¯™ÈyóæÍV¶lY[¾|y&®Ö%¹½hÒ¹‹±\ùó«`”€"F rÄP“QPlß¾Ýöïß”âP€ÔýñÇV¯^=ëØ±#L öíÛg;vìq6‡/ëô‰'žh?þø£ýþûïvÊ)§ØI'”|>ßés÷É'ŸØ»ï¾k:uBAŽÇ„:™ú¤?þØ)·êSRök×®µ)S¦Øž={¬AƒvòÉ''ûå—_¬téÒ&EjÑ¢E–7o^wnëÖ­.½½{÷º=ÄË§Š¸¬þK}”úÍ:XáÂ…“ïSš§všMš4ÉÖ¬YcÍ›7?¤KÎü¿oæÏŸoù=‹jîܹ]¿Ö¹sgwFý¤&·Šx×sÎ9ǽê„úâÔ²qãÆä>Yaêw%ÚÁAý÷gœ‘|‹,Ð?ÿü³µhÑÂ’’’’Çãµãc=æªÖ¾}{äxldêÄ\¬ÒdǼÝ{ï½vÛm·Q‰4û·¡Ušx’¼È³}úôqU’EJïµ×^›\Åÿû¿ÿ³É“'»ÏXI¡Õ=|ðÕ©Sdžš|­”9í¹«È¹Šš«A؃>˜|~øðáNÖ¹ &¸ì`/²©/-[¶4 dî¹ç7ÀÔ@ó¹çžóO»ôÚµkg÷ÝwŸK¿©·çꀒÏÇÓ ÚÅy¼ö–E MúþÞqÇÉJS6“ ìm‹/v}Ê«¯¾j_~ù¥5kÖÌú÷ïïÊûÅ_ØqÇçú*kÕª•=ðÀÉuQ?u«U¹aÆÉý˜¾wR¤ß{ï=4hs¹ÖÄ/ÚW\»"üúë¯öâ‹/º>pÉ’%î´~Ô?©íׯŸ½òÊ+V·n]Ky¿ŸŽÿúä“OZÏž=â>pà@wøÍ7ßtuRûüóÏ›~ÃæÌ™ãßrÈ«& 5¹9‹ =uêT;÷ÜsíöÛow×HqVŸ:wîÜä{^~ùe—_¼+ÇÉæ  Š r@šCkÊúöíë‰GR¤%J¸µ_gžy¦i/вt¾EWV¹£ÉмsçN÷§˜”V‰ê­¿ï¾ûÎÆŽko½õ–Ý|óÍΣó²°×®]ÛY(¤ØIy~ôÑGm¥·÷¥D–ÌgŸ}Ö >GŽé«ï¼óŽ;çÿ'kÍ´iÓì£>rîq½¼À.r)ôEkå/‹Ñ!Cœ2¾iÓ&ÿtÌ¿j€®A±¬`â×¶mÛ˜¯ˆo¼ÑM(ÉÛ"å_ÿú—SpÕgŒ5Ê4á&¥S¢>FçÕ— 6̤êÕõWò Q_>zôhwX¡Rn5§~ð¬³Îr}ŒNŽ7Îå!–7ÞxÃõSR®ï¼óN?I×^~ùåÎú«´5jäîI¾ Õ•áÛo¿µéÓ§»~X}¥¶$T™•ŸÎ]xá…ÉJoªÛ]ÚrÖµê/Ô'úu”r.‹¹_7Ý«÷]»vM Ÿ!@!€‚Ì‘Íäz/g¾|ùì³Ï>³³Ï>Û)‹±®(KÓ Ìw}¾è¢‹¬Zµjnð§ÁYÏ:¡Ï²’È}PVc)Ôú+Y²¤íö"’J±öE+ßý’K.±B… ¹¦ÎËÝ÷ÒK/uƒG ä¤DËU;¥¤¼É-X– T}IyÞwGÔ€5Ö%¥b,«¸&(4¸×ó†@ èzßãžûîþmÛ"VT¹Ë}úÊ+¯LÎóâ‹/v}—¼YdU–÷&Ô4'+kÊþFý”¬ÁÇsŒ»_ŸµNU ©DŸ5!è”Ò,wç”.×êã¾ò\¡ýëõzÕUW%Ö’Yr%òœQyô'ï‰Ê©ØšX”(¹lËíÚïg«W¯îêÖr‹gžyÆžxâ §`kRknÕ'û¢þR-{Q®:#€ h` r4¨‡9ÏR¥J9÷cYþùç“ Ÿ"ŸÊ¥NnÁþ 'ÌÅÈÑä5 lÒ¤‰sÏÓ@OÖ ÄôÞ_ƒ§ ׯ_ïò•›´¿VO¤`ð¢“ú"F¾h€)‹´?`{øá‡íé§ŸvîžZÓ\ÅS¾µFÎ]¯u}¾H9–‚-Ö¾”+WÎkyò䱂 r>ùdŒ¼‘b,«×K/½äïøuÕÚHM& ˆ{=ål·7áµÛ[öP!BËôÝQßrôÑG'#RßäÇ5Ð÷J“LŠS þFа¬º)¥X±b)?ZÊþK'ä9¤~Pʸ/>À6/º÷ºu­”çzŽ@€ ÔPSÑ>”Šü QTdí«»~ýúhdOž€@Ð>µêß‚*uêÔ±£>Ú´Wn8å€7 ºÚ4KÚ¿?œÙ6 @1L9EãÉz«}@ñD@px§xûöz–ô<žr\¨V­xj^ê’ƒvýô“íZ´ÈþŸ½ó€ªØþøI½÷ª4A,XPAQÅŠŠ êÃŽbEÁŽí¡Ø}ÖgA±+*–§Oý[°< öرwA¤wÒóŸïÈKÜBvsw÷wø„ÝÜ;wÊw²³sæœ9Sâ•jõî]9++t! 9¢§JÜĉˆ¼È$ŒkÅÅřԤ*µ%ÏQÞ`÷ÝhÿˆF`é3ÏØò)S¬–Ûö$9!]Ì' (Ö™ßÇj¡ˆ€ˆ€ˆ@%ÔrÞ¹­[›¹èïì$ rvö»Z-¡"pñÅÛå—_n­Zµ U½Tì"ÐêôÓ­î±ÇÚ²eËRÒpöÞöÙg~>±$" " 5O@ rÍ÷j YO AƒÖ¨Q#ÿ“õ0@D käææúà DpÏÉÉÉšv«¡" "fr±Iï¼ð þK’h®È&s×¹sg›8qb65[m!YCÒ)ÐY¾|¹‚„…¤?T ÔX±b…ÿŠŠŠRW¨J(dAŽE—D@D@D@D@D@D@²€äìësµXD@D@D@D@D@D ¹XG¢K" ©%€‹mAARÓXÇ«¤~•V:k–.]j:YÝ 7Ì¢–«©a%PZZj‹/¶Úµkû8$œY.¨YRk–—¾¢x±-,˜]ãõP²›ÀøñãmòäÉ6tèP{â‰'²†ZŸ4Å.bÁ³ÏZq¿~Öᦛb–SšŸo% úûµ;tˆ™.¸QüÇVVRbþ ݆ ƒËQ_K\¬‰R§¤ç8…(óvãH™SžŠçÌñ)òÜh9uêÄImV²h‘•®Ze¹.*|­fÍâ¦-+,´âùóÿÌ»}û„”‹çε2+£V“&–ë"ÎÇ“R·àU²d‰å8e/¯mÛxIý½¢Ù~Õr‘œsëÖ›ž|É?§^=ËkÑ"nÚ2·§½xÞ<Ÿ†zPŸx¸”¦0šô׿Ûl³¯Ç=mºé¦ñª¨{" " ) 9+SD=÷eß¾“”Êäµ6ižùízãG"" 5E µS9¶aå2Uõ[5}ºÍ9ã sZ£udÅÎ:î8CIn}î¹Öä€â¦_ê€Þz«ÕéÑÃÖ{ðÁ¸iKW®´_Vç×ñ®»¬^ïÞqÓÏ¿þz[þÒKÖhð`k{ÑEqÓæñ…Í>ñDŸ¦ëÔ©^áŒ÷Àì1c¬èÇ­¥{mvØañ’ڲ矷ù×^kynq¡ó“OÆMË"@ÐÆö7Þh ¶Ý6nzØ-}ê)k°ÓNÖþê«ã¦-tõýíˆ#|šÎ®NyN'sÎ9Ç >ÿÜ~¸Ù°añ’ꞈ€ˆ@‚’ÎÝu×]í矶y«W»CR­¬ªÆ´çÚµ²¼ºÚšŸU¯ÆÖ8_|Ñ:‹m¾³Ü&SjsŒÕ1ÂÊœâ;{µÕ2Zyõ˜{ñÒÏ–8ë1²ØY7—ÇÉ—4EÎzì_u3QÞeÎRÈ|gÝÌMw¡³#«œb(ï’ |Úë~ýÕ–8&×8å:žpÒ²ÄÕe‚z;\Õ9®N‹ä]èچ件&Ê»4âûôg©ÍqÛ8âIE½ÐY‘kÇK¨{" " M@ rFwoìÆÒêz+µ?'u±SeÏùóØM·îgÛ6n‡óìix%ZÚ8·U%R)‰„Ÿ@®³ ÜliEî&›XÝ[n©tƒê\z)Ú å$pk&üÝw·ZXI‹uB©_¿¼9 Ü±É å?ïÿ°çbHr»w÷yçL˜`¥ GòªóÏ:í¾Èrš6M”µÕrÖÝÜÍ7wM<ÅÈÉÍý«Î<‘Ô>äË2Är›D’Ã^ó kx"©}æ™fN9ÎQ„D¨t_D@2š@âo¯Œn~ö6®Y^ûìm|”–ÿû¶;¼µcâ¿ï¶ã<Ùpy—ˆ€d'ö·ætìXéÆç:÷ðÊ ÊWe0”ǵ©GŽÛ“ë–*%9n¯/yç°Ÿ¸ rn›6•Ê—D9ÎUžŸÊJîZ°f¢2 ¾nbmøåVb¢²mR:ô% _Òôí;Õ¼šàÖ>iÒ$#š(.ž=ôP5å¬lD@D@D@D@D@Ò‰€ätê-Õ5)n¾ùæò®5tÝu×%}/dR’Æ™víÚÕú¹È½zõJãV¨ê" "°vê:KþÖ[omýû÷MºµkR‹€ˆ@æ‹uæõ©Z´ëqœ…G+òÈ‘#×"'%]£F²±cÇZ“Jì\—rô¬ˆ€„‰@KYûé§Ÿ®‘S,ÂÄAu09$½AôÎ×_ÝÞyçÔ(;ªi=Z,+r@B¯"Ó¦M³7ß|Ó~ûí·Ô¨RD@D@D@D )È1À¤úò»ï¾k»»è¦Ã‡OuÑY[^`=æHÜÜÚ«#Ë®tG‰h/rÖþi¨á)&püñÇÛþûïoO&837ÅÕRq" " " YH@ rvºšü'¬Ç¸V£3Aoç"ÑŽ=ÚØËuíEÖ_Šˆ€ˆ€ˆ€ˆ€d)ÈÙÕßjíjXÙ÷…BûøIb¦¶QíŠ6lh£F²öíÛ[NNNÅÛú]D@D HA®èÑŠüâ‹/lâĉVXXh]tQ´$º&" IàÚk¯µï¾ûÎX(ÙqÇ3²j”ˆ€ˆ€ˆ@zÐäôÓ?þh·Ür‹Ý}÷Ý!©‘ª!" ©!0yòd»ýöÛí“O>IM*ED@D@D@b‚Œ.‹€ˆ€ˆ€ˆ€ˆ€ˆ€d)ÈÙÕßjíjK–,©‹Ê¦«TfJ$" 5H ??ßøI$EEE¶råÊDÉt_D@D@2’€äŒìV5*ß~û͆ fo¿ývÔ¤üñ‡7În½õÖ¨÷uQD@Ò@ݺuí˜cޱ»îº+ª¢ŒbŒ»ûÁlyy Q’ný«úŠ€ˆ€T)ÈÕÃQ¹¤M6ÙĈÊD#†EyÑ¢Evþùç[ß¾}í°‘#G¦YËÒ³º÷Þ{¯ >Ü®ºêªôl€j-i@€(ɇz¨Ù§O¯([ii©WŒ·Ùf;ûì³mÿý÷·:uê¤A‹Ò¿Š .´£>ÚöÛo?ûå—_Ò¿Ajˆ€d-g@'ª U#pÎ9çØ+¯¼â1iDN>ùd«U«–Ÿ0uÔQÖ¦M›ªe®§ÖŠÀÌ™3mÊ”)V¿~ýµzN‰E@ÖŽ ‚]ºt±Ÿ~úÉ®¸â ÿ0ŠóÓO?mÖ¢E ;äCÖ.S¥®2\Þ_zé%ÿ|ÐUÎLŠ€ˆ€T )ÈÕ‚qÝ3éׯŸ=óÌ3¶téÒuÏL9TŠVä]vÙŦNjXQ)))ñî…cÆŒ .éUD ‰ˆà?kÖ,ëÔ©SKQÖ@>ï¼ólôèÑ^!ޤ‚ öYg%ëq$½È:r±I—·nÝÚöØchHª”Õ8÷Üs­¬¬l¶âZxÄGÈz¼ý"É#п4huîÜ9y…(çrX‘;tèPþ{ð†m'²4ô*" "­¤ gkϫݞVäz·ê ûñd=hèUD ÓVäÈ}ƲgZ/«=" " U% ¹ªäô\ƈ´"Ëzœ1ݪ†ˆ€Ä!PÑŠ,ëqXº%" "U¤ gUw«±ÑVd¬*²G#¤k" ™F ÒŠ,ëq¦õ®Ú#" "°.¤ ¯ ==›1+²ö×L—Ž;Ö¦M›f7ß|sÍT@¥Š@¬È²×\çsR"¿üòKëÙ³gÍUD%‹€ˆ€”‚\Ž"ûÞ¸#>VsŒ=õTÂÆ—¼û®O›ê© Ó’ Ô(Ÿ¾Ä)=‰¤è±Ç|ÚÂk®I”ÔJçÍói©wéœ9 Ó^½O_ôÈ#qÓbEÞo§ìø´üã›6¸™Æ>ïâ·Þ .Å|-vÊ©sÁ¥—ÆLÜ([¶ì¯6º£XIám·ýÙFw–p")q“0êÁOYDäîDÏ%û>Aêzôè5pP²ËVþÙE øÕWýß ЗHÊ\<‚àóRòʼn’[Ñý÷ûô….*w")ugÞy—-Y’(¹\~¹O_äŽcJ$%ï¼ãÓæŸvZܤù´Ž­äÄ­dúô¸é¹Y>^_{m´¥sç–·±ô?¦¯ìxMF%3füÙFWïÊHþé§ûô•¯+“_u¥ÉË˳ 6ØÀ6ÜpCE¯.¨ÊGD@Ö‘€ŽyZG€Õõø«nÒvŒSZ˜°¼ýöÛÕ•mÜ|j­Xa¥‹'Ï6mÙ2nÚ.²s¡K›ã&Œ-¤%£Y‹›­Zeܱ! ¤w)m¹Ë;Ï™(ïbwNç—iÖ¤‰ÕN÷<—¾Ä¥¯çêÝ,AÚÛsùÅ[YQQÂzPþlw$W™Ë»QíÚÖ0AÞÞUäÒÖrÖ‚Dm,qç0ÿ¾ºM]TÙ: ò^àڸʥ¯ãÞ Òæ»s†ç¯Î»¥;ï4ÇÕ=–ÌsÇ\9µ]Dï\7y“ˆ@²ì»ï¾þ<ò²3bĈdãóÍsǸñYÌqŸ…DŸEäY«?/M\úz >_‹\ÞÅ.}í„y.\hsWçݼY3«å>ñdîÊ•~ ®Ôxí>×~¼vúµñÈ#´Ÿ'M2suiäÆù„ãµcâÇk7¾'Ê»ØéåãuãÆ‰Çk—geÇëUõêÙWç2WçDõ€keÇ륎ÅÊ÷Þ3ëÝÛj|p¼.Ñ= % 9$»ÒM~~þùç5¢)'»jMÝÄ(ÇY+ë:·.ö Å“Ü-·´¼ .°—.QZòií”M,”õ™d$È»éî»[ýnÝ,ÏYå]»m[kíê4h×ÎräÝâ°Ã¬x·Ý¬ŽË?QÞ-úô±úäíÔDi)¿•³Î”¹ `½-¶°: êÑdç­nûöVËM„å]Ö¼ù_mtÇÞÔJws7‰k´ÃV{ýõæ]ËõuÎj~u4°œÜØN$Ÿ|bî ,â-dà ä_ýÕ–¥ào­ŽË¹Ï@®[|JøYtÿåã[$ÊKðYlêý›mfy(ï¼õÖ+Ï»žûÌ'ËFŽ´§T×uõH”w®ËÖf¼îàÎE.sÊ}}W÷„ãõž{Z}gñLÊxíãŠÝq‡uºwOÜFçõ“»¶ãµ[LL4^—º¿ÅâÏ?·Z®O$" " ÙI Ç»æ!°ÙÉÁ·zذaÖ¯_?c?dªåÙgŸ5¬(µœrö‹s½K…´jÕJ.]©¦e,p®Û+–/·Ü-×¹`&[5jdMœW@¶ÈÎE¿ÀMØ'L˜ô&î&ü[o½µå»0J§Ð}ôÑGF,€Ñ£G'µŠ ÜÂP3·P%h–¿òŠ-ûì3+rçDç¹…ÇTI{·¨‚™DD@D æ È‚\ó} ˆ@( ´<é$+vûKœeI"" Ù@ Ñ AVÖ·oJ¼²§Ú(" éH ¶e:¶Fu*‚\EpzLD úœ}öÙÖ´iSc›ƒDD@²…ÀìÙ³­£ÛÂ’ëâA°B"" "Póäb]ó}àkÀ—cmy”=ÈÈ&Œ}ÿ²©ÇÕV/)È!é›ÁƒÛ wìÒšk¥RBXK¹ÝºY­v²ú›l²–O*y¶Èwù?þh%Y­^½’Þl‚ÓuïÞÝè¬[·nÒËS" " ‰ HANÌ(#SÔ9é$kÙª•Õ©S'#Û§F­;?Æ3++³:\`µ’¬ sÌÓÅ_lMš4Y÷Š+ˆA oç­ÁÞ{[³fÍb¤Ðål'°ä‰'lù”)VkÀ€”(È­[·¶7œëûöí-'''Ûñ«ý" " r±E7˜-[¶Ì>s+×_}õUHj¤jd;ÜÆÍ64gÚÈvj’ |÷Ýw6sæL[°`A’KRö"Ÿ@n½z–øç^%" " ÙI@äôûÔ©Smß}÷õnV¿üòKHj¥jT†@aa¡-_¾ÜZT£••ÎÄnРAeª”4]‹õüa%Î_"É$pðÁÛG}dçž{®=:™EÕXÞ+W®´R±‘sÝ•„—@k÷7Xïä“ý¢uxk©š…‘ó€¥K—†±jª“T ¦M›:»‰[@Ì‘‚œ¬&&—À .ØÙIÎe}Ö¬YÕVÐ 'œ`=zôðnÇÕ–©2¨1l!øý÷ßmÒ¤I5V‡t/˜³²Ÿzê)1b„åæÊ.Ýû3Óê¿bÅ ›7ož5ÆûJ"F€ÅŸ¼¼<)ÈÖ¯jŽˆ€ˆ€Ôí/]wô¿þú«9ÒsGt) ÕºóTÕO¯¯n. D2À7ß|“iMŠÛYãâÑÍdø¿ÿû?ë境~ÿý÷öî»ïÚV[meûí·Ÿ=ÿüóöÎ;ïøhÆGq„w1¦üââb{ì±ÇüE¾x†^îzüõ×_?[n¹¥=ðÀnÛX=;ú製›ÓC=䫸á‡Ûúë¯_ÞÊýõ×­yóævÈ!‡øò¸‰«ôÿû_ûôÓO 7’!C†ØF.‚s ÔãÁ´?þØ:uêdGy¤}¹Ì²BfÏží­C¸YÑžm¶Ù&xÔ»V’7ÏRÚŠ•¹GyÄïÁÜc=Êó,Ï@oD@j„À[îH¼§Ÿ~Ú-|®·Þzk_Ü¥§¸`Nï½÷žWÖvÝuWÛÖÈ}÷Ýç·Í0Þ0^yûí·klÉ8ꨣ¬]»vÁ#þóç¿^š@IDATï½÷Š ccL°Í‚qiþüùÖ¥K?V°õáÿø‡õìÙ³üùhoþ玵"+ÿ; 8pdŒ…Ôià 7ô÷qug äÕW_õã4cö;ì`Ÿ|ò‰í¾ûîþ6c,í¦ ÆÌ}öÙgñšèÌÔ1h-Y²ÄxkÛà-n¨¢]8ÆBÆSÆJÜï[¶léŸ{òÉ'}Ør1ü¹çž3êX¿~};è ƒlóÍ7÷iø–Œãô_çÎmРAå÷ôFD@D@bR,2ºž4—\r‰xàö¯ýË~sç0óž‰Ë?ÿùO?9:ýôÓmüøñ¾|”Vî]qÅVPP`LŒúôéṠ½Û¸7ïµ×^~RyÛm·ùô;¹£\~øá?1Ú~ûí­¨¨Èçwæ™gÚqÇg­ñÅ_XïÞ½½BÌM&wÔ ËAƒ(çýÕ祢3ѺòÊ+½{ nÕ›m¶™áò‡°gx—]v±ŸþÙç׿t{LŒyöüóÏ·üü|ûÏþãË \²Q¨ûöík7Þx£±ÿœ‰ Ù$ôÝ?ü0›š­¶†œÀĉýØÂ84gÎc,yæ™g|­Ù+}Ê)§øÈÃ(®ŒS>úhy‹Ž?þx6l˜»‚Ï:ŠîÁÁbÜ[láÇ@B)F¹C!'²1 ~ýúõ+ßÓÈçãÄOôõ!¿gŸ}Öñ›]tÑEÆb#c‹p(¤·Þzky/»ì2í§Ÿ~2ÆNh¶w‚[8ã3÷o¹åc\5jTpÛÆŒãàq.â=cíbdœd¼¾çž{ü8Œ“Ä4`1sòäɆ5åšÅ—^zÉç9wî\ÛÄÁ'”ê'\DiPÙ¿½jÕªò1•q‚ßÏ8ã Ï„=q‹Ý‘tôÏÃ?\^¿c=Ö÷ÁUW]U­[`Ê ¨†7|'¼øâ‹þ»Šï‰ˆ€ˆ@͹æû +k€e€ ¤«Å—_~é×®]»ú‰Ñ¥—^j·ß~»ŸØá =&7ß|s¹ͤ … ÁË.°Ö X¬ L[¹ã¬>ÿüs?áºþúë½5$°ô ¸¢t3$-Vl¬Ê.–Êcß––Ýù˜mÛ¶õ«°ð`Ñ Ú€u9°.1 dB‹޵dúôé>B9V„‰á5×\cÿþ÷¿ýÄ”va]ÆÎd›3³Iè&ÍC‡õ}ŸMmW[ÃI€…«³Î:Ë>Q2¼>î¸ãoÆsK'ょ ãÓ@Ö[o={íµ×¼=vìX¿PÇbã‹v(Ä7Ýt“]}õÕ~ bLa¬AÎ9çÛtÓM½BKð2\´ÙÃÌI;vô ",(ÔX¶£ eñÙ ,Âc\BÉEÉf!’q Ë0‚ë2Öd…ÅLòßn»íü5”ÙiÓ¦ù÷üG°â¾òÊ+Þã‡E>êÈxÍXƸÆâÊõ…^èg˜P&ϲ¹ñÆ—ç‡ušºàmƒœwÞy~ܧx䰈ʽ &øPÆO¾;«1üN;í4ßìQ¦ ¾‚>(/(DoX<8æ˜c|àFŸKD@D@j–€äšå_^:JÖ&Y©RçÞ\àVók9e´VŠÏeÒéꆫ!“¬º“G&§Š.–¬+‘“4”I&AHI .œwŠ;VÜå˜ûË£q•DÑf‚Šû7Öã ,Õ¼G9FHϱ4LÂPô™$Ê1÷éO\ ¬L ƒ²¸F½‚6 „c¥aB‰ pWtƒô7ôŸd(ÝvÛÍ»Ó&{a¨Ô-¦9‹]¡ê¬vé…”Ïgà¤aQ ¥a1Ž1å®»îò g¸ñpgçÂ8‡ 5¯¯,Œ‹dŒwœ\0cÆ «) a Ü'=ãR XœQŽ ‚qæw^9ã2xð`ïžýøã{K.V`¬«,@"(ÂŒ—rÌ5Æ¡@AF1F”ãà~0nñ;¹†±Žñš…ƒ@"ÇkÆQÜÆ&ô7m „¿¾ pAGyFaæ;1ð ž#=¼p/”c®áI„UŸ…LÜ»,ö‘Ïù‹úOD@D@â‚N*oáFÆä…ýW©g˜ë\îÚ¸UýÆ{ïŠ"×(ƒÉ] L^b\aò‡{]䤌}ÈÁ¾;ž­˜ùVÌi\ Qd#EY´h‘Ÿ(ò;n„¬âGN¼¨GÅgÙÓHd¸9!ãY&Ú‘m@Qj\7ƒIs_¶„ÑÚ«×ì&ÀÖ,i¸›&SŠ{t[Ð*rVßÎrOøÜò<–‰1~PÚöÜsO¯b öçV̯â¸P1ºm`eå9Ê ø‚|(+ò˜µŠã÷a aq aü`Ì ¶k 8RÇwÞÙ+ʤÁë%2×"ÛÊýŠãRä}Ò#÷Ó‡‘cŠj0^'Ê¥œE¬Îxáàáé2ýg‰þo9ö®“&öà1)E1fò†&°dßÿýåSöÃE ûÛp N$”‹’Ù,-2€»9.à‘Âïɶ¦E–§÷" kà3"L,ƒ *-c®ÕXv±†²½#X8ÃRÉÜXÂØ„«p¤`! \Œ¸'Q X—#­ÒÁõà5r¼Ã…;Rê…k*mAˆÁ–hܬY¼ ä"cp7kÆ®@ þàƒ‚Ç£¾2ÖaíëðÈ Æ[ò„_ ìS†®Û[`p¿Ï¹…#ŒÉõØ_ˆø^ß~û­¿ŒÙð¢®A{#’ë­ˆ€ˆ€TšÀ_ËÏ•~D 3@=¨¥£Û/×hu4ÒT¶)rR—¨\jå ï‰J]§NDúû‘eíí,åLfÙWÈÄý‚“aŸ0–,ŽÁ’Åž@¬ ”É$·@\þ˜Àañeo4n„êŠ,#Z¥8–äÍ7ßô®É×L¢gÏÑFwñÃ>hÜ8qß®iùѹ;.wõ,q{ü$" j»±£¹KÚ9‹u"Áƒ„ýÅìiÅ=Wgös>9ãVJ”;¶ƒ 83F¡ÐJrðùŽ,‡-(ìÓ%Â2[Høü#ŒÄV â4‹xé"vA°?5Z~Ñ®åa­Æ“¥%e™zR_S¬É¸PäÅœûŒo° †ÅÓO>Ùßç$öGJÅòi îÑìf¬ã=ãu`ùÆåœ±“í&,ÒfÆÝ@àʂ㠯Ügñ’ß‘`܇#îØXÐY`̦Xð„W®bý‚râ½Îs½æ9%½0"˜Y¼ôº'" "y¤ g^ŸVªE9Î/— ”Ûç–jA© öòR6.x‘ÖRîûÒpwÆš@´R”[&«har‡–üÁ=s‹3(~Ç•ËR,+i‚5…È­Xh8Ë ûßpE$"*å²÷·?öí¡œs 2û±d³ßŽI$.ò‘B°,®‚L> xC°<3‘Ûÿýý}ÜQЉÛ¡C¿gè³ì[®I)u“}7³6§ Ôd5T¶Tœºu-×¹[<âeŽ"‡’Å"‹Z§žzª?FŽÏ;A§°vbeß. 2öÖ‡ë Ò¥ë*A¦X c{|£ eÜpà ~¼aœÄ’K~(ç(â(­¯Â“…½Ç(Ïì”YÜ¿ ¦…BÍ}êÊApŸ2q…â<ð;ã2Š?'0Ö1n3Æ8Û^yeñ‘¶¡8±š­&AžŒ‘ìñ&†û¨“aBôn,ÉŒÍxí0†²Á1[,>r É‹±4ÆþÈ>®Ç{-u<Ê÷Ü«DD@D ; ä¸/ÿ?qÍÎö¯Ñj¾Œ±TtU[#Qaª=È4ƒýjÁJ{›UmY3qŠÜsWm§0£Dmàã(÷)¬VÔ¢–»‰< 9NÙÏq‹É"ëbÅBñ"'³¼0äò€%Ÿd Ö:”‡À­?ÙåU%ÿTìA¦^(Ÿ‘J]Uêšìg°Nñ’UVe¼hX  T"jtc—PŒQ@Q؃ï ,Ìä¹Dm¬ ö&ñïX` ‚} D'Ê7Úýêä•ï"I/snéùn!¥–SÈ“-XÐáÎâ.‹¶‘‹ÇÉ.[ùW/Ž1£?YD—ˆ@¦ÀÃ’ïN<²A´9z9CÚ˜îÊ1ݨ aQŽ©k#ç¸Â}áG¼áz2÷wŽÇ©4(e)O;d+Ç´ 1‹4Dƒf ñ°ìnÔÜÇc‡½ÖÿıwS«ì‚N´±Ž…¬Ðä•«5ŸyÎ/^©N^õœ·@‘Û³]„M „öãY0ÿ)hºŠÐ‚’®!Ø«èì=3fLHj¥jˆ€ˆ@ò °e=§xð°ÍA’|(•¸X_åöÜb¹d«®×l7AˆàÍ}”bîãÆ|«Û—DlmkI 3b:ÜyçÞEš­4”ÙZÛü”^D@D@’A@ r2¨V!O"{Ž?Þ»ÕIA®@=""¶P¼>rÁà°.JAN]7ûʼnXÂþç»ï¾;Öí*]gÿ0?+é kϨ^" " " " " " )% 9¥¸U˜ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@X HAkϨ^" " " " " " )% 9¥¸ÃSX;ÃsÎ1ÇØ wƯDjšÀc=fœ[Ù¹5]_•ŸžŠÜYÀ‹Ý¹ºó"ÎÊMÏ–¨Ö™B€£ô‚6räH›5kV¦4Kí´& 9­»¯ê•/uGv¹ÈÙ¥K–T==)ÕDàÃ?´|Ð9SMY*ø² ¬äûï­è×_ÿvOD &¬\¹Òyä»÷Þ{mÑ¢E5Q•)" "P€¢XWRS¿n¹å–þ rÅŠ)©Bí´î:½z¥¤<’~Üv›,_n¹ZnÇŽé×Õ8m\vÙeþÞ 7Ü0©u®µõÖV§ukkÒ½{RËQæéK`ù+¯ØòÏ>³â,o‡Ò·!ª¹ˆ€ˆ@• HA®2ºê}°£S@;ì0›7o^õf#·¼}÷µ&­ZY:ub¤Ðål'°øþûÍÊʬJ‹älÿsHjûl .´üüü¤–SkóÍ­ÁvÛY£fÍ’ZŽ2O_+Þ|ÓVN™bµ 0“‚œ¾©š‹€ˆÀ:‚¼ðô¨d2zΫ¡° Àr7Îäfªm" "PN NçÎV»wo+ëÔ©üšÞˆ€ˆ€d)ÈÙÕßj­Tš@GçbýÇXIII¥ŸQBHgÍ>ÚòܤeË–¥s3Twu   ]ëOŠ€ˆ€ˆ€ˆ€ˆ€ˆ€dY3§/ÕH[ñ4bÄ[o½õÒ¶ ª¸ˆ€¬-V.ÈSîø1^»uë¶¶+½ˆ€ˆ@HANTe)"°vºtéb5²&Mš¬ÝƒJ-" iL€@™Ûl³µoßÞrrrÒ¸%ªºˆ€d¹X‡¤/ßzë-ÛvÛmm_]Z"" ÙDàˆ#ްAƒÙ£>šMÍV[E@D@D@BH@ rH:eñâÅ6cÆ ûä“OBR#UCD@RCà‹/¾°?þØæÎ›šUŠˆ€ˆ€ˆ€Ä ë`2ýrñë¯ÛrçÚÕ¨o_«³þú™Þ\µOD@¬ä«¯,Î[á\úöï/"" " " "ð7Rÿ†$;.Ý{¯-ZºÔj_xa\¹ð‡¬dáB«Õ²¥ÕéÚ5.œ’åË­ÐM@ÎÐÍ©U+núü™3­låJ«í3åµm7m±³,ýò‹åÔ­kõÜ•‰dÕ´i>I=¬VÓ¦q“º|K\þ¹ÍšYÝ 6ˆ›¶tÕ*+pÖ.¤Þæ›[NíÚqÓ8¥ŽKžÛ_V»cǸi‹,°¢4Ë˳ú[l7-7W}ô‘¹3˜¬N÷îV«yó¸é‹~ûÍŠbëöøÖíÙ3nÚRwöqÁgŸù4emÚøúÄ}@7E M”¼ý¶>û¬•öëWA.Y²Ä ¿ýÖܦP«¿ÕV [—ï>/eîsSÛ¡›×ºuÜôEîsXì>9 Z½6Š›¶¬¸Øòe©Û«—åº}úñ¤ÊãuŸ>–“ß¡,ß{enüKêxíÆ¦Z âþü³•Ì›g¹nÌ«ëÆ¾xRê¾_ Ü÷ ²6ãu ß®$" " ÙI@ rvö»å´há•Í2§pÆ;çvá=÷ØŠ—_¶†{ìa­/º(.­üo¾±9.1²þÿþg¹ ÄM?÷ÒK­È)àÍÝ3M;,nÚeS§ÚÂk¯õŠf§'žˆ›–›³W×£íõ×[}··;ž,~è![梈Ö0ÀÚþë_ñ’Êtw§ÿû?Ës‘GãÉ^ï¹§µv‹Ÿñ$ÿë¯ýx½Ì)áž~ÚZ&øœûñÚ-à5?åkzè¡ñ²¶e¯½f ÝØ›×¡ƒuzüñ¸iËJKËÛØö†¬¾[¼ˆ'‹Üx½ÜÕ·ÁŽ;Z›«®Š—Ô œ2ýûêï‚NÏﵩíS#ñUJA_ãý"ë@€cîæ9Œ°¬×†e¼ieô}•ÆëJŽ«¯Êz¨ ܸyþ*ÙþÕW_õ×QšO:é$Ûpà ý3ò{«;#(³ÿþöÅê£;o¼ñF¯d‡‡jR“R ¶&Û§²E@Ò€@CwüNsw®)n¶Èædìc²ÏV+‰d ^U”X”á§Üq›’<Ýa‰Lš4É+ǘD)Fq&¨] ׸cÙPŽO=õTïýØcÙ*w* 0#…àiÀãt”e,Ë~ø¡·L£÷íÛ×¾vÇÞaa[ Èvè}j HAN-o•&"…Àøñãí§Ÿ~ÒOQØè’ˆ@æÀ­”(óLÌuÄSæö³Zöwo¼ñ†¿ÈžßK/½Ôf̘auëÖµéÓ§®×o¾ù¦¿ŒÛõn»ífœ6Hð7DD@D ³  #,}÷Ýwþ=.Ó{†W¬>¾I“&þÿE¾žÿôÓO½˜ûÛo¿=/k(È‘ß)¸b‚‹7ÒªU«à’\¬ËIèäü ¼üòË¡<9$xT  &°ûêä F­¦‰€ˆ@(¬¿þúÞÕù /´Áƒ¯Ù?l;èÞ½»¯ç”)SlÈ!^éå~ ÿüóvàúc›¨µ^xáÑzΜ9Þ}šcœòF¡æ(,Ï(¹xb>Üî¸ãŸ¦~ýú¾ì6mÚøßù¯uëÖþn×DÈ&¢u:uì¶Ûn3\®ÇŽëïWÆ]ž©Þd$¹Xgd·ªQ" " " " "P3š6mjßÿ}ÜÂ:ê(;òÈ#}:N±@q„cšˆMA´ê ¸Ö.»ìâocFŽ=öXÃÒL‹ŠÏcu®XþÕW_mürâ‰'ú<ØÏܬY3™£¢$" Y" 5N€Ö|A±'H‘\k¼;T ‚ï'Ÿ|b-[¶´>}úx+[ŠŠV1" ¸9cÙ­(Dš>äC¼Ò|ÀØ/¿üâ#[o°Áå 3ÏÄz¾b~±~'òu ÇJ£ëÙG@.ÖÙ×çj±„ŽÀ„ l=ö° .¸ tuS…D@D Y°|q´Ì€ì‡~HV1ÊWÒŽ`\¬Ù—Ì9Æœ‘|¸Õ¯_ßš7ož-ÍV;E@D Ô¤ ‡º{T9È|°sÌ1Ö¤I“ìh°Z)" Žç¯^wÝuÖ¾}{ž« ˆ€ˆ€Ô<)È5ß¾?ÿü³=ûì³¶bÅ ;üðÃCR+UCD@’OàñÇ7ÆÀM7ÝÔz÷îüU‚ˆ€ˆ€ˆ€Ä  =È1À¤ú2‡ ŸrÊ)vþù秺h•'" 5JàŠ+®°³Î:Ë^ýõ­G¦¾jÕ*›;wnÂf.Z´È–,Y’0ˆ€ˆ€ˆ@&‚œ‰½ª6‰€ˆ€ˆ@ìs3fŒ7.ª¢Œb|ÕUWy/¦ÆWxZ¿Š€ˆ€ˆ@v‹uvô³Z)" " 6jÔ(;äClÒ¤IvÄGXYY™Ø•W^iwÞy§?aÂ4O¸D@D@D  HAÎÆ^W›E@D@²’ÀŽ;îh›m¶™}úé§öÐCYqq±•——ç•ãN:Ù!C²’-" " ‹µþD@jœÀsÏ=g^x¡=ðÀ5^U@2Àyçg(Ä………VZZj%%%^9®S§Žq#×$©!°téR»ì²Ëìœsα?þø#5…ª¸ô-nŠ€¤‚Á™n¼ñF{ê©§RQœÊ¬&€yã7þƒ6mÚÈzü7*ɽ°|ùr»í¶Ûìšk®±yóæ%·0å." "P)r±®¦ä'Úd“MìÚk¯µ•+W&¿0• " !"@ëüѶÜrËÕ*³«Â‰ )ˆ‹5"ëqf÷·Z'" "PyR+Ï*©)»ví꣋j9©˜•¹ˆ@ zè¡¶páBËÏÏaí2³J ðVdö"#²gf?«U" " kO@.ÖkÏLOˆ€ˆ€ˆ@ÚÀŠÌ^dYÓ¾+Õj$ r5ÂL§¬JÊp«+K§*«®5D ×ò|”Û*^ÅŠ@µ(-+q£^iµå—îõßa[Ûh£Œó÷Þw/+)+J÷&U[ýs\ ÓÜœZÕ–Ÿ2HRÓ§¯ªµ¦wüq„­*]Z­y*³Ì$°‹‹¬[½¾™Ù8µ*«¼±ôn›±âé¬js¢ÆnxâJ[¹¨–ÝüÇÐDI³ê~¯ú;Ùàæc³ªÍj¬ˆ€ˆÀŸ¤ ë/AD Æ Œ1ÂöÝw_ëÞ½{×El"йoc++“7QMõy‹-ìž{î1^;wî\SÕP¹" " ¤ GÀÈÆ·;·;Úz6Ù6›®6' pÇ7':wÔÔLœ‰âÞ¨Q#kÒ¤I‚Z鶬;õlbƒ;Y÷Œ”CÆxuνöíÒ÷RÖ®zõêÙ{ìaíÛ·×V–”QWA" "Ÿ€äø|Rv÷ƒ>°qãÆYII‰Mš4)eå¶­×Õz4‘ûlÊ€« ¿=z´Íœ9Ó<ð@Ûo¿ýþv¿º/ÔÏk¢q¯º¡fH~Óæÿ_†´Dͨ*)ÈU%WÍÏÍ;×^zé%«UKAAª­²9·ß~Û>úè#ëÛW‹u!ï*UOD@D@2ž€ŽyÊø.VE@D@D@D@D@D@*C@ re()ˆ€ˆ€ˆ€ˆ€ˆ€ˆ@Æ‚œñ]¬Š€ˆ€ˆ€ˆ€ˆ€ˆ€T†€äÊPR¤¸æškl«­¶2‚5ID@D [Ì›7ÏvÜqGëÕ«—}ûí·ÙÒlµSD@BM@AºBÝ=ªœd‚Ô}÷Ýw6{öììh°Z)" Ž@QQ‘}ÿý÷žEAA˜ˆ€ˆ€„€€ätUØe—]ì믿¶E‹…¤Fª†ˆ€¤†À3ÏkGydœº%éO ÿþÆç"ŒR\\ìÇ>Å€ˆÞ;§Ÿ~ºÝwß}Ño¦ÑÕ'Ÿ|ÒŽ8âˆ4ª±ª*" "¤ GôzŸ>}¬¤¤ÄÞ}÷݈«©yûÜsÏYÆ ­{÷î©)0ÃK¡3aB™áݤæ¥ÀŽ;îh/¼ðB K¬|Q}ûöµvíÚÙ„ *ÿRŠ€ˆ€ˆ€ˆ@蘧¨yyyvôÑGÛ 7Ü`Ûo¿}Äôy»|ùr«]»¶Õ­[7}*£¦¯¼òŠ=þøãÆX'œpÂߢð2Ùÿïÿk+W®´Í6ÛÌŽ?þxkÖ¬™÷àÞ/¿übW_}µ;Ö~ûí7»ýöÛ WÅ6mÚØá‡nÛl³/9ˆîKy(ÕµjÕ²#FØÀËkF^<‹jÛ¶m½Å™•@Þxã {༛0ž'Ÿ|²Õ©SÇ߯­ð–[nñe÷êÕËFe-[¶ Õ«¤„^]t‘}úé§þó’’BSX[%Âô¹"(Ú­·ÞjS§N5ö€óݲÃ;x"ÔuâĉöÅ_ø1ëÀ´]vÙÅß[¸p¡ýûßÿöcÈW\aÇ÷cVöo¼ÑÞzë-[ýõíŒ3Î0ŽÇ $ðšáy¼mF]~l [p±'%V\ŽdŒÚxãƒÇÿöʸJyxU1æ1cÞï¿ÿîëÿÍ7ßX«V­ìÐC5ƽ@ó®½öZûú믭[·n¾.cxP×»ï¾Ûhå]wÝ5xÔÇa¼üꫯ¬GvÒI'ùòË舀ˆ€$™€,È3éÀšË¤&Åøàƒ¶{ï½× Ò± ¾ÎLèöÚk/cÑ¢qãÆ¶÷Þ{¯¡ ?òÈ#vÈ!‡Ø†nè'WO?ý´ýãÿðÏò ‹mÃÞËU«VªüÑì¯ 0`}ÇLä˜Pn¹å–þ>¶)S¦øüXt@™fŸÏ“? ((Û“½ý÷ßß+»í¶›W²O9åoîܹ¶õÖ[{¥„gf̘á'™L%"JXhQ’Ï<óÌrE%•å'»¬;|1,ÙeU&Ƨ;ï¼ÓöØc¯ ï¼óÎöÞ{ïùGY|ÃËeÏ=÷´öíÛûñíõ×_÷÷.½ôRÿ s,رˆ‡ÂÉ÷cJ+ itíùçŸ÷éQB8àï)@(éJñ1Çãêz÷îmü±1V¡ FÙ}öÙÇÇ`Ìc<¥<”V¶m»í¶þ=÷š4ib´í“O>ñYK€´Ÿþ¹ÏãçŸöéƒ"‡Y$D9gŒfœGÑF-ZäÇj81^Rc2 ¹DD@D@RE@ä ¤»tébÿú׿¼²Å—4¿§“0‘9è ƒìœsα뮻ÎO†YÝO7‹ò?ÿùO»ä’KìÜsÏõø™p1™ „‰–~,½HçÎmß}÷õï·Új+oaB†Ò‹Õ— ܤI“ü„ŒDO=õ”M›6Í6Úh#ÿ E,ÈLV”j&¤LÞPŒ™ä²è““ã-(ð Û`ƒ ìÿûŸ·t sŸ llŠ¿%&­LP¬!LøØMID •ø{dÁæ¼óÎóã\*ËNvYÇwœ_Èzøá‡ýÈb'kB>øàïÝòí·ßú1‚:0f½øâ‹† {Œ',þ!(Ç(Ì(µŒ!c×È‘#ý{®±H‡Ç B[±"ÓVÆÆI>Æçïó€u™qEç±b¿ôÒK~ d1‘çYä£>œ·ß~Û~ýõWïqÃýÙ³gÛË/¿ì·¡ ?ôÐC~±{,*ÓæÍ7ßÜ/ 0ž²hÉb"c4s´z0¶2ÖÖþ×^{ÍÞ|óMëÙ³§Ó±t‚´(Ò(Ê·Ýv›ÿ> ,‰ˆ€ˆ€$›€ä(„ÇŒã]ÃøRÇm%)„ÉQçÏŸï-é¦(cAÁr€#Aƒ•+·\cRȤ D,¼gÿx L®ÁÅXs°3iÅb™žè¡rÌsXÏ>ûlŸ“YÊÁÅšçÈã§Ÿ~*·ÂaÝ&&‡ü­ì¾ûî^áa,>ì-?~¼Ï‹ÿ°a]‘üE—L¬DôQ]%É!ÀkXðáo˜ÏÀL\}:ê(»çž{¼"Éö \—kBQF$ž hD d,Ay%¢ó÷ßïǯÀÅ:H,ø¿Gº!ãƒâÈóË–-³Ï>ûÌ»,iÙ–ÂB!VÝ@AF©Åb‹à2àƒ ˜gd³xÂâá[lQ®“&PÎyë5 >ã4J6åã)m§-(ǯX¬Ú “@9æŠ{PÆKÆÇ‹/¾˜[^°fgòxÉbŸEtù® ¶æí׫ˆ€ˆ@ê üùm™úrC_"Áb®ºê*ﮌEð±Ç3&ñé X‘Qî°ãfå—=&Léàzb0 „‰]0¹ãQ]q%grHð!,Αì+æÚG}ä­Xi°æÂ¦¢Õ¤¢…;˜àaAIfï&‘ÁÔàÊ$—=}X«qqd‚HV¬Xá÷û±ç/øaŠ…Gòöг …ÕL’\¸ØâêÏx†‘=úü(8É-=¹¹ãÅÁ80íA©#z7J2qR%ìßEI&¸3þ À³ tâ‰'z¯“ m°¸WQQª8FÑN”I,²HÅòP¼¸H0žñ{PFp1‹Å~#ɳb~AZöM3bæï‡±˜ÅÁ@âµ4ÛYžeA1+y6l˜vØaAö÷Ê6œvÚÉ{3®æ×H5HD@ÒŒÀŸK¼iVéTU÷Øcõ_ÎZ¹ð ½õÅ·=,1¸ÇE~¹¯K½8ã’h……W„Éw Äó;î(αዠÁepÍf"ÉßÉYgER/X›#•ýàº^E UØüꫯz¶*0AgìÙd“M¼E±¨¢"“̺XªiÓ¦Þ…7ØÛ_Õò?PBùœòƒ (ÿç?ÿ±ûof=vûr“l4GfÑŒ¼À·h®£´bíÆ8ø@"÷‚k¼bÕ åÿÃ?´ýöÛÏçEqŸþCËX b!ÏÅz­øÃ¸…÷üXpEPžÙsŒÇ‹,ðDø®ùã?ü{þ£Ô-êÊâ×Í7ß\ŠùJ¹(É‘ãåM7Ý3½nˆ€ˆ€ˆ@2HAN@•ýP\pÿA©ÂšÈd€ “ŸX“™Ùþí6“:&LªC˜ØD«“™Ö­[;­–ýå\%V_(©(šX¶˜\2qÆêLÔ(i½õÖó{ܘŒáÞÇ~e_\þ¸†õ™Ir`å@IÆ + ,0g" ',&¸gâ^["îì«C°’à–Êž<„½ÉpdµŸ|x–çPÚ©Š4‹(X‡N;í4ïv‹‚é\yå•Þbç3Ó"PƒPŒùA‰áïžÏ'üžRQ=‚‡ñ9Š\«j¹X8+ R(üm:5·zÿôP©˜¦:gÛc±ˆWÀ„âÈ öö²Ï—±·c‚qáfËwJ,!nÑ­ùžÀE¥•¶¡ŸþùÞu ðõ×_ïݨ7íŠß¯X&ÛtpsfF±gŸ0ûÉ—}Ô´ÆYê„‹4 ô!Û_hÓøñã}ÜêŠû0õŽæ*YÆQ<‚páfQ’½Ê,N³`)T‚¼¤™Ì0ñI– ÔV´lVµ,¬Þ‘VT”K&N¸³Gö¶9‡ØªÒ?]óªZF2ŸC EQƲÁ~5‚Ï °¢,#XŒ±ºàˆâIÄij\ã±TàÂÌŽÉ–&ox°÷—@ž#-GCa¥fÆ„“ !J9½ì…àö‹Õ„É.J/ÁpˆZÍ$É#÷qßä>}ˆu…ú“<¬WXîq#Fyg¢¹7Ñ¢ÿD  ð·Ê>Á1>5Qƒ}°U-Å‹càAƒ[2‹bl àÕ´’É6cÅÓU;ÒÏ¡Œ¼@|Œ),€2&`á凣¶¿ØÿÍ„1‹|,º±¸Æ6ŒH >‹‡Dà+öo÷«ûÑÁ‰PŽà EÀHIzÀ»o ‚ÒEð¤cÌÄ»žÈí‘m h*ޔу †ˆhÂÉ x…Déðœ‰&Ÿiä Ò°Jü™hÂ9óla‹&xðp¾z4Áp4dÈh·üB`p„]Å,z²½¥¢ð7@ ̊¢'Ûñˆ”ŽÂ.ímÓ¦M:V­ë, òZ# ÿ÷ÝwŸWŽY}ÇíŽó.%" "ɘ8á­Ûo`1ãLn·Ú&" kK€ÓBð¦‹Tlñ(áz4Á‘­7ÑÅ)8ã½â}¶ÄzŽ­'œ*Mx&š‚Œ«,< c•…a¬çðŒõÊq¬çðøŒfcä|úXÏàáÃö¥H¡hí×µš' ¹æû Zk€õ˜½²(ÉRŒ«­2K"7ÞØïÕ,)I,JYg(¶EÜ `)ÆÚÉØ,\ÏÙö„;|¦¹–Ý”QM"ÇÆÖb¬‚Xy±|GSøh<ž (wÑ„ ¨lÛˆ&lˈõq_ØZMbyñy‰ jù,Ûåb•ÅVXϱõ-ÖsÄy`‹J4!þC´çØâ­,¼:)‹ ¯x9¡ÐKQŽF6פ ‡£ª­ R¸’HD }ôÑ~/·&ˆéÔkáª+±˜/Œõk+,¾We7𵼘Ց-•(Ê,NÄ:RomËUúê% s«—g•sûý÷ßý> rrU3 ‚²Tõy='" ©&@P'P­ËORŽSÝk*OD Ý0Nï‹0[RPR×E9N·ö‡­¾¸c‹D>RCÒ'ìÅ`¥Š#2$" "Mˆ@k4AO$" " É!€û/¢8®Má’Ãxms%~Æe—]æO1XÛg•>yäb<¶ÊYD@D@D@D@BA€85±ö‡¢‚YX "^ÿðÃÞ’Ì‘ ’p9ý Zˆ€ˆ€ˆ€ˆ€ˆ@ÒÄ ~•´•qBÛo¿½OóÆo$L«©# 9u¬U’ˆ€ˆ€ˆ€ˆ€Ô’’’)W…Æ&°Áø›?ÿüsìDº“rr±N9r("P‘À믿nœSØ»woÛÿý+ÞÖï" "‘V¬Xa÷ß¿?â‰}ø­ZµÊÈvªQá ÀdI¸§wȺ®~‘9\ý¡Úˆ@V zû…^h<ð@V¶_ÈNK–,±Ë/¿ÜÎ9ç›3gNvBP«“N€}dzgÏöc1”j™1c†UçþZÎ^—S‚ößu×]¶®§Çyé5³HAIr@û¹çžkcÆŒ IT H c=Ö˜ðTåœÊÔÔP¥ˆ€ˆ@úà8¡Ž;ZŸ>}ìóÏ?OyC~ùå—j=¥€sœ«CÑûí·í‹/¾H9~r±Im¸á†vÉ%—ؼyóBR#UCD@RC`Ô¨Q¶páB“‹Yjx«¨iXµQœóòò¼ò­>(öM›6µœœœ5n?ôÐCküÎ/ ,°åË—û¼È3R-Zä£D·iÓÆrsÃeÜb‹-ìâ‹/¶¶mÛFVYïk˜@¸þJj†ŠHÏ>ûÌ `ƒ¶ÚÞ{ïmœÈ'Ÿ|b;ì°ƒm²É&Þê}ÅWØÐ¡CƒÛþ ç?üÐÿÎÂ*‹¬XÇwÛm7ëÛ·¯¡ÿýw;à€¼wÒ®»îêÓ¼ð åù„áMÏž=}ýO8á„0TGuXM@ ²þD@D@D@D@D@’N   ÀH7dÈïî‹s×®]íøã÷e¯ZµÊFŒaûýôÓOöÈ#Ø“O>é-ÄAå–.]jADî믿Þ>ýôSCaþæ›oì ƒ²±cÇú¤'N´úõëÛÌ™3}Y”Q{¡ƒúè5ó¬éƒyíK«Ut!I«Ê«²"°Š‹‹ýÓÝ¢Ö!K=šf4þ¥Y‡©ºÕB ˜ä“YíÚµ«%Oe"a&ðÖ[o.Ï£Gö®ÓuêÔ±ÓN;ÍvÚi'ïrýå—_ÚÊ•+íÌ3Ïôî×lAD±}ðÁ£6ëñÇ÷yá>`Mnݺµß£Œ¢Ý A£ ÊÄ­›W‰$" 9¡ÞÛ¾ˆ6]Ee9#Ž8Â9çf9ެl¾ä¬ìö¬ot‹-ìæ›o¶ZµjY»ví²ž‡d>ö¯·ÞzÞ²´6øÛg1Ѷ¹¹`Þ¹sç 鯅……FÀ®îÝ»—_gÏ2¬ÕãÆ³iÓ¦ùòÈW"•! ¹2”R”FÄV1¡#ÀÞ¡wÞÙ6lºº©B©! ÂÔpV)á"À˜wàJ9W·d\mP6ùŽEalܸq¶—g\¤#%8âŒsÀ£ÝÀ¯ ~Îg‹¿üòËÞE{äÈ‘~/ó„ |°¯W_}ÕN9å” ©^E &íAމ&µ7p1=묳¼ Á $"m° H²“AS˜´hoXvö¶·Zc_¶ÿ$¿ý(Å(‡¸#×´§Vÿþý½Õ7¤EëÿûßÿÁª°ðrÜ߬Y³ìwÞñ`Ø“üÀD…„a‰`_O<ñDùýÉ“'û’¸ «2òüóÏûWý'‰È‚œˆPŠî³ºwÿý÷û Ûm·õîÝ;%%ÿ°ü#+uÿ$"P‘@™•U¼”Ôß#Ý©’Z2o¿ýÖO€š7oîÝá’]Á¥…síƒùO'»埆æüšòZkìK9rXƒÖ_};ûì³} ®Aƒy«ö»ï¾[¾ÇwéóÏ?ߎ<òHÛl³Íü¾dö!ãzM8"iذa¶×^{YË–-íƒ>°»îºËo[à:{™±ž¨kóÍ7÷Öëo¼ÑN=õÔhÙ¥üÚ›o¾éëË1O±öY§¼R*Ф ‡è`ÓM7µ©S§¦ô÷æ?é&ŠO†ˆ‚ª’X–%{þÏ6s”Bð\í‚ýhÞ­þÿçäoý4¾ú3N×Ì.°R#¯ùúuÓ°ö™QeçÊŒ~T+b@A ÆyR¡œî²Ë.~op£Fìšk®ñµ‚N>ùd¯ôþðÃÖ¥K{ýõ×í?ÿùOpÛ¦L™â#_s¡[·nþX'æÏÌ%n¸á†ò¼°$c9gŸ2^JXχ^~®2Êu½zõÊó­‰7Eõ¿ÿýOç ×ü8eJAŽ'Õ·úõëçäT¸X7Ìmn¹&—ÖT÷q:–——S'éÕ&¤öà'sh À¥Ž=È¥¥¥Æù—ÉRëä40Æ>É_Þ{ò{[±¨È†\Øë¯‹zgus¥ŒãŸD2™.ΛsÐN<%£yKΟ?ߟüðÃîØâzê©§lûí·]CÙæ".äûì³Oùýà ó ¬Ô‘²ÕV[•ÿŠ5["ÑHAŽF¥†®âþꫯ6΄Õ¤C‡I«É‘mnMZÞÊXÖ†À’%K¬S§NkóˆÒf&7[n¹¥MŸ>ݯ¤ï±ÇIiaÿ&‡?’¿,hx…-È_`'´»î¯‹z—Âz% rJp«4!@ .‚k¼ŽèÕXXQ¤O:é¤4iª™ ¤+D½8pà@«[÷O7·_|1D5SUD 9Pމ`ÍâÐG}”œB”kZØsÏ=}=_zé%oIN‹J«’"°pek:%" 8ýôÓíÃ?ôÁ¶˜xK§\üÅGï’O@ ròWº3¬{Ñ5þÅg¥»éO€íDî帛²²ÔDLzjÁÚàx§Ûn»ÍƒÅ…9¤I“&~)™Þ”éÀAu¬r±®î1K½üòË}€¹\ÅD¤D ºK-nU’ì%°Å[Ø+¯¼â£Œ2™“ˆ@& r-ƒÃ—Û&÷uÚ¶råJ5j”¯ îÊú¾ C¯¨a& 9d½³ÑFù-\¸Ð[ÖBV=UGªÀ´iÓ|K2<ñÄ«-_e”¾ˆjZTTdóæÍKßF¨æ"P Xó­·ÞÚo3©Ä#J""ð%YëÖ­3°uéÛ$)È!í;‚Öàz*L%À±çî½÷Þ™ÚLµk- à=Cà"k NÉÓ†Àûï¿oXÎ{•ˆ€d/޹jÑ¢…¬ú!ûÐäuHP`’ü®WÈ$3f̰·ÞzË7é’K.ÑO™Ô¹ÕÐ& ÈTÿþ÷¿}ÓPxÀdj3Õ.ÈXŸþ¹í°ÃÛ>5ÌÜQ¸’Ð @D2‘Gúàbˆåx¿ýöËÄ&ªMë@€sa Z(L$pÝSЉ¹@IDATu×ÙСCíÒK/ÍÄæ©MY@ ¤¤Äo‡‰ÖÔââb«Î8‰‚Ø­Zµ*Z5’zöýøãI-C™×,)È5Ë?néyyyþðóçŸÞ° L!€‡Ä 'œ`Ï>ûl¦4Ií¨f,mõ7ި朕Ô,7ÞØžxâ jEÍÖD¥‹ÀÚ(,,´sÏ=×6Ø`ëÚµ«í¿ÿþöÝwßùLˆÈÎ÷z÷îÝý'D*‘G}´Mœ8Ñ?ÃùÆûMŸ>Ý/’sŠÅŽ;îh3gÎôyMš4Éo?à´nݺY¯^½ì¦›nZ£²¤a‹uÙj«­ìÑG-¿ÿøãÛi§f¾åYò8çœsֈϑ‚””9yøá‡ýñkx¸õìÙÓ·ç‚ .ðùóÍ7¾üÂÞáY³f•—«7™C@ rˆû’U³ãŽ;Îÿœ}öÙ!®©ª&kG Y³fr«^;dY—üwÞÙ˜T“¦¬ƒ gö×Ë;"ãº5ô âo×þ‹/¾Ø:uêTåú^uÕU~{ÔË/¿lŸ~ú©µlÙÒÎ;ï<Ÿß©§žjK–,1¶P}ùå—^©<ôÐC ¥ùí·ßìÖ[o5Î8~õÕW`´Ã† ócü;ï¼ãÕk¯½Ö§%Pãý÷ßo믿¾}üñÇ^±¾ñÆí©§žò÷9Œ;î¸Ã~ùå»úê«}=¦NêïS”d,½œŽ0aÂ{衇Œr>úÈ+¹(Ñ39vìX3fŒ?{™û‹/¶GyÄÏS^{í5Ïî¾ûîó÷»téâ9’Ž4mÛ¶å­$ÃHAq‡æääøU1ªÈ pÏ=÷„¸¶ªšTŽ–A\h%"V¶† ú`],bˆ@:àŒo%"juëÖ5XÆÒªFKæìn”LI¬¶–7nœÂÎÙõXd±²¢4hö /´Ù³gÛ{ï½ç›Ëœö°Ã³vÚÉ+ÏÛl³ 0À[”±â² ú믿–§E9¦¬¦M›ÚÀ ‹ô“O>éï£<|ðÁ¶í¶ÛŸ«AƒyŒÀŠœ››ëW:vìh{íµ—·"ÿôÓOþù»ï¾ÛöÙg¿ÕÏ$ïÉãé§Ÿ./Ÿ…ÚÇóX»©#Ï3 ”b®áí¹.‚1 —u~$á! 9<}µ&XŽÙ«„Œ?Þp·–ˆ@º¨_¿¾)Sºö^jëÍ9œ“;>“,É5±×,µ­Vi™Jå…‚‰»DÒ‘ÀܹsmùòåÆâe XS± ÿý÷þo;ò œŒãsæÌ ’[‡ÊߣضiÓfß#•Ä 7ܰüopÝΧ¼M7Ýtû¸mG–Õ®]»5<ÕðÞàA7i,øX?o¿ý¶WèƒLy>RxžýÕŸçê¾ç( E\©ÃÓ1krï½÷ú€ã¤“N2\K$".ØGŠrÃJ²¬'éÒká¨g¿~ý¼KµÁ qä‘GJIGר•$À>IÜFQŽY쑈@º<¿"p­X±Âï#ÆB…9p§¦ÌYqUÆHeˆP@e6x62/êYÒ,X°`²â)±<Ïþi,ÎÁ®Ø‹7ÏV¶®AýôšY¤ §Aâ’Ê—•9V¯þùÏ®1¥ATÅ,%ÀÞ ¢Tãz…'„‚ÍeéÂ:4ûØc5öž!ì#¸‘DÒÀõ×_ï­k7ÜpƒÝu×]éPeÕQb`‘×êH# ®ÎÌI™Ÿâ!6eÊ”òç±Ðâ>Ü·oßòkñÞDF«æ=¼PŠ”e<(ƒ¼¶Þzk_Vð Š9ód¬Á•ò™6mšw•nß¾½·dã~¸pùFæíZä}½Ï,ëæ8ŸY,BÝÜPj0dÈ?YdµNÖPwYÖWefÔ¨QF° Vk™$âr%µ%À>4¬k9räß,k›ŸÒ‹@2 °ˆÒì‡Üe—]¼÷C2ËTÞ" Æ1b„¸…Ë1{vÙÏËwûùçŸol Dñ$(¬~Õ¼yó*UüYXgo2îÏXŒñFCôžááÇ{™9íþCñ÷£Í#¯|òÉ^Ñ'HÊ6ùc€"¨Xe¥+3,®¹æš*ïë®LYJS3¤ × ÷*•JPÜ ×"FîרR¦zHª™+½|a­’/$‚uð%Ê—œDªJ€ Q0ÁY¶l™ß WÕ¼ôœ$‹q™|³G!°÷Ôd•«|E °ÐÁ+2†šÑ£Gûãž(û˜cŽñÛ1æ°¿˜À²Å—ûÌ"ðV ¤”]wÝÕÉ\c1 7å¡óY b˜c"UãZb|ÀJ5B^÷(sdSÁ›@b´ý¿;ꨣ¼ +8²çž{–ÉõÜW\q…uq{®öRcmþöÛoµðï‰dÞ9nÂQ–yÍÊŽ±ßƒPö \“ý.­äK'øâÛ|óÍó7Úh£t©~ÊêyÆgøqŽŸ¬=üü|ï~Ç8(©:&}L0¯»îºªg¢'Ë ì¾ûîöÅ_x 9gÆj/c9žŒ~C)¢í÷èÑ#tí$¸ &VXU\¥Ã,xœábýàƒ†¹šÕR·Ç{Ì[Ä1‚E«–Ì«1›G&2°Z5fº¬´9t]Rù ñ¥‹ë +a¬ÖÝ|óÍ6yòd¹V¡R&_Â{챇ðßÿ})ÇI`¬,Í[ ø¢ÆµoÖ¬Yvæ™gúȤb#5E€ \|£ ±Å—S)Ç5Õ*7’ž],^¿þú놎$<bFÄîŠQ»ÃSÃ쬉\¬3 ßqsaÀ#ú{(80}G ÜA2 ™jBÈ °ç÷'Î|æ™g±5äý• ÕCù`rRÂ~7~vÛm7Ö&®€ŒH6Æ<¶’àÞÉV,ÈŠXlêÊ?“ àòÌ9ÇÙ 8g™#±$á! rxúbk‚åŽ #A‘P’·ß~{¿CQ_×­2pX|ùúë¯}@S°7Ï&†¸ázÃDÑäÐcÐ)"°í¶Û–/²_¿ÏÞ½{û qAÔUEÅd(b~ð·5nÜ88p ßcŒBL` Ö­[û¾Á±2ÿ2ô@ÍJ>W:8e¸UP² G’Ž—ØOÂ^Oö“±wƒ}‹-²/¿üÒ+Ì(ÎÑöêqôį¿þµÉþ<ˆLÀ^‚0E,ÖA”ÁŠ÷‰lˆe1š°‚Ö¿ÿh·|€ö>D“SO=ÕOP*Þ£­ì³‰&¸eD%šÌœ9³<òhÅû ð ¯ó;Áˆ°M8:  Qñþ•W^i쥬(XbQ@£ÉO?ýdœM¶Új+h"Ú=Ü«pû‹&‡v˜õìÙ3Ú-;ñÄÀ3üD…õ•¿Ÿ ¨EÔ‡uQR@€hé'œp‚±—릛nòÁ 9Ÿ“ .lC‰jã»ï¾³x jí‹“¢Éÿýßÿù½qÑî1ö1FÆLÆÎŠÂËXMp¿ãŽ;¢Ý²-¶ØÂ¥‰v“vÕ5šüãÿðG²D»Ç~ø¹sçF»e]tQTwaÇஊ2¦0¶D“wß}×^xá…h·¼5…Ȳф±10š0fA|"ï3Æ2ÖF&áÇ|´[þš~üñGï#2®ª|'HD@D@2€ä ëÓ®]»ú "îÖ(DÏ=÷œƾ]»v^¹Á È $“F¢ Ϙ1#*Ž©Àm¶¢0É‹u¦#ËXÊç?üó9&•DŒ&¬ÚóM˜G«#Š\¬:öêÕ+¦òI4ÃXÏa)嘭hòÖ[oy÷Îh÷˜F«#i'MšäƒzT|‹ÒhÂÂG¬:r Ñ£ ±žƒ=îHÁÂÂÊW_}µÆ„—ÖvØÁuÑ%2½TÀ›H¦üA˜E+¬ÇÇÁXŒ}Œ ŒÔ‰õyÀHDÔhÂIœýMØÖÂy Ñ„HÆx÷Tιçè”hBÀŸXuäsKùd±.Ös(u‘Ê'mÅóƒ1ê¿ÿý¯ÿ¼G« fà!y…:VY¸»³@MðF‰õ cgÊ9«ÉMÎ:묨c-û/c•Õ§O;í´ÓÖÈŽ±ÆÓÈ…O®Q7ÆËX (kd¤_D@D@Ò’€ä´ì¶Ä•æH ö4ðH~"÷å¡Ð¢ŒEöCD;·–Éf¬Én¸ÚFÄzŽ(DZžÃ}E-š øG{Ž p¬²:wîõòïÖ­[Ìç6Ûl³˜Ïa¹Eq&X£Õ‘´L´°tU¬^±žáxƒXmc²ë9"JÇzŽ…•XÏa]!ò%^ ô/ ±ú£b;ô»ÔîÝ»ÊR (6(‚‘®¯ñ>G,Åú<ð‹i4ÞØ2hР¨ccl¬²;b}fsb=Çç4ÖsŒq‘ÏaÁæ;k(¥´!š0&ñýQQØ^«,Î',+òYÆ‘XÏñ]ë9¾³¢Y‰Éï hÏñ}X•²úõëçÏq… Š1c($" " ™M@Çë½òðrYo½õª9weWUÑýV«š›žÈ-v¡«\VËþøñã}¬†[n¹% „·ÉRÃÛ7ª™ˆ€ˆ€ˆ€ˆ€T ‚ñ“A÷ÝwŸ9üðÃÃQ)Õ‚¬?ÈpÚãDIÍàØÍË/¿ÜW„# ®( )Èáé ÕDD@D@D@D@’F€(ðDÏ¿îºëì™gž‰zN|Ò WÆžÀĉíˆ#Ž0Îhç‘k®¹FdBF@AºBÖ!ªŽˆ€ˆ€ˆ€ˆ€$‹ÀsÏ=g×_½Ï¾K—.6pà@ëØ±£?òm“M61Ž×Œ&œAþÕW_E»e{íµ—uèÐ!꽇~ØV®\ù·{œ­~ÔQGýí:(öôÓOG½GÀ1êM¦OŸ¾Æùå‘ivÞygœgäµàý“O>i . ~]ãuĈQ¹[¾|¹=úè£k¤ ~‰wLß«¯¾ê•cØó>쬃6eÓ«älêmµUD@D@D@D « l·Ývþlð_|Ñ~úé'c/l Çwœí´ÓNÁ¯k¼N™2Åî½÷Þ5®¿lºé¦Þüùzíµ×F=?KöñÇ™´ü=ÇÏ]xá…å¿G¾6lX̳ͧNê­ã‘éƒ÷g·ÑF¿®ñzë­·ÚÌ™3׸ü2räH¿xü¼Î;7fQà‡ $õ{¿qq'PÚe—]f“'Oö–ã¦M›–§Ñ›ð‚ž¾PMD@D@D@D@D ©pë}á…lÆŒöÄOØûï¿oœã\XXh;wŽiÑä^Ïž=£Ö­}ûö1ŸëÑ£‡5iÒäoÏ4,–õ´]»v1ËÂòë¹õ×_?æsX¸c=·ÁXqqñßêÈ…XgGÄ,«[·n1ËByŽeZ]L9œ2')/UŠ€ˆ@–8ãŒ3Œ/× &d9 5¿& œwÞy†¥ËŠDD êP0—.]j(ƒÈ4ß|ó5kÖÌÚ´i“iM‹ÚžÜ¨WuQD@D@D@D@D@D@²Œ€ä,ëp5WD@D@D@D@D@D :)Èѹ誈€ˆ€ˆ€ˆ€ˆ€ˆ@–‚œe®æŠ€ˆ€ˆ€ˆ€ˆ€ˆ€D' 9:]È2R³¬ÃÕ\è¤ G碫" " " " " " YF@ r–u¸š+" " " " " "€äè\tUD@D@D@D@D@D ËHAβWsE@D@D@D@D@D@¢‚‹®Š€ˆ€ˆ€ˆ€ˆ€ˆÀÿ·wðQTëÿÇŸ$´P E@{»¢‚¢(*W±bAﻢ¢Ø®å§Ø ¶«X{o+ö"*vE¤wHòŸï¹Nþ›ef“°›ìììç¼^I6;sfμçd3Ïœ3ç gÈyvÂ9\@@@`ä`ÞE@@È3ä<;á. € € €@°r° ï"€ € €ä™ržp@@@ X€9Ø…w@@@òL€9ÏN8‡‹ € € ,@€ì» € € €y&@€œg'œÃE@@ @vá]@@@< @γÎá"€ € € Ô ~›w@@@ .Kúɬ´ÔêµkgEÍ›§<¬ýe¥ÞWaq±Õ_k­”ë–¯XaË&MrëÔïÔÉ 6L¹þò©S­láB+jÑÂêµm›r]­§õ•vë–r]-T9TmWÛO•VÌše¥3gZWÞ^¹S¥ò²2[öãnyÈ%UZ>mš•ÍŸo…žs}Ï›”[´ çÖù¢´ € €ÔXà÷N°ßŽ<Ò}øa•yç>þ¸[÷ÏË.«rÝR/ÐÔvõµ|Ê”*ןyà nÝÙ÷ß_庋?ÿ¼bÛU®ì­0mð`·þ‚1cª\}þ‹/ºu§Ÿ~•ë–/^\QŽe?üPåú³þó·¾~¦J æË-²2oû¤è Gç\P@@XU‚‚UÍ™•|ó_yÅ~Þm7ûõÿÈÊþÙi°]¬ƒ]x@@جõØcfååVØ´i•ÇTrôÑÖâàƒ­ ^Õ¡BQëÖÖiôh·Íªº5k¥Õ/¹ÄÊ—-«²+¶Ömܽ{Ŷõ{UiÍûî3u‡.lÒ¤ªU­EÿþÖlŸ}ªuŒW”£:ÇØúœs¬Õé§»îÛU„"'Pu­\‘) € €ÔD ^Ë–Õ^½Ð õUTPXhõZµªÎªn¢fͪ½nAýú5ÛvIIµ·­çˆ«z–ØßX×2]£cÔMˆj܈h¼ýö¶ÆwšŽ“ºXGç\Pˆ©À‚ ìŠ+®°YÞsZaiΜ96lØ0›;wnØ*¼@Z‹½gÜTgzƒÒ„¥yóæÙUW]•²®†åå}@š è¦Eñæ›[£6ªYFÖ®UäZåeã €€n"7uAÉšk®iç{ƒ$Ê Œ/ºè"ëСƒMõFêlQŨ›x"°ªÅ^k‰nÖ¬åÀ:dÈJ²ãK/½ÔÕühZÖ ¥iUËC>@¢(PPî¥(Œ2!€qøã?¬cÇŽVæ=UßëJµÉ&›¸×_ýµ-óžÅRšIy°ÿVÞs‚§vš5hÐÀ–.]j&L°¯¾úÊjNÒ¢";âˆ#Žó pˆ €á´ ‡Û°Ȩ€ßЬֻĤÀ„ÖãD^צ€žAVOȉIõPÝ«i=NTá5Õ ¹zN¬•›´ çæy£Ô €@äüVä† V”U¯i=®ààE´ö¦dQ+r£F*ö¦åÃ?œà¸B„ €ù*@ r¾žy޲"ÜŠLëqVNCÞïÔÙoE¦õ8ï«i D¹¹tþ|ûõÀÝ®qóÍÖpýõÓiÒ${ðÁ—uïÞÝöÞ{ïÀe/½ô’;6pÙ€¬K—.Ënºé&75BòBì«9cƒ’Œ#F-²¼ÉÖü»+Qò o¿ý¶é+(ýãÿ°7Þ8h‘Û—ö”Î;ï<7]Jò2M÷ c J²IP’¡,ƒ’ìu‚’ΙÎ]PÒ¹Ö9ON+V¬°aÆ%¿í~WKçñǸL£Þ>õÔSËzôèaú JO?ý´Mœ81h‘Û—ö”®¼òJ7Mò²TõøçŸ¶Q£F%gq¿§ªÇ/¿ü²}òÉ'ùRÕãáÇÛ\ïî|r ªÇ~+òìÙ³íÞ{ïMÎâ~OUßyç{ë­·ó¥ªÇwÝu—M›6-0ߪÔc ætä‘Gn/U=Þk¯½l›m¶ Ì—ªŸ~úéóD§ªÇmÛ¶µAƒî+U=Þe—]l×]w Ì—ªÿë_ÿ²öíÛæ «ÇÍš5³ÁƒæIU·ÞzkëÓ§O`¾TõX#U¯³Î:æ?‹¬Ï6`®°z¬.Ø\pAà¾ÜyçË6ÜpC;è ƒ—Õe=žïu1½ñÆË‘ª7ÎF˜/U=ÌÀ›dI À›Z°YÈgE–ŠÄnÿX>uª-ð®;м¹ç£ çÝ Ó<ȤøxÁp¹7§j¹œi~ërï¢ÆýÔëÄ/oÌroZÀ¯^x¡Òº‰ù¼ ÍÀ<Ú––%®›øúùçŸͧ²$®ë¿öºþ…æyÿý÷ó(¯w1šÏ ¸CóÝÿý¡ù¼¹BCó͘1#0ßwß}šg·Ýv Ì#Çn¸!4ßõ×_šo÷ÝwÍ÷í·ßæóZBólºé¦yTÆ‘#G†æ“qXÝêß¿h¾÷Þ{/4_qqq`¾5ÖX#4Oªzìþ¡ù¼©˜÷¥º•ª{£æóºQîë§Ÿ~*öÙgóh_ÞMžÀ|²õ•Ð|÷Ýw_h¾Í7ß<4ߟþ˜Ï»kšÇ ó¨Œ^0šÏ»yš¯gÏž¡ù¾ùæ›À|Þó´¡y¼ù¦óTU½¡ù>øàÐý¥ªÇ7ÌçÔ¡ûzñÅó¨ŽxÁxh¾O<14ßsÏ=W‘ï×_-÷æâ®ø}­µÖ ÌçuîX'ùïûÃ? Ì£2z7lBó]xá…¡ù¼G¡ù¶Øb‹Ð|^°˜Ï;4wC/0OUõøÚk¯-_´hQ¹7U[¹wSÚë¹ZZq1¡z WRþx7šÊõyIB &‹Æ/ÿÃû,üóª«j’­Î×Õ5­>_ó%Ñ‚ìýÏÅäˆæKv÷Ýw[“&Mܼªj5VKŠŸ¶ÜrK+,,¬ôž¿¬M›66gÎÿ×J? Ì»®ôžÿKª|Z–OåÛŸZ”79éṵ̀<Þ…Hè¾¼€;4_IIIh¾Tû[wÝuM.AI-ÅÞM‰•i~Û0N:…–Qç3,Ÿ–…™h›aù4ïnP>Õ™°/  ͧs–Ï ÖWš’FåHUUçÂʨ‰îÃö•N=V‹\r’Uоôì§ž +cmÕãäòù¿«…-yú)-KU;wîxlÊ烡ǖªwìØ14_X=Öß_˜ãªÖc}V7[:õXÇœToÂöUÛõX-Ã-¼î–þþ7Ø`W/“ËXßkò×I^¦ÿ;aþ©ê±>+ÂòUõyì]¤%Ãý®zœøÐ_)U=V rرUõy¬^ ‰Iž*û¯«¤wãÀvØa;÷Üsm¿ýöK\× PõXS¯ž kÅl¦Z«~þùçîšzÛm·­Öúé®T¼Å¦/R´x9Zç£ÊÒ¨ í™gži^ €[÷’K.1ué#!€ €@ötdçw¶ßÿ½¢0Ûo¿½Ýì¬nñ¤x Dùä\×ߎ¦¢{àÜÍVÝtzå•Wl×Ç^2y|ºÆÖc'?üp&7›óÛÊ·g sþŒåÑè/µ¤ùÁ±Z^ýçÆòˆCE@ ²êòñÇ»±<Ô‚¬¤ÖdµH]vÙe‘-7C *ê ¢Vc¿W“~Û$*e¦ñ @Îó©îƒ4ïÙHóž‰r]L4Ê«¯¾j½zõÊ# ˆ €䀺Æ{cMØO<áZ¢4(šÌÔ#$òA@7…z÷îmzDmÏ=÷4 Êç'o<óÆ[±Ûn»Í بÞ˜n±7†zê©îõQGeÞxnOo,?»û»Úi§¬k×®æ aÞó±˼q8LRjÔí¶ÛÎõæÐÀЉI'ª5Zxz衦nÕ$5"úZÏZi$S%}ȼñÆnTаgb#z @¼PË—º‡^uÕU¦ þ çÐó…޵À—_~iÞ€‹.@ÖM"ÍÀ¡ëWõ¬PÒò‹.ºÈ4žŽf\9à€\ «ëÛ¦ÞtGûï¿¿[OÁ«ÆêPwguaWzòÉ'íŸÿü§tÒIö裺Yvô¦®òg™àM›tÖYg™~^|ñÅnf“Ã;̼Á]~µL:Ôuá¾çž{Ühþ‰³³„oà2ó-ox9NµZ'Ožl?þ¸kI&0ΓF@Ð pÞèü!Ky;xùÿŸµcŽ9ÆMß™Ør«`WƒØ=ôÐCnzIM»6Õ›âÈïU¡iuóH°Z‹5` ÏÓ ‚‰Ï kZ z§1xü¤i5å _Mkù–7 ¢d%uÓÖßš‚o ô5fÌ·]:PM÷§)>5àžäd_µòOžA®ìÁoYжîzéŽÚ±Ç:’r–‹Éî@@ šº§%¹šX¬–¶@™7cÅ,o}­ðº0×v?~¼ F÷ãM—iÞtkoyÓµUÇz³{÷î¦hS%=¦ îÐ t“ÆçùñÇ+ÞÒ=~Òü ý¿7=úàMÏf âµµl+Ñrì‹ñSLóáz ‚Y³fñGásDÑ@XÉš¶¦^=.ÅVÅ<Õð&ê¶Ù÷Þë24öžÝ­çMuX›Iׯz?1-X°ÀHí¿§À51iŒªzU(ˆÕWж§€J^ž¸ŸÓO?ÝFm矾ÛGS¹)À&!(P¹ö&.áuÖÔµDsÃ’@@ ^ºÐ×àBtƒÅëÔFîh ¼®Í ½nÄú*¬ƒ®ýüêÍ7߬äðÚk¯™¦;óÓ§Ÿ~jK½ÀÝOêú¬îÓ©’ºh«;tâ¶Õ2üÞ{ïUÚvªm(8>çœsì¸ãŽsƒxéÆl¦Rõ&ñžÉ^òÍ7Ù,ûNà¶eH~Õ@zÂï…2Q@Ȭ€ž›üì³ÏÜCºÈ'!P…^+éšÞ€Tu•† âÖSN9Åæþú믻±t4·±’n©E¹_¿~¦´´|ìØ±vÇw¸åzF_ãíhZ4³ZßOÜK7êy¡ç”GŽi:ur7š´Nâº~žÄ÷¶Új+Ó´©ºÎÖ¸´KûÒªêv¸®Ÿ¿6.üà›ágQË–Öù¥—jsWl»´ ׫.VÕ3;vtÏÏ›7¯.vÉ>@@ HI£ù¾üòËY(»D ózÞø/ðSû˜ÖILÿþ÷¿ÝtSzOåÑ©[ QjÙÖ”Pþ3Ì}úôq#j'æçuþ 0ŠuÄÎù‰'žèî µk×Î}¸hä> €ÄS@SÚŒ7ÎÍËšØu4žGߣbëêŸÛaÆÙÛo¿í¦?«~®x®Y¾b…•{º×Œmjéjb먞™<(—FÕÓ-%=Apœ'CDÈkÍ窤©iüV¬¼áàÈ#¯«x¡7SM”ƒã<:‡Jë Šì¿P÷*u«Öè{ÉÝC²_:J€ €™èÙ³§µnÝÚmöñÇÏôæÙ‘гÇEš„@T#tf4²žÒÖ[oí¦~ˆPÑ(  €Ô‚€Úc=Üœ°¤“„@Ü4¸V=â~˜_  Gèäi@¥ä Ð#TDŠ‚ €PkÚ?ü`7ß|s†·Ìæ@j*À4O5«¥õ5¬ü[láºWkz €ä‡@KoŠ%] hÊ €@ö³g_iÏú‡øàƒÚ´iÓ*½Ï/ € +¼mýéjòãˆ9ʺЗҿþr»*òæÿÕÀP$ ‹u¸M/)++«ó}²C@ˆ†×Ñ8q+EÙüùö‹7?°¾–~÷]ÜãA ãÈ']õ ê â) ¿ï%Þ\‡Ë—/çrT ¶×i²@ mä´ 3·þ1fÎ’-!ŽÀ+¯¼bk¯½¶YÖßÎc=æÞ[ýõMÝ •&OžìÞÓ¸_|ñ…i™?§©ŸÏÿ©å묳Žyä‘þ[üD* pP‰ƒ_2$ 9v×5Ê}5ðþ‘¢#°ðwlÊ€öûÉ'G§P”Ä© €@’ÀöÛoo¥¥¥öõ×_ÛìÙ³ÝR¸Ë–-³ù^Wµïþî¢6vìX÷ÞvÛmç×Ѳŋ'mí¿6mÚÔP¿é¦›.çMÈoßÿÝ~þùg›;wn~Cpô((*²†Ýº¹¯ÂF2¾}6¸ê¥ÞuÃ2oûe“&­úFÈ™qžÒÏ8)D\hÞ¼¹©Uø“O>±qãÆ¹–dÈíÛ·wé}þùç¶ÑF¹å:ÖÝvÛÍÈþq+Ïÿû_kÖ¬™rÈ!Ö¡C[Í¥OŸ>nþz¯¿þº}øá‡.ßl³Ílïù° ¸ÅÏ<óŒë’Ý»wo{ôÑG]`¾×^{™Ö󓦆3fŒé¹ÅvØ¡R‹·Ÿï½÷vî´ÓN¶ùæ›ûYù‰àµ"éæÛµ×^kgŸ}vÄJGq@ 6z=ÏZz­Çܸ¨ ÝUß&òªÛe4§ºj¾ð ¶`Á;úè£3ºm6†5Ø}÷Ý]¬Vb½VkòGá‚Í &Øá‡nZ¦Ô£G›:uª{ýå—_Z¿~ý\Ъ7FŽio½õ–M™2ņj;ï¼³õêÕË®¼òJ»õÖ[­¤¤Ä×wÝu—=ÿüóvß}÷¹íhùÌ™3í¶Ûns­Jzó–[nqy8à>|¸]sÍ5n]}1b„éûꫯvïéçŒ3ìᇶñãÇ»õ +¸x €@Öz]ÞõEŠ–]¬#r>&Nœh§vš]tÑE)Å@ ¿vÝuW  øÇt­¹ 0õœ±du½þÁëµñÆ[›6m*°Ô>ýôÓ¦¿i­«ß?ú裊åz¡ç ï¹ç×Âüé§ŸÚgŸ}æ‚ðß~ûÍæÌ™ãÖÕ:K—.uõ{ï½ggžy¦Ëw饗º`üºë®³¶mÛÚÇìòwíÚÕï Ðý}hP°E‹Ùå—_nÝ»wwïó @@ \€äp– €@ ø¯ºS«VIÝ›$kÎò÷ßß½§îÕ‰ië­·®F”~ûí·.HM\Góž«Ëµæ=×óËê½ï¾ûZß¾}­qãÆnU­£tÁ˜ž_œ·hÑB«T¤5ÖX£â5/@@R  §öa)ä±€üª‹³FŸVÐì?Ç« TÁ°óªiRËñ»ï¾kýû÷·o¾ùÆ4…”Z¬5¶ë'šýÕW_¹_õ<ñ/¿üb ºý}ªL Þõ¥.×çœsŽëªíç×O¿%9ñ=^#€ € ÐÅ:Ø…w@7-“Zn5J´?z´žõ-..vÓ9idèzõÂ?FƒZŽÅZ¿~}»êª«\ðª®Óê*íÏ­¼æškV’?öØcÝèÖo¼ñ†-_¾Üöß×j­õ^}õU;ï¼ó¬uëÖvÇw¸r¾ù曕òó ä†À6Ûlc:ur=Ur£Ä”ˆ§@ø•]<—£Bª- ¦ý¬uñª¤€Y£VkÚ'M»ä'½êÎܲeKÿ-÷œ±ÞÓsÅþr³úÒÖ”O£U+é9ãóÏ?ßu“®Ø€÷BÓDiôjÇ={ö´aÆYÆ í‘G±!C†Ø<àVïØ±£ ºõSIx©+¸ÊKBè 覙>stŽ„@&ʼÁ§_|±Ûd«SOµÿŸÈä>Øq(ðZ8Êãt@¹z,êZ©ç.\hÌÕàÜ PCuVë±ÚÄ`V¹¦ŽÒôPZ®/¯Ä]Ì›7ÏÔ[A7 r[€9wÏßôéÓMŸÇêeµTê•k²7Æ…R‡{ïµFmZÄ9Þø+¼Á o¿½5®böƒ%Þ#@ ÆŒ±Bo¬Œ–ǺMÁ_Þár¯GVsoPÊÞ˜©Ò·߶ÅÞ ™ ¼^ͽžS©R©7«Älo\¥’cޱ¢æÍS­ns½™&–{³F{H5ÙqÇ”ë.ýþ{›ÿòËVàÝouâ‰)×ÕÂYÞ”‹eÞ Íz÷¶†U ¹ÈTs‘7SFýöí­…÷ÈU”Ó÷žƒ]}õÕ£\ÌŒ•äŒQ¦·¡Î;ÛÉÞDáºX&!€@þ$NvÔ¬K_A©yAyx@  ¼ÿÍûõs\äõRH•¼ô’-õf_(òÆØ¨*@^æM8÷¡‡¬È{L¨:òœ‡6¯k“o±E•òâqãlîã[±7ÓC•òܹ®:®Te€¼àµ×l‰7;E×êªyù¯¿ºmx=Áª Ïõf–(ónH4ìÖ­Êy‰w@~¼ñD¢ §ª3q\F€dzÊ1!€@Î h ®µÖZ‹A¶rþLr €@v 5²6C‡V« 7ÜÐ ½G~êy­šU%ÆÅÞì …O3XÕúZWrQ5Ö¯ïµkýªZaµÏBï±·mïu÷RU©áúë»à¸¾÷?¶ªTä=6¥mx†ÕI þ˼ޠE­ZU¹z½ܶ¬³N•ë²BÝ Ðźn½SîMÏÒ‚œ’ˆ… €ÄV€.Ö¹{j£ÜÅ:wU)yTò­‹5£·D¥æQ@@@¬ ÐÅ:«üì@0{òÉ'Ýôq½zõª˜ë@º ¹îÍÙ# € PIàöÛo·¡Þs¢Ìe^‰…_@: @®sòà~üñÇÖ§O0`@𠼋 € € P«t±®UÞêo\ƒs½þúëVTTTýL¬‰ € € 1Z3FɆ@@@rY€9—ÏeG@@ȘrÆ(Ù € € €@. ð r.Ÿ=ÊŽ €±¾Û¬MÃNß.¬{—§ÞfŸÎúoÝï˜="€ ð·2U!«Mê•XIÃôžWÍê°ó ÆõšW¼Î䋦õ½çò¨#™$ÍÚ¶Š‹šÕʾ›×oC©Ùºßhâ&u¿Söˆ €@‚r/@@l,Z´ÈŠŠŠÜWƒ ²Qö‰ à ð 2Õ@ȲÀ¾ûîkíÚµ³›o¾9Ë%a÷ €@~ Ђ‘óÿûï¿Û›o¾i ,°¾}ûF¤T@@È䈜ëñãÇÛ€\×*䈜Š € €y%@ë¼:Ý, € € €@˜r˜ ï#€ € €ä•r^n@@@ L€9L†÷@@:Xýõm«­¶²öíÛ×ÑÙ ñXwÝumìØ±;˜_|ÑvÛm·Œm 垃tåÞ9£Ä € 3Ûo¿ÝJJJ¬¸¸8fGÆá P»tS¤ej/K–,±™3gfjsl'#rÒºuëf\p-^¼8"%¢ € €T_@Ó–.Z´ÈÚ´ic¯½öštÐA.óܹsÝt¦®u¶yóæ•6úÓO?Ù¸qãl½õÖ³.]ºØÏ?ÿl›m¶™[ç“O>± 7ÜК6mê~ÿã?löìÙ¶Á¸ß÷Ûo?kÕª•{ýÛo¿ÙòåË­E‹ööÛo[¿~ýÜû³fͲ·ÞzËêׯo»ï¾»5iÒĽïÓþ'Nœhº///÷ßægž  GäÄëòâ‹/¶3fD¤D@@ê Üwß}öúë¯Û/¿üâ‚Ø<ÐÞÿ}Ûÿý]ðYTTdÇ{¬=õÔS¶ë®»º 9Ò dÛn»­)ÀîØ±£)`ßòW€gó÷Üsä € €dT@-·Ã‡w²ÒÃ;̆j~ø¡½÷Þ{6dÈ$k§jÙ=ùä“íž{îqAî7ß|Sã\‰é7Þ0ÝS¦Lq­Ù‡~¸]uÕU. V üñ.ËŸþiçž{®=üðÃöÑGÙ÷ßoK—.MܯóP€9O:‡Œ € €@¦¬vïÞÝúöíë6­ SÝž·Ùf×…Zݨ7Þxc×…ú×_u­Í 64±JõêÕ³£>Ú½^Õo=zô°ž={ºìêV­îØjeÖ¾õ¥®Û_~ù¥{ÿ¿ÿý¯­¾úê]Á5€hR~ ÐÅ:¿Ï?G € €@ÆV[mµŠméyáÂÂB÷aÅ›Þ ±j]ž>}ºµmÛÖu‡ö—·lÙÒø³´´4ð}½©=hÿjÁNLÚ¿ZŠÕÊœ—i>cµHëïKI#\ë™ço¼Ñý®°0ûûœ6mZÅk·ßòR€9"§]#îuÔQvÚi§E¤D¹U ÝyT7uש¤_}hk?aiΜ9n ÞHŠž€ê†êHª¤é”ZuCu$lû]t‘›bbìØ±æ-X° ]’7Muí«Ís iMtá–T'uÑvï½÷®´Ê“O>i>ø`E]QIÕj²ÒxÈ‚@ƒ ¬qãÆ{Öïj=Ö¨Ój­U‹±>Ïü WÏÿ>ú裦ÿ‘êê¼þúë»Ñ¦+6à½ÐÍ›nºÉMͤѰÿõ¯UÚG³fÍL£c+©•8q.q•Eû× `Ú—ö¯æþÍË5×\Óxà;ï¼óÜMîM7ÝÔx< ”Û8ßòF€.Ö9ÕjùÔ„þÀo¾ù戔*wŠ”èâTwâÕB£¡ÿ5‡^bR@«‘5÷´oØh£»;Šï¼óŽi®¾­·ÞºÒ²ä_tTÓ ,[¶Ì9äJ‹Õº=Ù›ª@Ó ¼üòË.€Úk¯½ÜOµézÏ=÷tsö%fÔ…»‘о5oŸZ&?ÿüs·.À?þØ—þ9èYu!R¶Å[¸/mO#4j[úÇôÒK/¹Ú£Fwû×AuDV:':šnbÝu×­ä i×ÞòøP £óеk×JËe«©'Ôr¬;äaIuL-Ìß}÷]¥Üþú Ô´-í_åѹQðÏ©ÊÞ»wï•æmTÖˆŸºC¯®aªó_ýµ;÷Ú†‚vÕÕo]0¨õ\uNù4`Š_çU6ÝUW½ÒrÕ'íOõ.Î)¹NÈKǯ¿W òâw¹“ƒZ>Þ|óÍŠiHvÙe—Š.Z®z¢Ñ[å¬çÛ’·¯uütÅWص×^ëΙ¼““FRÕH¯L^Tq^õw®›« œ5¯§.þTU~uÓÕ\¢ÉIó‰j ÿ;µT·k×Ît‘¨ôí·ßºz¶ÖZk¹ß5â¬ÊÒ¡CÓçœþG©>«.ëBRÓ§èïDË´ä·€>·’“>«~üñÇŠÿ;w®´ŠZqõHŸeú,ÒÀYú¬ò“4Ÿ²ZzÕšœø¹¬uô?ÍO—^z©ÿ²â§>5¯²>·ô.ùÿµ¦€Òu‘ö¯ÏÍÄ¿b#¼È+ä¼:Ýñ=Øä Q–º`SP¬ Á³Ï>Û}ýûßÿv öØcXh0u·9å”S*ºé¢QŠ.øôAé?·&xçwº‹cMœtA­íë‚¶£F#8*˜ÑU={sþùç»`81hÕŸ.ÀÕ"­‹í^xÁ=ôPÓƒÇsŒû°ßqÇÝÅ©þi(HÒE¬îŽªû’Žù /të«© õÖ[Ïíÿ‚ .0ÿZ7_RrQwø>}ú¸@QwŠÕÍõÊ+¯´SO=Õ‘(PúÇ?þáìu^tÇú²Ë.s¶ZA7WôO]”«  Ç·ÕÝjNãÇw¯/4ãÕW_í¶¡ú8aÂwSGùÔ5Lž£úôÓO+]Ì›7ÏÍ ©ú®:õÐC¹ºöüóÏ»Dµ¾êù_ýå.>4—¤‚b¯Žóšk®±“N:Éu5Óñ¨Nj¹‚.Õ}ÕÝ|¹‹®Pº@ÒÍ Ý ÑùP ©›l:ÿºÉä߈P`¨ÏÝtÒ1ÝHÐ8uåS/µ€¨7Fc KêJ« >]^rÉ%+­¦‹Ií_-- J5êªßB¢²j>PÕ_]TêwϽ÷ÞÛM£¢›zꆨ:® ÓĤÏ}ž(@×Í;Ý(Ñ犦8QÒȳú;P€<`ÀWç´ ¯ÞS=ÑMåÓM%ý])`V=’•nF’@d=_¼Á$¿]ñ»®ºuëVñ{ò ]‹¥¸êó3¹¡$qú®ÿ£$$@kêA,’ï&j~;]|êÿñÇwuºU ¡¤î4šF@A–«ëMb7GK Žt‘©`Y‚©Ò:ë¬ã‚Ï-Z¬´šÊ¦‹î‹/¾Øµ.=óÌ3®Uòˆ#Žpsî}ñÅ.ØÕhbÒ¶+URË”‚$µh*3Ƶ•””˜¶©>ºx}â‰'\K±j?é‚ö±Ç3N'NtÚþó8þ:ùôSõº?b–оIDATÉ  B­îêú¥¯Áƒ›¦PR}8묳\óÔSOÙ 7Üàn6h™ò+¯‚³:‡ šÂ’‚ÝáÖ?ÿ#<ÒÕ JÔã@IuDw·u£Eç÷~ï¹UNºá¢A: ZU“î‚ëzXQ}Ð"]x(xîÔ©“k¡Öñ¨ž(0WÒþµmYè=½V‹ö-·Ü’¸»X¿¾îºëÜÍ&KYéïD7&ü=ú{Óo-×ùÐgƒN´žn€¨µU«êj ý-놕nœ$'Õ/ÝQÑ—n”)èV™“ê“Ê¡Ï5ÝSµèƈ‚|ã䤠ZåSR½Q«³ÿ™¢º¯cÖM=¯ãÔg¤‚gí[¸~ª¾èžn(ÈEƒÝ¨…G$@ ]]׬¦«HþtÓÑ#o$t‘¨y÷ç±ÓÅ¢.&0+i0£žõo¢(àUo \z­²¨Ë¸Ÿ’눂¤|ª#úÛIþÌPìf¨eV­¸j]Õh«zÞØïò,C}n$ª öª$Õõ P—m%}v©7tõFQ ³RòçJrwx=·òßßt£LåÒMDÈ:u¹ÖMµ+ÈVÒ¶ôÙ£Vn=’¡Ás´®“FÇžx|~ï™|ª3“fìDZÇëzÑM=c¤lX%äUb#S”ü E]ý¤î‡êæêZsâ‰'ºgðÔ=QÝÕUÐOþà5‰Ý#_ûëeò§%oS]ŒȨµ[-|jÝÒŬZ¯Ô*©–a%‡Z)0ÒˆšÂÀï’©à:1ÉÂo¥L|?_^«µM)±Ž¨…L7"TG48–ZÖîºë.×Ú¦.ùêæê'Õ‰ùSÕ=7î·DúÛP áþ{«òS-~j TYPi›[n¹¥{†V­ŽþàKj=Ö@qꎯ^z¬@Ýþ5¥…R>Ö‘Ä¿;}n$žO™è¦ƒÿ™¡› ¤M7§Ô ýœsÎq]®µž’ò'×äßÿ·fÕßÕu{øðá•VT}QPª Ø/·ÿ³ÒŠÕøE½Yô¸…Že«­¶rÝðÕ3%ñ¦›þô|³>kôy¡òñEQë¹ê‘ŸÔ;BÁù7ü÷ùY}=ó­!zÖ„ =äìÙWÚ³‚ÝÑW«©æ‰-%jÕP   Z:JÿùÏ\@© C­›Øú£€RÏê‚OIÏuêÅϯàÚÜË­à}Ós¡A#%úËkú3±üjÑÖ³¨~R™Õbå·&©kìí·ß^Ñ2¨õÔUVÝ…ÕURÏ"ëôÓÀôܤÿL²ºAjNÞ<ÐßE^üL4Vw{µâ*@ôÏûõ×_ïZÉë==oê·ªuPϘúëêÆ„ZÖT/T—¼$¶Æ T]Ý5J±’ºd«%Z‡’ZvÕm[Ï¡+%–­:¿kÐ5þ^Ý(Qw´ä:¢:ï·j›ÚŸ‚~ýMè¸tƒDƒK©¥PûW€äw©Ög‘;ˆ{It×(¦ºÉàÉú;Q?=[«¤çÅýQ½õZS’(¿ê‰’z¨×Ÿ_ÛRê'µP«%Ö_Xÿ=uß÷ÿf5˜–ê—ºy«—@P?¯ÿ3q~¯}ûϼë3EeÕ@_ª?­[A¿ŽÏÙ\7L4`—‚c%«®Ü‰½m4¯©Ž_ݪ5§©Ê§í‘@Èe䈜=¿ÕG-<¤š (Ôs¾ú©¤;µ€è:µ iDZ~ë‹âÓO?Ý Z¤`ø„Np‡ºHVRwX]j›jR@¥î“þöuÁ© à䤋×änŽºèLì>›\VmCûñ/¾ÕŠ£ ÙOºHÕ…©c%usTK²Þ÷“žUð¦‹X©fõ|«ßJ¬`P½ŽE#Òê¢ÿ˜„çýíÄù§‚9û­nzÆX-uºàW÷Qµ+(ÔyÐyÔ¼‹‡~¸«# @5u…ZÌÔÍ]çPõI7J´MÕ u‹Ôk?©ÅVÛTºÄ NÛ½‘ÌuGçP-E~ªó™Ø]VAFâ¶TfýîêNŸx3M£i«Žø7Qô<µ¶©®Ý~Òþô7¡²ªŽ(HR­º©íwïÞÝÔ³BuD7 t¼Únœ“Ì夤ù(ª•XçIŸ ºâÿÝ)ÀÔÕý]©ŽÈPƺ‰6tèPpªÕ^= Ô3¥_¿~ÛW×dÝØòo’ø®:o‰çZïëoôÖ[ou£Hë|èKûÓM%¿>øŸGzOçQÛò“>‡”GI­»Ú· «þi™¦òRÒÈ®úœTyý¤–e=¬^,êZ®Ï­§ç´ý¤g¥UŸU>ýÝøšùËù‰ €@. xw™ÿ÷0S.–>feÖE–Zò! ÿý+µåvô:×Û&%ÿ üjã¸õ¼¥Zø4ßèïG]jå­‹a-SËšþü©–Ô2¢ K]æJ·AuéÔ3“:&=·¨¤@Y-Ìš.J-Zºi|AóóÝéÙsS®³’¢6°íˆt6eËË–Ø-ü¯…ûÄõî¶ušm•ÖöÂ2ë|ë+àPÑÏĤ F_@KËÔR¬Ÿ~P¥º¥) :«cªA“ÔcA–º£ÖuÒñª¼ ”tL~¥î“½î³ºi :¢€'1`ÏT9_žz»½>í.k_;¬Íuimv~é »kú1ngoô¤µ+^'­íù™u~ô%Ÿä›]rÓHÏ e'O‰‰7ÀÔÛ@7«:{ƒé&ºê?ú‘î6kš_ êõ|¶_õHQ¯ÿYºi¤ãM~~»¦ûñ×ú—+íƒ[—†ÛØ­.ößΛŸºa—φ¼®ÅÕøº®ÐM¶¨¥E+æÙ¿'ôpÅ:mýQÖ±éÆQ+bÞ–gìÌçí±É[Óz-í’ÍÇDÖA›ê:G×ùè •g9Ñ•7ˆ@µ‰¶~Ð㯫Öu£Í¥ä?/Tfv©–å‰û{2Q¤‹ÕÄ.¥þÍ}µèªu­ºIÿ\ªHWw{5]OÇtñ¦÷•TçSýÍÔt¹¸¾þù‡]¨…V7Rü$·ÄϽï÷Úð×IçgòþÒÙÖªæMå¡mêæ @8  Çélr,¨KhM‚¸€MðVÌÔ%÷°ˆù!sxi¨õ\]òý+ilЬ €DN€9r§„!Y=3˜øÜ`f·ÎÖâ PÝy¾ãp¬Cúêu¡9‘I™ÐXê²®ñ!âþüfåØ YäÌz²5@@ ÆE^Óiitq €@öþ7äoööÏžÿx饗ܳ‰t…¥J € € €Ù 9;î+íU£€jôaž\‰†7@@@: ¹N˜Ù  € € €@Ô£~†( € € €@ × 3;A@@ˆºÏ Gý Q>@ˆ½ÀÝwßm5²Î;ÇþX9@@ ÊÈ9;ú§¸ÆkXAAADJD1@@ ®ºtéb%%%V\\\W»d?y(°¸tž-X>+<š‡¼´ta4 –ç¥"@ŽHèÕ«—Mž<Ùf̘‘Q @@8 ÜõÃÉq:ŽZàäZae£ € € €¹&@ r®1Ê‹ € €@55±36x¸šk³Z6 в±[ö"@€ÃÛ € €亀‚¯5›lë‡Aù¨3ºX×5;B@@ˆ²r”ÏeC@¼ØsÏ=­yóævã7æÅñr €@Tèb‘33sæLûôÓOmÞ¼y¶ãŽ;F¤T@êB`ÅŠ¦¯ÒÒÒºØû@ @©ë·?úè#ëÛ·¯Ù¯¿þZ×»g € € €@Þ ÐÅ:ï« € € € @¦ € € € à  S @@@ðx™jU·þiãÿÕ2°óÌÌ\:%3JÚÊ+SÿcMê­–ô.¿æ¢ÀK~ª•b?7å:kTؤV¶ÍFëV`ê¢oëv‡Ú[ûöímÉ’%Ö¢E‹•Š¢ €ù'@€œç^¡(Q¤~˜÷Q¤ÊCaX‡zÈJJJ¬¸¸xU²“@ CÈ‚Lw3;w¶AƒÙ²eËÒÝTNäߨñVf+r¢¬²fM [Ö,CÀÚ…E¶qã=–ðVV+jŸöaÔ/hDI[1ºhS¯Kt GÉ@b-PPî¥XaÜòåËmÆŒ9TbŠŠ €™ 9S’u¿éÓ§Û¼yó¬k×®u¿söˆ@- |ÿý÷¶Új«Ùꫯ^Ë{ŠÆæ¤+çÁ•¢   B¥¡( € P—\Ô¥6ûB‚ƒ]²ò.ÿ³ÂÎN@ˆ„ב8 ò\€9B °Ó¡ÓAQ@¨S¢¢¢:Ý;CXY€ˆle“¬½£;ÇüsÌ?;F@ +ä‘G±ñãÇ[YYYVÊÀN@þ'À(Ö« õë×·ÒÒÒˆ•Šâ € €@m ¼ûî»vöÙg»)ž4Ð=ÊjKší"€U Ђ\µQ­ñã?Ú7ÞhC‡­³}²#@È®€d¥m·ÝÖêÕ£í"»gƒ½#€@¾  G¨|ûí·vùå—Û¨Q£lÚ´i*EA@ÚЯ½öšÛô>ûìS»`› €5 @®Vm¯ºÇ{¸9Æ´Ÿ‡~¸¶wÇö@@ Ë£G¶Ù³g»RtÐAY. »G @ŽPhذ¡ 8Еè°Å‹G¨t@2-pÇw¸Mî½÷ÞÖ¹sçLoží!€ÔP€¹†`µ½úi§f¨kæÌ™v×]wÕöîØ> €dI`Ò¤I¦ñG”† ’¥R°[@DäD¼ÖÝãAƒ¹’ >Ü~ùå—”Š" € €@¦ºtéb_|ñ…]{íµ¶Ûn»ezól@`W­¶³\vÙeÖ®];Ó3ÉÍš5«íݱ}@È‚@ƒ LA²¦x"!€DC€¹¢q*•¢¤¤Ä>ùäëСƒëj½bÅŠJËù@r[@sëÿ}AAAn¥Gb&@ rDOèZk­eúçÙ²eK÷3¢Å¤X € ° úÿ^TT´ 9É‚ P›ȵ©›m׫WÏZµjEœK6 €@6¾úê+×b¬àXÝ«I €Ñ @ŽÞ9Y©DÕºuëÖîNó¬Y³ì÷ß_iÞ@@h Ì›7ÏN>ùdÛk¯½Ü#T5ŠfA) €€ çH%PKr›6m쬳Îr#]Þwß}¶|ùò)=ÅD@ ÿÊËËíùçŸwÿ·Ÿ}öY+++³§Ÿ~:ÿ 8b@ ‡sèdýôÓO6nÜ8[°`]xá…Ö£GS ¬ßI €  ÆÏ<óŒk1>ñÄí?þ°† Úu×]g÷ß4 I)@Y¢ùf×®]í믿¶£Ž:Ê=ä9’(oºé¦výõ×G³Ð” @<ÐÈÔ·Þz«Mœ8ѹºVþù箣VçYeàp@ ç˜æ)ÇNYÛ¶mmäÈ‘nÎD݉~ôÑGméÒ¥n / ø¡n׺s˜N:é$ûâ‹/ߪxý /¸i&*Þøû…ž—êÓ§OòÛî÷7ÞØî¸ãŽÀe£G¶aÆ.;á„lÀ€ËÎ?ÿ|{çw—=øàƒÖ¹sçÀe»ì²‹ë²–¼pÍ5×t6Éïë÷÷ßßÎ=÷Ü EvØa‡¹çÄ‚^}õÕ&¯ tÛm·Ùf›m´Èúöík³gÏ^i™æ¸~饗Vz_oè¢J^Aiï½÷¶ .¸ h‘;/ò J:/ò J:/“'OZä΋FTON¿ýö›zè¡Éo»ßwØa»æšk—=òÈ#&¯ tÎ9çØ~ûí´È]`%uaÔ 7Éiþüù&¯ ´ÑFÙwÞ´È—+®¸"pÙ AƒìÈ# \¦óòöÛo.5j”­½öÚËV¥ðÁ&¯ ¤órÊ)§-rçE^AIô›o¾yÐ"w^4BrjÚ´©½üòËÉo»ß5 ‘¼‚’Ýà J:/ò J:/ê=”t^~þùç Eî¼Õݰ2®J=V¹Ãö¥ïÂö¥r„å«z¬}iŸÉ)Õ9«ëzü믿Öã-Z„:F­ÈsæÌ =×ݺu =¶Ú¨ÇºiT'Sëڨǩþ¶S}«Ȫ×AÇ¥÷SÛª~kÌŽ°ý©ÿùçŸÚu¥ö¿P+¥ªÇ3gÎtÿ{õY£cIl>ýôÓM_¤üÐùWýW#!GÕñ|IÈ9~¦upÜqÇU…þ9«'Vâ3Ï<3´…DWA£ij»Ã‡¯Ønâ‹öíÛæÑ:;í´Sh¾wÜ14ŸZ™zõꕸ›Š×:u ͧ2*(ON >ƒŽKëm¹å–¡eÔ²°|jÚb‹-’wå~W+NX>µÜ.Z´h¥|Z?,Ì0ÿTûêׯŸií ´õÖ[‡îO-yA­ƒÚNqqq¥‹>Ûj¥+£ZJÃŽ­wïÞ¦‹ì ¤¨°|ƒ¶ƒ>8(›À.(_IIIhÛµkº¯TõX­ãAûRÁTu³*(UUƒäTõXu1Ì?U=Vo°Vbµª‡[X=Vð–GfX7Ø`ƒÐ|ªÇª_A©{÷î¡ùTƒZµÕ¹ÄàÅß¶Z7Ãʘªï¹çžîoÃßNâÏ]wÝ5´Œgœq†õïß?qõŠ×ºùd©à+¬ŒµQÕZºûî»W”+ñ…zó•QëÜtÓM7zRÕcÕŰcSÛ×GÚk§ªz¬À;9­j=Vgº¦dÍüü]×Sú"!€@î xÁÅÊÑEîG€ € € €@V~°°FÙY@@@x Çã¤*šü[­ÕŸþì]Ø ªÞ·)`v¯ƒÖ#ü/;)“ »qIEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/share.png0000664000000000000000000000050500000000000021425 0ustar00rootroot00000000000000‰PNG  IHDRóÿa IDATxœ¥Ó½JCA†á'ɱ²°ÁÆÂÒN A+oÀBÐ (z{¼mSØXy ‚h)Ø!)üÅñ§È‡5&úÁ²S̼|3;[HÓÔTì!÷ 1À8jøÂsÀ *XÏvQF˜À>®ðˆf€÷‡œ-ì¡ Æp€›Øè¢e\à°HŸ˜î²vpÔn¡­ÉL\Å<†Ð¬¿†VÊXÃGpîLáu­Àm€ng­$™øO¸Ä]Äö¨0¸¬ò{p·Hq[Õߧk<üPœà=8ÇJ€Ô1).ag1À"æÐÐz¦Øi`K1[5­%ú“zùQ}OÚ8‚$®²IEND®B`‚././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/img/trash.png0000664000000000000000000000033500000000000021445 0ustar00rootroot00000000000000‰PNG  IHDRóÿa¤IDATxœÝ’1 1E_ÄBm¶°ϲ{Œ\ÁF°´°õD»§±²±um„µpV†ð#íü0ägøy CBŒ‘)šeúà V=p,l,¼‚ÕØÛ4Äçòs>Ο›åyîÔJb-<¡Y&p²‡oàW¸@ËÔꘇbè`Œ,EàS\Gü£ º%â·1ïàoáýXà‡Á¿ÇYÉWż}IegLÂQ¾ƒÿJø´™ùÇîqf3û9¢ø ¶K,.¬ ²*;¸ ¾ ÛðËfÁ¿j~Ú:ÙÁ3õ!D5šaIEND®B`‚././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.6014643 graphite-web-1.1.10/webapp/content/js/0000755000000000000000000000000000000000000017453 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1653243713.6054642 graphite-web-1.1.10/webapp/content/js/ace/0000755000000000000000000000000000000000000020203 5ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/ace.js0000664000000000000000000073132700000000000021310 0ustar00rootroot00000000000000(function(){var a=function(){return this}();if(typeof requirejs!="undefined")return;var b=function(a,c,d){if(typeof a!="string"){b.original?b.original.apply(window,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(d=c),define.modules||(define.modules={}),define.modules[a]=d};a.define&&(b.original=a.define),a.define=b;var c=function(a,b){if(Object.prototype.toString.call(a)==="[object Array]"){var e=[];for(var f=0,g=a.length;f1&&h(b,"")>-1&&(i=RegExp(this.source,d.replace.call(g(this),"g","")),d.replace.call(a.slice(b.index),i,function(){for(var a=1;ab.index&&this.lastIndex--}return b},f||(RegExp.prototype.test=function(a){var b=d.exec.call(this,a);return b&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--,!!b})}),define("pilot/es5-shim",["require","exports","module"],function(a,b,c){function p(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this;if(typeof b!="function")throw new TypeError;var c=g.call(arguments,1),d=function(){if(this instanceof d){var e=function(){};e.prototype=b.prototype;var f=new e,h=b.apply(f,c.concat(g.call(arguments)));return h!==null&&Object(h)===h?h:f}return b.apply(a,c.concat(g.call(arguments)))};return d});var d=Function.prototype.call,e=Array.prototype,f=Object.prototype,g=e.slice,h=d.bind(f.toString),i=d.bind(f.hasOwnProperty),j,k,l,m,n;if(n=i(f,"__defineGetter__"))j=d.bind(f.__defineGetter__),k=d.bind(f.__defineSetter__),l=d.bind(f.__lookupGetter__),m=d.bind(f.__lookupSetter__);Array.isArray||(Array.isArray=function(a){return h(a)=="[object Array]"}),Array.prototype.forEach||(Array.prototype.forEach=function(a){var b=G(this),c=arguments[1],d=0,e=b.length>>>0;if(h(a)!="[object Function]")throw new TypeError;while(d>>0,d=Array(c),e=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var f=0;f>>0,d=[],e=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var f=0;f>>0,d=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var e=0;e>>0,d=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var e=0;e>>0;if(h(a)!="[object Function]")throw new TypeError;if(!c&&arguments.length==1)throw new TypeError;var d=0,e;if(arguments.length>=2)e=arguments[1];else do{if(d in b){e=b[d++];break}if(++d>=c)throw new TypeError}while(!0);for(;d>>0;if(h(a)!="[object Function]")throw new TypeError;if(!c&&arguments.length==1)throw new TypeError;var d,e=c-1;if(arguments.length>=2)d=arguments[1];else do{if(e in b){d=b[e--];break}if(--e<0)throw new TypeError}while(!0);do e in this&&(d=a.call(void 0,d,b[e],e,b));while(e--);return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=G(this),c=b.length>>>0;if(!c)return-1;var d=0;arguments.length>1&&(d=E(arguments[1])),d=d>=0?d:Math.max(0,c+d);for(;d>>0;if(!c)return-1;var d=c-1;arguments.length>1&&(d=Math.min(d,E(arguments[1]))),d=d>=0?d:c-Math.abs(d);for(;d>=0;d--)if(d in b&&a===b[d])return d;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||(a.constructor?a.constructor.prototype:f)});if(!Object.getOwnPropertyDescriptor){var o="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(o+a);if(!i(a,b))return;var c,d,e;c={enumerable:!0,configurable:!0};if(n){var g=a.__proto__;a.__proto__=f;var d=l(a,b),e=m(a,b);a.__proto__=g;if(d||e)return d&&(c.get=d),e&&(c.set=e),c}return c.value=a[b],c}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),Object.create||(Object.create=function(a,b){var c;if(a===null)c={"__proto__":null};else{if(typeof a!="object")throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}return b!==void 0&&Object.defineProperties(c,b),c});if(Object.defineProperty){var q=p({}),r=typeof document=="undefined"||p(document.createElement("div"));if(!q||!r)var s=Object.defineProperty}if(!Object.defineProperty||s){var t="Property description must be an object: ",u="Object.defineProperty called on non-object: ",v="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(u+a);if(typeof c!="object"&&typeof c!="function"||c===null)throw new TypeError(t+c);if(s)try{return s.call(Object,a,b,c)}catch(d){}if(i(c,"value"))if(n&&(l(a,b)||m(a,b))){var e=a.__proto__;a.__proto__=f,delete a[b],a[b]=c.value,a.__proto__=e}else a[b]=c.value;else{if(!n)throw new TypeError(v);i(c,"get")&&j(a,b,c.get),i(c,"set")&&k(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)i(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(w){Object.freeze=function(a){return function b(b){return typeof b=="function"?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)===a)throw new TypeError;var b="";while(i(a,b))b+="?";a[b]=!0;var c=i(a,b);return delete a[b],c});if(!Object.keys){var x=!0,y=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],z=y.length;for(var A in{toString:null})x=!1;Object.keys=function bd(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var bd=[];for(var b in a)i(a,b)&&bd.push(b);if(x)for(var c=0,d=z;c9999?"+":"")+("00000"+Math.abs(d)).slice(0<=d&&d<=9999?-4:-6),b=a.length;while(b--)c=a[b],c<10&&(a[b]="0"+c);return d+"-"+a.slice(0,2).join("-")+"T"+a.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"};Date.now||(Date.now=function(){return(new Date).getTime()}),Date.prototype.toJSON||(Date.prototype.toJSON=function(a){if(typeof this.toISOString!="function")throw new TypeError;return this.toISOString()}),Date.parse("+275760-09-13T00:00:00.000Z")!==864e13&&(Date=function(a){var b=function e(b,c,d,f,g,h,i){var j=arguments.length;if(this instanceof a){var k=j==1&&String(b)===b?new a(e.parse(b)):j>=7?new a(b,c,d,f,g,h,i):j>=6?new a(b,c,d,f,g,h):j>=5?new a(b,c,d,f,g):j>=4?new a(b,c,d,f):j>=3?new a(b,c,d):j>=2?new a(b,c):j>=1?new a(b):new a;return k.constructor=e,k}return a.apply(this,arguments)},c=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$");for(var d in a)b[d]=a[d];return b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function f(b){var d=c.exec(b);if(d){d.shift();for(var e=1;e<7;e++)d[e]=+(d[e]||(e<3?1:0)),e==1&&d[e]--;var f=+d.pop(),g=+d.pop(),h=d.pop(),i=0;if(h){if(g>23||f>59)return NaN;i=(g*60+f)*6e4*(h=="+"?-1:1)}var j=+d[0];return 0<=j&&j<=99?(d[0]=j+400,a.UTC.apply(this,d)+i-126227808e5):a.UTC.apply(this,d)+i}return a.parse.apply(this,arguments)},b}(Date));var B="\t\n \f\r   ᠎ â€â€‚         âŸã€€\u2028\u2029";if(!String.prototype.trim||B.trim()){B="["+B+"]";var C=new RegExp("^"+B+B+"*"),D=new RegExp(B+B+"*$");String.prototype.trim=function(){return String(this).replace(C,"").replace(D,"")}}var E=function(a){return a=+a,a!==a?a=0:a!==0&&a!==1/0&&a!==-Infinity&&(a=(a>0||-1)*Math.floor(Math.abs(a))),a},F="a"[0]!="a",G=function(a){if(a==null)throw new TypeError;return F&&typeof a=="string"&&a?a.split(""):Object(a)}}),define("ace/ace",["require","exports","module","pilot/index","pilot/fixoldbrowsers","pilot/plugin_manager","pilot/dom","pilot/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/theme/textmate","pilot/environment"],function(a,b,c){a("pilot/index"),a("pilot/fixoldbrowsers");var d=a("pilot/plugin_manager").catalog;d.registerPlugins(["pilot/index"]);var e=a("pilot/dom"),f=a("pilot/event"),g=a("ace/editor").Editor,h=a("ace/edit_session").EditSession,i=a("ace/undomanager").UndoManager,j=a("ace/virtual_renderer").VirtualRenderer;b.edit=function(b){typeof b=="string"&&(b=document.getElementById(b));var c=new h(e.getInnerText(b));c.setUndoManager(new i),b.innerHTML="";var k=new g(new j(b,a("ace/theme/textmate")));k.setSession(c);var l=a("pilot/environment").create();return d.startupPlugins({env:l}).then(function(){l.document=c,l.editor=k,k.resize(),f.addListener(window,"resize",function(){k.resize()}),b.env=l}),k.env=l,k}}),define("pilot/index",["require","exports","module","pilot/fixoldbrowsers","pilot/types/basic","pilot/types/command","pilot/types/settings","pilot/commands/settings","pilot/commands/basic","pilot/settings/canon","pilot/canon"],function(a,b,c){a("pilot/fixoldbrowsers"),b.startup=function(b,c){a("pilot/types/basic").startup(b,c),a("pilot/types/command").startup(b,c),a("pilot/types/settings").startup(b,c),a("pilot/commands/settings").startup(b,c),a("pilot/commands/basic").startup(b,c),a("pilot/settings/canon").startup(b,c),a("pilot/canon").startup(b,c)},b.shutdown=function(b,c){a("pilot/types/basic").shutdown(b,c),a("pilot/types/command").shutdown(b,c),a("pilot/types/settings").shutdown(b,c),a("pilot/commands/settings").shutdown(b,c),a("pilot/commands/basic").shutdown(b,c),a("pilot/settings/canon").shutdown(b,c),a("pilot/canon").shutdown(b,c)}}),define("pilot/types/basic",["require","exports","module","pilot/types"],function(a,b,c){function j(a){if(!Array.isArray(a.data)&&typeof a.data!="function")throw new Error("instances of SelectionType need typeSpec.data to be an array or function that returns an array:"+JSON.stringify(a));Object.keys(a).forEach(function(b){this[b]=a[b]},this)}function l(a){if(typeof a.defer!="function")throw new Error("Instances of DeferredType need typeSpec.defer to be a function that returns a type");Object.keys(a).forEach(function(b){this[b]=a[b]},this)}function m(a){if(a instanceof e)this.subtype=a;else{if(typeof a!="string")throw new Error("Can' handle array subtype");this.subtype=d.getType(a);if(this.subtype==null)throw new Error("Unknown array subtype: "+a)}}var d=a("pilot/types"),e=d.Type,f=d.Conversion,g=d.Status,h=new e;h.stringify=function(a){return a},h.parse=function(a){if(typeof a!="string")throw new Error("non-string passed to text.parse()");return new f(a)},h.name="text";var i=new e;i.stringify=function(a){return a?""+a:null},i.parse=function(a){if(typeof a!="string")throw new Error("non-string passed to number.parse()");if(a.replace(/\s/g,"").length===0)return new f(null,g.INCOMPLETE,"");var b=new f(parseInt(a,10));return isNaN(b.value)&&(b.status=g.INVALID,b.message="Can't convert \""+a+'" to a number.'),b},i.decrement=function(a){return a-1},i.increment=function(a){return a+1},i.name="number",j.prototype=new e,j.prototype.stringify=function(a){return a},j.prototype.parse=function(a){if(typeof a!="string")throw new Error("non-string passed to parse()");if(!this.data)throw new Error("Missing data on selection type extension.");var b=typeof this.data=="function"?this.data():this.data,c=!1,d,e=[];b.forEach(function(b){a==b?(d=this.fromString(b),c=!0):b.indexOf(a)===0&&e.push(this.fromString(b))},this);if(c)return new f(d);this.noMatch&&this.noMatch();if(e.length>0){var h="Possibilities"+(a.length===0?"":" for '"+a+"'");return new f(null,g.INCOMPLETE,h,e)}var h="Can't use '"+a+"'.";return new f(null,g.INVALID,h,e)},j.prototype.fromString=function(a){return a},j.prototype.decrement=function(a){var b=typeof this.data=="function"?this.data():this.data,c;if(a==null)c=b.length-1;else{var d=this.stringify(a),c=b.indexOf(d);c=c===0?b.length-1:c-1}return this.fromString(b[c])},j.prototype.increment=function(a){var b=typeof this.data=="function"?this.data():this.data,c;if(a==null)c=0;else{var d=this.stringify(a),c=b.indexOf(d);c=c===b.length-1?0:c+1}return this.fromString(b[c])},j.prototype.name="selection",b.SelectionType=j;var k=new j({name:"bool",data:["true","false"],stringify:function(a){return""+a},fromString:function(a){return a==="true"?!0:!1}});l.prototype=new e,l.prototype.stringify=function(a){return this.defer().stringify(a)},l.prototype.parse=function(a){return this.defer().parse(a)},l.prototype.decrement=function(a){var b=this.defer();return b.decrement?b.decrement(a):undefined},l.prototype.increment=function(a){var b=this.defer();return b.increment?b.increment(a):undefined},l.prototype.name="deferred",b.DeferredType=l,m.prototype=new e,m.prototype.stringify=function(a){return a.join(" ")},m.prototype.parse=function(a){return this.defer().parse(a)},m.prototype.name="array";var n=!1;b.startup=function(){if(n)return;n=!0,d.registerType(h),d.registerType(i),d.registerType(k),d.registerType(j),d.registerType(l),d.registerType(m)},b.shutdown=function(){n=!1,d.unregisterType(h),d.unregisterType(i),d.unregisterType(k),d.unregisterType(j),d.unregisterType(l),d.unregisterType(m)}}),define("pilot/types",["require","exports","module"],function(a,b,c){function e(a,b,c,e){this.value=a,this.status=b||d.VALID,this.message=c,this.predictions=e||[]}function f(){}function h(a,b){if(a.substr(-2)==="[]"){var c=a.slice(0,-2);return new g.array(c)}var d=g[a];return typeof d=="function"&&(d=new d(b)),d}var d={VALID:{toString:function(){return"VALID"},valueOf:function(){return 0}},INCOMPLETE:{toString:function(){return"INCOMPLETE"},valueOf:function(){return 1}},INVALID:{toString:function(){return"INVALID"},valueOf:function(){return 2}},combine:function(a){var b=d.VALID;for(var c=0;cb.valueOf()&&(b=a[c]);return b}};b.Status=d,b.Conversion=e,f.prototype={stringify:function(a){throw new Error("not implemented")},parse:function(a){throw new Error("not implemented")},name:undefined,increment:function(a){return undefined},decrement:function(a){return undefined},getDefault:function(){return this.parse("")}},b.Type=f;var g={};b.registerType=function(a){if(typeof a=="object"){if(!(a instanceof f))throw new Error("Can't registerType using: "+a);if(!a.name)throw new Error("All registered types must have a name");g[a.name]=a}else{if(typeof a!="function")throw new Error("Unknown type: "+a);if(!a.prototype.name)throw new Error("All registered types must have a name");g[a.prototype.name]=a}},b.registerTypes=function(a){Object.keys(a).forEach(function(c){var d=a[c];d.name=c,b.registerType(d)})},b.deregisterType=function(a){delete g[a.name]},b.getType=function(a){if(typeof a=="string")return h(a);if(typeof a=="object"){if(!a.name)throw new Error("Missing 'name' member to typeSpec");return h(a.name,a)}throw new Error("Can't extract type from "+a)}}),define("pilot/types/command",["require","exports","module","pilot/canon","pilot/types/basic","pilot/types"],function(a,b,c){var d=a("pilot/canon"),e=a("pilot/types/basic").SelectionType,f=a("pilot/types"),g=new e({name:"command",data:function(){return d.getCommandNames()},stringify:function(a){return a.name},fromString:function(a){return d.getCommand(a)}});b.startup=function(){f.registerType(g)},b.shutdown=function(){f.unregisterType(g)}}),define("pilot/canon",["require","exports","module","pilot/console","pilot/stacktrace","pilot/oop","pilot/useragent","pilot/keys","pilot/event_emitter","pilot/typecheck","pilot/catalog","pilot/types","pilot/lang"],function(a,b,c){function t(a,b,c,d){return(d&&a.toLowerCase()||a).replace(/(?:^\s+|\n|\s+$)/g,"").split(new RegExp("[\\s ]*"+b+"[\\s ]*","g"),c||999)}function u(a,b,c){var d,e=0,f=t(a,"\\-",null,!0),g=0,i=f.length;for(;gI)H.shiftObject();b._dispatchEvent("output",{requests:H,request:this})},J.prototype.doneWithError=function(a){this.error=!0,this.done(a)},J.prototype.async=function(){this.isAsync=!0,this._begunOutput||this._beginOutput()},J.prototype.output=function(a){return this._begunOutput||this._beginOutput(),typeof a!="string"&&!(a instanceof Node)&&(a=a.toString()),this.outputs.push(a),this.isDone=!0,this._dispatchEvent("output",{}),this},J.prototype.done=function(a){this.completed=!0,this.end=new Date,this.duration=this.end.getTime()-this.start.getTime(),a&&this.output(a),this.isDone||(this.isDone=!0,this._dispatchEvent("output",{}))},b.Request=J}),define("pilot/console",["require","exports","module"],function(a,b,c){var d=function(){},e=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","log","profile","profileEnd","time","timeEnd","trace","warn"];typeof window=="undefined"?e.forEach(function(a){b[a]=function(){var b=Array.prototype.slice.call(arguments),c={op:"log",method:a,args:b};postMessage(JSON.stringify(c))}}):e.forEach(function(a){window.console&&window.console[a]?b[a]=Function.prototype.bind.call(window.console[a],window.console):b[a]=d})}),define("pilot/stacktrace",["require","exports","module","pilot/useragent","pilot/console"],function(a,b,c){function g(a){for(var b=0;b\s*\(/gm,"{anonymous}()@").split("\n"):(e.log(a),[])},firefox:function(a){var b=a.stack;return b?(b=b.replace(/(?:\n@:0)?\s+$/m,""),b=b.replace(/^\(/gm,"{anonymous}("),b.split("\n")):(e.log(a),[])},opera:function(a){var b=a.message.split("\n"),c="{anonymous}",d=/Line\s+(\d+).*?script\s+(http\S+)(?:.*?in\s+function\s+(\S+))?/i,e,f,g;for(e=4,f=0,g=b.length;e=0,b.isIPad=e.indexOf("iPad")>=0,b.isTouchPad=e.indexOf("TouchPad")>=0,b.OS={LINUX:"LINUX",MAC:"MAC",WINDOWS:"WINDOWS"},b.getOS=function(){return b.isMac?b.OS.MAC:b.isLinux?b.OS.LINUX:b.OS.WINDOWS}}),define("pilot/oop",["require","exports","module"],function(a,b,c){b.inherits=function(){var a=function(){};return function(b,c){a.prototype=c.prototype,b.super_=c.prototype,b.prototype=new a,b.prototype.constructor=b}}(),b.mixin=function(a,b){for(var c in b)a[c]=b[c]},b.implement=function(a,c){b.mixin(a,c)}}),define("pilot/keys",["require","exports","module","pilot/oop"],function(a,b,c){var d=a("pilot/oop"),e=function(){var a={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,meta:8,command:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:'"'}};for(i in a.FUNCTION_KEYS){var b=a.FUNCTION_KEYS[i].toUpperCase();a[b]=parseInt(i,10)}return d.mixin(a,a.MODIFIER_KEYS),d.mixin(a,a.PRINTABLE_KEYS),d.mixin(a,a.FUNCTION_KEYS),a}();d.mixin(b,e),b.keyCodeToString=function(a){return(e[a]||String.fromCharCode(a)).toLowerCase()}}),define("pilot/event_emitter",["require","exports","module"],function(a,b,c){var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{},this._defaultHandlers=this._defaultHandlers||{};var c=this._eventRegistry[a]||[],d=this._defaultHandlers[a];if(!c.length&&!d)return;b=b||{},b.type=a,b.stopPropagation||(b.stopPropagation=function(){this.propagationStopped=!0}),b.preventDefault||(b.preventDefault=function(){this.defaultPrevented=!0});for(var e=0;e'+c.name+" = "+c.value+"
"})}else b.value===undefined?d=""+setting.name+" = "+setting.get():(b.setting.set(b.value),d="Setting: "+b.setting.name+" = "+b.setting.get());c.done(d)}},e={name:"unset",params:[{name:"setting",type:"setting",description:"The name of the setting to return to defaults"}],description:"unset a setting entirely",exec:function(a,b,c){var d=a.settings.get(b.setting);if(!d){c.doneWithError("No setting with the name "+b.setting+".");return}d.reset(),c.done("Reset "+d.name+" to default: "+a.settings.get(b.setting))}},f=a("pilot/canon");b.startup=function(a,b){f.addCommand(d),f.addCommand(e)},b.shutdown=function(a,b){f.removeCommand(d),f.removeCommand(e)}}),define("pilot/commands/basic",["require","exports","module","pilot/typecheck","pilot/canon"],function(require,exports,module){var checks=require("pilot/typecheck"),canon=require("pilot/canon"),helpCommandSpec={name:"help",params:[{name:"search",type:"text",description:"Search string to narrow the output.",defaultValue:null}],description:"Get help on the available commands.",exec:function(a,b,c){var d=[],e=canon.getCommand(b.search);if(e&&e.exec)d.push(e.description?e.description:"No description for "+b.search);else{var f=!1;e?(d.push("

Sub-Commands of "+e.name+"

"),d.push("

"+e.description+"

")):b.search?(b.search=="hidden"&&(b.search="",f=!0),d.push("

Commands starting with '"+b.search+"':

")):d.push("

Available Commands:

");var g=canon.getCommandNames();g.sort(),d.push("");for(var h=0;h"),d.push('"),d.push(""),d.push("")}d.push("
'+e.name+""+e.description+"
")}c.done(d.join(""))}},evalCommandSpec={name:"eval",params:[{name:"javascript",type:"text",description:"The JavaScript to evaluate"}],description:"evals given js code and show the result",hidden:!0,exec:function(env,args,request){var result,javascript=args.javascript;try{result=eval(javascript)}catch(e){result="Error: "+e.message+""}var msg="",type="",x;if(checks.isFunction(result))msg=(result+"").replace(/\n/g,"
").replace(/ /g," "),type="function";else if(checks.isObject(result)){Array.isArray(result)?type="array":type="object";var items=[],value;for(x in result)result.hasOwnProperty(x)&&(checks.isFunction(result[x])?value="[function]":checks.isObject(result[x])?value="[object]":value=result[x],items.push({name:x,value:value}));items.sort(function(a,b){return a.name.toLowerCase()"+items[x].name+": "+items[x].value+"
"}else msg=result,type=typeof result;request.done("Result for eval '"+javascript+"'"+" (type: "+type+"):

"+msg)}},canon=require("pilot/canon");exports.startup=function(a,b){canon.addCommand(helpCommandSpec),canon.addCommand(evalCommandSpec)},exports.shutdown=function(a,b){canon.removeCommand(helpCommandSpec),canon.removeCommand(evalCommandSpec)}}),define("pilot/settings/canon",["require","exports","module"],function(a,b,c){var d={name:"historyLength",description:"How many typed commands do we recall for reference?",type:"number",defaultValue:50};b.startup=function(a,b){a.env.settings.addSetting(d)},b.shutdown=function(a,b){a.env.settings.removeSetting(d)}}),define("pilot/plugin_manager",["require","exports","module","pilot/promise"],function(a,b,c){var d=a("pilot/promise").Promise;b.REASONS={APP_STARTUP:1,APP_SHUTDOWN:2,PLUGIN_ENABLE:3,PLUGIN_DISABLE:4,PLUGIN_INSTALL:5,PLUGIN_UNINSTALL:6,PLUGIN_UPGRADE:7,PLUGIN_DOWNGRADE:8},b.Plugin=function(a){this.name=a,this.status=this.INSTALLED},b.Plugin.prototype={NEW:0,INSTALLED:1,REGISTERED:2,STARTED:3,UNREGISTERED:4,SHUTDOWN:5,install:function(b,c){var e=new d;return this.status>this.NEW?(e.resolve(this),e):(a([this.name],function(a){a.install&&a.install(b,c),this.status=this.INSTALLED,e.resolve(this)}.bind(this)),e)},register:function(b,c){var e=new d;return this.status!=this.INSTALLED?(e.resolve(this),e):(a([this.name],function(a){a.register&&a.register(b,c),this.status=this.REGISTERED,e.resolve(this)}.bind(this)),e)},startup:function(c,e){e=e||b.REASONS.APP_STARTUP;var f=new d;return this.status!=this.REGISTERED?(f.resolve(this),f):(a([this.name],function(a){a.startup&&a.startup(c,e),this.status=this.STARTED,f.resolve(this)}.bind(this)),f)},shutdown:function(b,c){if(this.status!=this.STARTED)return;pluginModule=a(this.name),pluginModule.shutdown&&pluginModule.shutdown(b,c)}},b.PluginCatalog=function(){this.plugins={}},b.PluginCatalog.prototype={registerPlugins:function(a,c,e){var f=[];return a.forEach(function(a){var d=this.plugins[a];d===undefined&&(d=new b.Plugin(a),this.plugins[a]=d,f.push(d.register(c,e)))}.bind(this)),d.group(f)},startupPlugins:function(a,b){var c=[];for(var e in this.plugins){var f=this.plugins[e];c.push(f.startup(a,b))}return d.group(c)}},b.catalog=new b.PluginCatalog}),define("pilot/promise",["require","exports","module","pilot/console","pilot/stacktrace"],function(a,b,c){var d=a("pilot/console"),e=a("pilot/stacktrace").Trace,f=-1,g=0,h=1,i=0,j=!1,k=[],l=[];Promise=function(){this._status=g,this._value=undefined,this._onSuccessHandlers=[],this._onErrorHandlers=[],this._id=i++,k[this._id]=this},Promise.prototype.isPromise=!0,Promise.prototype.isComplete=function(){return this._status!=g},Promise.prototype.isResolved=function(){return this._status==h},Promise.prototype.isRejected=function(){return this._status==f},Promise.prototype.then=function(a,b){return typeof a=="function"&&(this._status===h?a.call(null,this._value):this._status===g&&this._onSuccessHandlers.push(a)),typeof b=="function"&&(this._status===f?b.call(null,this._value):this._status===g&&this._onErrorHandlers.push(b)),this},Promise.prototype.chainPromise=function(a){var b=new Promise;return b._chainedFrom=this,this.then(function(c){try{b.resolve(a(c))}catch(d){b.reject(d)}},function(a){b.reject(a)}),b},Promise.prototype.resolve=function(a){return this._complete(this._onSuccessHandlers,h,a,"resolve")},Promise.prototype.reject=function(a){return this._complete(this._onErrorHandlers,f,a,"reject")},Promise.prototype._complete=function(a,b,c,f){if(this._status!=g)return d.group("Promise already closed"),d.error("Attempted "+f+"() with ",c),d.error("Previous status = ",this._status,", previous value = ",this._value),d.trace(),this._completeTrace&&(d.error("Trace of previous completion:"),this._completeTrace.log(5)),d.groupEnd(),this;j&&(this._completeTrace=new e(new Error)),this._status=b,this._value=c,a.forEach(function(a){a.call(null,this._value)},this),this._onSuccessHandlers.length=0,this._onErrorHandlers.length=0,delete k[this._id],l.push(this);while(l.length>20)l.shift();return this},Promise.group=function(a){a instanceof Array||(a=Array.prototype.slice.call(arguments));if(a.length===0)return(new Promise).resolve([]);var b=new Promise,c=[],d=0,e=function(e){return function(g){c[e]=g,d++,b._status!==f&&d===a.length&&b.resolve(c)}};return a.forEach(function(a,c){var d=e(c),f=b.reject.bind(b);a.then(d,f)}),b},b.Promise=Promise,b._outstanding=k,b._recent=l}),define("pilot/dom",["require","exports","module"],function(a,b,c){var d="http://www.w3.org/1999/xhtml";b.createElement=function(a,b){return document.createElementNS?document.createElementNS(b||d,a):document.createElement(a)},b.setText=function(a,b){a.innerText!==undefined&&(a.innerText=b),a.textContent!==undefined&&(a.textContent=b)},document.documentElement.classList?(b.hasCssClass=function(a,b){return a.classList.contains(b)},b.addCssClass=function(a,b){a.classList.add(b)},b.removeCssClass=function(a,b){a.classList.remove(b)},b.toggleCssClass=function(a,b){return a.classList.toggle(b)}):(b.hasCssClass=function(a,b){var c=a.className.split(/\s+/g);return c.indexOf(b)!==-1},b.addCssClass=function(a,c){b.hasCssClass(a,c)||(a.className+=" "+c)},b.removeCssClass=function(a,b){var c=a.className.split(/\s+/g);for(;;){var d=c.indexOf(b);if(d==-1)break;c.splice(d,1)}a.className=c.join(" ")},b.toggleCssClass=function(a,b){var c=a.className.split(/\s+/g),d=!0;for(;;){var e=c.indexOf(b);if(e==-1)break;d=!1,c.splice(e,1)}return d&&c.push(b),a.className=c.join(" "),d}),b.setCssClass=function(a,c,d){d?b.addCssClass(a,c):b.removeCssClass(a,c)},b.importCssString=function(a,b){b=b||document;if(b.createStyleSheet){var c=b.createStyleSheet();c.cssText=a}else{var e=b.createElementNS?b.createElementNS(d,"style"):b.createElement("style");e.appendChild(b.createTextNode(a));var f=b.getElementsByTagName("head")[0]||b.documentElement;f.appendChild(e)}},b.getInnerWidth=function(a){return parseInt(b.computedStyle(a,"paddingLeft"))+parseInt(b.computedStyle(a,"paddingRight"))+a.clientWidth},b.getInnerHeight=function(a){return parseInt(b.computedStyle(a,"paddingTop"))+parseInt(b.computedStyle(a,"paddingBottom"))+a.clientHeight},window.pageYOffset!==undefined?(b.getPageScrollTop=function(){return window.pageYOffset},b.getPageScrollLeft=function(){return window.pageXOffset}):(b.getPageScrollTop=function(){return document.body.scrollTop},b.getPageScrollLeft=function(){return document.body.scrollLeft}),window.getComputedStyle?b.computedStyle=function(a,b){return b?(window.getComputedStyle(a,"")||{})[b]||"":window.getComputedStyle(a,"")||{}}:b.computedStyle=function(a,b){return b?a.currentStyle[b]:a.currentStyle},b.scrollbarWidth=function(){var a=b.createElement("p");a.style.width="100%",a.style.minWidth="0px",a.style.height="200px";var c=b.createElement("div"),d=c.style;d.position="absolute",d.left="-10000px",d.overflow="hidden",d.width="200px",d.minWidth="0px",d.height="150px",c.appendChild(a);var e=document.body||document.documentElement;e.appendChild(c);var f=a.offsetWidth;d.overflow="scroll";var g=a.offsetWidth;return f==g&&(g=c.clientWidth),e.removeChild(c),f-g},b.setInnerHtml=function(a,b){var c=a.cloneNode(!1);return c.innerHTML=b,a.parentNode.replaceChild(c,a),c},b.setInnerText=function(a,b){document.body&&"textContent"in document.body?a.textContent=b:a.innerText=b},b.getInnerText=function(a){return document.body&&"textContent"in document.body?a.textContent:a.innerText||a.textContent||""},b.getParentWindow=function(a){return a.defaultView||a.parentWindow},b.getSelectionStart=function(a){var b;try{b=a.selectionStart||0}catch(c){b=0}return b},b.setSelectionStart=function(a,b){return a.selectionStart=b},b.getSelectionEnd=function(a){var b;try{b=a.selectionEnd||0}catch(c){b=0}return b},b.setSelectionEnd=function(a,b){return a.selectionEnd=b}}),define("pilot/event",["require","exports","module","pilot/keys","pilot/useragent","pilot/dom"],function(a,b,c){function g(a,b,c){var f=0;e.isOpera&&e.isMac?f=0|(b.metaKey?1:0)|(b.altKey?2:0)|(b.shiftKey?4:0)|(b.ctrlKey?8:0):f=0|(b.ctrlKey?1:0)|(b.altKey?2:0)|(b.shiftKey?4:0)|(b.metaKey?8:0);if(c in d.MODIFIER_KEYS){switch(d.MODIFIER_KEYS[c]){case"Alt":f=2;break;case"Shift":f=4;break;case"Ctrl":f=1;break;default:f=8}c=0}return f&8&&(c==91||c==93)&&(c=0),f!=0||c in d.FUNCTION_KEYS?a(b,f,c):!1}var d=a("pilot/keys"),e=a("pilot/useragent"),f=a("pilot/dom");b.addListener=function(a,b,c){if(a.addEventListener)return a.addEventListener(b,c,!1);if(a.attachEvent){var d=function(){c(window.event)};c._wrapper=d,a.attachEvent("on"+b,d)}},b.removeListener=function(a,b,c){if(a.removeEventListener)return a.removeEventListener(b,c,!1);a.detachEvent&&a.detachEvent("on"+b,c._wrapper||c)},b.stopEvent=function(a){return b.stopPropagation(a),b.preventDefault(a),!1},b.stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},b.preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},b.getDocumentX=function(a){return a.clientX?a.clientX+f.getPageScrollLeft():a.pageX},b.getDocumentY=function(a){return a.clientY?a.clientY+f.getPageScrollTop():a.pageY},b.getButton=function(a){return a.type=="dblclick"?0:a.type=="contextmenu"?2:a.preventDefault?a.button:{1:0,2:2,4:1}[a.button]},document.documentElement.setCapture?b.capture=function(a,c,d){function e(a){return c(a),b.stopPropagation(a)}function g(e){c(e),f||(f=!0,d()),b.removeListener(a,"mousemove",c),b.removeListener(a,"mouseup",g),b.removeListener(a,"losecapture",g),a.releaseCapture()}var f=!1;b.addListener(a,"mousemove",c),b.addListener(a,"mouseup",g),b.addListener(a,"losecapture",g),a.setCapture()}:b.capture=function(a,b,c){function d(a){b(a),a.stopPropagation()}function e(a){b&&b(a),c&&c(),document.removeEventListener("mousemove",d,!0),document.removeEventListener("mouseup",e,!0),a.stopPropagation()}document.addEventListener("mousemove",d,!0),document.addEventListener("mouseup",e,!0)},b.addMouseWheelListener=function(a,c){var d=0,e=function(a){a.wheelDelta!==undefined?(Math.abs(a.wheelDeltaY)>d&&(d=Math.abs(a.wheelDeltaY)),d>5e3?factor=400:factor=8,a.wheelDeltaX!==undefined?(a.wheelX=-a.wheelDeltaX/factor,a.wheelY=-a.wheelDeltaY/factor):(a.wheelX=0,a.wheelY=-a.wheelDelta/factor)):a.axis&&a.axis==a.HORIZONTAL_AXIS?(a.wheelX=(a.detail||0)*5,a.wheelY=0):(a.wheelX=0,a.wheelY=(a.detail||0)*5),c(a)};b.addListener(a,"DOMMouseScroll",e),b.addListener(a,"mousewheel",e)},b.addMultiMouseDownListener=function(a,c,d,f,g){var h=0,i,j,k=function(a){h+=1,h==1&&(i=a.clientX,j=a.clientY,setTimeout(function(){h=0},f||600));var e=b.getButton(a)==c;if(!e||Math.abs(a.clientX-i)>5||Math.abs(a.clientY-j)>5)h=0;h==d&&(h=0,g(a));if(e)return b.preventDefault(a)};b.addListener(a,"mousedown",k),e.isOldIE&&b.addListener(a,"dblclick",k)},b.addCommandKeyListener=function(a,c){var d=b.addListener;if(e.isOldGecko){var f=null;d(a,"keydown",function(a){f=a.keyCode}),d(a,"keypress",function(a){return g(c,a,f)})}else{var h=null;d(a,"keydown",function(a){return h=a.keyIdentifier||a.keyCode,g(c,a,a.keyCode)}),e.isMac&&e.isOpera&&d(a,"keypress",function(a){var b=a.keyIdentifier||a.keyCode;if(h!==b)return g(c,a,h);h=null})}}}),define("ace/editor",["require","exports","module","pilot/fixoldbrowsers","pilot/oop","pilot/event","pilot/lang","pilot/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","pilot/event_emitter"],function(a,b,c){a("pilot/fixoldbrowsers");var d=a("pilot/oop"),e=a("pilot/event"),f=a("pilot/lang"),g=a("pilot/useragent"),h=a("ace/keyboard/textinput").TextInput,i=a("ace/mouse/mouse_handler").MouseHandler,j=a("ace/keyboard/keybinding").KeyBinding,k=a("ace/edit_session").EditSession,l=a("ace/search").Search,m=a("ace/range").Range,n=a("pilot/event_emitter").EventEmitter,o=function(a,b){var c=a.getContainerElement();this.container=c,this.renderer=a,this.textInput=new h(a.getTextAreaContainer(),this),this.keyBinding=new j(this),g.isIPad||(this.$mouseHandler=new i(this)),this.$blockScrolling=0,this.$search=(new l).set({wrap:!0}),this.setSession(b||new k(""))};(function(){d.implement(this,n),this.$forwardEvents={gutterclick:1,gutterdblclick:1},this.$originalAddEventListener=this.addEventListener,this.$originalRemoveEventListener=this.removeEventListener,this.addEventListener=function(a,b){return this.$forwardEvents[a]?this.renderer.addEventListener(a,b):this.$originalAddEventListener(a,b)},this.removeEventListener=function(a,b){return this.$forwardEvents[a]?this.renderer.removeEventListener(a,b):this.$originalRemoveEventListener(a,b)},this.setKeyboardHandler=function(a){this.keyBinding.setKeyboardHandler(a)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(a){if(this.session==a)return;if(this.session){var b=this.session;this.session.removeEventListener("change",this.$onDocumentChange),this.session.removeEventListener("changeMode",this.$onChangeMode),this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.session.removeEventListener("changeTabSize",this.$onChangeTabSize),this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode),this.session.removeEventListener("onChangeFold",this.$onChangeFold),this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker),this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation),this.session.removeEventListener("changeOverwrite",this.$onCursorChange);var c=this.session.getSelection();c.removeEventListener("changeCursor",this.$onCursorChange),c.removeEventListener("changeSelection",this.$onSelectionChange),this.session.setScrollTopRow(this.renderer.getScrollTopRow())}this.session=a,this.$onDocumentChange=this.onDocumentChange.bind(this),a.addEventListener("change",this.$onDocumentChange),this.renderer.setSession(a),this.$onChangeMode=this.onChangeMode.bind(this),a.addEventListener("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),a.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.updateText.bind(this.renderer),a.addEventListener("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),a.addEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),a.addEventListener("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),a.addEventListener("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener("changeOverwrite",this.$onCursorChange),this.selection=a.getSelection(),this.selection.addEventListener("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.scrollToRow(a.getScrollTopRow()),this.renderer.updateFull(),this._dispatchEvent("changeSession",{session:a,oldSession:b})},this.getSession=function(){return this.session},this.getSelection=function(){return this.selection},this.resize=function(){this.renderer.onResize()},this.setTheme=function(a){this.renderer.setTheme(a)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(a){this.renderer.setStyle(a)},this.unsetStyle=function(a){this.renderer.unsetStyle(a)},this.setFontSize=function(a){this.container.style.fontSize=a},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var a=this;this.$highlightPending=!0,setTimeout(function(){a.$highlightPending=!1;var b=a.session.findMatchingBracket(a.getCursorPosition());if(b){var c=new m(b.row,b.column,b.row,b.column+1);a.session.$bracketHighlight=a.session.addMarker(c,"ace_bracket","text")}},10)},this.focus=function(){var a=this;setTimeout(function(){a.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){this.renderer.showCursor(),this.renderer.visualizeFocus(),this._dispatchEvent("focus")},this.onBlur=function(){this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._dispatchEvent("blur")},this.onDocumentChange=function(a){var b=a.data,c=b.range;if(c.start.row==c.end.row&&b.action!="insertLines"&&b.action!="removeLines")var d=c.end.row;else d=Infinity;this.renderer.updateLines(c.start.row,d),this._dispatchEvent("change",a),this.renderer.updateCursor()},this.onTokenizerUpdate=function(a){var b=a.data;this.renderer.updateLines(b.first,b.last)},this.onCursorChange=function(a){this.renderer.updateCursor(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.renderer.moveTextAreaToCursor(this.textInput.getElement()),this.$highlightBrackets(),this.$updateHighlightActiveLine()},this.$updateHighlightActiveLine=function(){var a=this.getSession();a.$highlightLineMarker&&a.removeMarker(a.$highlightLineMarker),a.$highlightLineMarker=null;if(this.getHighlightActiveLine()&&(this.getSelectionStyle()!="line"||!this.selection.isMultiLine())){var b=this.getCursorPosition(),c=this.session.getFoldLine(b.row),d;c?d=new m(c.start.row,0,c.end.row+1,0):d=new m(b.row,0,b.row+1,0),a.$highlightLineMarker=a.addMarker(d,"ace_active_line","background")}},this.onSelectionChange=function(a){var b=this.getSession();b.$selectionMarker&&b.removeMarker(b.$selectionMarker),b.$selectionMarker=null;if(!this.selection.isEmpty()){var c=this.selection.getRange(),d=this.getSelectionStyle();b.$selectionMarker=b.addMarker(c,"ace_selection",d)}else this.$updateHighlightActiveLine();this.$highlightSelectedWord&&this.session.getMode().highlightSelection(this)},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.setBreakpoints(this.session.getBreakpoints())},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(){this.renderer.updateText()},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getCopyText=function(){var a="";return this.selection.isEmpty()||(a=this.session.getTextRange(this.getSelectionRange())),this._emit("copy",a),a},this.onCut=function(){if(this.$readOnly)return;var a=this.getSelectionRange();this._emit("cut",a),this.selection.isEmpty()||(this.session.remove(a),this.clearSelection())},this.insert=function(a){if(this.$readOnly)return;var b=this.session,c=b.getMode(),d=this.getCursorPosition();if(this.getBehavioursEnabled()){var e=c.transformAction(b.getState(d.row),"insertion",this,b,a);e&&(a=e.text)}a=a.replace("\t",this.session.getTabString());if(!this.selection.isEmpty()){var d=this.session.remove(this.getSelectionRange());this.clearSelection()}else if(this.session.getOverwrite()){var f=new m.fromPoints(d,d);f.end.column+=a.length,this.session.remove(f)}this.clearSelection();var g=d.column,h=b.getState(d.row),i=c.checkOutdent(h,b.getLine(d.row),a),j=b.getLine(d.row),k=c.getNextLineIndent(h,j.slice(0,d.column),b.getTabString()),l=b.insert(d,a);e&&e.selection&&(e.selection.length==2?this.selection.setSelectionRange(new m(d.row,g+e.selection[0],d.row,g+e.selection[1])):this.selection.setSelectionRange(new m(d.row+e.selection[0],e.selection[1],d.row+e.selection[2],e.selection[3])));var h=b.getState(d.row);if(b.getDocument().isNewLine(a)){this.moveCursorTo(d.row+1,0);var n=b.getTabSize(),o=Number.MAX_VALUE;for(var p=d.row+1;p<=l.row;++p){var q=0;j=b.getLine(p);for(var r=0;r0;++r)j.charAt(r)=="\t"?s-=n:j.charAt(r)==" "&&(s-=1);b.remove(new m(p,0,p,r))}b.indentRows(d.row+1,l.row,k)}i&&c.autoOutdent(h,b,d.row)},this.onTextInput=function(a,b){b||this._emit("paste",a);if(b&&a.length==1){var c=this.keyBinding.onCommandKey({},0,null,a);c||this.insert(a)}else this.keyBinding.onTextInput(a)},this.onCommandKey=function(a,b,c){this.keyBinding.onCommandKey(a,b,c)},this.setOverwrite=function(a){this.session.setOverwrite(a)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(a){this.$mouseHandler.setScrollSpeed(a)},this.getScrollSpeed=function(){return this.$mouseHandler.getScrollSpeed()},this.$selectionStyle="line",this.setSelectionStyle=function(a){if(this.$selectionStyle==a)return;this.$selectionStyle=a,this.onSelectionChange(),this._dispatchEvent("changeSelectionStyle",{data:a})},this.getSelectionStyle=function(){return this.$selectionStyle},this.$highlightActiveLine=!0,this.setHighlightActiveLine=function(a){if(this.$highlightActiveLine==a)return;this.$highlightActiveLine=a,this.$updateHighlightActiveLine()},this.getHighlightActiveLine=function(){return this.$highlightActiveLine},this.$highlightSelectedWord=!0,this.setHighlightSelectedWord=function(a){if(this.$highlightSelectedWord==a)return;this.$highlightSelectedWord=a,a?this.session.getMode().highlightSelection(this):this.session.getMode().clearSelectionHighlight(this)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setShowInvisibles=function(a){if(this.getShowInvisibles()==a)return;this.renderer.setShowInvisibles(a)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setShowPrintMargin=function(a){this.renderer.setShowPrintMargin(a)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(a){this.renderer.setPrintMarginColumn(a)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.$readOnly=!1,this.setReadOnly=function(a){this.$readOnly=a},this.getReadOnly=function(){return this.$readOnly},this.$modeBehaviours=!0,this.setBehavioursEnabled=function(a){this.$modeBehaviours=a},this.getBehavioursEnabled=function(){return this.$modeBehaviours},this.remove=function(a){if(this.$readOnly)return;this.selection.isEmpty()&&(a=="left"?this.selection.selectLeft():this.selection.selectRight());var b=this.getSelectionRange();if(this.getBehavioursEnabled()){var c=this.session,d=c.getState(b.start.row),e=c.getMode().transformAction(d,"deletion",this,c,b);e&&(b=e)}this.session.remove(b),this.clearSelection()},this.removeWordRight=function(){if(this.$readOnly)return;this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){if(this.$readOnly)return;this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){if(this.$readOnly)return;this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){if(this.$readOnly)return;this.selection.isEmpty()&&this.selection.selectLineEnd();var a=this.getSelectionRange();a.start.column==a.end.column&&a.start.row==a.end.row&&(a.end.column=0,a.end.row++),this.session.remove(a),this.clearSelection()},this.splitLine=function(){if(this.$readOnly)return;this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var a=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(a)},this.transposeLetters=function(){if(this.$readOnly)return;if(!this.selection.isEmpty())return;var a=this.getCursorPosition(),b=a.column;if(b===0)return;var c=this.session.getLine(a.row),d,e;b=this.getFirstVisibleRow()&&a<=this.getLastVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$getPageDownRow=function(){return this.renderer.getScrollBottomRow()},this.$getPageUpRow=function(){var a=this.renderer.getScrollTopRow(),b=this.renderer.getScrollBottomRow();return a-(b-a)},this.selectPageDown=function(){var a=this.$getPageDownRow()+Math.floor(this.$getVisibleRowCount()/2);this.scrollPageDown();var b=this.getSelection(),c=this.session.documentToScreenPosition(b.getSelectionLead()),d=this.session.screenToDocumentPosition(a,c.column);b.selectTo(d.row,d.column)},this.selectPageUp=function(){var a=this.renderer.getScrollTopRow()-this.renderer.getScrollBottomRow(),b=this.$getPageUpRow()+Math.round(a/2);this.scrollPageUp();var c=this.getSelection(),d=this.session.documentToScreenPosition(c.getSelectionLead()),e=this.session.screenToDocumentPosition(b,d.column);c.selectTo(e.row,e.column)},this.gotoPageDown=function(){var a=this.$getPageDownRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.gotoPageUp=function(){var a=this.$getPageUpRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.scrollPageDown=function(){this.scrollToRow(this.$getPageDownRow())},this.scrollPageUp=function(){this.renderer.scrollToRow(this.$getPageUpRow())},this.scrollToRow=function(a){this.renderer.scrollToRow(a)},this.scrollToLine=function(a,b){this.renderer.scrollToLine(a,b)},this.centerSelection=function(){var a=this.getSelectionRange(),b=Math.floor(a.start.row+(a.end.row-a.start.row)/2);this.renderer.scrollToLine(b,!0)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(a,b){this.selection.moveCursorTo(a,b)},this.moveCursorToPosition=function(a){this.selection.moveCursorToPosition(a)},this.gotoLine=function(a,b){this.selection.clearSelection(),this.$blockScrolling+=1,this.moveCursorTo(a-1,b||0),this.$blockScrolling-=1,this.isRowVisible(this.getCursorPosition().row)||this.scrollToLine(a,!0)},this.navigateTo=function(a,b){this.clearSelection(),this.moveCursorTo(a,b)},this.navigateUp=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(-a,0)},this.navigateDown=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(a,0)},this.navigateLeft=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().start;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorLeft()}this.clearSelection()},this.navigateRight=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().end;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorRight()}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){this.selection.moveCursorFileEnd(),this.clearSelection()},this.navigateFileStart=function(){this.selection.moveCursorFileStart(),this.clearSelection()},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(a,b){b&&this.$search.set(b);var c=this.$search.find(this.session);if(!c)return;this.$tryReplace(c,a),c!==null&&this.selection.setSelectionRange(c)},this.replaceAll=function(a,b){b&&this.$search.set(b);var c=this.$search.findAll(this.session);if(!c.length)return;var d=this.getSelectionRange();this.clearSelection(),this.selection.moveCursorTo(0,0),this.$blockScrolling+=1;for(var e=c.length-1;e>=0;--e)this.$tryReplace(c[e],a);this.selection.setSelectionRange(d),this.$blockScrolling-=1},this.$tryReplace=function(a,b){var c=this.session.getTextRange(a);return b=this.$search.replace(c,b),b!==null?(a.end=this.session.replace(a,b),a):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(a,b){this.clearSelection(),b=b||{},b.needle=a,this.$search.set(b),this.$find()},this.findNext=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!1),this.$search.set(a),this.$find()},this.findPrevious=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!0),this.$search.set(a),this.$find()},this.$find=function(a){this.selection.isEmpty()||this.$search.set({needle:this.session.getTextRange(this.getSelectionRange())}),typeof a!="undefined"&&this.$search.set({backwards:a});var b=this.$search.find(this.session);b&&(this.gotoLine(b.end.row+1,b.end.column),this.selection.setSelectionRange(b))},this.undo=function(){this.session.getUndoManager().undo()},this.redo=function(){this.session.getUndoManager().redo()},this.destroy=function(){this.renderer.destroy()}}).call(o.prototype),b.Editor=o}),define("ace/keyboard/textinput",["require","exports","module","pilot/event","pilot/useragent","pilot/dom"],function(a,b,c){var d=a("pilot/event"),e=a("pilot/useragent"),f=a("pilot/dom"),g=function(a,b){function l(){try{c.select()}catch(a){}}function m(a){if(!i){var d=a||c.value;if(d){d.charCodeAt(d.length-1)==g.charCodeAt(0)?(d=d.slice(0,-1),d&&b.onTextInput(d,!j)):b.onTextInput(d,!j);if(!v())return!1}}i=!1,j=!1,c.value=g,l()}function v(){return document.activeElement===c}var c=f.createElement("textarea");e.isTouchPad&&c.setAttribute("x-palm-disable-auto-cap",!0),c.style.left="-10000px",a.appendChild(c);var g=String.fromCharCode(0);m();var h=!1,i=!1,j=!1,k="",n=function(a){setTimeout(function(){h||m(a.data)},0)},o=function(a){if(e.isOldIE&&c.value.charCodeAt(0)>128)return;setTimeout(function(){h||m()},0)},p=function(a){h=!0,b.onCompositionStart(),e.isGecko||setTimeout(q,0)},q=function(){if(!h)return;b.onCompositionUpdate(c.value)},r=function(a){h=!1,b.onCompositionEnd()},s=function(a){i=!0;var d=b.getCopyText();d?c.value=d:a.preventDefault(),l(),setTimeout(function(){m()},0)},t=function(a){i=!0;var d=b.getCopyText();d?(c.value=d,b.onCut()):a.preventDefault(),l(),setTimeout(function(){m()},0)};d.addCommandKeyListener(c,b.onCommandKey.bind(b));if(e.isOldIE){var u={13:1,27:1};d.addListener(c,"keyup",function(a){h&&(!c.value||u[a.keyCode])&&setTimeout(r,0);if((c.value.charCodeAt(0)|0)<129)return;h?q():p()})}"onpropertychange"in c&&!("oninput"in c)?d.addListener(c,"propertychange",o):d.addListener(c,"input",n),d.addListener(c,"paste",function(a){j=!0,a.clipboardData&&a.clipboardData.getData?(m(a.clipboardData.getData("text/plain")),a.preventDefault()):o()}),"onbeforecopy"in c&&typeof clipboardData!="undefined"?(d.addListener(c,"beforecopy",function(a){var c=b.getCopyText();c?clipboardData.setData("Text",c):a.preventDefault()}),d.addListener(a,"keydown",function(a){if(a.ctrlKey&&a.keyCode==88){var c=b.getCopyText();c&&(clipboardData.setData("Text",c),b.onCut()),d.preventDefault(a)}})):(d.addListener(c,"copy",s),d.addListener(c,"cut",t)),d.addListener(c,"compositionstart",p),e.isGecko&&d.addListener(c,"text",q),e.isWebKit&&d.addListener(c,"keyup",q),d.addListener(c,"compositionend",r),d.addListener(c,"blur",function(){b.onBlur()}),d.addListener(c,"focus",function(){b.onFocus(),l()}),this.focus=function(){b.onFocus(),l(),c.focus()},this.blur=function(){c.blur()},this.isFocused=v,this.getElement=function(){return c},this.onContextMenu=function(a,b){a&&(k||(k=c.style.cssText),c.style.cssText="position:fixed; z-index:1000;left:"+(a.x-2)+"px; top:"+(a.y-2)+"px;"),b&&(c.value="")},this.onContextMenuClose=function(){setTimeout(function(){k&&(c.style.cssText=k,k=""),m()},0)}};b.TextInput=g}),define("ace/mouse/mouse_handler",["require","exports","module","pilot/event","ace/mouse/default_handlers","ace/mouse/mouse_event"],function(a,b,c){var d=a("pilot/event"),e=a("ace/mouse/default_handlers").DefaultHandlers,f=a("ace/mouse/mouse_event").MouseEvent,g=function(a){this.editor=a,this.defaultHandlers=new e(a),d.addListener(a.container,"mousedown",function(b){return a.focus(),d.preventDefault(b)}),d.addListener(a.container,"selectstart",function(a){return d.preventDefault(a)});var b=a.renderer.getMouseEventTarget();d.addListener(b,"mousedown",this.onMouseDown.bind(this)),d.addListener(b,"mousemove",this.onMouseMove.bind(this)),d.addMultiMouseDownListener(b,0,2,500,this.onMouseDoubleClick.bind(this)),d.addMultiMouseDownListener(b,0,3,600,this.onMouseTripleClick.bind(this)),d.addMultiMouseDownListener(b,0,4,600,this.onMouseQuadClick.bind(this)),d.addMouseWheelListener(a.container,this.onMouseWheel.bind(this))};(function(){this.$scrollSpeed=1,this.setScrollSpeed=function(a){this.$scrollSpeed=a},this.getScrollSpeed=function(){return this.$scrollSpeed},this.onMouseDown=function(a){this.editor._dispatchEvent("mousedown",new f(a,this.editor))},this.onMouseMove=function(a){var b=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!b||!b.length)return;this.editor._dispatchEvent("mousemove",new f(a,this.editor))},this.onMouseDoubleClick=function(a){this.editor._dispatchEvent("dblclick",new f(a,this.editor))},this.onMouseTripleClick=function(a){this.editor._dispatchEvent("tripleclick",new f(a,this.editor))},this.onMouseQuadClick=function(a){this.editor._dispatchEvent("quadclick",new f(a,this.editor))},this.onMouseWheel=function(a){var b=new f(a,this.editor);b.speed=this.$scrollSpeed*2,b.wheelX=a.wheelX,b.wheelY=a.wheelY,this.editor._dispatchEvent("mousewheel",b)}}).call(g.prototype),b.MouseHandler=g}),define("ace/mouse/default_handlers",["require","exports","module","pilot/event","pilot/dom","pilot/event_emitter","pilot/browser_focus"],function(a,b,c){function m(a){this.editor=a,this.$clickSelection=null,this.browserFocus=new g,a.setDefaultHandler("mousedown",this.onMouseDown.bind(this)),a.setDefaultHandler("dblclick",this.onDoubleClick.bind(this)),a.setDefaultHandler("tripleclick",this.onTripleClick.bind(this)),a.setDefaultHandler("quadclick",this.onQuadClick.bind(this)),a.setDefaultHandler("mousewheel",this.onScroll.bind(this))}function n(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))}var d=a("pilot/event"),e=a("pilot/dom"),f=a("pilot/event_emitter").EventEmitter,g=a("pilot/browser_focus").BrowserFocus,h=0,i=1,j=2,k=250,l=5;(function(){this.onMouseDown=function(a){function E(b){a.getShiftKey()?m.selection.selectToPosition(b):o.$clickSelection||(m.moveCursorToPosition(b),m.selection.clearSelection(b.row,b.column)),r=i}var b=a.inSelection(),c=a.pageX,f=a.pageY,g=a.getDocumentPosition(),m=this.editor,o=this,p=m.getSelectionRange(),q=p.isEmpty(),r=h;if(b&&(!this.browserFocus.isFocused()||(new Date).getTime()-this.browserFocus.lastFocus<20||!m.isFocused())){m.focus();return}var s=a.getButton();if(s!==0){q&&m.moveCursorToPosition(g),s==2&&(m.textInput.onContextMenu({x:c,y:f},q),d.capture(m.container,function(){},m.textInput.onContextMenuClose));return}var t=m.session.getFoldAt(g.row,g.column,1);if(t){m.selection.setSelectionRange(t.range);return}b||E(g);var u=c,v=f,w=m.getOverwrite(),x=(new Date).getTime(),y,z,A=function(a){u=d.getDocumentX(a),v=d.getDocumentY(a)},B=function(){clearInterval(H),r==h?E(g):r==j&&C(),o.$clickSelection=null,r=h},C=function(){e.removeCssClass(m.container,"ace_dragging"),m.session.removeMarker(dragSelectionMarker),m.$mouseHandler.$clickSelection||y||(m.moveCursorToPosition(g),m.selection.clearSelection(g.row,g.column));if(!y)return;if(z.contains(y.row,y.column)){y=null;return}m.clearSelection();var a=m.moveText(z,y);if(!a){y=null;return}m.selection.setSelectionRange(a)},D=function(){if(r==h){var a=n(c,f,u,v),b=(new Date).getTime();if(a>l){r=i;var d=m.renderer.screenToTextCoordinates(u,v);d.row=Math.max(0,Math.min(d.row,m.session.getLength()-1)),E(d)}else if(b-x>k){r=j,z=m.getSelectionRange();var g=m.getSelectionStyle();dragSelectionMarker=m.session.addMarker(z,"ace_selection",g),m.clearSelection(),e.addCssClass(m.container,"ace_dragging")}}r==j?G():r==i&&F()},F=function(){var a,b=m.renderer.screenToTextCoordinates(u,v);b.row=Math.max(0,Math.min(b.row,m.session.getLength()-1)),o.$clickSelection?o.$clickSelection.contains(b.row,b.column)?m.selection.setSelectionRange(o.$clickSelection):(o.$clickSelection.compare(b.row,b.column)==-1?a=o.$clickSelection.end:a=o.$clickSelection.start,m.selection.setSelectionAnchor(a.row,a.column),m.selection.selectToPosition(b)):m.selection.selectToPosition(b),m.renderer.scrollCursorIntoView()},G=function(){y=m.renderer.screenToTextCoordinates(u,v),y.row=Math.max(0,Math.min(y.row,m.session.getLength()-1)),m.moveCursorToPosition(y)};d.capture(m.container,A,B);var H=setInterval(D,20);return a.preventDefault()},this.onDoubleClick=function(a){var b=a.getDocumentPosition(),c=this.editor,d=c.session.getFoldAt(b.row,b.column,1);d?c.session.expandFold(d):(c.moveCursorToPosition(b),c.selection.selectWord(),this.$clickSelection=c.getSelectionRange())},this.onTripleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;c.moveCursorToPosition(b),c.selection.selectLine(),this.$clickSelection=c.getSelectionRange()},this.onQuadClick=function(a){var b=this.editor;b.selectAll(),this.$clickSelection=b.getSelectionRange()},this.onScroll=function(a){var b=this.editor;b.renderer.scrollBy(a.wheelX*a.speed,a.wheelY*a.speed);if(b.renderer.isScrollableBy(a.wheelX*a.speed,a.wheelY*a.speed))return a.preventDefault()}}).call(m.prototype),b.DefaultHandlers=m}),define("pilot/browser_focus",["require","exports","module","pilot/oop","pilot/event","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event"),f=a("pilot/event_emitter").EventEmitter,g=function(a){a=a||window,this.lastFocus=(new Date).getTime(),this._isFocused=!0;var b=this;"onfocusin"in a.document?(e.addListener(a.document,"focusin",function(a){b._setFocused(!0)}),e.addListener(a.document,"focusout",function(a){b._setFocused(!!a.toElement)})):(e.addListener(a,"blur",function(a){b._setFocused(!1)}),e.addListener(a,"focus",function(a){b._setFocused(!0)}))};(function(){d.implement(this,f),this.isFocused=function(){return this._isFocused},this._setFocused=function(a){if(this._isFocused==a)return;a&&(this.lastFocus=(new Date).getTime()),this._isFocused=a,this._emit("changeFocus")}}).call(g.prototype),b.BrowserFocus=g}),define("ace/mouse/mouse_event",["require","exports","module","pilot/event","pilot/dom"],function(a,b,c){var d=a("pilot/event"),e=a("pilot/dom"),f=b.MouseEvent=function(a,b){this.domEvent=a,this.editor=b,this.pageX=d.getDocumentX(a),this.pageY=d.getDocumentY(a),this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){d.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){d.preventDefault(this.domEvent),this.defaultPrevented=!0},this.getDocumentPosition=function(){if(this.$pos)return this.$pos;var a=d.getDocumentX(this.domEvent),b=d.getDocumentY(this.domEvent);return this.$pos=this.editor.renderer.screenToTextCoordinates(a,b),this.$pos.row=Math.max(0,Math.min(this.$pos.row,this.editor.session.getLength()-1)),this.$pos},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var a=this.editor;if(a.getReadOnly())this.$inSelection=!1;else{var b=a.getSelectionRange();if(b.isEmpty())this.$inSelection=!1;else{var c=this.getDocumentPosition();this.$inSelection=b.contains(c.row,c.column)}}return this.$inSelection},this.getButton=function(){return d.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey}}).call(f.prototype)}),define("ace/keyboard/keybinding",["require","exports","module","pilot/useragent","pilot/keys","pilot/event","pilot/settings","pilot/canon","ace/commands/default_commands"],function(a,b,c){var d=a("pilot/useragent"),e=a("pilot/keys"),f=a("pilot/event"),g=a("pilot/settings").settings,h=a("pilot/canon");a("ace/commands/default_commands");var i=function(a){this.$editor=a,this.$data={},this.$keyboardHandler=null};(function(){this.setKeyboardHandler=function(a){this.$keyboardHandler!=a&&(this.$data={},this.$keyboardHandler=a)},this.getKeyboardHandler=function(){return this.$keyboardHandler},this.$callKeyboardHandler=function(a,b,c,d){var e={editor:this.$editor},g;this.$keyboardHandler&&(g=this.$keyboardHandler.handleKeyboard(this.$data,b,c,d,a));if(!g||!g.command)b!=0||d!=0?g={command:h.findKeyCommand(e,"editor",b,c)}:g={command:"inserttext",args:{text:c}};var i=!1;return g&&(i=h.exec(g.command,e,"editor",g.args),i&&f.stopEvent(a)),i},this.onCommandKey=function(a,b,c,d){return d||(d=e.keyCodeToString(c)),this.$callKeyboardHandler(a,b,d,c)},this.onTextInput=function(a){return this.$callKeyboardHandler({},0,a,0)}}).call(i.prototype),b.KeyBinding=i}),define("ace/commands/default_commands",["require","exports","module","pilot/lang","pilot/canon"],function(a,b,c){function f(a,b){return{win:a,mac:b,sender:"editor"}}var d=a("pilot/lang"),e=a("pilot/canon");e.addCommand({name:"null",exec:function(a,b,c){}}),e.addCommand({name:"selectall",bindKey:f("Ctrl-A","Command-A"),exec:function(a,b,c){a.editor.selectAll()}}),e.addCommand({name:"removeline",bindKey:f("Ctrl-D","Command-D"),exec:function(a,b,c){a.editor.removeLines()}}),e.addCommand({name:"gotoline",bindKey:f("Ctrl-L","Command-L"),exec:function(a,b,c){var d=parseInt(prompt("Enter line number:"));isNaN(d)||a.editor.gotoLine(d)}}),e.addCommand({name:"togglecomment",bindKey:f("Ctrl-7","Command-7"),exec:function(a,b,c){a.editor.toggleCommentLines()}}),e.addCommand({name:"findnext",bindKey:f("Ctrl-K","Command-G"),exec:function(a,b,c){a.editor.findNext()}}),e.addCommand({name:"findprevious",bindKey:f("Ctrl-Shift-K","Command-Shift-G"),exec:function(a,b,c){a.editor.findPrevious()}}),e.addCommand({name:"find",bindKey:f("Ctrl-F","Command-F"),exec:function(a,b,c){var d=prompt("Find:",a.editor.getCopyText());a.editor.find(d)}}),e.addCommand({name:"replace",bindKey:f("Ctrl-R","Command-Option-F"),exec:function(a,b,c){var d=prompt("Find:",a.editor.getCopyText());if(!d)return;var e=prompt("Replacement:");if(!e)return;a.editor.replace(e,{needle:d})}}),e.addCommand({name:"replaceall",bindKey:f("Ctrl-Shift-R","Command-Shift-Option-F"),exec:function(a,b,c){var d=prompt("Find:");if(!d)return;var e=prompt("Replacement:");if(!e)return;a.editor.replaceAll(e,{needle:d})}}),e.addCommand({name:"undo",bindKey:f("Ctrl-Z","Command-Z"),exec:function(a,b,c){a.editor.undo()}}),e.addCommand({name:"redo",bindKey:f("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(a,b,c){a.editor.redo()}}),e.addCommand({name:"overwrite",bindKey:f("Insert","Insert"),exec:function(a,b,c){a.editor.toggleOverwrite()}}),e.addCommand({name:"copylinesup",bindKey:f("Ctrl-Alt-Up","Command-Option-Up"),exec:function(a,b,c){a.editor.copyLinesUp()}}),e.addCommand({name:"movelinesup",bindKey:f("Alt-Up","Option-Up"),exec:function(a,b,c){a.editor.moveLinesUp()}}),e.addCommand({name:"selecttostart",bindKey:f("Ctrl-Shift-Home|Alt-Shift-Up","Command-Shift-Up"),exec:function(a,b,c){a.editor.getSelection().selectFileStart()}}),e.addCommand({name:"gotostart",bindKey:f("Ctrl-Home|Ctrl-Up","Command-Home|Command-Up"),exec:function(a,b,c){a.editor.navigateFileStart()}}),e.addCommand({name:"selectup",bindKey:f("Shift-Up","Shift-Up"),exec:function(a,b,c){a.editor.getSelection().selectUp()}}),e.addCommand({name:"golineup",bindKey:f("Up","Up|Ctrl-P"),exec:function(a,b,c){a.editor.navigateUp(b.times)}}),e.addCommand({name:"copylinesdown",bindKey:f("Ctrl-Alt-Down","Command-Option-Down"),exec:function(a,b,c){a.editor.copyLinesDown()}}),e.addCommand({name:"movelinesdown",bindKey:f("Alt-Down","Option-Down"),exec:function(a,b,c){a.editor.moveLinesDown()}}),e.addCommand({name:"selecttoend",bindKey:f("Ctrl-Shift-End|Alt-Shift-Down","Command-Shift-Down"),exec:function(a,b,c){a.editor.getSelection().selectFileEnd()}}),e.addCommand({name:"gotoend",bindKey:f("Ctrl-End|Ctrl-Down","Command-End|Command-Down"),exec:function(a,b,c){a.editor.navigateFileEnd()}}),e.addCommand({name:"selectdown",bindKey:f("Shift-Down","Shift-Down"),exec:function(a,b,c){a.editor.getSelection().selectDown()}}),e.addCommand({name:"golinedown",bindKey:f("Down","Down|Ctrl-N"),exec:function(a,b,c){a.editor.navigateDown(b.times)}}),e.addCommand({name:"selectwordleft",bindKey:f("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(a,b,c){a.editor.getSelection().selectWordLeft()}}),e.addCommand({name:"gotowordleft",bindKey:f("Ctrl-Left","Option-Left"),exec:function(a,b,c){a.editor.navigateWordLeft()}}),e.addCommand({name:"selecttolinestart",bindKey:f("Alt-Shift-Left","Command-Shift-Left"),exec:function(a,b,c){a.editor.getSelection().selectLineStart()}}),e.addCommand({name:"gotolinestart",bindKey:f("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(a,b,c){a.editor.navigateLineStart()}}),e.addCommand({name:"selectleft",bindKey:f("Shift-Left","Shift-Left"),exec:function(a,b,c){a.editor.getSelection().selectLeft()}}),e.addCommand({name:"gotoleft",bindKey:f("Left","Left|Ctrl-B"),exec:function(a,b,c){a.editor.navigateLeft(b.times)}}),e.addCommand({name:"selectwordright",bindKey:f("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(a,b,c){a.editor.getSelection().selectWordRight()}}),e.addCommand({name:"gotowordright",bindKey:f("Ctrl-Right","Option-Right"),exec:function(a,b,c){a.editor.navigateWordRight()}}),e.addCommand({name:"selecttolineend",bindKey:f("Alt-Shift-Right","Command-Shift-Right"),exec:function(a,b,c){a.editor.getSelection().selectLineEnd()}}),e.addCommand({name:"gotolineend",bindKey:f("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(a,b,c){a.editor.navigateLineEnd()}}),e.addCommand({name:"selectright",bindKey:f("Shift-Right","Shift-Right"),exec:function(a,b,c){a.editor.getSelection().selectRight()}}),e.addCommand({name:"gotoright",bindKey:f("Right","Right|Ctrl-F"),exec:function(a,b,c){a.editor.navigateRight(b.times)}}),e.addCommand({name:"selectpagedown",bindKey:f("Shift-PageDown","Shift-PageDown"),exec:function(a,b,c){a.editor.selectPageDown()}}),e.addCommand({name:"pagedown",bindKey:f(null,"PageDown"),exec:function(a,b,c){a.editor.scrollPageDown()}}),e.addCommand({name:"gotopagedown",bindKey:f("PageDown","Option-PageDown|Ctrl-V"),exec:function(a,b,c){a.editor.gotoPageDown()}}),e.addCommand({name:"selectpageup",bindKey:f("Shift-PageUp","Shift-PageUp"),exec:function(a,b,c){a.editor.selectPageUp()}}),e.addCommand({name:"pageup",bindKey:f(null,"PageUp"),exec:function(a,b,c){a.editor.scrollPageUp()}}),e.addCommand({name:"gotopageup",bindKey:f("PageUp","Option-PageUp"),exec:function(a,b,c){a.editor.gotoPageUp()}}),e.addCommand({name:"selectlinestart",bindKey:f("Shift-Home","Shift-Home"),exec:function(a,b,c){a.editor.getSelection().selectLineStart()}}),e.addCommand({name:"selectlineend",bindKey:f("Shift-End","Shift-End"),exec:function(a,b,c){a.editor.getSelection().selectLineEnd()}}),e.addCommand({name:"del",bindKey:f("Delete","Delete|Ctrl-D"),exec:function(a,b,c){a.editor.remove("right")}}),e.addCommand({name:"backspace",bindKey:f("Ctrl-Backspace|Command-Backspace|Option-Backspace|Shift-Backspace|Backspace","Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(a,b,c){a.editor.remove("left")}}),e.addCommand({name:"removetolinestart",bindKey:f("Alt-Backspace","Option-Backspace"),exec:function(a,b,c){a.editor.removeToLineStart()}}),e.addCommand({name:"removetolineend",bindKey:f("Alt-Delete","Ctrl-K"),exec:function(a,b,c){a.editor.removeToLineEnd()}}),e.addCommand({name:"removewordleft",bindKey:f("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(a,b,c){a.editor.removeWordLeft()}}),e.addCommand({name:"removewordright",bindKey:f("Ctrl-Delete","Alt-Delete"),exec:function(a,b,c){a.editor.removeWordRight()}}),e.addCommand({name:"outdent",bindKey:f("Shift-Tab","Shift-Tab"),exec:function(a,b,c){a.editor.blockOutdent()}}),e.addCommand({name:"indent",bindKey:f("Tab","Tab"),exec:function(a,b,c){a.editor.indent()}}),e.addCommand({name:"inserttext",exec:function(a,b,c){a.editor.insert(d.stringRepeat(b.text||"",b.times||1))}}),e.addCommand({name:"centerselection",bindKey:f(null,"Ctrl-L"),exec:function(a,b,c){a.editor.centerSelection()}}),e.addCommand({name:"splitline",bindKey:f(null,"Ctrl-O"),exec:function(a,b,c){a.editor.splitLine()}}),e.addCommand({name:"transposeletters",bindKey:f("Ctrl-T","Ctrl-T"),exec:function(a,b,c){a.editor.transposeLetters()}})}),define("ace/edit_session",["require","exports","module","pilot/oop","pilot/lang","pilot/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/edit_session/folding"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("pilot/event_emitter").EventEmitter,g=a("ace/selection").Selection,h=a("ace/mode/text").Mode,j=a("ace/range").Range,k=a("ace/document").Document,l=a("ace/background_tokenizer").BackgroundTokenizer,m=function(a,b){this.$modified=!0,this.$breakpoints=[],this.$frontMarkers={},this.$backMarkers={},this.$markerId=1,this.$rowCache=[],this.$wrapData=[],this.$foldData=[],this.$foldData.toString=function(){var a="";return this.forEach(function(b){a+="\n"+b.toString()}),a},a instanceof k?this.setDocument(a):this.setDocument(new k(a)),this.selection=new g(this),b?this.setMode(b):this.setMode(new h)};(function(){function o(a){return a<4352?!1:a>=4352&&a<=4447||a>=4515&&a<=4519||a>=4602&&a<=4607||a>=9001&&a<=9002||a>=11904&&a<=11929||a>=11931&&a<=12019||a>=12032&&a<=12245||a>=12272&&a<=12283||a>=12288&&a<=12350||a>=12353&&a<=12438||a>=12441&&a<=12543||a>=12549&&a<=12589||a>=12593&&a<=12686||a>=12688&&a<=12730||a>=12736&&a<=12771||a>=12784&&a<=12830||a>=12832&&a<=12871||a>=12880&&a<=13054||a>=13056&&a<=19903||a>=19968&&a<=42124||a>=42128&&a<=42182||a>=43360&&a<=43388||a>=44032&&a<=55203||a>=55216&&a<=55238||a>=55243&&a<=55291||a>=63744&&a<=64255||a>=65040&&a<=65049||a>=65072&&a<=65106||a>=65108&&a<=65126||a>=65128&&a<=65131||a>=65281&&a<=65376||a>=65504&&a<=65510}d.implement(this,f),this.setDocument=function(a){if(this.doc)throw new Error("Document is already set");this.doc=a,a.on("change",this.onChange.bind(this)),this.on("changeFold",this.onChangeFold.bind(this)),this.bgTokenizer&&(this.bgTokenizer.setDocument(this.getDocument()),this.bgTokenizer.start(0))},this.getDocument=function(){return this.doc},this.$resetRowCache=function(a){if(a==0){this.$rowCache=[];return}var b=this.$rowCache;for(var c=0;c=a){b.splice(c,b.length);return}},this.onChangeFold=function(a){var b=a.data;this.$resetRowCache(b.start.row)},this.onChange=function(a){var b=a.data;this.$modified=!0,this.$resetRowCache(b.range.start.row);var c=this.$updateInternalDataOnChange(a);!this.$fromUndo&&this.$undoManager&&!b.ignore&&(this.$deltasDoc.push(b),c&&c.length!=0&&this.$deltasFold.push({action:"removeFolds",folds:c}),this.$informUndoManager.schedule()),this.bgTokenizer.start(b.range.start.row),this._dispatchEvent("change",a)},this.setValue=function(a){this.doc.setValue(a),this.selection.moveCursorTo(0,0),this.selection.clearSelection(),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(a){return this.bgTokenizer.getState(a)},this.getTokens=function(a,b){return this.bgTokenizer.getTokens(a,b)},this.setUndoManager=function(a){this.$undoManager=a,this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(a){var b=this;this.$syncInformUndoManager=function(){b.$informUndoManager.cancel(),b.$deltasFold.length&&(b.$deltas.push({group:"fold",deltas:b.$deltasFold}),b.$deltasFold=[]),b.$deltasDoc.length&&(b.$deltas.push({group:"doc",deltas:b.$deltasDoc}),b.$deltasDoc=[]),b.$deltas.length>0&&a.execute({action:"aceupdate",args:[b.$deltas,b]}),b.$deltas=[]},this.$informUndoManager=e.deferredCall(this.$syncInformUndoManager)}},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?e.stringRepeat(" ",this.getTabSize()):"\t"},this.$useSoftTabs=!0,this.setUseSoftTabs=function(a){if(this.$useSoftTabs===a)return;this.$useSoftTabs=a},this.getUseSoftTabs=function(){return this.$useSoftTabs},this.$tabSize=4,this.setTabSize=function(a){if(isNaN(a)||this.$tabSize===a)return;this.$modified=!0,this.$tabSize=a,this._dispatchEvent("changeTabSize")},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(a){return this.$useSoftTabs&&a.column%this.$tabSize==0},this.$overwrite=!1,this.setOverwrite=function(a){if(this.$overwrite==a)return;this.$overwrite=a,this._dispatchEvent("changeOverwrite")},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(a){this.$breakpoints=[];for(var b=0;b0&&(d=!!c.charAt(b-1).match(this.tokenRe)),d||(d=!!c.charAt(b).match(this.tokenRe));var e=d?this.tokenRe:this.nonTokenRe,f=b;if(f>0){do f--;while(f>=0&&c.charAt(f).match(e));f++}var g=b;while(g=0){var h=g.charAt(d);if(h==c){f-=1;if(f==0)return{row:e,column:d}}else h==a&&(f+=1);d-=1}e-=1;if(e<0)break;var g=this.getLine(e),d=g.length-1}return null},this.$findClosingBracket=function(a,b){var c=this.$brackets[a],d=b.column,e=b.row,f=1,g=this.getLine(e),h=this.getLength();for(;;){while(d=h)break;var g=this.getLine(e),d=0}return null},this.insert=function(a,b){return this.doc.insert(a,b)},this.remove=function(a){return this.doc.remove(a)},this.undoChanges=function(a,b){if(!a.length)return;this.$fromUndo=!0;var c=null;for(var d=a.length-1;d!=-1;d--)delta=a[d],delta.group=="doc"?(this.doc.revertDeltas(delta.deltas),c=this.$getUndoSelection(delta.deltas,!0,c)):delta.deltas.forEach(function(a){this.addFolds(a.folds)},this);return this.$fromUndo=!1,c&&!b&&this.selection.setSelectionRange(c),c},this.redoChanges=function(a,b){if(!a.length)return;this.$fromUndo=!0;var c=null;for(var d=0;d=this.doc.getLength()-1)return 0;var c=this.doc.removeLines(a,b);return this.doc.insertLines(a+1,c),1},this.duplicateLines=function(a,b){var a=this.$clipRowToDocument(a),b=this.$clipRowToDocument(b),c=this.getLines(a,b);this.doc.insertLines(a,c);var d=b-a+1;return d},this.$clipRowToDocument=function(a){return Math.max(0,Math.min(a,this.doc.getLength()-1))},this.$clipPositionToDocument=function(a,b){b=Math.max(0,b);if(a<0)a=0,b=0;else{var c=this.doc.getLength();a>=c?(a=c-1,b=this.doc.getLine(c-1).length):b=Math.min(this.doc.getLine(a).length,b)}return{row:a,column:b}},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(a){if(a!=this.$useWrapMode){this.$useWrapMode=a,this.$modified=!0,this.$resetRowCache(0);if(a){var b=this.getLength();this.$wrapData=[];for(i=0;i0?(this.$wrapLimit=b,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._dispatchEvent("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(a){var b=this.$wrapLimitRange.min;b&&(a=Math.max(b,a));var c=this.$wrapLimitRange.max;return c&&(a=Math.min(c,a)),Math.max(1,a)},this.getWrapLimit=function(){return this.$wrapLimit},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(a){var b=this.$useWrapMode,c,d=a.data.action,e=a.data.range.start.row,f=a.data.range.end.row,g=a.data.range.start,h=a.data.range.end,i=null;d.indexOf("Lines")!=-1?(d=="insertLines"?f=e+a.data.lines.length:f=e,c=a.data.lines?a.data.lines.length:f-e):c=f-e;if(c!=0)if(d.indexOf("remove")!=-1){b&&this.$wrapData.splice(e,c);var j=this.$foldData;i=this.getFoldsInRange(a.data.range),this.removeFolds(i);var k=this.getFoldLine(h.row),l=0;if(k){k.addRemoveChars(h.row,h.column,g.column-h.column),k.shiftRow(-c);var m=this.getFoldLine(e);m&&m!==k&&(m.merge(k),k=m),l=j.indexOf(k)+1}for(l;l=h.row&&k.shiftRow(-c)}f=e}else{var n;if(b){n=[e,0];for(var o=0;o=e&&k.shiftRow(c)}}else{var q;c=Math.abs(a.data.range.start.column-a.data.range.end.column),d.indexOf("remove")!=-1&&(i=this.getFoldsInRange(a.data.range),this.removeFolds(i),c=-c);var k=this.getFoldLine(e);k&&k.addRemoveChars(e,g.column,c)}return b&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),b&&this.$updateWrapData(e,f),i},this.$updateWrapData=function(a,b){var c=this.doc.getAllLines(),d=this.getTabSize(),f=this.$wrapData,i=this.$wrapLimit,j,l,m=a;b=Math.min(b,c.length-1);while(m<=b){l=this.getFoldLine(m);if(!l)j=this.$getDisplayTokens(e.stringTrimRight(c[m]));else{j=[],l.walk(function(a,b,d,e){var f;if(a){f=this.$getDisplayTokens(a,j.length),f[0]=g;for(var i=1;i=k)j.pop()}f[m]=this.$computeWrapSplits(j,i,d),m=this.getRowFoldEnd(m)+1}};var b=1,c=2,g=3,h=4,k=10,m=11,n=12;this.$computeWrapSplits=function(a,b,c){function j(b){var c=a.slice(f,b),e=c.length;c.join("").replace(/12/g,function(a){e-=1}).replace(/2/g,function(a){e-=1}),i+=e,d.push(i),f=b}if(a.length==0)return[];var c=this.getTabSize(),d=[],e=a.length,f=0,i=0;while(e-f>b){var l=f+b;if(a[l]>=k){while(a[l]>=k)l++;j(l);continue}if(a[l]==g||a[l]==h){for(l;l!=f-1;l--)if(a[l]==g)break;if(l>f){j(l);continue}l=f+b;for(l;l=g){l++;break}if(l>f){j(l);continue}l=f+b,j(f+b)}return d},this.$getDisplayTokens=function(a,d){var e=[],f;d=d||0;for(var g=0;gb)break}return[c,e]},this.getRowLength=function(a){return!this.$useWrapMode||!this.$wrapData[a]?1:this.$wrapData[a].length+1},this.getRowHeight=function(a,b){return this.getRowLength(b)*a.lineHeight},this.getScreenLastRowColumn=function(a){return this.documentToScreenColumn(a,this.doc.getLine(a).length)},this.getDocumentLastRowColumn=function(a,b){var c=this.documentToScreenRow(a,b);return this.getScreenLastRowColumn(c)},this.getDocumentLastRowColumnPosition=function(a,b){var c=this.documentToScreenRow(a,b);return this.screenToDocumentPosition(c,Number.MAX_VALUE/10)},this.getRowSplitData=function(a){return this.$useWrapMode?this.$wrapData[a]:undefined},this.getScreenTabSize=function(a){return this.$tabSize-a%this.$tabSize},this.screenToDocumentRow=function(a,b){return this.screenToDocumentPosition(a,b).row},this.screenToDocumentColumn=function(a,b){return this.screenToDocumentPosition(a,b).column},this.screenToDocumentPosition=function(a,b){if(a<0)return{row:0,column:0};var c,d=0,e=0,f,g,h=0,i=0,j=this.$rowCache;for(var k=0;k=a||d>=m)break;h+=i,d++,d>o&&(d=n.end.row+1,n=this.getNextFold(d),o=n?n.start.row:Infinity),l&&j.push({docRow:d,screenRow:h})}n&&n.start.row<=d?c=this.getFoldDisplayLine(n):(c=this.getLine(d),n=null);var p=[];return this.$useWrapMode&&(p=this.$wrapData[d],p&&(f=p[a-h],a>h&&p.length&&(e=p[a-h-1]||p[p.length-1],c=c.substring(e)))),e+=this.$getStringScreenWidth(c,b)[1],h+p.length=f&&(e=f-1):e=Math.min(e,c.length),n?n.idxToPosition(e):{row:d,column:e}},this.documentToScreenPosition=function(a,b){if(typeof b=="undefined")var c=this.$clipPositionToDocument(a.row,a.column);else c=this.$clipPositionToDocument(a,b);a=c.row,b=c.column;var d=this.$rowCache.length,e;if(this.$useWrapMode){e=this.$wrapData;if(a>e.length-1)return{row:this.getScreenLength(),column:e.length==0?0:e[e.length-1].length-1}}var f=0,g=0,h=null,i=null;i=this.getFoldAt(a,b,1),i&&(a=i.start.row,b=i.start.column);var j,k=0,l=this.$rowCache;for(var m=0;m=p){j=o.end.row+1;if(j>a)break;o=this.getNextFold(j),p=o?o.start.row:Infinity}else j=k+1;f+=this.getRowLength(k),k=j,n&&l.push({docRow:k,screenRow:f})}var q="";o&&k>=p?(q=this.getFoldDisplayLine(o,a,b),h=o.start.row):(q=this.getLine(a).substring(0,b),h=a);if(this.$useWrapMode){var r=e[h],s=0;while(q.length>=r[s])f++,s++;q=q.substring(r[s-1]||0,q.length)}return{row:f,column:this.$getStringScreenWidth(q)[0]}},this.documentToScreenColumn=function(a,b){return this.documentToScreenPosition(a,b).column},this.documentToScreenRow=function(a,b){return this.documentToScreenPosition(a,b).row},this.getScreenLength=function(){var a=0,b=null,c=null;if(!this.$useWrapMode){a=this.getLength();var d=this.$foldData;for(var e=0;eb.row||a.row==b.row&&a.column>b.column},this.getRange=function(){var a=this.selectionAnchor,b=this.selectionLead;return this.isEmpty()?g.fromPoints(b,b):this.isBackwards()?g.fromPoints(b,a):g.fromPoints(a,b)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._dispatchEvent("changeSelection"))},this.selectAll=function(){var a=this.doc.getLength()-1;this.setSelectionAnchor(a,this.doc.getLine(a).length),this.moveCursorTo(0,0)},this.setSelectionRange=function(a,b){b?(this.setSelectionAnchor(a.end.row,a.end.column),this.selectTo(a.start.row,a.start.column)):(this.setSelectionAnchor(a.start.row,a.start.column),this.selectTo(a.end.row,a.end.column)),this.$updateDesiredColumn()},this.$updateDesiredColumn=function(){var a=this.getCursor();this.$desiredColumn=this.session.documentToScreenColumn(a.row,a.column)},this.$moveSelection=function(a){var b=this.selectionLead;this.$isEmpty&&this.setSelectionAnchor(b.row,b.column),a.call(this)},this.selectTo=function(a,b){this.$moveSelection(function(){this.moveCursorTo(a,b)})},this.selectToPosition=function(a){this.$moveSelection(function(){this.moveCursorToPosition(a)})},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.selectWord=function(){var a=this.getCursor(),b=this.session.getWordRange(a.row,a.column);this.setSelectionRange(b)},this.selectLine=function(){var a=this.selectionLead.row,b,c=this.session.getFoldLine(a);c?(a=c.start.row,b=c.end.row):b=a,this.setSelectionAnchor(a,0),this.$moveSelection(function(){this.moveCursorTo(b+1,0)})},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,-1))this.moveCursorTo(b.start.row,b.start.column);else if(a.column==0)a.row>0&&this.moveCursorTo(a.row-1,this.doc.getLine(a.row-1).length);else{var c=this.session.getTabSize();this.session.isTabStop(a)&&this.doc.getLine(a.row).slice(a.column-c,a.column).split(" ").length-1==c?this.moveCursorBy(0,-c):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,1))this.moveCursorTo(b.end.row,b.end.column);else if(this.selectionLead.column==this.doc.getLine(this.selectionLead.row).length)this.selectionLead.row ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;return b=this.compare(c.row,c.column),b==1?(b=this.compare(d.row,d.column),b==1?2:b==0?1:0):b==-1?-2:(b=this.compare(d.row,d.column),b==-1?-1:b==1?42:0)},this.containsRange=function(a){var b=this.compareRange(a);return b==-1||b==0||b==1},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)||this.isStart(a,b)?!1:!0:!1},this.insideStart=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)?!1:!0:!1},this.insideEnd=function(a,b){return this.compare(a,b)==0?this.isStart(a,b)?!1:!0:!1},this.compare=function(a,b){return!this.isMultiLine()&&a===this.start.row?bthis.end.column?1:0:athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.row=0&&/^[\w\d]/.test(h)||e<=g&&/[\w\d]$/.test(h))return;h=f.substring(c.start.column,c.end.column);if(!/^[\w\d]+$/.test(h))return;var i=a.getCursorPosition(),j={wrap:!0,wholeWord:!0,caseSensitive:!0,needle:h},k=a.$search.getOptions();a.$search.set(j);var l=a.$search.findAll(b);l.forEach(function(a){if(!a.contains(i.row,i.column)){var c=b.addMarker(a,"ace_selected_word","text");b.$selectionOccurrences.push(c)}}),a.$search.set(k)},this.clearSelectionHighlight=function(a){if(!a.session.$selectionOccurrences)return;a.session.$selectionOccurrences.forEach(function(b){a.session.removeMarker(b)}),a.session.$selectionOccurrences=[]},this.createModeDelegates=function(a){if(!this.$embeds)return;this.$modes={};for(var b=0;b1&&(m=g.slice(n+2,n+1+e[n].len)),typeof l.token=="function"?k=l.token.apply(this,m):k=l.token;var o=l.next;o&&o!==c&&(c=o,d=this.rules[c],e=this.matchMappings[c],i=f.lastIndex,f=this.regExps[c],f.lastIndex=i);break}if(m[0]){typeof k=="string"&&(m=[m.join("")],k=[k]);for(var n=0;n=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length),a},this.insert=function(a,b){if(b.length==0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];return a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||"")),a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};return this._dispatchEvent("change",{data:e}),d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};return this._dispatchEvent("change",{data:d}),c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};return this._dispatchEvent("change",{data:e}),d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b==c)return;var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};return this._dispatchEvent("change",{data:i}),d.start},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};return this._dispatchEvent("change",{data:e}),d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}}).call(h.prototype),b.Document=h}),define("ace/anchor",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=b.Anchor=function(a,b,c){this.document=a,typeof c=="undefined"?this.setPosition(b.row,b.column):this.setPosition(b,c),this.$onChange=this.onChange.bind(this),a.on("change",this.$onChange)};(function(){d.implement(this,e),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(a){var b=a.data,c=b.range;if(c.start.row==c.end.row&&c.start.row!=this.row)return;if(c.start.row>this.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0),c}}).call(f.prototype)}),define("ace/background_tokenizer",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(a,b){this.running=!1,this.lines=[],this.currentLine=0,this.tokenizer=a;var c=this;this.$worker=function(){if(!c.running)return;var a=new Date,b=c.currentLine,d=c.doc,e=0,f=d.getLength();while(c.currentLine20){c.fireUpdateEvent(b,c.currentLine-1),c.running=setTimeout(c.$worker,20);return}}c.running=!1,c.fireUpdateEvent(b,f-1)}};(function(){d.implement(this,e),this.setTokenizer=function(a){this.tokenizer=a,this.lines=[],this.start(0)},this.setDocument=function(a){this.doc=a,this.lines=[],this.stop()},this.fireUpdateEvent=function(a,b){var c={first:a,last:b};this._dispatchEvent("update",{data:c})},this.start=function(a){this.currentLine=Math.min(a||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(a,b){return this.$tokenizeRows(a,b)},this.getState=function(a){return this.$tokenizeRows(a,a)[0].state},this.$tokenizeRows=function(a,b){if(!this.doc)return[];var c=[],d="start",e=!1;a>0&&this.lines[a-1]?(d=this.lines[a-1].state,e=!0):a==0?(d="start",e=!0):this.lines.length>0&&(d=this.lines[this.lines.length-1].state);var f=this.doc.getLines(a,b);for(var g=a;g<=b;g++)if(!this.lines[g]){var h=this.tokenizer.getLineTokens(f[g-a]||"",d),d=h.state;c.push(h),e&&(this.lines[g]=h)}else{var h=this.lines[g];d=h.state,c.push(h)}return c}}).call(f.prototype),b.BackgroundTokenizer=f}),define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold"],function(a,b,c){function g(){this.getFoldAt=function(a,b,c){var d=this.getFoldLine(a);if(!d)return null;var e=d.folds;for(var f=0;f=a)return e;if(e.end.row>a)return null}return null},this.getNextFold=function(a,b){var c=this.$foldData,d,e=0;b&&(e=c.indexOf(b)),e==-1&&(e=0);for(e;e=a)return f}return null},this.getFoldedRowCount=function(a,b){var c=this.$foldData,d=b-a+1;for(var e=0;e=b){h=a?d-=b-h:d=0);break}g>=a&&(h>=a?d-=g-h:d-=g-a+1)}return d},this.$addFoldLine=function(a){return this.$foldData.push(a),this.$foldData.sort(function(a,b){return a.start.row-b.start.row}),a},this.addFold=function(a,b){var c=this.$foldData,d=!1;if(a instanceof f)var g=a;else g=new f(b,a);var h=g.start.row,i=g.start.column,j=g.end.row,k=g.end.column;if(g.placeholder.length<2)throw"Placeholder has to be at least 2 characters";if(h==j&&k-i<2)throw"The range has to be at least 2 characters width";var l=this.getFoldAt(h,i,1);if(l&&l.range.isEnd(j,k)&&l.range.isStart(h,i))return g;l=this.getFoldAt(h,i,1);if(l&&!l.range.isStart(h,i))throw"A fold can't start inside of an already existing fold";l=this.getFoldAt(j,k,-1);if(l&&!l.range.isEnd(j,k))throw"A fold can't end inside of an already existing fold";if(j>=this.doc.getLength())throw"End of fold is outside of the document.";if(k>this.getLine(j).length||i>this.getLine(h).length)throw"End of fold is outside of the document.";var m=this.getFoldsInRange(g.range);m.length>0&&(this.removeFolds(m),g.subFolds=m);for(var n=0;nthis.endRow)throw"Can't add a fold to this FoldLine as it has no connection";this.folds.push(a),this.folds.sort(function(a,b){return-a.range.compareEnd(b.start.row,b.start.column)}),this.range.compareEnd(a.start.row,a.start.column)>0?(this.end.row=a.end.row,this.end.column=a.end.column):this.range.compareStart(a.end.row,a.end.column)<0&&(this.start.row=a.start.row,this.start.column=a.start.column)}else if(a.start.row==this.end.row)this.folds.push(a),this.end.row=a.end.row,this.end.column=a.end.column;else if(a.end.row==this.start.row)this.folds.unshift(a),this.start.row=a.start.row,this.start.column=a.start.column;else throw"Trying to add fold to FoldRow that doesn't have a matching row";a.foldLine=this},this.containsRow=function(a){return a>=this.start.row&&a<=this.end.row},this.walk=function(a,b,c){var d=0,e=this.folds,f,g,h,i=!0;b==null&&(b=this.end.row,c=this.end.column);for(var j=0;j=0;h--){var i=g[h],j=c.$rangeFromMatch(f,i.offset,i.str.length);if(d(j))return!0}})}}},this.$rangeFromMatch=function(a,b,c){return new f(a,b,a,b+c)},this.$assembleRegExp=function(){if(this.$options.regExp)var a=this.$options.needle;else a=d.escapeRegExp(this.$options.needle);this.$options.wholeWord&&(a="\\b"+a+"\\b");var b="g";this.$options.caseSensitive||(b+="i");var c=new RegExp(a,b);return c},this.$forwardLineIterator=function(a){function k(e){var f=a.getLine(e);return b&&e==c.end.row&&(f=f.substring(0,c.end.column)),j&&e==d.row&&(f=f.substring(0,d.column)),f}var b=this.$options.scope==g.SELECTION,c=a.getSelection().getRange(),d=a.getSelection().getCursor(),e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap,j=!1;return{forEach:function(a){var b=d.row,c=k(b),g=d.column,l=!1;j=!1;while(!a(c,g,b)){if(l)return;b++,g=0;if(b>h)if(i)b=e,g=f,j=!0;else return;b==d.row&&(l=!0),c=k(b)}}}},this.$backwardLineIterator=function(a){var b=this.$options.scope==g.SELECTION,c=a.getSelection().getRange(),d=b?c.end:c.start,e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap;return{forEach:function(g){var j=d.row,k=a.getLine(j).substring(0,d.column),l=0,m=!1,n=!1;while(!g(k,l,j)){if(m)return;j--,l=0;if(j0},this.hasRedo=function(){return this.$redoStack.length>0}}).call(d.prototype),b.UndoManager=d}),define("ace/virtual_renderer",["require","exports","module","pilot/oop","pilot/dom","pilot/event","pilot/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","pilot/event_emitter","text!ace/css/editor.css"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/dom"),f=a("pilot/event"),g=a("pilot/useragent"),h=a("ace/layer/gutter").Gutter,i=a("ace/layer/marker").Marker,j=a("ace/layer/text").Text,k=a("ace/layer/cursor").Cursor,l=a("ace/scrollbar").ScrollBar,m=a("ace/renderloop").RenderLoop,n=a("pilot/event_emitter").EventEmitter,o=a("text!ace/css/editor.css");e.importCssString(o);var p=function(a,b){this.container=a,e.addCssClass(this.container,"ace_editor"),this.setTheme(b),this.$gutter=e.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=e.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=e.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new h(this.$gutter),this.$markerBack=new i(this.content);var c=this.$textLayer=new j(this.content);this.canvas=c.element,this.$markerFront=new i(this.content),this.characterWidth=c.getCharacterWidth(),this.lineHeight=c.getLineHeight(),this.$cursorLayer=new k(this.content),this.$cursorPadding=8,this.$horizScroll=!0,this.$horizScrollAlwaysVisible=!0,this.scrollBar=new l(a),this.scrollBar.addEventListener("scroll",this.onScroll.bind(this)),this.scrollTop=0,this.cursorPos={row:0,column:0};var d=this;this.$textLayer.addEventListener("changeCharaterSize",function(){d.characterWidth=c.getCharacterWidth(),d.lineHeight=c.getLineHeight(),d.$updatePrintMargin(),d.onResize(!0),d.$loop.schedule(d.CHANGE_FULL)}),f.addListener(this.$gutter,"click",this.$onGutterClick.bind(this)),f.addListener(this.$gutter,"dblclick",this.$onGutterClick.bind(this)),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:1,characterWidth:1,minHeight:1,maxHeight:1,offset:0,height:1},this.$loop=new m(this.$renderChanges.bind(this)),this.$loop.schedule(this.CHANGE_FULL),this.setPadding(4),this.$updatePrintMargin()};(function(){this.showGutter=!0,this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,d.implement(this,n),this.setSession=function(a){this.session=a,this.$cursorLayer.setSession(a),this.$markerBack.setSession(a),this.$markerFront.setSession(a),this.$gutterLayer.setSession(a),this.$textLayer.setSession(a),this.$loop.schedule(this.CHANGE_FULL)},this.updateLines=function(a,b){b===undefined&&(b=Infinity),this.$changedLines?(this.$changedLines.firstRow>a&&(this.$changedLines.firstRow=a),this.$changedLines.lastRowc.lastRow+1)return;if(bc&&this.scrollToY(c),this.scrollTop+this.$size.scrollerHeightb&&this.scrollToX(b),d+this.$size.scrollerWidththis.layerConfig.width?this.$desiredScrollLeft=b+2*this.characterWidth:this.scrollToX(Math.round(b+this.characterWidth-this.$size.scrollerWidth)))},this.getScrollTop=function(){return this.scrollTop},this.getScrollLeft=function(){return this.scroller.scrollLeft},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(a){this.scrollToY(a*this.lineHeight)},this.scrollToLine=function(a,b){var c={lineHeight:this.lineHeight},d=0;for(var e=1;e0)return!0;if(b>0&&this.scrollTop+this.$size.scrollerHeighth&&(e=g.end.row+1,g=this.session.getNextFold(e),h=g?g.start.row:Infinity);if(e>f)break;var i=this.$annotations[e]||b;c.push("
",e+1);var j=this.session.getRowLength(e)-1;while(j--)c.push("
¦");c.push("
"),e++}this.element=d.setInnerHtml(this.element,c.join("")),this.element.style.height=a.minHeight+"px"}}).call(e.prototype),b.Gutter=e}),define("ace/layer/marker",["require","exports","module","ace/range","pilot/dom"],function(a,b,c){var d=a("ace/range").Range,e=a("pilot/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_marker-layer",a.appendChild(this.element)};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setMarkers=function(a){this.markers=a},this.update=function(a){var a=a||this.config;if(!a)return;this.config=a;var b=[];for(var c in this.markers){var d=this.markers[c],f=d.range.clipRows(a.firstRow,a.lastRow);if(f.isEmpty())continue;f=f.toScreenRange(this.session);if(d.renderer){var g=this.$getTop(f.start.row,a),h=Math.round(this.$padding+f.start.column*a.characterWidth);d.renderer(b,f,h,g,a)}else f.isMultiLine()?d.type=="text"?this.drawTextMarker(b,f,d.clazz,a):this.drawMultiLineMarker(b,f,d.clazz,a,d.type):this.drawSingleLineMarker(b,f,d.clazz,a,null,d.type)}this.element=e.setInnerHtml(this.element,b.join(""))},this.$getTop=function(a,b){return(a-b.firstRowScreen)*b.lineHeight},this.drawTextMarker=function(a,b,c,e){var f=b.start.row,g=new d(f,b.start.column,f,this.session.getScreenLastRowColumn(f));this.drawSingleLineMarker(a,g,c,e,1,"text"),f=b.end.row,g=new d(f,0,f,b.end.column),this.drawSingleLineMarker(a,g,c,e,0,"text");for(f=b.start.row+1;f"),i=this.$getTop(b.end.row,d),h=Math.round(b.end.column*d.characterWidth),a.push("
"),g=(b.end.row-b.start.row-1)*d.lineHeight;if(g<0)return;i=this.$getTop(b.start.row+1,d),h=d.width,a.push("
")},this.drawSingleLineMarker=function(a,b,c,d,e,f){var g=f==="background"?0:this.$padding,h=d.lineHeight;if(f==="background")var i=d.width;else i=Math.round((b.end.column+(e||0)-b.start.column)*d.characterWidth);var j=this.$getTop(b.start.row,d),k=Math.round(g+b.start.column*d.characterWidth);a.push("
")}}).call(f.prototype),b.Marker=f}),define("ace/layer/text",["require","exports","module","pilot/oop","pilot/dom","pilot/lang","pilot/useragent","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/dom"),f=a("pilot/lang"),g=a("pilot/useragent"),h=a("pilot/event_emitter").EventEmitter,i=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_text-layer",this.element.style.width="auto",a.appendChild(this.element),this.$characterSize=this.$measureSizes()||{width:0,height:0},this.$pollSizeChanges()};(function(){d.implement(this,h),this.EOF_CHAR="¶",this.EOL_CHAR="¬",this.TAB_CHAR="→",this.SPACE_CHAR="·",this.$padding=0,this.setPadding=function(a){this.$padding=a,this.element.style.padding="0 "+a+"px"},this.getLineHeight=function(){return this.$characterSize.height||1},this.getCharacterWidth=function(){return this.$characterSize.width||1},this.checkForSizeChanges=function(){var a=this.$measureSizes();a&&(this.$characterSize.width!==a.width||this.$characterSize.height!==a.height)&&(this.$characterSize=a,this._dispatchEvent("changeCharaterSize",{data:a}))},this.$pollSizeChanges=function(){var a=this;this.$pollSizeChangesTimer=setInterval(function(){a.checkForSizeChanges()},500)},this.$fontStyles={fontFamily:1,fontSize:1,fontWeight:1,fontStyle:1,lineHeight:1},this.$measureSizes=function(){var a=1e3;if(!this.$measureNode){var b=this.$measureNode=e.createElement("div"),c=b.style;c.width=c.height="auto",c.left=c.top=-a*40+"px",c.visibility="hidden",c.position="absolute",c.overflow="visible",c.whiteSpace="nowrap",b.innerHTML=f.stringRepeat("Xy",a);if(document.body)document.body.appendChild(b);else{var d=this.element.parentNode;while(!e.hasCssClass(d,"ace_editor"))d=d.parentNode;d.appendChild(b)}}var c=this.$measureNode.style,g=e.computedStyle(this.element);for(var h in this.$fontStyles)c[h]=g[h];var i={height:this.$measureNode.offsetHeight,width:this.$measureNode.offsetWidth/(a*2)};return i.width==0&&i.height==0?null:i},this.setSession=function(a){this.session=a},this.showInvisibles=!1,this.setShowInvisibles=function(a){return this.showInvisibles==a?!1:(this.showInvisibles=a,!0)},this.$tabStrings=[],this.$computeTabString=function(){var a=this.session.getTabSize(),b=this.$tabStrings=[0];for(var c=1;c"+this.TAB_CHAR+(new Array(c)).join(" ")+""):b.push((new Array(c+1)).join(" "))},this.updateLines=function(a,b,c){this.$computeTabString(),(this.config.lastRow!=a.lastRow||this.config.firstRow!=a.firstRow)&&this.scrollLines(a),this.config=a;var d=Math.max(b,a.firstRow),f=Math.min(c,a.lastRow),g=this.element.childNodes,h=0;for(var i=a.firstRow;i0;d--)c.removeChild(c.firstChild);if(b.lastRow>a.lastRow)for(var d=this.session.getFoldedRowCount(a.lastRow+1,b.lastRow);d>0;d--)c.removeChild(c.lastChild);if(a.firstRowb.lastRow){var e=this.$renderLinesFragment(a,b.lastRow+1,a.lastRow);c.appendChild(e)}},this.$renderLinesFragment=function(a,b,c){var d=document.createDocumentFragment(),f=b,g=this.session.getNextFold(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFold(f),h=g?g.start.row:Infinity);if(f>c)break;var i=e.createElement("div"),j=[],k=this.session.getTokens(f,f);k.length==1&&this.$renderLine(j,f,k[0].tokens,!1),i.innerHTML=j.join("");if(this.$useLineGroups())i.className="ace_line_group",d.appendChild(i);else{var l=i.childNodes;while(l.length)d.appendChild(l[0])}f++}return d},this.update=function(a){this.$computeTabString(),this.config=a;var b=[],c=a.firstRow,d=a.lastRow,f=c,g=this.session.getNextFold(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFold(f),h=g?g.start.row:Infinity);if(f>d)break;this.$useLineGroups()&&b.push("
");var i=this.session.getTokens(f,f);i.length==1&&this.$renderLine(b,f,i[0].tokens,!1),this.$useLineGroups()&&b.push("
"),f++}this.element=e.setInnerHtml(this.element,b.join(""))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(a,b,c,d){var e=this,f=/\t|&|<|( +)|([\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000])|[\u1100-\u115F]|[\u11A3-\u11A7]|[\u11FA-\u11FF]|[\u2329-\u232A]|[\u2E80-\u2E99]|[\u2E9B-\u2EF3]|[\u2F00-\u2FD5]|[\u2FF0-\u2FFB]|[\u3000-\u303E]|[\u3041-\u3096]|[\u3099-\u30FF]|[\u3105-\u312D]|[\u3131-\u318E]|[\u3190-\u31BA]|[\u31C0-\u31E3]|[\u31F0-\u321E]|[\u3220-\u3247]|[\u3250-\u32FE]|[\u3300-\u4DBF]|[\u4E00-\uA48C]|[\uA490-\uA4C6]|[\uA960-\uA97C]|[\uAC00-\uD7A3]|[\uD7B0-\uD7C6]|[\uD7CB-\uD7FB]|[\uF900-\uFAFF]|[\uFE10-\uFE19]|[\uFE30-\uFE52]|[\uFE54-\uFE66]|[\uFE68-\uFE6B]|[\uFF01-\uFF60]|[\uFFE0-\uFFE6]/g,h=function(a,c,d,f,h){if(a.charCodeAt(0)==32)return(new Array(a.length+1)).join(" ");if(a=="\t"){var i=e.session.getScreenTabSize(b+f);return b+=i-1,e.$tabStrings[i]}if(a=="&")return g.isOldGecko?"&":"&";if(a=="<")return"<";if(a==" "){var j=e.showInvisibles?"ace_cjk ace_invisible":"ace_cjk",k=e.showInvisibles?e.SPACE_CHAR:"";return b+=1,""+k+""}if(a.match(/[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]/)){if(e.showInvisibles){var k=(new Array(a.length+1)).join(e.SPACE_CHAR);return""+k+""}return" "}return b+=1,""+a+""},i=d.replace(f,h);if(!this.$textToken[c.type]){var j="ace_"+c.type.replace(/\./g," ace_");a.push("",i,"")}else a.push(i);return b+d.length},this.$renderLineCore=function(a,b,c,d,e){var f=0,g=0,h,i=this.config.characterWidth,j=0,k=this;!d||d.length==0?h=Number.MAX_VALUE:h=d[0],e||a.push("
");for(var l=0;l=h)j=k.$renderToken(a,j,m,n.substring(0,h-f)),n=n.substring(h-f),f=h,e||a.push("
","
"),g++,j=0,h=d[g]||Number.MAX_VALUE;n.length!=0&&(f+=n.length,j=k.$renderToken(a,j,m,n))}}this.showInvisibles&&(b!==this.session.getLength()-1?a.push(""+this.EOL_CHAR+""):a.push(""+this.EOF_CHAR+"")),e||a.push("
")},this.$renderLine=function(a,b,c,d){if(!this.session.isRowFolded(b)){var e=this.session.getRowSplitData(b);this.$renderLineCore(a,b,c,e,d)}else this.$renderFoldLine(a,b,c,d)},this.$renderFoldLine=function(a,b,c,d){function h(a,b,c){var d=0,e=0;while(e+a[d].value.lengthc-b&&(f=f.substring(0,c-b)),g.push({type:a[d].type,value:f}),e=b+f.length,d+=1}while(ec&&(f=f.substring(0,c-e)),g.push({type:a[d].type,value:f}),e+=f.length,d+=1}}var e=this.session,f=e.getFoldLine(b),g=[];f.walk(function(a,b,d,e,f){a?g.push({type:"fold",value:a}):(f&&(c=this.session.getTokens(b,b)[0].tokens),c.length!=0&&h(c,e,d))}.bind(this),f.end.row,this.session.getLine(f.end.row).length);var i=this.session.$useWrapMode?this.session.$wrapData[b]:null;this.$renderLineCore(a,b,g,i,d)},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(i.prototype),b.Text=i}),define("ace/layer/cursor",["require","exports","module","pilot/dom"],function(a,b,c){var d=a("pilot/dom"),e=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_cursor-layer",a.appendChild(this.element),this.cursor=d.createElement("div"),this.cursor.className="ace_cursor ace_hidden",this.element.appendChild(this.cursor),this.isVisible=!1};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.hideCursor=function(){this.isVisible=!1,d.addCssClass(this.cursor,"ace_hidden"),clearInterval(this.blinkId)},this.showCursor=function(){this.isVisible=!0,d.removeCssClass(this.cursor,"ace_hidden"),this.cursor.style.visibility="visible",this.restartTimer()},this.restartTimer=function(){clearInterval(this.blinkId);if(!this.isVisible)return;var a=this.cursor;this.blinkId=setInterval(function(){a.style.visibility="hidden",setTimeout(function(){a.style.visibility="visible"},400)},1e3)},this.getPixelPosition=function(a){if(!this.config||!this.session)return{left:0,top:0};var b=this.session.selection.getCursor(),c=this.session.documentToScreenPosition(b),d=Math.round(this.$padding+c.column*this.config.characterWidth),e=(c.row-(a?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:d,top:e}},this.update=function(a){this.config=a,this.pixelPos=this.getPixelPosition(!0),this.cursor.style.left=this.pixelPos.left+"px",this.cursor.style.top=this.pixelPos.top+"px",this.cursor.style.width=a.characterWidth+"px",this.cursor.style.height=a.lineHeight+"px";var b=this.session.getOverwrite();b!=this.overwrite&&(this.overwrite=b,b?d.addCssClass(this.cursor,"ace_overwrite"):d.removeCssClass(this.cursor,"ace_overwrite")),this.restartTimer()},this.destroy=function(){clearInterval(this.blinkId)}}).call(e.prototype),b.Cursor=e}),define("ace/scrollbar",["require","exports","module","pilot/oop","pilot/dom","pilot/event","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/dom"),f=a("pilot/event"),g=a("pilot/event_emitter").EventEmitter,h=function(a){this.element=e.createElement("div"),this.element.className="ace_sb",this.inner=e.createElement("div"),this.element.appendChild(this.inner),a.appendChild(this.element),this.width=e.scrollbarWidth(),this.element.style.width=(this.width||15)+5+"px",f.addListener(this.element,"scroll",this.onScroll.bind(this))};(function(){d.implement(this,g),this.onScroll=function(){this._dispatchEvent("scroll",{data:this.element.scrollTop})},this.getWidth=function(){return this.width},this.setHeight=function(a){this.element.style.height=a+"px"},this.setInnerHeight=function(a){this.inner.style.height=a+"px"},this.setScrollTop=function(a){this.element.scrollTop=a}}).call(h.prototype),b.ScrollBar=h}),define("ace/renderloop",["require","exports","module","pilot/event"],function(a,b,c){var d=a("pilot/event"),e=function(a){this.onRender=a,this.pending=!1,this.changes=0};(function(){this.schedule=function(a){this.changes=this.changes|a;if(!this.pending){this.pending=!0;var b=this;this.setTimeoutZero(function(){b.pending=!1;var a=b.changes;b.changes=0,b.onRender(a)})}},this.setTimeoutZero=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame,this.setTimeoutZero?this.setTimeoutZero=this.setTimeoutZero.bind(window):window.postMessage?(this.messageName="zero-timeout-message",this.setTimeoutZero=function(a){if(!this.attached){var b=this;d.addListener(window,"message",function(a){b.callback&&a.data==b.messageName&&(d.stopPropagation(a),b.callback())}),this.attached=!0}this.callback=a,window.postMessage(this.messageName,"*")}):this.setTimeoutZero=function(a){setTimeout(a,0)}}).call(e.prototype),b.RenderLoop=e}),define("ace/theme/textmate",["require","exports","module","pilot/dom"],function(a,b,c){var d=a("pilot/dom"),e=".ace-tm .ace_editor { border: 2px solid rgb(159, 159, 159);}.ace-tm .ace_editor.ace_focus { border: 2px solid #327fbd;}.ace-tm .ace_gutter { width: 50px; background: #e8e8e8; color: #333; overflow : hidden;}.ace-tm .ace_gutter-layer { width: 100%; text-align: right;}.ace-tm .ace_gutter-layer .ace_gutter-cell { padding-right: 6px;}.ace-tm .ace_print_margin { width: 1px; background: #e8e8e8;}.ace-tm .ace_text-layer { cursor: text;}.ace-tm .ace_cursor { border-left: 2px solid black;}.ace-tm .ace_cursor.ace_overwrite { border-left: 0px; border-bottom: 1px solid black;} .ace-tm .ace_line .ace_invisible { color: rgb(191, 191, 191);}.ace-tm .ace_line .ace_keyword { color: blue;}.ace-tm .ace_line .ace_constant.ace_buildin { color: rgb(88, 72, 246);}.ace-tm .ace_line .ace_constant.ace_language { color: rgb(88, 92, 246);}.ace-tm .ace_line .ace_constant.ace_library { color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_invalid { background-color: rgb(153, 0, 0); color: white;}.ace-tm .ace_line .ace_fold { background-color: #E4E4E4; border-radius: 3px;}.ace-tm .ace_line .ace_support.ace_function { color: rgb(60, 76, 114);}.ace-tm .ace_line .ace_support.ace_constant { color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_support.ace_type,.ace-tm .ace_line .ace_support.ace_class { color: rgb(109, 121, 222);}.ace-tm .ace_line .ace_keyword.ace_operator { color: rgb(104, 118, 135);}.ace-tm .ace_line .ace_string { color: rgb(3, 106, 7);}.ace-tm .ace_line .ace_comment { color: rgb(76, 136, 107);}.ace-tm .ace_line .ace_comment.ace_doc { color: rgb(0, 102, 255);}.ace-tm .ace_line .ace_comment.ace_doc.ace_tag { color: rgb(128, 159, 191);}.ace-tm .ace_line .ace_constant.ace_numeric { color: rgb(0, 0, 205);}.ace-tm .ace_line .ace_variable { color: rgb(49, 132, 149);}.ace-tm .ace_line .ace_xml_pe { color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function { color: #0000A2;}.ace-tm .ace_markup.ace_markupine { text-decoration:underline;}.ace-tm .ace_markup.ace_heading { color: rgb(12, 7, 255);}.ace-tm .ace_markup.ace_list { color:rgb(185, 6, 144);}.ace-tm .ace_marker-layer .ace_selection { background: rgb(181, 213, 255);}.ace-tm .ace_marker-layer .ace_step { background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack { background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active_line { background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_marker-layer .ace_selected_word { background: rgb(250, 250, 255); border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_meta.ace_tag { color:rgb(28, 2, 255);}.ace-tm .ace_string.ace_regex { color: rgb(255, 0, 0)}";d.importCssString(e),b.cssClass="ace-tm"}),define("pilot/environment",["require","exports","module","pilot/settings"],function(a,b,c){function e(){return{settings:d}}var d=a("pilot/settings").settings;b.create=e}),define("text!ace/css/editor.css",[],"@import url(//fonts.googleapis.com/css?family=Droid+Sans+Mono);\n\n\n.ace_editor {\n position: absolute;\n overflow: hidden;\n font-family: 'Monaco', 'Menlo', 'Droid Sans Mono', 'Courier New', monospace;\n font-size: 12px;\n}\n\n.ace_scroller {\n position: absolute;\n overflow-x: scroll;\n overflow-y: hidden;\n}\n\n.ace_content {\n position: absolute;\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n cursor: text;\n}\n\n/* setting pointer-events: auto; on node under the mouse, which changes during scroll,\n will break mouse wheel scrolling in Safari */\n.ace_content * {\n pointer-events: none;\n}\n\n.ace_composition {\n position: absolute;\n background: #555;\n color: #DDD;\n z-index: 4;\n}\n\n.ace_gutter {\n position: absolute;\n overflow-x: hidden;\n overflow-y: hidden;\n height: 100%;\n}\n\n.ace_gutter-cell.ace_error {\n background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%F5or%F5%87%88%F5nr%F4ns%EBmq%F5z%7F%DDJT%DEKS%DFOW%F1Yc%F2ah%CE(7%CE)8%D18E%DD%40M%F2KZ%EBU%60%F4%60m%DCir%C8%16(%C8%19*%CE%255%F1%3FR%F1%3FS%E6%AB%B5%CA%5DI%CEn%5E%F7%A2%9A%C9G%3E%E0a%5B%F7%89%85%F5yy%F6%82%80%ED%82%80%FF%BF%BF%E3%C4%C4%FF%FF%FF%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%25%00%2C%00%00%00%00%10%00%10%00%00%06p%C0%92pH%2C%1A%8F%C8%D2H%93%E1d4%23%E4%88%D3%09mB%1DN%B48%F5%90%40%60%92G%5B%94%20%3E%22%D2%87%24%FA%20%24%C5%06A%00%20%B1%07%02B%A38%89X.v%17%82%11%13q%10%0Fi%24%0F%8B%10%7BD%12%0Ei%09%92%09%0EpD%18%15%24%0A%9Ci%05%0C%18F%18%0B%07%04%01%04%06%A0H%18%12%0D%14%0D%12%A1I%B3%B4%B5IA%00%3B\");\n background-repeat: no-repeat;\n background-position: 4px center;\n}\n\n.ace_gutter-cell.ace_warning {\n background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%FF%DBr%FF%DE%81%FF%E2%8D%FF%E2%8F%FF%E4%96%FF%E3%97%FF%E5%9D%FF%E6%9E%FF%EE%C1%FF%C8Z%FF%CDk%FF%D0s%FF%D4%81%FF%D5%82%FF%D5%83%FF%DC%97%FF%DE%9D%FF%E7%B8%FF%CCl%7BQ%13%80U%15%82W%16%81U%16%89%5B%18%87%5B%18%8C%5E%1A%94d%1D%C5%83-%C9%87%2F%C6%84.%C6%85.%CD%8B2%C9%871%CB%8A3%CD%8B5%DC%98%3F%DF%9BB%E0%9CC%E1%A5U%CB%871%CF%8B5%D1%8D6%DB%97%40%DF%9AB%DD%99B%E3%B0p%E7%CC%AE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2F%00%2C%00%00%00%00%10%00%10%00%00%06a%C0%97pH%2C%1A%8FH%A1%ABTr%25%87%2B%04%82%F4%7C%B9X%91%08%CB%99%1C!%26%13%84*iJ9(%15G%CA%84%14%01%1A%97%0C%03%80%3A%9A%3E%81%84%3E%11%08%B1%8B%20%02%12%0F%18%1A%0F%0A%03'F%1C%04%0B%10%16%18%10%0B%05%1CF%1D-%06%07%9A%9A-%1EG%1B%A0%A1%A0U%A4%A5%A6BA%00%3B\");\n background-repeat: no-repeat;\n background-position: 4px center;\n}\n\n.ace_editor .ace_sb {\n position: absolute;\n overflow-x: hidden;\n overflow-y: scroll;\n right: 0;\n}\n\n.ace_editor .ace_sb div {\n position: absolute;\n width: 1px;\n left: 0;\n}\n\n.ace_editor .ace_print_margin_layer {\n z-index: 0;\n position: absolute;\n overflow: hidden;\n margin: 0;\n left: 0;\n height: 100%;\n width: 100%;\n}\n\n.ace_editor .ace_print_margin {\n position: absolute;\n height: 100%;\n}\n\n.ace_editor textarea {\n position: fixed;\n z-index: -1;\n width: 10px;\n height: 30px;\n opacity: 0;\n background: transparent;\n appearance: none;\n -moz-appearance: none;\n border: none;\n resize: none;\n outline: none;\n overflow: hidden;\n}\n\n.ace_layer {\n z-index: 1;\n position: absolute;\n overflow: hidden;\n white-space: nowrap;\n height: 100%;\n width: 100%;\n}\n\n.ace_text-layer {\n color: black;\n}\n\n.ace_cjk {\n display: inline-block;\n text-align: center;\n}\n\n.ace_cursor-layer {\n z-index: 4;\n}\n\n.ace_cursor {\n z-index: 4;\n position: absolute;\n}\n\n.ace_cursor.ace_hidden {\n opacity: 0.2;\n}\n\n.ace_line {\n white-space: nowrap;\n}\n\n.ace_marker-layer .ace_step {\n position: absolute;\n z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n position: absolute;\n z-index: 4;\n}\n\n.ace_marker-layer .ace_bracket {\n position: absolute;\n z-index: 5;\n}\n\n.ace_marker-layer .ace_active_line {\n position: absolute;\n z-index: 2;\n}\n\n.ace_marker-layer .ace_selected_word {\n position: absolute;\n z-index: 6;\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n cursor: pointer;\n pointer-events: auto;\n color: darkred;\n}\n\n.ace_fold:hover{\n background: gold!important;\n}\n\n.ace_dragging .ace_content {\n cursor: move;\n}\n"),define("text!build/demo/styles.css",[],"html {\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\nbody {\n overflow: hidden;\n margin: 0;\n padding: 0;\n height: 100%;\n width: 100%;\n font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif;\n font-size: 12px;\n background: rgb(14, 98, 165);\n color: white;\n}\n\n#logo {\n padding: 15px;\n margin-left: 70px;\n}\n\n#editor {\n position: absolute;\n top: 0px;\n left: 300px;\n bottom: 0px;\n right: 0px;\n background: white;\n}\n\n#controls {\n padding: 5px;\n}\n\n#controls td {\n text-align: right;\n}\n\n#controls td + td {\n text-align: left;\n}"),define("text!build_support/style.css",[],"body {\n margin:0;\n padding:0;\n background-color:#e6f5fc;\n \n}\n\nH2, H3, H4 {\n font-family:Trebuchet MS;\n font-weight:bold;\n margin:0;\n padding:0;\n}\n\nH2 {\n font-size:28px;\n color:#263842;\n padding-bottom:6px;\n}\n\nH3 {\n font-family:Trebuchet MS;\n font-weight:bold;\n font-size:22px;\n color:#253741;\n margin-top:43px;\n margin-bottom:8px;\n}\n\nH4 {\n font-family:Trebuchet MS;\n font-weight:bold;\n font-size:21px;\n color:#222222;\n margin-bottom:4px;\n}\n\nP {\n padding:13px 0;\n margin:0;\n line-height:22px;\n}\n\nUL{\n line-height : 22px;\n}\n\nPRE{\n background : #333;\n color : white;\n padding : 10px;\n}\n\n#header {\n height : 227px;\n position:relative;\n overflow:hidden;\n background: url(images/background.png) repeat-x 0 0;\n border-bottom:1px solid #c9e8fa; \n}\n\n#header .content .signature {\n font-family:Trebuchet MS;\n font-size:11px;\n color:#ebe4d6;\n position:absolute;\n bottom:5px;\n right:42px;\n letter-spacing : 1px;\n}\n\n.content {\n width:970px;\n position:relative;\n overflow:hidden;\n margin:0 auto;\n}\n\n#header .content {\n height:184px;\n margin-top:22px;\n}\n\n#header .content .logo {\n width : 282px;\n height : 184px;\n background:url(images/logo.png) no-repeat 0 0;\n position:absolute;\n top:0;\n left:0;\n}\n\n#header .content .title {\n width : 605px;\n height : 58px;\n background:url(images/ace.png) no-repeat 0 0;\n position:absolute;\n top:98px;\n left:329px;\n}\n\n#wrapper {\n background:url(images/body_background.png) repeat-x 0 0;\n min-height:250px;\n}\n\n#wrapper .content {\n font-family:Arial;\n font-size:14px;\n color:#222222;\n width:1000px;\n}\n\n#wrapper .content .column1 {\n position:relative;\n overflow:hidden;\n float:left;\n width:315px;\n margin-right:31px;\n}\n\n#wrapper .content .column2 {\n position:relative;\n overflow:hidden;\n float:left;\n width:600px;\n padding-top:47px;\n}\n\n.fork_on_github {\n width:310px;\n height:80px;\n background:url(images/fork_on_github.png) no-repeat 0 0;\n position:relative;\n overflow:hidden;\n margin-top:49px;\n cursor:pointer;\n}\n\n.fork_on_github:hover {\n background-position:0 -80px;\n}\n\n.divider {\n height:3px;\n background-color:#bedaea;\n margin-bottom:3px;\n}\n\n.menu {\n padding:23px 0 0 24px;\n}\n\nUL.content-list {\n padding:15px;\n margin:0;\n}\n\nUL.menu-list {\n padding:0;\n margin:0 0 20px 0;\n list-style-type:none;\n line-height : 16px;\n}\n\nUL.menu-list LI {\n color:#2557b4;\n font-family:Trebuchet MS;\n font-size:14px;\n padding:7px 0;\n border-bottom:1px dotted #d6e2e7;\n}\n\nUL.menu-list LI:last-child {\n border-bottom:0;\n}\n\nA {\n color:#2557b4;\n text-decoration:none;\n}\n\nA:hover {\n text-decoration:underline;\n}\n\nP#first{\n background : rgba(255,255,255,0.5);\n padding : 20px;\n font-size : 16px;\n line-height : 24px;\n margin : 0 0 20px 0;\n}\n\n#footer {\n height:40px;\n position:relative;\n overflow:hidden;\n background:url(images/bottombar.png) repeat-x 0 0;\n position:relative;\n margin-top:40px;\n}\n\nUL.menu-footer {\n padding:0;\n margin:8px 11px 0 0;\n list-style-type:none;\n float:right;\n}\n\nUL.menu-footer LI {\n color:white;\n font-family:Arial;\n font-size:12px;\n display:inline-block;\n margin:0 1px;\n}\n\nUL.menu-footer LI A {\n color:#8dd0ff;\n text-decoration:none;\n}\n\nUL.menu-footer LI A:hover {\n text-decoration:underline;\n}\n\n\n\n\n"),define("text!demo/docs/css.css",[],'.text-layer {\n font-family: Monaco, "Courier New", monospace;\n font-size: 12px;\n cursor: text;\n}'),define("text!demo/styles.css",[],"html {\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\nbody {\n overflow: hidden;\n margin: 0;\n padding: 0;\n height: 100%;\n width: 100%;\n font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif;\n font-size: 12px;\n background: rgb(14, 98, 165);\n color: white;\n}\n\n#logo {\n padding: 15px;\n margin-left: 70px;\n}\n\n#editor {\n position: absolute;\n top: 0px;\n left: 300px;\n bottom: 0px;\n right: 0px;\n background: white;\n}\n\n#controls {\n padding: 5px;\n}\n\n#controls td {\n text-align: right;\n}\n\n#controls td + td {\n text-align: left;\n}"),define("text!deps/csslint/demos/demo.css",[],'@charset "UTF-8";\n\n@import url("booya.css") print,screen;\n@import "whatup.css" screen;\n@import "wicked.css";\n\n@namespace "http://www.w3.org/1999/xhtml";\n@namespace svg "http://www.w3.org/2000/svg";\n\nli.inline #foo {\n background: url("something.png");\n display: inline;\n padding-left: 3px;\n padding-right: 7px;\n border-right: 1px dotted #066;\n}\n\nli.last.first {\n display: inline;\n padding-left: 3px !important;\n padding-right: 3px;\n border-right: 0px;\n}\n\n@media print {\n li.inline {\n color: black;\n }\n\n\n@charset "UTF-8"; \n\n@page {\n margin: 10%;\n counter-increment: page;\n\n @top-center {\n font-family: sans-serif;\n font-weight: bold;\n font-size: 2em;\n content: counter(page);\n }\n}'),define("text!doc/site/iphone.css",[],"#wrapper {\n position:relative;\n overflow:hidden;\n}\n\n#wrapper .content .column1 {\n margin:0 16px 0 15px;\n}\n\n#header .content .signature {\n font-size:18px;\n bottom:0;\n}\n\nUL.menu-list LI {\n font-size:22px;\n}\n\nUL.menu-footer LI {\n font-size:22px;\n}\n\nPRE{\n font-size:22px;\n}\n"),define("text!doc/site/style.css",[],"body {\n margin:0;\n padding:0;\n background-color:#e6f5fc;\n \n}\n\nH2, H3, H4 {\n font-family:Trebuchet MS;\n font-weight:bold;\n margin:0;\n padding:0;\n}\n\nH2 {\n font-size:28px;\n color:#263842;\n padding-bottom:6px;\n}\n\nH3 {\n font-family:Trebuchet MS;\n font-weight:bold;\n font-size:22px;\n color:#253741;\n margin-top:43px;\n margin-bottom:8px;\n}\n\nH4 {\n font-family:Trebuchet MS;\n font-weight:bold;\n font-size:21px;\n color:#222222;\n margin-bottom:4px;\n}\n\nP {\n padding:13px 0;\n margin:0;\n line-height:22px;\n}\n\nUL{\n line-height : 22px;\n}\n\nPRE{\n background : #333;\n color : white;\n padding : 10px;\n}\n\n#header {\n height : 227px;\n position:relative;\n overflow:hidden;\n background: url(images/background.png) repeat-x 0 0;\n border-bottom:1px solid #c9e8fa; \n}\n\n#header .content .signature {\n font-family:Trebuchet MS;\n font-size:11px;\n color:#ebe4d6;\n position:absolute;\n bottom:5px;\n right:42px;\n letter-spacing : 1px;\n}\n\n.content {\n width:970px;\n position:relative;\n overflow:hidden;\n margin:0 auto;\n}\n\n#header .content {\n height:184px;\n margin-top:22px;\n}\n\n#header .content .logo {\n width : 282px;\n height : 184px;\n background:url(images/logo.png) no-repeat 0 0;\n position:absolute;\n top:0;\n left:0;\n}\n\n#header .content .title {\n width : 605px;\n height : 58px;\n background:url(images/ace.png) no-repeat 0 0;\n position:absolute;\n top:98px;\n left:329px;\n}\n\n#wrapper {\n background:url(images/body_background.png) repeat-x 0 0;\n min-height:250px;\n}\n\n#wrapper .content {\n font-family:Arial;\n font-size:14px;\n color:#222222;\n width:1000px;\n}\n\n#wrapper .content .column1 {\n position:relative;\n overflow:hidden;\n float:left;\n width:315px;\n margin-right:31px;\n}\n\n#wrapper .content .column2 {\n position:relative;\n overflow:hidden;\n float:left;\n width:600px;\n padding-top:47px;\n}\n\n.fork_on_github {\n width:310px;\n height:80px;\n background:url(images/fork_on_github.png) no-repeat 0 0;\n position:relative;\n overflow:hidden;\n margin-top:49px;\n cursor:pointer;\n}\n\n.fork_on_github:hover {\n background-position:0 -80px;\n}\n\n.divider {\n height:3px;\n background-color:#bedaea;\n margin-bottom:3px;\n}\n\n.menu {\n padding:23px 0 0 24px;\n}\n\nUL.content-list {\n padding:15px;\n margin:0;\n}\n\nUL.menu-list {\n padding:0;\n margin:0 0 20px 0;\n list-style-type:none;\n line-height : 16px;\n}\n\nUL.menu-list LI {\n color:#2557b4;\n font-family:Trebuchet MS;\n font-size:14px;\n padding:7px 0;\n border-bottom:1px dotted #d6e2e7;\n}\n\nUL.menu-list LI:last-child {\n border-bottom:0;\n}\n\nA {\n color:#2557b4;\n text-decoration:none;\n}\n\nA:hover {\n text-decoration:underline;\n}\n\nP#first{\n background : rgba(255,255,255,0.5);\n padding : 20px;\n font-size : 16px;\n line-height : 24px;\n margin : 0 0 20px 0;\n}\n\n#footer {\n height:40px;\n position:relative;\n overflow:hidden;\n background:url(images/bottombar.png) repeat-x 0 0;\n position:relative;\n margin-top:40px;\n}\n\nUL.menu-footer {\n padding:0;\n margin:8px 11px 0 0;\n list-style-type:none;\n float:right;\n}\n\nUL.menu-footer LI {\n color:white;\n font-family:Arial;\n font-size:12px;\n display:inline-block;\n margin:0 1px;\n}\n\nUL.menu-footer LI A {\n color:#8dd0ff;\n text-decoration:none;\n}\n\nUL.menu-footer LI A:hover {\n text-decoration:underline;\n}\n\n\n\n\n"),define("text!lib/ace/css/editor.css",[],"@import url(//fonts.googleapis.com/css?family=Droid+Sans+Mono);\n\n\n.ace_editor {\n position: absolute;\n overflow: hidden;\n font-family: 'Monaco', 'Menlo', 'Droid Sans Mono', 'Courier New', monospace;\n font-size: 12px;\n}\n\n.ace_scroller {\n position: absolute;\n overflow-x: scroll;\n overflow-y: hidden;\n}\n\n.ace_content {\n position: absolute;\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n cursor: text;\n}\n\n/* setting pointer-events: auto; on node under the mouse, which changes during scroll,\n will break mouse wheel scrolling in Safari */\n.ace_content * {\n pointer-events: none;\n}\n\n.ace_composition {\n position: absolute;\n background: #555;\n color: #DDD;\n z-index: 4;\n}\n\n.ace_gutter {\n position: absolute;\n overflow-x: hidden;\n overflow-y: hidden;\n height: 100%;\n}\n\n.ace_gutter-cell.ace_error {\n background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%F5or%F5%87%88%F5nr%F4ns%EBmq%F5z%7F%DDJT%DEKS%DFOW%F1Yc%F2ah%CE(7%CE)8%D18E%DD%40M%F2KZ%EBU%60%F4%60m%DCir%C8%16(%C8%19*%CE%255%F1%3FR%F1%3FS%E6%AB%B5%CA%5DI%CEn%5E%F7%A2%9A%C9G%3E%E0a%5B%F7%89%85%F5yy%F6%82%80%ED%82%80%FF%BF%BF%E3%C4%C4%FF%FF%FF%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%25%00%2C%00%00%00%00%10%00%10%00%00%06p%C0%92pH%2C%1A%8F%C8%D2H%93%E1d4%23%E4%88%D3%09mB%1DN%B48%F5%90%40%60%92G%5B%94%20%3E%22%D2%87%24%FA%20%24%C5%06A%00%20%B1%07%02B%A38%89X.v%17%82%11%13q%10%0Fi%24%0F%8B%10%7BD%12%0Ei%09%92%09%0EpD%18%15%24%0A%9Ci%05%0C%18F%18%0B%07%04%01%04%06%A0H%18%12%0D%14%0D%12%A1I%B3%B4%B5IA%00%3B\");\n background-repeat: no-repeat;\n background-position: 4px center;\n}\n\n.ace_gutter-cell.ace_warning {\n background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%FF%DBr%FF%DE%81%FF%E2%8D%FF%E2%8F%FF%E4%96%FF%E3%97%FF%E5%9D%FF%E6%9E%FF%EE%C1%FF%C8Z%FF%CDk%FF%D0s%FF%D4%81%FF%D5%82%FF%D5%83%FF%DC%97%FF%DE%9D%FF%E7%B8%FF%CCl%7BQ%13%80U%15%82W%16%81U%16%89%5B%18%87%5B%18%8C%5E%1A%94d%1D%C5%83-%C9%87%2F%C6%84.%C6%85.%CD%8B2%C9%871%CB%8A3%CD%8B5%DC%98%3F%DF%9BB%E0%9CC%E1%A5U%CB%871%CF%8B5%D1%8D6%DB%97%40%DF%9AB%DD%99B%E3%B0p%E7%CC%AE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2F%00%2C%00%00%00%00%10%00%10%00%00%06a%C0%97pH%2C%1A%8FH%A1%ABTr%25%87%2B%04%82%F4%7C%B9X%91%08%CB%99%1C!%26%13%84*iJ9(%15G%CA%84%14%01%1A%97%0C%03%80%3A%9A%3E%81%84%3E%11%08%B1%8B%20%02%12%0F%18%1A%0F%0A%03'F%1C%04%0B%10%16%18%10%0B%05%1CF%1D-%06%07%9A%9A-%1EG%1B%A0%A1%A0U%A4%A5%A6BA%00%3B\");\n background-repeat: no-repeat;\n background-position: 4px center;\n}\n\n.ace_editor .ace_sb {\n position: absolute;\n overflow-x: hidden;\n overflow-y: scroll;\n right: 0;\n}\n\n.ace_editor .ace_sb div {\n position: absolute;\n width: 1px;\n left: 0;\n}\n\n.ace_editor .ace_print_margin_layer {\n z-index: 0;\n position: absolute;\n overflow: hidden;\n margin: 0;\n left: 0;\n height: 100%;\n width: 100%;\n}\n\n.ace_editor .ace_print_margin {\n position: absolute;\n height: 100%;\n}\n\n.ace_editor textarea {\n position: fixed;\n z-index: -1;\n width: 10px;\n height: 30px;\n opacity: 0;\n background: transparent;\n appearance: none;\n -moz-appearance: none;\n border: none;\n resize: none;\n outline: none;\n overflow: hidden;\n}\n\n.ace_layer {\n z-index: 1;\n position: absolute;\n overflow: hidden;\n white-space: nowrap;\n height: 100%;\n width: 100%;\n}\n\n.ace_text-layer {\n color: black;\n}\n\n.ace_cjk {\n display: inline-block;\n text-align: center;\n}\n\n.ace_cursor-layer {\n z-index: 4;\n}\n\n.ace_cursor {\n z-index: 4;\n position: absolute;\n}\n\n.ace_cursor.ace_hidden {\n opacity: 0.2;\n}\n\n.ace_line {\n white-space: nowrap;\n}\n\n.ace_marker-layer .ace_step {\n position: absolute;\n z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n position: absolute;\n z-index: 4;\n}\n\n.ace_marker-layer .ace_bracket {\n position: absolute;\n z-index: 5;\n}\n\n.ace_marker-layer .ace_active_line {\n position: absolute;\n z-index: 2;\n}\n\n.ace_marker-layer .ace_selected_word {\n position: absolute;\n z-index: 6;\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n cursor: pointer;\n pointer-events: auto;\n color: darkred;\n}\n\n.ace_fold:hover{\n background: gold!important;\n}\n\n.ace_dragging .ace_content {\n cursor: move;\n}\n"),define("text!node_modules/uglify-js/docstyle.css",[],'html { font-family: "Lucida Grande","Trebuchet MS",sans-serif; font-size: 12pt; }\nbody { max-width: 60em; }\n.title { text-align: center; }\n.todo { color: red; }\n.done { color: green; }\n.tag { background-color:lightblue; font-weight:normal }\n.target { }\n.timestamp { color: grey }\n.timestamp-kwd { color: CadetBlue }\np.verse { margin-left: 3% }\npre {\n border: 1pt solid #AEBDCC;\n background-color: #F3F5F7;\n padding: 5pt;\n font-family: monospace;\n font-size: 90%;\n overflow:auto;\n}\npre.src {\n background-color: #eee; color: #112; border: 1px solid #000;\n}\ntable { border-collapse: collapse; }\ntd, th { vertical-align: top; }\ndt { font-weight: bold; }\ndiv.figure { padding: 0.5em; }\ndiv.figure p { text-align: center; }\n.linenr { font-size:smaller }\n.code-highlighted {background-color:#ffff00;}\n.org-info-js_info-navigation { border-style:none; }\n#org-info-js_console-label { font-size:10px; font-weight:bold;\n white-space:nowrap; }\n.org-info-js_search-highlight {background-color:#ffff00; color:#000000;\n font-weight:bold; }\n\nsup {\n vertical-align: baseline;\n position: relative;\n top: -0.5em;\n font-size: 80%;\n}\n\nsup a:link, sup a:visited {\n text-decoration: none;\n color: #c00;\n}\n\nsup a:before { content: "["; color: #999; }\nsup a:after { content: "]"; color: #999; }\n\nh1.title { border-bottom: 4px solid #000; padding-bottom: 5px; margin-bottom: 2em; }\n\n#postamble {\n color: #777;\n font-size: 90%;\n padding-top: 1em; padding-bottom: 1em; border-top: 1px solid #999;\n margin-top: 2em;\n padding-left: 2em;\n padding-right: 2em;\n text-align: right;\n}\n\n#postamble p { margin: 0; }\n\n#footnotes { border-top: 1px solid #000; }\n\nh1 { font-size: 200% }\nh2 { font-size: 175% }\nh3 { font-size: 150% }\nh4 { font-size: 125% }\n\nh1, h2, h3, h4 { font-family: "Bookman",Georgia,"Times New Roman",serif; font-weight: normal; }\n\n@media print {\n html { font-size: 11pt; }\n}\n'),define("text!support/cockpit/lib/cockpit/ui/cli_view.css",[],"\n#cockpitInput { padding-left: 16px; }\n\n.cptOutput { overflow: auto; position: absolute; z-index: 999; display: none; }\n\n.cptCompletion { padding: 0; position: absolute; z-index: -1000; }\n.cptCompletion.VALID { background: #FFF; }\n.cptCompletion.INCOMPLETE { background: #DDD; }\n.cptCompletion.INVALID { background: #DDD; }\n.cptCompletion span { color: #FFF; }\n.cptCompletion span.INCOMPLETE { color: #DDD; border-bottom: 2px dotted #F80; }\n.cptCompletion span.INVALID { color: #DDD; border-bottom: 2px dotted #F00; }\nspan.cptPrompt { color: #66F; font-weight: bold; }\n\n\n.cptHints {\n color: #000;\n position: absolute;\n border: 1px solid rgba(230, 230, 230, 0.8);\n background: rgba(250, 250, 250, 0.8);\n -moz-border-radius-topleft: 10px;\n -moz-border-radius-topright: 10px;\n border-top-left-radius: 10px; border-top-right-radius: 10px;\n z-index: 1000;\n padding: 8px;\n display: none;\n}\n\n.cptFocusPopup { display: block; }\n.cptFocusPopup.cptNoPopup { display: none; }\n\n.cptHints ul { margin: 0; padding: 0 15px; }\n\n.cptGt { font-weight: bold; font-size: 120%; }\n"),define("text!support/cockpit/lib/cockpit/ui/request_view.css",[],"\n.cptRowIn {\n display: box; display: -moz-box; display: -webkit-box;\n box-orient: horizontal; -moz-box-orient: horizontal; -webkit-box-orient: horizontal;\n box-align: center; -moz-box-align: center; -webkit-box-align: center;\n color: #333;\n background-color: #EEE;\n width: 100%;\n font-family: consolas, courier, monospace;\n}\n.cptRowIn > * { padding-left: 2px; padding-right: 2px; }\n.cptRowIn > img { cursor: pointer; }\n.cptHover { display: none; }\n.cptRowIn:hover > .cptHover { display: block; }\n.cptRowIn:hover > .cptHover.cptHidden { display: none; }\n.cptOutTyped {\n box-flex: 1; -moz-box-flex: 1; -webkit-box-flex: 1;\n font-weight: bold; color: #000; font-size: 120%;\n}\n.cptRowOutput { padding-left: 10px; line-height: 1.2em; }\n.cptRowOutput strong,\n.cptRowOutput b,\n.cptRowOutput th,\n.cptRowOutput h1,\n.cptRowOutput h2,\n.cptRowOutput h3 { color: #000; }\n.cptRowOutput a { font-weight: bold; color: #666; text-decoration: none; }\n.cptRowOutput a: hover { text-decoration: underline; cursor: pointer; }\n.cptRowOutput input[type=password],\n.cptRowOutput input[type=text],\n.cptRowOutput textarea {\n color: #000; font-size: 120%;\n background: transparent; padding: 3px;\n border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;\n}\n.cptRowOutput table,\n.cptRowOutput td,\n.cptRowOutput th { border: 0; padding: 0 2px; }\n.cptRowOutput .right { text-align: right; }\n"),define("text!tool/Theme.tmpl.css",[],".%cssClass% .ace_editor {\n border: 2px solid rgb(159, 159, 159);\n}\n\n.%cssClass% .ace_editor.ace_focus {\n border: 2px solid #327fbd;\n}\n\n.%cssClass% .ace_gutter {\n width: 50px;\n background: #e8e8e8;\n color: #333;\n overflow : hidden;\n}\n\n.%cssClass% .ace_gutter-layer {\n width: 100%;\n text-align: right;\n}\n\n.%cssClass% .ace_gutter-layer .ace_gutter-cell {\n padding-right: 6px;\n}\n\n.%cssClass% .ace_print_margin {\n width: 1px;\n background: %printMargin%;\n}\n\n.%cssClass% .ace_scroller {\n background-color: %background%;\n}\n\n.%cssClass% .ace_text-layer {\n cursor: text;\n color: %foreground%;\n}\n\n.%cssClass% .ace_cursor {\n border-left: 2px solid %cursor%;\n}\n\n.%cssClass% .ace_cursor.ace_overwrite {\n border-left: 0px;\n border-bottom: 1px solid %overwrite%;\n}\n \n.%cssClass% .ace_marker-layer .ace_selection {\n background: %selection%;\n}\n\n.%cssClass% .ace_marker-layer .ace_step {\n background: %step%;\n}\n\n.%cssClass% .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid %bracket%;\n}\n\n.%cssClass% .ace_marker-layer .ace_active_line {\n background: %active_line%;\n}\n\n \n.%cssClass% .ace_invisible {\n %invisible%\n}\n\n.%cssClass% .ace_keyword {\n %keyword%\n}\n\n.%cssClass% .ace_keyword.ace_operator {\n %keyword.operator%\n}\n\n.%cssClass% .ace_constant {\n %constant%\n}\n\n.%cssClass% .ace_constant.ace_language {\n %constant.language%\n}\n\n.%cssClass% .ace_constant.ace_library {\n %constant.library%\n}\n\n.%cssClass% .ace_constant.ace_numeric {\n %constant.numeric%\n}\n\n.%cssClass% .ace_invalid {\n %invalid%\n}\n\n.%cssClass% .ace_invalid.ace_illegal {\n %invalid.illegal%\n}\n\n.%cssClass% .ace_invalid.ace_deprecated {\n %invalid.deprecated%\n}\n\n.%cssClass% .ace_support {\n %support%\n}\n\n.%cssClass% .ace_support.ace_function {\n %support.function%\n}\n\n.%cssClass% .ace_function.ace_buildin {\n %function.buildin%\n}\n\n.%cssClass% .ace_string {\n %string%\n}\n\n.%cssClass% .ace_string.ace_regexp {\n %string.regexp%\n}\n\n.%cssClass% .ace_comment {\n %comment%\n}\n\n.%cssClass% .ace_comment.ace_doc {\n %comment.doc%\n}\n\n.%cssClass% .ace_comment.ace_doc.ace_tag {\n %comment.doc.tag%\n}\n\n.%cssClass% .ace_variable {\n %variable%\n}\n\n.%cssClass% .ace_variable.ace_language {\n %variable.language%\n}\n\n.%cssClass% .ace_xml_pe {\n %xml_pe%\n}\n\n.%cssClass% .ace_meta {\n %meta%\n}\n\n.%cssClass% .ace_meta.ace_tag {\n %meta.tag%\n}\n\n.%cssClass% .ace_meta.ace_tag.ace_input {\n %ace.meta.tag.input%\n}\n\n.%cssClass% .ace_entity.ace_other.ace_attribute-name {\n %entity.other.attribute-name%\n}\n\n.%cssClass% .ace_entity.ace_name {\n %entity.name%\n}\n\n.%cssClass% .ace_entity.ace_name.ace_function {\n %entity.name.function%\n}\n\n.%cssClass% .ace_markup.ace_underline {\n text-decoration:underline;\n}\n\n.%cssClass% .ace_markup.ace_heading {\n %markup.heading%\n}\n\n.%cssClass% .ace_markup.ace_heading.ace_1 {\n %markup.heading.1%\n}\n\n.%cssClass% .ace_markup.ace_heading.ace_2 {\n %markup.heading.2%\n}\n\n.%cssClass% .ace_markup.ace_heading.ace_3 {\n %markup.heading.3%\n}\n\n.%cssClass% .ace_markup.ace_heading.ace_4 {\n %markup.heading.4%\n}\n\n.%cssClass% .ace_markup.ace_heading.ace_5 {\n %markup.heading.5%\n}\n\n.%cssClass% .ace_markup.ace_heading.ace_6 {\n %markup.heading.6%\n}\n\n.%cssClass% .ace_markup.ace_list {\n %markup.list%\n}\n\n.%cssClass% .ace_collab.ace_user1 {\n %collab.user1% \n}"),define("text!docs/css.css",[],'.text-layer {\n font-family: Monaco, "Courier New", monospace;\n font-size: 12px;\n cursor: text;\n}'),define("text!styles.css",[],"html {\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\nbody {\n overflow: hidden;\n margin: 0;\n padding: 0;\n height: 100%;\n width: 100%;\n font-family: Arial, Helvetica, sans-serif, Tahoma, Verdana, sans-serif;\n font-size: 12px;\n background: rgb(14, 98, 165);\n color: white;\n}\n\n#logo {\n padding: 15px;\n margin-left: 70px;\n}\n\n#editor {\n position: absolute;\n top: 0px;\n left: 300px;\n bottom: 0px;\n right: 0px;\n background: white;\n}\n\n#controls {\n padding: 5px;\n}\n\n#controls td {\n text-align: right;\n}\n\n#controls td + td {\n text-align: left;\n}"),require(["ace/ace"],function(a){window.ace=a}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/keybinding-vim.js0000664000000000000000000000565300000000000023470 0ustar00rootroot00000000000000define("ace/keyboard/keybinding/vim",["require","exports","module","ace/keyboard/state_handler"],function(a,b,c){var d=a("ace/keyboard/state_handler").StateHandler,e=a("ace/keyboard/state_handler").matchCharacterOnly,f=function(a,b,c){return{regex:["([0-9]*)",a],exec:b,params:[{name:"times",match:1,type:"number",defaultValue:1}],then:c}},g={start:[{key:"i",then:"insertMode"},{key:"d",then:"deleteMode"},{key:"a",exec:"gotoright",then:"insertMode"},{key:"shift-i",exec:"gotolinestart",then:"insertMode"},{key:"shift-a",exec:"gotolineend",then:"insertMode"},{key:"shift-c",exec:"removetolineend",then:"insertMode"},{key:"shift-r",exec:"overwrite",then:"replaceMode"},f("(k|up)","golineup"),f("(j|down)","golinedown"),f("(l|right)","golineright"),f("(h|left)","golineleft"),{key:"shift-g",exec:"gotoend"},f("b","gotowordleft"),f("e","gotowordright"),f("x","del"),f("shift-x","backspace"),f("shift-d","removetolineend"),f("u","undo"),{comment:"Catch some keyboard input to stop it here",match:e}],insertMode:[{key:"esc",then:"start"}],replaceMode:[{key:"esc",exec:"overwrite",then:"start"}],deleteMode:[{key:"d",exec:"removeline",then:"start"}]};b.Vim=new d(g)}),define("ace/keyboard/state_handler",["require","exports","module"],function(a,b,c){function e(a){this.keymapping=this.$buildKeymappingRegex(a)}var d=!1;e.prototype={$buildKeymappingRegex:function(a){for(state in a)this.$buildBindingsRegex(a[state]);return a},$buildBindingsRegex:function(a){a.forEach(function(a){a.key?a.key=new RegExp("^"+a.key+"$"):Array.isArray(a.regex)?("key"in a||(a.key=new RegExp("^"+a.regex[1]+"$")),a.regex=new RegExp(a.regex.join("")+"$")):a.regex&&(a.regex=new RegExp(a.regex+"$"))})},$composeBuffer:function(a,b,c){if(a.state==null||a.buffer==null)a.state="start",a.buffer="";var d=[];b&1&&d.push("ctrl"),b&8&&d.push("command"),b&2&&d.push("option"),b&4&&d.push("shift"),c&&d.push(c);var e=d.join("-"),f=a.buffer+e;return b!=2&&(a.buffer=f),{bufferToUse:f,symbolicName:e}},$find:function(a,b,c,e,f){var g={};return this.keymapping[a.state].some(function(h){var i;if(h.key&&!h.key.test(c))return!1;if(h.regex&&!(i=h.regex.exec(b)))return!1;if(h.match&&!h.match(b,e,f,c))return!1;if(h.disallowMatches)for(var j=0;j"},{token:"keyword",regex:"(?:#include|#pragma|#line|#define|#undef|#ifdef|#else|#elif|#endif|#ifndef)"},{token:function(c){return c=="this"?"variable.language":a.hasOwnProperty(c)?"keyword":b.hasOwnProperty(c)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.c_cppHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","pilot/oop","ace/mode/behaviour"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/mode-clojure.js0000664000000000000000000001741100000000000023134 0ustar00rootroot00000000000000define("ace/mode/clojure",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/clojure_highlight_rules","ace/mode/matching_parens_outdent","ace/range"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/clojure_highlight_rules").ClojureHighlightRules,h=a("ace/mode/matching_parens_outdent").MatchingParensOutdent,i=a("ace/range").Range,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)#/;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,";")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=d,f=this.$tokenizer.getLineTokens(b,a),g=f.tokens,h=f.state;if(g.length&&g[g.length-1].type=="comment")return d;if(a=="start"){var i=b.match(/[\(\[]/);i&&(d+=" "),i=b.match(/[\)]/),i&&(d="")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(j.prototype),b.Mode=j}),define("ace/mode/clojure_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){var a=e.arrayToMap("* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* *compile-path* *e *err* *file* *flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* *source-path* *use-context-classloader* *warn-on-reflection* + - -> -> ->> ->> .. / < < <= <= = == > > >= >= accessor aclone add-classpath add-watch agent agent-errors aget alength alias all-ns alter alter-meta! alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 bases bean bigdec bigint binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* butlast byte byte-array bytes cast char char-array char-escape-string char-name-string char? chars chunk chunk-append chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement concat cond condp conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec decimal? declare definline defmacro defmethod defmulti defn defn- defonce defstruct delay delay? deliver deref derive descendants destructure disj disj! dissoc dissoc! distinct distinct? doall doc dorun doseq dosync dotimes doto double double-array doubles drop drop-last drop-while empty empty? ensure enumeration-seq eval even? every? false? ffirst file-seq filter find find-doc find-ns find-var first float float-array float? floats flush fn fn? fnext for force format future future-call future-cancel future-cancelled? future-done? future? gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator hash hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc init-proxy instance? int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array make-hierarchy map map? mapcat max max-key memfn memoize merge merge-with meta method-sig methods min min-key mod name namespace neg? newline next nfirst nil? nnext not not-any? not-empty not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? or parents partial partition pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers primitives-classnames print print-ctor print-doc print-dup print-method print-namespace-doc print-simple print-special-doc print-str printf println println-str prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot rand rand-int range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern re-seq read read-line read-string reduce ref ref-history-count ref-max-history ref-min-history ref-set refer refer-clojure release-pending-sends rem remove remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq rsubseq second select-keys send send-off seq seq? seque sequence sequential? set set-validator! set? short short-array shorts shutdown-agents slurp some sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? special-form-anchor special-symbol? split-at split-with str stream? string? struct struct-map subs subseq subvec supers swap! symbol symbol? sync syntax-symbol-anchor take take-last take-nth take-while test the-ns time to-array to-array-2d trampoline transient tree-seq true? type unchecked-add unchecked-dec unchecked-divide unchecked-inc unchecked-multiply unchecked-negate unchecked-remainder unchecked-subtract underive unquote unquote-splicing update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector? when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context with-local-vars with-meta with-open with-out-str with-precision xml-seq zero? zipmap ".split(" ")),b=e.arrayToMap("def do fn if let loop monitor-enter monitor-exit new quote recur set! throw try var".split(" ")),c=e.arrayToMap("true false nil".split(" "));this.$rules={start:[{token:"comment",regex:";.*$"},{token:"comment",regex:"^=begin$",next:"comment"},{token:"keyword",regex:"[\\(|\\)]"},{token:"keyword",regex:"[\\'\\(]"},{token:"keyword",regex:"[\\[|\\]]"},{token:"keyword",regex:"[\\{|\\}|\\#\\{|\\#\\}]"},{token:"keyword",regex:"[\\&]"},{token:"keyword",regex:"[\\#\\^\\{]"},{token:"keyword",regex:"[\\%]"},{token:"keyword",regex:"[@]"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language",regex:"[!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+||=|!=|<=|>=|<>|<|>|!|&&]"},{token:function(d){return b.hasOwnProperty(d)?"keyword":c.hasOwnProperty(d)?"constant.language":a.hasOwnProperty(d)?"support.function":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"[:](?:[a-zA-Z]|d)+"},{token:"string.regexp",regex:'/#"(?:.|(\\")|[^""\n])*"/g'}],comment:[{token:"comment",regex:"^=end$",next:"start"},{token:"comment",merge:!0,regex:".+"}]}};d.inherits(g,f),b.ClojureHighlightRules=g}),define("ace/mode/matching_parens_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\)/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\))/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingParensOutdent=e}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/mode-coffee.js0000664000000000000000000001665000000000000022724 0ustar00rootroot00000000000000define("ace/mode/coffee",["require","exports","module","ace/tokenizer","ace/mode/coffee_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/text","ace/worker/worker_client","pilot/oop"],function(a,b,c){function k(){this.$tokenizer=new d((new e).getRules()),this.$outdent=new f}var d=a("ace/tokenizer").Tokenizer,e=a("ace/mode/coffee_highlight_rules").CoffeeHighlightRules,f=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,g=a("ace/range").Range,h=a("ace/mode/text").Mode,i=a("ace/worker/worker_client").WorkerClient,j=a("pilot/oop");j.inherits(k,h),function(){var a=/(?:[({[=:]|[-=]>|\b(?:else|switch|try|catch(?:\s*[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)?|finally))\s*$/,b=/^(\s*)#/,c=/^\s*###(?!#)/,d=/^\s*/;this.getNextLineIndent=function(b,c,d){var e=this.$getIndent(c),f=this.$tokenizer.getLineTokens(c,b).tokens;return(!f.length||f[f.length-1].type!=="comment")&&b==="start"&&a.test(c)&&(e+=d),e},this.toggleCommentLines=function(a,e,f,h){console.log("toggle");var i=new g(0,0,0,0);for(var j=f;j<=h;++j){var k=e.getLine(j);if(c.test(k))continue;b.test(k)?k=k.replace(b,"$1"):k=k.replace(d,"$&#"),i.end.row=i.start.row=j,i.end.column=k.length+1,e.replace(i,k)}},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new i(["ace","pilot"],"worker-coffee.js","ace/mode/coffee_worker","Worker");b.attachToDocument(a.getDocument()),b.on("error",function(b){a.setAnnotations([b.data])}),b.on("ok",function(b){a.clearAnnotations()})}}.call(k.prototype),b.Mode=k}),define("ace/mode/coffee_highlight_rules",["require","exports","module","pilot/lang","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){function g(){var a="[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*",b={token:"string",merge:!0,regex:".+"},c=d.arrayToMap("this|throw|then|try|typeof|super|switch|return|break|by)|continue|catch|class|in|instanceof|is|isnt|if|else|extends|for|forown|finally|function|while|when|new|not|delete|debugger|do|loop|of|off|or|on|unless|until|and|yes".split("|")),e=d.arrayToMap("true|false|null|undefined".split("|")),f=d.arrayToMap("case|const|default|function|var|void|with|enum|export|implements|interface|let|package|private|protected|public|static|yield|__hasProp|extends|slice|bind|indexOf".split("|")),g=d.arrayToMap("Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|RangeError|String|SyntaxError|Error|EvalError|TypeError|URIError".split("|")),h=d.arrayToMap("Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|encodeURIComponent|decodeURI|decodeURIComponent|RangeError|String|SyntaxError|Error|EvalError|TypeError|URIError".split("|"));this.$rules={start:[{token:"identifier",regex:"(?:(?:\\.|::)\\s*)"+a},{token:"variable",regex:"@"+a},{token:function(a){return c.hasOwnProperty(a)?"keyword":e.hasOwnProperty(a)?"constant.language":f.hasOwnProperty(a)?"invalid.illegal":g.hasOwnProperty(a)?"language.support.class":h.hasOwnProperty(a)?"language.support.function":"identifier"},regex:a},{token:"constant.numeric",regex:"(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)"},{token:"string",merge:!0,regex:"'''",next:"qdoc"},{token:"string",merge:!0,regex:'"""',next:"qqdoc"},{token:"string",merge:!0,regex:"'",next:"qstring"},{token:"string",merge:!0,regex:'"',next:"qqstring"},{token:"string",merge:!0,regex:"`",next:"js"},{token:"string.regex",merge:!0,regex:"///",next:"heregex"},{token:"string.regex",regex:"/(?!\\s)[^[/\\n\\\\]*(?: (?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[/\\n\\\\]*)*/[imgy]{0,4}(?!\\w)"},{token:"comment",merge:!0,regex:"###(?!#)",next:"comment"},{token:"comment",regex:"#.*"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\."},{token:"paren.lparen",regex:"[({[]"},{token:"paren.rparen",regex:"[\\]})]"},{token:"keyword.operator",regex:"\\S+"},{token:"text",regex:"\\s+"}],qdoc:[{token:"string",regex:".*?'''",next:"start"},b],qqdoc:[{token:"string",regex:'.*?"""',next:"start"},b],qstring:[{token:"string",regex:"[^\\\\']*(?:\\\\.[^\\\\']*)*'",next:"start"},b],qqstring:[{token:"string",regex:'[^\\\\"]*(?:\\\\.[^\\\\"]*)*"',next:"start"},b],js:[{token:"string",merge:!0,regex:"[^\\\\`]*(?:\\\\.[^\\\\`]*)*`",next:"start"},b],heregex:[{token:"string.regex",regex:".*?///[imgy]{0,4}",next:"start"},{token:"comment.regex",regex:"\\s+(?:#.*)?"},{token:"string.regex",merge:!0,regex:"\\S+"}],comment:[{token:"comment",regex:".*?###",next:"start"},{token:"comment",merge:!0,regex:".+"}]}}var d=a("pilot/lang"),e=a("pilot/oop"),f=a("ace/mode/text_highlight_rules").TextHighlightRules;e.inherits(g,f),b.CoffeeHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.changeListener=this.changeListener.bind(this);if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;j=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.CSharpHighlightRules=h}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","pilot/oop","ace/mode/behaviour"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/mode-css.js0000664000000000000000000002404300000000000022260 0ustar00rootroot00000000000000define("ace/mode/css",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/css_highlight_rules").CssHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/worker/worker_client").WorkerClient,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;if(e.length&&e[e.length-1].type=="comment")return d;var f=b.match(/^.*\{\s*$/);return f&&(d+=c),d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new i(["ace","pilot"],"worker-css.js","ace/mode/css_worker","Worker");b.attachToDocument(a.getDocument()),b.on("csslint",function(b){var c=[];b.data.forEach(function(a){c.push({row:a.line-1,column:a.col-1,text:a.message,type:a.type,lint:a})}),a.setAnnotations(c)})}}.call(j.prototype),b.Mode=j}),define("ace/mode/css_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){function g(a){var b=[],c=a.split("");for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.changeListener=this.changeListener.bind(this);if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/groovy_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules,g=a("ace/mode/text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("assert|with|abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|def|float|native|super|while".split("|")),b=e.arrayToMap("null|Infinity|NaN|undefined".split("|")),c=e.arrayToMap("AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object".split("|")),d=e.arrayToMap("".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="this"?"variable.language":a.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"support.function":d.hasOwnProperty(e)?"support.function":b.hasOwnProperty(e)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"\\?:|\\?\\.|\\*\\.|<=>|=~|==~|\\.@|\\*\\.@|\\.&|as|in|is|!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.GroovyHighlightRules=h}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/mode-html.js0000664000000000000000000005640000000000000022436 0ustar00rootroot00000000000000define("ace/mode/html",["require","exports","module","pilot/oop","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/tokenizer","ace/mode/html_highlight_rules","ace/mode/behaviour/xml"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/mode/javascript").Mode,g=a("ace/mode/css").Mode,h=a("ace/tokenizer").Tokenizer,i=a("ace/mode/html_highlight_rules").HtmlHighlightRules,j=a("ace/mode/behaviour/xml").XmlBehaviour,k=function(){var a=new i;this.$tokenizer=new h(a.getRules()),this.$behaviour=new j,this.$embeds=a.getEmbeds(),this.createModeDelegates({"js-":f,"css-":g})};d.inherits(k,e),function(){this.toggleCommentLines=function(a,b,c,d){return 0},this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)},this.checkOutdent=function(a,b,c){return!1}}.call(k.prototype),b.Mode=k}),define("ace/mode/javascript",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/worker/worker_client").WorkerClient,k=a("ace/mode/behaviour/cstyle").CstyleBehaviour,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace","pilot"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.changeListener=this.changeListener.bind(this);if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/css",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/css_highlight_rules").CssHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/worker/worker_client").WorkerClient,j=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h};d.inherits(j,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a).tokens;if(e.length&&e[e.length-1].type=="comment")return d;var f=b.match(/^.*\{\s*$/);return f&&(d+=c),d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new i(["ace","pilot"],"worker-css.js","ace/mode/css_worker","Worker");b.attachToDocument(a.getDocument()),b.on("csslint",function(b){var c=[];b.data.forEach(function(a){c.push({row:a.line-1,column:a.col-1,text:a.message,type:a.type,lint:a})}),a.setAnnotations(c)})}}.call(j.prototype),b.Mode=j}),define("ace/mode/css_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){function g(a){var b=[],c=a.split("");for(var d=0;d",next:e},{token:"entity.other.attribute-name",regex:"[-_a-zA-Z0-9:]+"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"text",regex:"\\s+"}].concat(a(d))}this.$rules={start:[{token:"text",merge:!0,regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:"xml_pe",regex:"<\\?.*?\\?>"},{token:"comment",merge:!0,regex:"<\\!--",next:"comment"},{token:"text",regex:"<(?=s*script)",next:"script"},{token:"text",regex:"<(?=s*style)",next:"css"},{token:"text",regex:"<\\/?",next:"tag"},{token:"text",regex:"\\s+"},{token:"text",regex:"[^<]+"}],cdata:[{token:"text",regex:"\\]\\]>",next:"start"},{token:"text",merge:!0,regex:"\\s+"},{token:"text",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?-->",next:"start"},{token:"comment",merge:!0,regex:".+"}]},c(this.$rules,"tag","start"),c(this.$rules,"css","css-start"),c(this.$rules,"script","js-start"),this.embedRules(f,"js-",[{token:"comment",regex:"\\/\\/.*(?=<\\/script>)",next:"tag"},{token:"text",regex:"<\\/(?=script)",next:"tag"}]),this.embedRules(e,"css-",[{token:"text",regex:"<\\/(?=style)",next:"tag"}])};d.inherits(h,g),b.HtmlHighlightRules=h}),define("ace/mode/behaviour/xml",["require","exports","module","pilot/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=a("ace/mode/behaviour/cstyle").CstyleBehaviour,g=function(){this.inherit(f,["string_dquotes"]),this.add("brackets","insertion",function(a,b,c,d,e){if(e=="<"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?!1:{text:"<>",selection:[1,1]}}if(e==">"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==">")return{text:"",selection:[1,1]}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),k=i.substring(h.column,h.column+2);if(k=="=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.changeListener=this.changeListener.bind(this);if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}),define("ace/mode/java_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules,g=a("ace/mode/text_highlight_rules").TextHighlightRules,h=function(){var a=e.arrayToMap("abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while".split("|")),b=e.arrayToMap("null|Infinity|NaN|undefined".split("|")),c=e.arrayToMap("AbstractMethodError|AssertionError|ClassCircularityError|ClassFormatError|Deprecated|EnumConstantNotPresentException|ExceptionInInitializerError|IllegalAccessError|IllegalThreadStateException|InstantiationError|InternalError|NegativeArraySizeException|NoSuchFieldError|Override|Process|ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|SuppressWarnings|TypeNotPresentException|UnknownError|UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|InstantiationException|IndexOutOfBoundsException|ArrayIndexOutOfBoundsException|CloneNotSupportedException|NoSuchFieldException|IllegalArgumentException|NumberFormatException|SecurityException|Void|InheritableThreadLocal|IllegalStateException|InterruptedException|NoSuchMethodException|IllegalAccessException|UnsupportedOperationException|Enum|StrictMath|Package|Compiler|Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|Character|Boolean|StackTraceElement|Appendable|StringBuffer|Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|StackOverflowError|OutOfMemoryError|VirtualMachineError|ArrayStoreException|ClassCastException|LinkageError|NoClassDefFoundError|ClassNotFoundException|RuntimeException|Exception|ThreadDeath|Error|Throwable|System|ClassLoader|Cloneable|Class|CharSequence|Comparable|String|Object".split("|")),d=e.arrayToMap("".split("|"));this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},(new f).getStartRule("doc-start"),{token:"comment",merge:!0,regex:"\\/\\*",next:"comment"},{token:"string.regexp",regex:"[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)"},{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"string",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:function(e){return e=="this"?"variable.language":a.hasOwnProperty(e)?"keyword":c.hasOwnProperty(e)?"support.function":d.hasOwnProperty(e)?"support.function":b.hasOwnProperty(e)?"constant.language":"identifier"},regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"lparen",regex:"[[({]"},{token:"rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:".*?\\*\\/",next:"start"},{token:"comment",merge:!0,regex:".+"}]},this.embedRules(f,"doc-",[(new f).getEndRule("start")])};d.inherits(h,g),b.JavaHighlightRules=h}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/mode-javascript.js0000664000000000000000000003046400000000000023642 0ustar00rootroot00000000000000define("ace/mode/javascript",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/worker/worker_client").WorkerClient,k=a("ace/mode/behaviour/cstyle").CstyleBehaviour,l=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new k};d.inherits(l,e),function(){this.toggleCommentLines=function(a,b,c,d){var e=!0,f=[],g=/^(\s*)\/\//;for(var h=c;h<=d;h++)if(!g.test(b.getLine(h))){e=!1;break}if(e){var j=new i(0,0,0,0);for(var h=c;h<=d;h++){var k=b.getLine(h),l=k.match(g);j.start.row=h,j.end.row=h,j.end.column=l[0].length,b.replace(j,l[1])}}else b.indentRows(c,d,"//")},this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(f.length&&f[f.length-1].type=="comment")return d;if(a=="start"||a=="regex_allowed"){var h=b.match(/^.*[\{\(\[\:]\s*$/);h&&(d+=c)}else if(a=="doc-start"){if(g=="start"||a=="regex_allowed")return"";var h=b.match(/^\s*(\/?)\*/);h&&(h[1]&&(d+=" "),d+="* ")}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)},this.createWorker=function(a){var b=new j(["ace","pilot"],"worker-javascript.js","ace/mode/javascript_worker","JavaScriptWorker");return b.attachToDocument(a.getDocument()),b.on("jslint",function(b){var c=[];for(var d=0;d=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)",next:"regex_allowed"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\.",next:"regex_allowed"},{token:"paren.lparen",regex:"[[({]",next:"regex_allowed"},{token:"paren.rparen",regex:"[\\])}]"},{token:"keyword.operator",regex:"\\/=?",next:"regex_allowed"},{token:"comment",regex:"^#!.*$"},{token:"text",regex:"\\s+"}],regex_allowed:[{token:"comment",merge:!0,regex:"\\/\\*",next:"comment_regex_allowed"},{token:"comment",regex:"\\/\\/.*$"},{token:"string.regexp",regex:"\\/(?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*",next:"start"},{token:"text",regex:"\\s+"},{token:"empty",regex:"",next:"start"}],comment_regex_allowed:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"regex_allowed"},{token:"comment",merge:!0,regex:".+"}],comment:[{token:"comment",regex:".*?\\*\\/",merge:!0,next:"start"},{token:"comment",merge:!0,regex:".+"}],qqstring:[{token:"string",regex:'(?:(?:\\\\.)|(?:[^"\\\\]))*?"',next:"start"},{token:"string",merge:!0,regex:".+"}],qstring:[{token:"string",regex:"(?:(?:\\\\.)|(?:[^'\\\\]))*?'",next:"start"},{token:"string",merge:!0,regex:".+"}]},this.embedRules(g,"doc-",[(new g).getEndRule("start")])};d.inherits(i,h),b.JavaScriptHighlightRules=i}),define("ace/mode/doc_comment_highlight_rules",["require","exports","module","pilot/oop","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text_highlight_rules").TextHighlightRules,f=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},{token:"comment.doc",merge:!0,regex:"\\s+"},{token:"comment.doc",merge:!0,regex:"TODO"},{token:"comment.doc",merge:!0,regex:"[^@\\*]+"},{token:"comment.doc",merge:!0,regex:"."}]}};d.inherits(f,e),function(){this.getStartRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\/\\*(?=\\*)",next:a}},this.getEndRule=function(a){return{token:"comment.doc",merge:!0,regex:"\\*\\/",next:a}}}.call(f.prototype),b.DocCommentHighlightRules=f}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/worker/worker_client",["require","exports","module","pilot/oop","pilot/event_emitter"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/event_emitter").EventEmitter,f=function(b,c,d,e){this.changeListener=this.changeListener.bind(this);if(a.packaged)var f=this.$guessBasePath(),g=this.$worker=new Worker(f+c);else{var h=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_")),g=this.$worker=new Worker(h),i={};for(var j=0;jf.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/mode-json.js0000664000000000000000000001211400000000000022435 0ustar00rootroot00000000000000define("ace/mode/json",["require","exports","module","pilot/oop","ace/mode/text","ace/tokenizer","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/text").Mode,f=a("ace/tokenizer").Tokenizer,g=a("ace/mode/json_highlight_rules").JsonHighlightRules,h=a("ace/mode/matching_brace_outdent").MatchingBraceOutdent,i=a("ace/range").Range,j=a("ace/mode/behaviour/cstyle").CstyleBehaviour,k=function(){this.$tokenizer=new f((new g).getRules()),this.$outdent=new h,this.$behaviour=new j};d.inherits(k,e),function(){this.getNextLineIndent=function(a,b,c){var d=this.$getIndent(b),e=this.$tokenizer.getLineTokens(b,a),f=e.tokens,g=e.state;if(a=="start"){var h=b.match(/^.*[\{\(\[]\s*$/);h&&(d+=c)}return d},this.checkOutdent=function(a,b,c){return this.$outdent.checkOutdent(b,c)},this.autoOutdent=function(a,b,c){this.$outdent.autoOutdent(b,c)}}.call(k.prototype),b.Mode=k}),define("ace/mode/json_highlight_rules",["require","exports","module","pilot/oop","pilot/lang","ace/mode/text_highlight_rules"],function(a,b,c){var d=a("pilot/oop"),e=a("pilot/lang"),f=a("ace/mode/text_highlight_rules").TextHighlightRules,g=function(){this.$rules={start:[{token:"string",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}]}};d.inherits(g,f),b.JsonHighlightRules=g}),define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(a,b,c){var d=a("ace/range").Range,e=function(){};(function(){this.checkOutdent=function(a,b){return/^\s+$/.test(a)?/^\s*\}/.test(b):!1},this.autoOutdent=function(a,b){var c=a.getLine(b),e=c.match(/^(\s*\})/);if(!e)return 0;var f=e[1].length,g=a.findMatchingBracket({row:b,column:f});if(!g||g.row==b)return 0;var h=this.$getIndent(a.getLine(g.row));a.replace(new d(b,0,b,f-1),h)},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""}}).call(e.prototype),b.MatchingBraceOutdent=e}),define("ace/mode/behaviour/cstyle",["require","exports","module","pilot/oop","ace/mode/behaviour"],function(a,b,c){var d=a("pilot/oop"),e=a("ace/mode/behaviour").Behaviour,f=function(){this.add("braces","insertion",function(a,b,c,d,e){if(e=="{"){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"{"+g+"}",selection:!1}:{text:"{}",selection:[1,1]}}if(e=="}"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var k=d.$findOpeningBracket("}",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}else if(e=="\n"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j=="}"){var l=d.findMatchingBracket({row:h.row,column:h.column+1});if(!l)return null;var m=this.getNextLineIndent(a,i.substring(0,i.length-1),d.getTabString()),n=this.$getIndent(d.doc.getLine(l.row));return{text:"\n"+m+"\n"+n,selection:[1,m.length,1,m.length]}}}}),this.add("braces","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="{"){var g=d.doc.getLine(e.start.row),h=g.substring(e.end.column,e.end.column+1);if(h=="}")return e.end.column++,e}}),this.add("parens","insertion",function(a,b,c,d,e){if(e=="("){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);return g!==""?{text:"("+g+")",selection:!1}:{text:"()",selection:[1,1]}}if(e==")"){var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(j==")"){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(k!==null)return{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=="("){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==")")return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if(e=='"'){var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(g!=="")return{text:'"'+g+'"',selection:!1};var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column-1,h.column);if(j=="\\")return null;var k=d.getTokens(f.start.row,f.start.row)[0].tokens,l=0,m,n=-1;for(var o=0;of.start.column)break;l+=k[o].value.length}if(!m||n<0&&m.type!=="comment"&&(m.type!=="string"||f.start.column!==m.value.length+l-1&&m.value.lastIndexOf('"')===m.value.length-1))return{text:'""',selection:[1,1]};if(m&&m.type==="string"){var p=i.substring(h.column,h.column+1);if(p=='"')return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&f=='"'){var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h=='"')return e.end.column++,e}})};d.inherits(f,e),b.CstyleBehaviour=f}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/theme-textmate.js0000664000000000000000000000547400000000000023510 0ustar00rootroot00000000000000define("ace/theme/textmate",["require","exports","module"],function(a,b,c){var d=a("pilot/dom"),e=".ace-tm .ace_editor { border: 2px solid rgb(159, 159, 159);}.ace-tm .ace_editor.ace_focus { border: 2px solid #327fbd;}.ace-tm .ace_gutter { width: 50px; background: #e8e8e8; color: #333; overflow : hidden;}.ace-tm .ace_gutter-layer { width: 100%; text-align: right;}.ace-tm .ace_gutter-layer .ace_gutter-cell { padding-right: 6px;}.ace-tm .ace_print_margin { width: 1px; background: #e8e8e8;}.ace-tm .ace_text-layer { cursor: text;}.ace-tm .ace_cursor { border-left: 2px solid black;}.ace-tm .ace_cursor.ace_overwrite { border-left: 0px; border-bottom: 1px solid black;} .ace-tm .ace_line .ace_invisible { color: rgb(191, 191, 191);}.ace-tm .ace_line .ace_keyword { color: blue;}.ace-tm .ace_line .ace_constant.ace_buildin { color: rgb(88, 72, 246);}.ace-tm .ace_line .ace_constant.ace_language { color: rgb(88, 92, 246);}.ace-tm .ace_line .ace_constant.ace_library { color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_invalid { background-color: rgb(153, 0, 0); color: white;}.ace-tm .ace_line .ace_fold { background-color: #E4E4E4; border-radius: 3px;}.ace-tm .ace_line .ace_support.ace_function { color: rgb(60, 76, 114);}.ace-tm .ace_line .ace_support.ace_constant { color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_support.ace_type,.ace-tm .ace_line .ace_support.ace_class { color: rgb(109, 121, 222);}.ace-tm .ace_line .ace_keyword.ace_operator { color: rgb(104, 118, 135);}.ace-tm .ace_line .ace_string { color: rgb(3, 106, 7);}.ace-tm .ace_line .ace_comment { color: rgb(76, 136, 107);}.ace-tm .ace_line .ace_comment.ace_doc { color: rgb(0, 102, 255);}.ace-tm .ace_line .ace_comment.ace_doc.ace_tag { color: rgb(128, 159, 191);}.ace-tm .ace_line .ace_constant.ace_numeric { color: rgb(0, 0, 205);}.ace-tm .ace_line .ace_variable { color: rgb(49, 132, 149);}.ace-tm .ace_line .ace_xml_pe { color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function { color: #0000A2;}.ace-tm .ace_markup.ace_markupine { text-decoration:underline;}.ace-tm .ace_markup.ace_heading { color: rgb(12, 7, 255);}.ace-tm .ace_markup.ace_list { color:rgb(185, 6, 144);}.ace-tm .ace_marker-layer .ace_selection { background: rgb(181, 213, 255);}.ace-tm .ace_marker-layer .ace_step { background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack { background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active_line { background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_marker-layer .ace_selected_word { background: rgb(250, 250, 255); border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_meta.ace_tag { color:rgb(28, 2, 255);}.ace-tm .ace_string.ace_regex { color: rgb(255, 0, 0)}";d.importCssString(e),b.cssClass="ace-tm"}) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ace/worker-javascript.js0000664000000000000000000033245200000000000024231 0ustar00rootroot00000000000000function initBaseUrls(a){require.tlns=a}function initSender(){var a=require("pilot/event_emitter").EventEmitter,b=require("pilot/oop"),c=function(){};return function(){b.implement(this,a),this.callback=function(a,b){postMessage({type:"call",id:b,data:a})},this.emit=function(a,b){postMessage({type:"event",name:a,data:b})}}.call(c.prototype),new c}var console={log:function(a){postMessage({type:"log",data:a})}},window={console:console},require=function(a){var b=require.modules[a];if(b)return b.initialized||(b.exports=b.factory().exports,b.initialized=!0),b.exports;var c=a.split("/");return c[0]=require.tlns[c[0]]||c[0],path=c.join("/")+".js",require.id=a,importScripts(path),require(a)};require.modules={},require.tlns={};var define=function(a,b,c){arguments.length==2?c=b:arguments.length==1&&(c=a,a=require.id);if(a.indexOf("text!")===0)return;require.modules[a]={factory:function(){var a={exports:{}},b=c(require,a.exports,a);return b&&(a.exports=b),a}}},main,sender;onmessage=function(a){var b=a.data;if(b.command)main[b.command].apply(main,b.args);else if(b.init){initBaseUrls(b.tlns),require("pilot/fixoldbrowsers"),sender=initSender();var c=require(b.module)[b.classname];main=new c(sender)}else b.event&&sender&&sender._dispatchEvent(b.event,b.data)},define("pilot/fixoldbrowsers",["require","exports","module","pilot/regexp","pilot/es5-shim"],function(a,b,c){a("pilot/regexp"),a("pilot/es5-shim")}),define("pilot/regexp",["require","exports","module"],function(a,b,c){function g(a){return(a.global?"g":"")+(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.extended?"x":"")+(a.sticky?"y":"")}function h(a,b,c){if(Array.prototype.indexOf)return a.indexOf(b,c);for(var d=c||0;d1&&h(b,"")>-1&&(i=RegExp(this.source,d.replace.call(g(this),"g","")),d.replace.call(a.slice(b.index),i,function(){for(var a=1;ab.index&&this.lastIndex--}return b},f||(RegExp.prototype.test=function(a){var b=d.exec.call(this,a);return b&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--,!!b})}),define("pilot/es5-shim",["require","exports","module"],function(a,b,c){function p(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this;if(typeof b!="function")throw new TypeError;var c=g.call(arguments,1),d=function(){if(this instanceof d){var e=function(){};e.prototype=b.prototype;var f=new e,h=b.apply(f,c.concat(g.call(arguments)));return h!==null&&Object(h)===h?h:f}return b.apply(a,c.concat(g.call(arguments)))};return d});var d=Function.prototype.call,e=Array.prototype,f=Object.prototype,g=e.slice,h=d.bind(f.toString),i=d.bind(f.hasOwnProperty),j,k,l,m,n;if(n=i(f,"__defineGetter__"))j=d.bind(f.__defineGetter__),k=d.bind(f.__defineSetter__),l=d.bind(f.__lookupGetter__),m=d.bind(f.__lookupSetter__);Array.isArray||(Array.isArray=function(a){return h(a)=="[object Array]"}),Array.prototype.forEach||(Array.prototype.forEach=function(a){var b=G(this),c=arguments[1],d=0,e=b.length>>>0;if(h(a)!="[object Function]")throw new TypeError;while(d>>0,d=Array(c),e=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var f=0;f>>0,d=[],e=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var f=0;f>>0,d=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var e=0;e>>0,d=arguments[1];if(h(a)!="[object Function]")throw new TypeError;for(var e=0;e>>0;if(h(a)!="[object Function]")throw new TypeError;if(!c&&arguments.length==1)throw new TypeError;var d=0,e;if(arguments.length>=2)e=arguments[1];else do{if(d in b){e=b[d++];break}if(++d>=c)throw new TypeError}while(!0);for(;d>>0;if(h(a)!="[object Function]")throw new TypeError;if(!c&&arguments.length==1)throw new TypeError;var d,e=c-1;if(arguments.length>=2)d=arguments[1];else do{if(e in b){d=b[e--];break}if(--e<0)throw new TypeError}while(!0);do e in this&&(d=a.call(void 0,d,b[e],e,b));while(e--);return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=G(this),c=b.length>>>0;if(!c)return-1;var d=0;arguments.length>1&&(d=E(arguments[1])),d=d>=0?d:Math.max(0,c+d);for(;d>>0;if(!c)return-1;var d=c-1;arguments.length>1&&(d=Math.min(d,E(arguments[1]))),d=d>=0?d:c-Math.abs(d);for(;d>=0;d--)if(d in b&&a===b[d])return d;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||(a.constructor?a.constructor.prototype:f)});if(!Object.getOwnPropertyDescriptor){var o="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(o+a);if(!i(a,b))return;var c,d,e;c={enumerable:!0,configurable:!0};if(n){var g=a.__proto__;a.__proto__=f;var d=l(a,b),e=m(a,b);a.__proto__=g;if(d||e)return d&&(c.get=d),e&&(c.set=e),c}return c.value=a[b],c}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),Object.create||(Object.create=function(a,b){var c;if(a===null)c={"__proto__":null};else{if(typeof a!="object")throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}return b!==void 0&&Object.defineProperties(c,b),c});if(Object.defineProperty){var q=p({}),r=typeof document=="undefined"||p(document.createElement("div"));if(!q||!r)var s=Object.defineProperty}if(!Object.defineProperty||s){var t="Property description must be an object: ",u="Object.defineProperty called on non-object: ",v="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError(u+a);if(typeof c!="object"&&typeof c!="function"||c===null)throw new TypeError(t+c);if(s)try{return s.call(Object,a,b,c)}catch(d){}if(i(c,"value"))if(n&&(l(a,b)||m(a,b))){var e=a.__proto__;a.__proto__=f,delete a[b],a[b]=c.value,a.__proto__=e}else a[b]=c.value;else{if(!n)throw new TypeError(v);i(c,"get")&&j(a,b,c.get),i(c,"set")&&k(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)i(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(w){Object.freeze=function(a){return function b(b){return typeof b=="function"?b:a(b)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)===a)throw new TypeError;var b="";while(i(a,b))b+="?";a[b]=!0;var c=i(a,b);return delete a[b],c});if(!Object.keys){var x=!0,y=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],z=y.length;for(var A in{toString:null})x=!1;Object.keys=function bd(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var bd=[];for(var b in a)i(a,b)&&bd.push(b);if(x)for(var c=0,d=z;c9999?"+":"")+("00000"+Math.abs(d)).slice(0<=d&&d<=9999?-4:-6),b=a.length;while(b--)c=a[b],c<10&&(a[b]="0"+c);return d+"-"+a.slice(0,2).join("-")+"T"+a.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"};Date.now||(Date.now=function(){return(new Date).getTime()}),Date.prototype.toJSON||(Date.prototype.toJSON=function(a){if(typeof this.toISOString!="function")throw new TypeError;return this.toISOString()}),Date.parse("+275760-09-13T00:00:00.000Z")!==864e13&&(Date=function(a){var b=function e(b,c,d,f,g,h,i){var j=arguments.length;if(this instanceof a){var k=j==1&&String(b)===b?new a(e.parse(b)):j>=7?new a(b,c,d,f,g,h,i):j>=6?new a(b,c,d,f,g,h):j>=5?new a(b,c,d,f,g):j>=4?new a(b,c,d,f):j>=3?new a(b,c,d):j>=2?new a(b,c):j>=1?new a(b):new a;return k.constructor=e,k}return a.apply(this,arguments)},c=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$");for(var d in a)b[d]=a[d];return b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function f(b){var d=c.exec(b);if(d){d.shift();for(var e=1;e<7;e++)d[e]=+(d[e]||(e<3?1:0)),e==1&&d[e]--;var f=+d.pop(),g=+d.pop(),h=d.pop(),i=0;if(h){if(g>23||f>59)return NaN;i=(g*60+f)*6e4*(h=="+"?-1:1)}var j=+d[0];return 0<=j&&j<=99?(d[0]=j+400,a.UTC.apply(this,d)+i-126227808e5):a.UTC.apply(this,d)+i}return a.parse.apply(this,arguments)},b}(Date));var B="\t\n \f\r   ᠎ â€â€‚         âŸã€€\u2028\u2029";if(!String.prototype.trim||B.trim()){B="["+B+"]";var C=new RegExp("^"+B+B+"*"),D=new RegExp(B+B+"*$");String.prototype.trim=function(){return String(this).replace(C,"").replace(D,"")}}var E=function(a){return a=+a,a!==a?a=0:a!==0&&a!==1/0&&a!==-Infinity&&(a=(a>0||-1)*Math.floor(Math.abs(a))),a},F="a"[0]!="a",G=function(a){if(a==null)throw new TypeError;return F&&typeof a=="string"&&a?a.split(""):Object(a)}}),define("pilot/event_emitter",["require","exports","module"],function(a,b,c){var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{},this._defaultHandlers=this._defaultHandlers||{};var c=this._eventRegistry[a]||[],d=this._defaultHandlers[a];if(!c.length&&!d)return;b=b||{},b.type=a,b.stopPropagation||(b.stopPropagation=function(){this.propagationStopped=!0}),b.preventDefault||(b.preventDefault=function(){this.defaultPrevented=!0});for(var e=0;e=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length),a},this.insert=function(a,b){if(b.length==0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];return a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||"")),a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};return this._dispatchEvent("change",{data:e}),d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};return this._dispatchEvent("change",{data:d}),c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};return this._dispatchEvent("change",{data:e}),d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b==c)return;var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};return this._dispatchEvent("change",{data:i}),d.start},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};return this._dispatchEvent("change",{data:e}),d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._dispatchEvent("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}}).call(h.prototype),b.Document=h}),define("ace/range",["require","exports","module"],function(a,b,c){var d=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};(function(){this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;return b=this.compare(c.row,c.column),b==1?(b=this.compare(d.row,d.column),b==1?2:b==0?1:0):b==-1?-2:(b=this.compare(d.row,d.column),b==-1?-1:b==1?42:0)},this.containsRange=function(a){var b=this.compareRange(a);return b==-1||b==0||b==1},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)||this.isStart(a,b)?!1:!0:!1},this.insideStart=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)?!1:!0:!1},this.insideEnd=function(a,b){return this.compare(a,b)==0?this.isStart(a,b)?!1:!0:!1},this.compare=function(a,b){return!this.isMultiLine()&&a===this.start.row?bthis.end.column?1:0:athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.rowthis.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0),c}}).call(f.prototype)}),define("pilot/lang",["require","exports","module"],function(a,b,c){b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){return(new Array(b+1)).join(a)};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){var b=[];for(i=0,l=a.length;i=A.maxerr&&bd("Too many errors.",i,h),j}function bf(a,b,c,d,e,f,g){return be(a,{line:b,from:c},d,e,f,g)}function bg(a,b,c,d,e,f){var g=be(a,b,c,d,e,f);bd("Stopping, unable to continue.",g.line,g.character)}function bh(a,b,c,d,e,f,g){return bg(a,{line:b,from:c},d,e,f,g)}function bj(a,b){a==="hasOwnProperty"&&be("'hasOwnProperty' is a really bad name."),ba(j,a)&&!j["(global)"]&&(j[a]===!0?A.latedef&&be("'{a}' was used before it was defined.",x,a):A.shadow||be("'{a}' is already defined.",x,a)),j[a]=b,j["(global)"]?(m[a]=j,ba(n,a)&&(A.latedef&&be("'{a}' was used before it was defined.",x,a),delete n[a])):G[a]=j}function bk(){var a,b,d,e=x.value,f,g;switch(e){case"*/":bg("Unbegun comment.");break;case"/*members":case"/*member":e="/*members",v||(v={}),b=v;break;case"/*jshint":case"/*jslint":b=A,d=c;break;case"/*global":b=B;break;default:bg("What?")}f=bi.token();h:for(;;){for(;;){if(f.type==="special"&&f.value==="*/")break h;if(f.id!=="(endline)"&&f.id!==",")break;f=bi.token()}f.type!=="(string)"&&f.type!=="(identifier)"&&e!=="/*members"&&bg("Bad option.",f),g=bi.token(),g.id===":"?(g=bi.token(),b===v&&bg("Expected '{a}' and instead saw '{b}'.",f,"*/",":"),f.value!=="indent"||e!=="/*jshint"&&e!=="/*jslint"?f.value!=="maxerr"||e!=="/*jshint"&&e!=="/*jslint"?f.value!=="maxlen"||e!=="/*jshint"&&e!=="/*jslint"?g.value==="true"?b[f.value]=!0:g.value==="false"?b[f.value]=!1:bg("Bad option value.",g):(a=+g.value,(typeof a!="number"||!isFinite(a)||a<=0||Math.floor(a)!==a)&&bg("Expected a small integer and instead saw '{a}'.",g,g.value),b.maxlen=a):(a=+g.value,(typeof a!="number"||!isFinite(a)||a<=0||Math.floor(a)!==a)&&bg("Expected a small integer and instead saw '{a}'.",g,g.value),b.maxerr=a):(a=+g.value,(typeof a!="number"||!isFinite(a)||a<=0||Math.floor(a)!==a)&&bg("Expected a small integer and instead saw '{a}'.",g,g.value),b.white=!0,b.indent=a),f=bi.token()):((e==="/*jshint"||e==="/*jslint")&&bg("Missing option value.",f),b[f.value]=!1,f=g)}d&&bc()}function bl(a){var b=a||0,c=0,d;while(c<=b)d=t[c],d||(d=t[c]=bi.token()),c+=1;return d}function bm(b,c){switch(O.id){case"(number)":x.id==="."&&be("A dot following a number can be confused with a decimal point.",O);break;case"-":(x.id==="-"||x.id==="--")&&be("Confusing minusses.");break;case"+":(x.id==="+"||x.id==="++")&&be("Confusing plusses.")}if(O.type==="(string)"||O.identifier)a=O.value;b&&x.id!==b&&(c?x.id==="(end)"?be("Unmatched '{a}'.",c,c.id):be("Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",x,b,c.id,c.line,x.value):(x.type!=="(identifier)"||x.value!==b)&&be("Expected '{a}' and instead saw '{b}'.",x,b,x.value)),D=O,O=x;for(;;){x=t.shift()||bi.token();if(x.id==="(end)"||x.id==="(error)")return;if(x.type==="special")bk();else if(x.id!=="(endline)")break}}function bn(b,c){var d,e=!1;x.id==="(end)"&&bg("Unexpected early end of program.",O),bm(),c&&(a="anonymous",j["(verb)"]=O.value);if(c===!0&&O.fud)d=O.fud();else{if(O.nud)d=O.nud();else{if(x.type==="(number)"&&O.id===".")return be("A leading decimal point can be confused with a dot: '.{a}'.",O,x.value),bm(),O;bg("Expected an identifier and instead saw '{a}'.",O,O.id)}while(b="a"&&b<="z"||b>="A"&&b<="Z")a.identifier=a.reserved=!0;return a}function bB(a,b){var c=bw(a,150);return bA(c),c.nud=typeof b=="function"?b:function(){this.right=bn(150),this.arity="unary";if(this.id==="++"||this.id==="--")A.plusplus?be("Unexpected use of '{a}'.",this,this.id):(!this.right.identifier||this.right.reserved)&&this.right.id!=="."&&this.right.id!=="["&&be("Bad operand.",this);return this},c}function bC(a,b){var c=bx(a);return c.type=a,c.nud=b,c}function bD(a,b){var c=bC(a,b);return c.identifier=c.reserved=!0,c}function bE(a,b){return bD(a,function(){return typeof b=="function"&&b(this),this})}function bF(a,b,c,d){var e=bw(a,c);return bA(e),e.led=function(a){return d||(bs(D,O),br(O,x)),typeof b=="function"?b(a,this):(this.left=a,this.right=bn(c),this)},e}function bG(a,b){var c=bw(a,100);return c.led=function(a){bs(D,O),br(O,x);var c=bn(100);return a&&a.id==="NaN"||c&&c.id==="NaN"?be("Use the isNaN function to compare with NaN.",this):b&&b.apply(this,[a,c]),a.id==="!"&&be("Confusing use of '{a}'.",a,"!"),c.id==="!"&&be("Confusing use of '{a}'.",a,"!"),this.left=a,this.right=c,this},c}function bH(a){return a&&(a.type==="(number)"&&+a.value===0||a.type==="(string)"&&a.value===""||a.type==="null"&&!A.eqnull||a.type==="true"||a.type==="false"||a.type==="undefined")}function bI(a,b){return bw(a,20).exps=!0,bF(a,function(a,b){var c;b.left=a,B[a.value]===!1&&G[a.value]["(global)"]===!0?be("Read only.",a):a["function"]&&be("'{a}' is a function.",a,a.value);if(a){if(a.id==="."||a.id==="[")return(!a.left||a.left.value==="arguments")&&be("Bad assignment.",b),b.right=bn(19),b;if(a.identifier&&!a.reserved)return j[a.value]==="exception"&&be("Do not assign to the exception parameter.",a),b.right=bn(19),b;a===M["function"]&&be("Expected an identifier in an assignment and instead saw a function invocation.",O)}bg("Bad assignment.",b)},20)}function bJ(a,b,c){var d=bw(a,c);return bA(d),d.led=typeof b=="function"?b:function(a){return A.bitwise&&be("Unexpected use of '{a}'.",this,this.id),this.left=a,this.right=bn(c),this},d}function bK(a){return bw(a,20).exps=!0,bF(a,function(a,b){A.bitwise&&be("Unexpected use of '{a}'.",b,b.id),br(D,O),br(O,x);if(a)return a.id==="."||a.id==="["||a.identifier&&!a.reserved?(bn(19),b):(a===M["function"]&&be("Expected an identifier in an assignment, and instead saw a function invocation.",O),b);bg("Bad assignment.",b)},20)}function bL(a,b){var c=bw(a,150);return c.led=function(a){return A.plusplus?be("Unexpected use of '{a}'.",this,this.id):(!a.identifier||a.reserved)&&a.id!=="."&&a.id!=="["&&be("Bad operand.",this),this.left=a,this},c}function bM(a){if(x.identifier)return bm(),O.reserved&&!A.es5&&(!a||O.value!="undefined")&&be("Expected an identifier and instead saw '{a}' (a reserved word).",O,O.id),O.value}function bN(a){var b=bM(a);if(b)return b;O.id==="function"&&x.id==="("?be("Missing name in function declaration."):bg("Expected an identifier and instead saw '{a}'.",x,x.value)}function bO(a){var b=0,c;if(x.id!==";"||z)return;for(;;){c=bl(b);if(c.reach)return;if(c.id!=="(endline)"){if(c.id==="function"){be("Inner functions should be listed at the top of the outer function.",c);break}be("Unreachable '{a}' after '{b}'.",c,c.value,a);break}b+=1}}function bP(a){var b=p,c,d=G,e=x;if(e.id===";"){be("Unnecessary semicolon.",e),bm(";");return}return e.identifier&&!e.reserved&&bl().id===":"&&(bm(),bm(":"),G=Object.create(d),bj(e.value,"label"),x.labelled||be("Label '{a}' on {b} statement.",x,e.value,x.value),Z.test(e.value+":")&&be("Label '{a}' looks like a javascript url.",e,e.value),x.label=e.value,e=x),a||bt(),c=bn(0,!0),e.block||(!A.expr&&(!c||!c.exps)?be("Expected an assignment or function call and instead saw an expression.",O):A.nonew&&c.id==="("&&c.left.id==="new"&&be("Do not use 'new' for side effects."),x.id!==";"?!A.asi&&(!A.lastsemic||x.id!="}"||x.line!=O.line)&&bf("Missing semicolon.",O.line,O.from+O.value.length):(bo(O,x),bm(";"),br(O,x))),p=b,G=d,c}function bQ(){return x.value==="use strict"?(L&&be('Unnecessary "use strict".'),bm(),bm(";"),L=!0,A.newcap=!0,A.undef=!0,!0):!1}function bR(a){var b=[],c,d;while(!x.reach&&x.id!=="(end)")x.id===";"?(be("Unnecessary semicolon."),bm(";")):b.push(bP());return b}function bS(a,b){var c,d=o,e=p,f=L,g=G,h;o=a,G=Object.create(G),br(O,x),h=x;if(x.id==="{"){bm("{");if(x.id!=="}"||O.line!==x.line){p+=A.indent;while(!a&&x.from>p)p+=A.indent;!a&&!bQ()&&!f&&A.strict&&j["(context)"]["(global)"]&&be('Missing "use strict" statement.'),c=bR(),L=f,p-=A.indent,bt()}bm("}",h),p=e}else a?((!b||A.curly)&&be("Expected '{a}' and instead saw '{b}'.",x,"{",x.value),z=!0,c=[bP()],z=!1):bg("Expected '{a}' and instead saw '{b}'.",x,"{",x.value);return j["(verb)"]=null,G=g,o=d,a&&A.noempty&&(!c||c.length===0)&&be("Empty block."),c}function bT(a){v&&typeof v[a]!="boolean"&&be("Unexpected /*member '{a}'.",O,a),typeof u[a]=="number"?u[a]+=1:u[a]=1}function bU(a){var b=a.value,c=a.line,d=n[b];typeof d=="function"&&(d=!1),d?d[d.length-1]!==c&&d.push(c):(d=[c],n[b]=d)}function bV(){var a=bM(!0);return a||(x.id==="(string)"?(a=x.value,bm()):x.id==="(number)"&&(a=x.value.toString(),bm())),a}function bW(){var a,b=x,c=[];bm("("),bq();if(x.id===")"){bm(")"),bq(D,O);return}for(;;){a=bN(!0),c.push(a),bj(a,"parameter");if(x.id===",")bv();else return bm(")",b),bq(D,O),c}}function bX(b,c){var d,e=A,f=G;return A=Object.create(A),G=Object.create(G),j={"(name)":b||'"'+a+'"',"(line)":x.line,"(context)":j,"(breakage)":0,"(loopage)":0,"(scope)":G,"(statement)":c},d=j,O.funct=j,l.push(j),b&&bj(b,"function"),j["(params)"]=bW(),bS(!1),G=f,A=e,j["(last)"]=O.line,j=j["(context)"],d}function bZ(){function a(){var a={},b=x;bm("{");if(x.id!=="}")for(;;){if(x.id==="(end)")bg("Missing '}' to match '{' from line {a}.",x,b.line);else{if(x.id==="}"){be("Unexpected comma.",O);break}x.id===","?bg("Unexpected comma.",x):x.id!=="(string)"&&be("Expected a string and instead saw {a}.",x,x.value)}a[x.value]===!0?be("Duplicate key '{a}'.",x,x.value):x.value==="__proto__"&&!A.proto||x.value==="__iterator__"&&!A.iterator?be("The '{a}' key may produce unexpected results.",x,x.value):a[x.value]=!0,bm(),bm(":"),bZ();if(x.id!==",")break;bm(",")}bm("}")}function b(){var a=x;bm("[");if(x.id!=="]")for(;;){if(x.id==="(end)")bg("Missing ']' to match '[' from line {a}.",x,a.line);else{if(x.id==="]"){be("Unexpected comma.",O);break}x.id===","&&bg("Unexpected comma.",x)}bZ();if(x.id!==",")break;bm(",")}bm("]")}switch(x.id){case"{":a();break;case"[":b();break;case"true":case"false":case"null":case"(number)":case"(string)":bm();break;case"-":bm("-"),O.character!==x.from&&be("Unexpected space after '-'.",O),bo(O,x),bm("(number)");break;default:bg("Expected a JSON value.",x)}}"use strict";var a,b={"<":!0,"<=":!0,"==":!0,"===":!0,"!==":!0,"!=":!0,">":!0,">=":!0,"+":!0,"-":!0,"*":!0,"/":!0,"%":!0},c={asi:!0,bitwise:!0,boss:!0,browser:!0,couch:!0,curly:!0,debug:!0,devel:!0,dojo:!0,eqeqeq:!0,eqnull:!0,es5:!0,evil:!0,expr:!0,forin:!0,globalstrict:!0,immed:!0,iterator:!0,jquery:!0,latedef:!0,laxbreak:!0,loopfunc:!0,mootools:!0,newcap:!0,noarg:!0,node:!0,noempty:!0,nonew:!0,nomen:!0,onevar:!0,passfail:!0,plusplus:!0,proto:!0,prototypejs:!0,regexdash:!0,regexp:!0,rhino:!0,undef:!0,scripturl:!0,shadow:!0,strict:!0,sub:!0,supernew:!0,trailing:!0,white:!0,wsh:!0},e={ArrayBuffer:!1,ArrayBufferView:!1,addEventListener:!1,applicationCache:!1,blur:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,DataView:!1,defaultStatus:!1,document:!1,event:!1,FileReader:!1,Float32Array:!1,Float64Array:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,history:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Image:!1,length:!1,localStorage:!1,location:!1,moveBy:!1,moveTo:!1,name:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,print:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,setInterval:!1,setTimeout:!1,status:!1,top:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,WebSocket:!1,window:!1,Worker:!1,XMLHttpRequest:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},f={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1},g={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},h={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},i={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"/":"\\/","\\":"\\\\"},j,k=["closure","exception","global","label","outer","unused","var"],l,m,n,o,p,q,r={$:!1,jQuery:!1},s,t,u,v,w={$:!1,$$:!1,Assets:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,Iframe:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},x,y={__filename:!1,__dirname:!1,exports:!1,Buffer:!1,GLOBAL:!1,global:!1,module:!1,process:!1,require:!1},z,A,B,C,D,E={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},F={defineClass:!1,deserialize:!1,gc:!1,help:!1,load:!1,loadClass:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},G,H,I,J={Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,JSON:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},K={E:!0,LN2:!0,LN10:!0,LOG2E:!0,LOG10E:!0,MAX_VALUE:!0,MIN_VALUE:!0,NEGATIVE_INFINITY:!0,PI:!0,POSITIVE_INFINITY:!0,SQRT1_2:!0,SQRT2:!0},L,M={},N,O,P,Q,R={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0},S,T,U,V,W,X,Y,Z,$;(function(){S=/@cc|<\/?|script|\]\s*\]|<\s*!|</i,T=/[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/,U=/^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/(\*(jshint|jslint|members?|global)?|=|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|%=?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=!]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+\-]?[0-9]+)?)/,V=/[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/,W=/[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,X=/\*\/|\/\*/,Y=/^([a-zA-Z_$][a-zA-Z0-9_$]*)$/,Z=/^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i,$=/^\s*\/\*\s*falls\sthrough\s*\*\/\s*$/})(),typeof Array.isArray!="function"&&(Array.isArray=function(a){return Object.prototype.toString.apply(a)==="[object Array]"}),typeof Object.create!="function"&&(Object.create=function(a){return _.prototype=a,new _}),typeof Object.keys!="function"&&(Object.keys=function(a){var b=[],c;for(c in a)ba(a,c)&&b.push(c);return b}),typeof String.prototype.entityify!="function"&&(String.prototype.entityify=function(){return this.replace(/&/g,"&").replace(//g,">")}),typeof String.prototype.isAlpha!="function"&&(String.prototype.isAlpha=function(){return this>="a"&&this<="zï¿¿"||this>="A"&&this<="Zï¿¿"}),typeof String.prototype.isDigit!="function"&&(String.prototype.isDigit=function(){return this>="0"&&this<="9"}),typeof String.prototype.supplant!="function"&&(String.prototype.supplant=function(a){return this.replace(/\{([^{}]*)\}/g,function(b,c){var d=a[c];return typeof d=="string"||typeof d=="number"?d:b})}),typeof String.prototype.name!="function"&&(String.prototype.name=function(){return Y.test(this)?this:V.test(this)?'"'+this.replace(W,function(a){var b=i[a];return b?b:"\\u"+("0000"+a.charCodeAt().toString(16)).slice(-4)})+'"':'"'+this+'"'});var bi=function(){function e(){var b,e;return c>=s.length?!1:(a=1,d=s[c],c+=1,b=d.search(/ \t/),b>=0&&bf("Mixed spaces and tabs.",c,b+1),d=d.replace(/\t/g,N),b=d.search(T),b>=0&&bf("Unsafe character.",c,b),A.maxlen&&A.maxlen=0||f==="return")),g}var a,b,c,d;return{init:function(a){typeof a=="string"?s=a.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n"):s=a,s[0]&&s[0].substr(0,2)=="#!"&&(s[0]=""),c=0,e(),b=1},range:function(e,g){var h,i="";b=a,d.charAt(0)!==e&&bh("Expected '{a}' and instead saw '{b}'.",c,a,e,d.charAt(0));for(;;){d=d.slice(1),a+=1,h=d.charAt(0);switch(h){case"":bh("Missing '{a}'.",c,a,h);break;case g:return d=d.slice(1),a+=1,f("(range)",i);case"\\":bf("Unexpected '{a}'.",c,a,h)}i+=h}},token:function(){function s(c){var e=c.exec(d),f;if(e)return n=e[0].length,f=e[1],h=f.charAt(0),d=d.substr(n),b=a+n-f.length,a+=n,f}function t(g){function k(b){var e=parseInt(d.substr(i+1,b),16);i+=b,e>=32&&e<=126&&e!==34&&e!==92&&e!==39&&bf("Unnecessary escapement.",c,a),a+=b,h=String.fromCharCode(e)}var h,i,j="";q&&g!=='"'&&bf("Strings must use doublequote.",c,a),i=0;for(;;){while(i>=d.length)i=0,e()||bh("Unclosed string.",c,b);h=d.charAt(i);if(h===g)return a+=1,d=d.substr(i+1),f("(string)",j,g);if(h<" "){if(h==="\n"||h==="\r")break;bf("Control character in string: {a}.",c,a+i,d.slice(0,i))}else if(h==="\\"){i+=1,a+=1,h=d.charAt(i);switch(h){case"\\":case'"':case"/":break;case"'":q&&bf("Avoid \\'.",c,a);break;case"b":h="\b";break;case"f":h="\f";break;case"n":h="\n";break;case"r":h="\r";break;case"t":h="\t";break;case"u":k(4);break;case"v":q&&bf("Avoid \\v.",c,a),h=" ";break;case"x":q&&bf("Avoid \\x-.",c,a),k(2);break;default:bf("Bad escapement.",c,a)}}j+=h,a+=1,i+=1}}var g,h,i,j,k,l,m,n,o,p,r;for(;;){if(!d)return f(e()?"(endline)":"(end)","");r=s(U);if(!r){r="",h="";while(d&&d<"!")d=d.substr(1);d&&bh("Unexpected '{a}'.",c,a,d.substr(0,1))}else{if(h.isAlpha()||h==="_"||h==="$")return f("(identifier)",r);if(h.isDigit())return isFinite(Number(r))||bf("Bad number '{a}'.",c,a,r),d.substr(0,1).isAlpha()&&bf("Missing space after '{a}'.",c,a,r),h==="0"&&(j=r.substr(1,1),j.isDigit()?O.id!=="."&&bf("Don't use extra leading zeros '{a}'.",c,a,r):q&&(j==="x"||j==="X")&&bf("Avoid 0x-. '{a}'.",c,a,r)),r.substr(r.length-1)==="."&&bf("A trailing decimal point can be confused with a dot '{a}'.",c,a,r),f("(number)",r);switch(r){case'"':case"'":return t(r);case"//":H&&bf("Unexpected comment.",c,a),d="",O.comment=!0;break;case"/*":H&&bf("Unexpected comment.",c,a);for(;;){m=d.search(X);if(m>=0)break;e()||bh("Unclosed comment.",c,a)}a+=m+2,d.substr(m,1)==="/"&&bh("Nested comment.",c,a),d=d.substr(m+2),O.comment=!0;break;case"/*members":case"/*member":case"/*jshint":case"/*jslint":case"/*global":case"*/":return{value:r,type:"special",line:c,character:a,from:b};case"":break;case"/":O.id==="/="&&bh("A regular expression literal can be confused with '/='.",c,b);if(C){k=0,i=0,n=0;for(;;){g=!0,h=d.charAt(n),n+=1;switch(h){case"":bh("Unclosed regular expression.",c,b);return;case"/":k>0&&bf("Unescaped '{a}'.",c,b+n,"/"),h=d.substr(0,n-1),p={g:!0,i:!0,m:!0};while(p[d.charAt(n)]===!0)p[d.charAt(n)]=!1,n+=1;return a+=n,d=d.substr(n),p=d.charAt(0),(p==="/"||p==="*")&&bh("Confusing regular expression.",c,b),f("(regexp)",h);case"\\":h=d.charAt(n),h<" "?bf("Unexpected control character in regular expression.",c,b+n):h==="<"&&bf("Unexpected escaped character '{a}' in regular expression.",c,b+n,h),n+=1;break;case"(":k+=1,g=!1;if(d.charAt(n)==="?"){n+=1;switch(d.charAt(n)){case":":case"=":case"!":n+=1;break;default:bf("Expected '{a}' and instead saw '{b}'.",c,b+n,":",d.charAt(n))}}else i+=1;break;case"|":g=!1;break;case")":k===0?bf("Unescaped '{a}'.",c,b+n,")"):k-=1;break;case" ":p=1;while(d.charAt(n)===" ")n+=1,p+=1;p>1&&bf("Spaces are hard to count. Use {{a}}.",c,b+n,p);break;case"[":h=d.charAt(n),h==="^"&&(n+=1,A.regexp?bf("Insecure '{a}'.",c,b+n,h):d.charAt(n)==="]"&&bh("Unescaped '{a}'.",c,b+n,"^")),p=!1,h==="]"&&(bf("Empty class.",c,b+n-1),p=!0);u:do{h=d.charAt(n),n+=1;switch(h){case"[":case"^":bf("Unescaped '{a}'.",c,b+n,h),p=!0;break;case"-":p?p=!1:(bf("Unescaped '{a}'.",c,b+n,"-"),p=!0);break;case"]":!p&&!A.regexdash&&bf("Unescaped '{a}'.",c,b+n-1,"-");break u;case"\\":h=d.charAt(n),h<" "?bf("Unexpected control character in regular expression.",c,b+n):h==="<"&&bf("Unexpected escaped character '{a}' in regular expression.",c,b+n,h),n+=1,p=!0;break;case"/":bf("Unescaped '{a}'.",c,b+n-1,"/"),p=!0;break;case"<":p=!0;break;default:p=!0}}while(h);break;case".":A.regexp&&bf("Insecure '{a}'.",c,b+n,h);break;case"]":case"?":case"{":case"}":case"+":case"*":bf("Unescaped '{a}'.",c,b+n,h)}if(g)switch(d.charAt(n)){case"?":case"+":case"*":n+=1,d.charAt(n)==="?"&&(n+=1);break;case"{":n+=1,h=d.charAt(n),(h<"0"||h>"9")&&bf("Expected a number and instead saw '{a}'.",c,b+n,h),n+=1,o=+h;for(;;){h=d.charAt(n);if(h<"0"||h>"9")break;n+=1,o=+h+o*10}l=o;if(h===","){n+=1,l=Infinity,h=d.charAt(n);if(h>="0"&&h<="9"){n+=1,l=+h;for(;;){h=d.charAt(n);if(h<"0"||h>"9")break;n+=1,l=+h+l*10}}}d.charAt(n)!=="}"?bf("Expected '{a}' and instead saw '{b}'.",c,b+n,"}",h):n+=1,d.charAt(n)==="?"&&(n+=1),o>l&&bf("'{a}' should not be greater than '{b}'.",c,b+n,o,l)}}return h=d.substr(0,n-1),a+=n,d=d.substr(n),f("(regexp)",h)}return f("(punctuator)",r);case"#":return f("(punctuator)",r);default:return f("(punctuator)",r)}}}}}}();bC("(number)",function(){return this}),bC("(string)",function(){return this}),M["(identifier)"]={type:"(identifier)",lbp:0,identifier:!0,nud:function(){var b=this.value,c=G[b],d;typeof c=="function"?c=undefined:typeof c=="boolean"&&(d=j,j=l[0],bj(b,"var"),c=j,j=d);if(j===c)switch(j[b]){case"unused":j[b]="var";break;case"unction":j[b]="function",this["function"]=!0;break;case"function":this["function"]=!0;break;case"label":be("'{a}' is a statement label.",O,b)}else if(j["(global)"])a!="typeof"&&a!="delete"&&A.undef&&typeof B[b]!="boolean"&&be("'{a}' is not defined.",O,b),bU(O);else switch(j[b]){case"closure":case"function":case"var":case"unused":be("'{a}' used out of scope.",O,b);break;case"label":be("'{a}' is a statement label.",O,b);break;case"outer":case"global":break;default:if(c===!0)j[b]=!0;else if(c===null)be("'{a}' is not allowed.",O,b),bU(O);else if(typeof c!="object")a!="typeof"&&a!="delete"&&A.undef?be("'{a}' is not defined.",O,b):j[b]=!0,bU(O);else switch(c[b]){case"function":case"unction":this["function"]=!0,c[b]="closure",j[b]=c["(global)"]?"global":"outer";break;case"var":case"unused":c[b]="closure",j[b]=c["(global)"]?"global":"outer";break;case"closure":case"parameter":j[b]=c["(global)"]?"global":"outer";break;case"label":be("'{a}' is a statement label.",O,b)}}return this},led:function(){bg("Expected an operator and instead saw '{a}'.",x,x.value)}},bC("(regexp)",function(){return this}),bx("(endline)"),bx("(begin)"),bx("(end)").reach=!0,bx(""),bx("(error)").reach=!0,bx("}").reach=!0,bx(")"),bx("]"),bx('"').reach=!0,bx("'").reach=!0,bx(";"),bx(":").reach=!0,bx(","),bx("#"),bx("@"),bD("else"),bD("case").reach=!0,bD("catch"),bD("default").reach=!0,bD("finally"),bE("arguments",function(a){L&&j["(global)"]&&be("Strict violation.",a)}),bE("eval"),bE("false"),bE("Infinity"),bE("NaN"),bE("null"),bE("this",function(a){L&&(j["(statement)"]&&j["(name)"].charAt(0)>"Z"||j["(global)"])&&be("Strict violation.",a)}),bE("true"),bE("undefined"),bI("=","assign",20),bI("+=","assignadd",20),bI("-=","assignsub",20),bI("*=","assignmult",20),bI("/=","assigndiv",20).nud=function(){bg("A regular expression literal can be confused with '/='.")},bI("%=","assignmod",20),bK("&=","assignbitand",20),bK("|=","assignbitor",20),bK("^=","assignbitxor",20),bK("<<=","assignshiftleft",20),bK(">>=","assignshiftright",20),bK(">>>=","assignshiftrightunsigned",20),bF("?",function(a,b){return b.left=a,b.right=bn(10),bm(":"),b["else"]=bn(10),b},30),bF("||","or",40),bF("&&","and",50),bJ("|","bitor",70),bJ("^","bitxor",80),bJ("&","bitand",90),bG("==",function(a,b){var c=A.eqnull&&(a.value=="null"||b.value=="null");return!c&&A.eqeqeq?be("Expected '{a}' and instead saw '{b}'.",this,"===","=="):bH(a)?be("Use '{a}' to compare with '{b}'.",this,"===",a.value):bH(b)&&be("Use '{a}' to compare with '{b}'.",this,"===",b.value),this}),bG("==="),bG("!=",function(a,b){var c=A.eqnull&&(a.value=="null"||b.value=="null");return!c&&A.eqeqeq?be("Expected '{a}' and instead saw '{b}'.",this,"!==","!="):bH(a)?be("Use '{a}' to compare with '{b}'.",this,"!==",a.value):bH(b)&&be("Use '{a}' to compare with '{b}'.",this,"!==",b.value),this}),bG("!=="),bG("<"),bG(">"),bG("<="),bG(">="),bJ("<<","shiftleft",120),bJ(">>","shiftright",120),bJ(">>>","shiftrightunsigned",120),bF("in","in",120),bF("instanceof","instanceof",120),bF("+",function(a,b){var c=bn(130);return a&&c&&a.id==="(string)"&&c.id==="(string)"?(a.value+=c.value,a.character=c.character,!A.scripturl&&Z.test(a.value)&&be("JavaScript URL.",a),a):(b.left=a,b.right=c,b)},130),bB("+","num"),bB("+++",function(){return be("Confusing pluses."),this.right=bn(150),this.arity="unary",this}),bF("+++",function(a){return be("Confusing pluses."),this.left=a,this.right=bn(130),this},130),bF("-","sub",130),bB("-","neg"),bB("---",function(){return be("Confusing minuses."),this.right=bn(150),this.arity="unary",this}),bF("---",function(a){return be("Confusing minuses."),this.left=a,this.right=bn(130),this},130),bF("*","mult",140),bF("/","div",140),bF("%","mod",140),bL("++","postinc"),bB("++","preinc"),M["++"].exps=!0,bL("--","postdec"),bB("--","predec"),M["--"].exps=!0,bB("delete",function(){var a=bn(0);return(!a||a.id!=="."&&a.id!=="[")&&be("Variables should not be deleted."),this.first=a,this}).exps=!0,bB("~",function(){return A.bitwise&&be("Unexpected '{a}'.",this,"~"),bn(150),this}),bB("!",function(){return this.right=bn(150),this.arity="unary",b[this.right.id]===!0&&be("Confusing use of '{a}'.",this,"!"),this}),bB("typeof","typeof"),bB("new",function(){var a=bn(155),b;if(a&&a.id!=="function")if(a.identifier){a["new"]=!0;switch(a.value){case"Object":be("Use the object literal notation {}.",O);break;case"Number":case"String":case"Boolean":case"Math":case"JSON":be("Do not use {a} as a constructor.",O,a.value);break;case"Function":A.evil||be("The Function constructor is eval.");break;case"Date":case"RegExp":break;default:a.id!=="function"&&(b=a.value.substr(0,1),A.newcap&&(b<"A"||b>"Z")&&be("A constructor name should start with an uppercase letter.",O))}}else a.id!=="."&&a.id!=="["&&a.id!=="("&&be("Bad constructor.",O);else A.supernew||be("Weird construction. Delete 'new'.",this);return bo(O,x),x.id!=="("&&!A.supernew&&be("Missing '()' invoking a constructor."),this.first=a,this}),M["new"].exps=!0,bB("void").exps=!0,bF(".",function(a,b){bo(D,O),bp();var c=bN();return typeof c=="string"&&bT(c),b.left=a,b.right=c,A.noarg&&a&&a.value==="arguments"&&(c==="callee"||c==="caller")?be("Avoid arguments.{a}.",a,c):!A.evil&&a&&a.value==="document"&&(c==="write"||c==="writeln")&&be("document.write can be a form of eval.",a),!A.evil&&(c==="eval"||c==="execScript")&&be("eval is evil."),b},160,!0),bF("(",function(a,b){D.id!=="}"&&D.id!==")"&&bp(D,O),bq(),A.immed&&!a.immed&&a.id==="function"&&be("Wrap an immediate function invocation in parentheses to assist the reader in understanding that the expression is the result of a function, and not the function itself.");var c=0,d=[];a&&a.type==="(identifier)"&&a.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&a.value!=="Number"&&a.value!=="String"&&a.value!=="Boolean"&&a.value!=="Date"&&(a.value==="Math"?be("Math is not a function.",a):A.newcap&&be("Missing 'new' prefix when invoking a constructor.",a));if(x.id!==")")for(;;){d[d.length]=bn(10),c+=1;if(x.id!==",")break;bv()}return bm(")"),bq(D,O),typeof a=="object"&&(a.value==="parseInt"&&c===1&&be("Missing radix parameter.",a),A.evil||(a.value==="eval"||a.value==="Function"||a.value==="execScript"?be("eval is evil.",a):d[0]&&d[0].id==="(string)"&&(a.value==="setTimeout"||a.value==="setInterval")&&be("Implied eval is evil. Pass a function instead of a string.",a)),!a.identifier&&a.id!=="."&&a.id!=="["&&a.id!=="("&&a.id!=="&&"&&a.id!=="||"&&a.id!=="?"&&be("Bad invocation.",a)),b.left=a,b},155,!0).exps=!0,bB("(",function(){bq(),x.id==="function"&&(x.immed=!0);var a=bn(0);return bm(")",this),bq(D,O),A.immed&&a.id==="function"&&(x.id==="("?be("Move the invocation into the parens that contain the function.",x):be("Do not wrap function literals in parens unless they are to be immediately invoked.",this)),a}),bF("[",function(a,b){bp(D,O),bq();var c=bn(0),d;return c&&c.type==="(string)"&&(!A.evil&&(c.value==="eval"||c.value==="execScript")&&be("eval is evil.",b),bT(c.value),!A.sub&&Y.test(c.value)&&(d=M[c.value],(!d||!d.reserved)&&be("['{a}'] is better written in dot notation.",c,c.value))),bm("]",b),bq(D,O),b.left=a,b.right=c,b},160,!0),bB("[",function(){var a=O.line!==x.line;this.first=[],a&&(p+=A.indent,x.from===p+A.indent&&(p+=A.indent));while(x.id!=="(end)"){while(x.id===",")be("Extra comma."),bm(",");if(x.id==="]")break;a&&O.line!==x.line&&bt(),this.first.push(bn(10));if(x.id!==",")break;bv();if(x.id==="]"&&!A.es5){be("Extra comma.",O);break}}return a&&(p-=A.indent,bt()),bm("]",this),this},160),function(a){a.nud=function(){var a,b,c,d,e,f={},g;a=O.line!==x.line,a&&(p+=A.indent,x.from===p+A.indent&&(p+=A.indent));for(;;){if(x.id==="}")break;a&&bt();if(x.value==="get"&&bl().id!==":")bm("get"),A.es5||bg("get/set are ES5 features."),c=bV(),c||bg("Missing property name."),g=x,bo(O,x),b=bX(),!A.loopfunc&&j["(loopage)"]&&be("Don't make functions within a loop.",g),e=b["(params)"],e&&be("Unexpected parameter '{a}' in get {b} function.",g,e[0],c),bo(O,x),bm(","),bt(),bm("set"),d=bV(),c!==d&&bg("Expected {a} and instead saw {b}.",O,c,d),g=x,bo(O,x),b=bX(),e=b["(params)"],(!e||e.length!==1||e[0]!=="value")&&be("Expected (value) in set {a} function.",g,c);else{c=bV();if(typeof c!="string")break;bm(":"),br(O,x),bn(10)}f[c]===!0&&be("Duplicate member '{a}'.",x,c),f[c]=!0,bT(c);if(x.id===",")bv(),x.id===","?be("Extra comma.",O):x.id==="}"&&!A.es5&&be("Extra comma.",O);else break}return a&&(p-=A.indent,bt()),bm("}",this),this},a.fud=function(){bg("Expected to see a statement and instead saw a block.",O)}}(bx("{"));var bY=by("var",function(a){var b,c,d;j["(onevar)"]&&A.onevar?be("Too many var statements."):j["(global)"]||(j["(onevar)"]=!0),this.first=[];for(;;){br(O,x),b=bN(),j["(global)"]&&B[b]===!1&&be("Redefinition of '{a}'.",O,b),bj(b,"unused");if(a)break;c=O,this.first.push(O),x.id==="="&&(br(O,x),bm("="),br(O,x),x.id==="undefined"&&be("It is not necessary to initialize '{a}' to 'undefined'.",O,b),bl(0).id==="="&&x.identifier&&bg("Variable {a} was not declared correctly.",x,x.value),d=bn(0),c.first=d);if(x.id!==",")break;bv()}return this});bY.exps=!0,bz("function",function(){o&&be("Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.",O);var a=bN();return bo(O,x),bj(a,"unction"),bX(a,!0),x.id==="("&&x.line===O.line&&bg("Function declarations are not invocable. Wrap the whole function invocation in parens."),this}),bB("function",function(){var a=bM();return a?bo(O,x):br(O,x),bX(a),!A.loopfunc&&j["(loopage)"]&&be("Don't make functions within a loop."),this}),bz("if",function(){var a=x;return bm("("),br(this,a),bq(),bn(20),x.id==="="&&(A.boss||be("Expected a conditional expression and instead saw an assignment."),bm("="),bn(20)),bm(")",a),bq(D,O),bS(!0,!0),x.id==="else"&&(br(O,x),bm("else"),x.id==="if"||x.id==="switch"?bP(!0):bS(!0,!0)),this}),bz("try",function(){var a,b,c;bS(!1),x.id==="catch"&&(bm("catch"),br(O,x),bm("("),c=G,G=Object.create(c),b=x.value,x.type!=="(identifier)"?be("Expected an identifier and instead saw '{a}'.",x,b):bj(b,"exception"),bm(),bm(")"),bS(!1),a=!0,G=c);if(x.id==="finally"){bm("finally"),bS(!1);return}return a||bg("Expected '{a}' and instead saw '{b}'.",x,"catch",x.value),this}),bz("while",function(){var a=x;return j["(breakage)"]+=1,j["(loopage)"]+=1,bm("("),br(this,a),bq(),bn(20),x.id==="="&&(A.boss||be("Expected a conditional expression and instead saw an assignment."),bm("="),bn(20)),bm(")",a),bq(D,O),bS(!0,!0),j["(breakage)"]-=1,j["(loopage)"]-=1,this}).labelled=!0,bD("with"),bz("switch",function(){var a=x,b=!1;j["(breakage)"]+=1,bm("("),br(this,a),bq(),this.condition=bn(20),bm(")",a),bq(D,O),br(O,x),a=x,bm("{"),br(O,x),p+=A.indent,this.cases=[];for(;;)switch(x.id){case"case":switch(j["(verb)"]){case"break":case"case":case"continue":case"return":case"switch":case"throw":break;default:$.test(s[x.line-2])||be("Expected a 'break' statement before 'case'.",O)}bt(-A.indent),bm("case"),this.cases.push(bn(20)),b=!0,bm(":"),j["(verb)"]="case";break;case"default":switch(j["(verb)"]){case"break":case"continue":case"return":case"throw":break;default:$.test(s[x.line-2])||be("Expected a 'break' statement before 'default'.",O)}bt(-A.indent),bm("default"),b=!0,bm(":");break;case"}":p-=A.indent,bt(),bm("}",a),(this.cases.length===1||this.condition.id==="true"||this.condition.id==="false")&&be("This 'switch' should be an 'if'.",this),j["(breakage)"]-=1,j["(verb)"]=undefined;return;case"(end)":bg("Missing '{a}'.",x,"}");return;default:if(b)switch(O.id){case",":bg("Each value should have its own case label.");return;case":":bR();break;default:bg("Missing ':' on a case clause.",O)}else bg("Expected '{a}' and instead saw '{b}'.",x,"case",x.value)}}).labelled=!0,by("debugger",function(){return A.debug||be("All 'debugger' statements should be removed."),this}).exps=!0,function(){var a=by("do",function(){j["(breakage)"]+=1,j["(loopage)"]+=1,this.first=bS(!0),bm("while");var a=x;return br(O,a),bm("("),bq(),bn(20),x.id==="="&&(A.boss||be("Expected a conditional expression and instead saw an assignment."),bm("="),bn(20)),bm(")",a),bq(D,O),j["(breakage)"]-=1,j["(loopage)"]-=1,this});a.labelled=!0,a.exps=!0}(),bz("for",function(){var a,b=x;j["(breakage)"]+=1,j["(loopage)"]+=1,bm("("),br(this,b),bq();if(bl(x.id==="var"?1:0).id==="in"){if(x.id==="var")bm("var"),bY.fud.call(bY,!0);else{switch(j[x.value]){case"unused":j[x.value]="var";break;case"var":break;default:be("Bad for in variable '{a}'.",x,x.value)}bm()}return bm("in"),bn(20),bm(")",b),a=bS(!0,!0),A.forin&&(a.length>1||typeof a[0]!="object"||a[0].value!=="if")&&be("The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.",this),j["(breakage)"]-=1,j["(loopage)"]-=1,this}if(x.id!==";")if(x.id==="var")bm("var"),bY.fud.call(bY);else for(;;){bn(0,"for");if(x.id!==",")break;bv()}bu(O),bm(";"),x.id!==";"&&(bn(20),x.id==="="&&(A.boss||be("Expected a conditional expression and instead saw an assignment."),bm("="),bn(20))),bu(O),bm(";"),x.id===";"&&bg("Expected '{a}' and instead saw '{b}'.",x,")",";");if(x.id!==")")for(;;){bn(0,"for");if(x.id!==",")break;bv()}return bm(")",b),bq(D,O),bS(!0,!0),j["(breakage)"]-=1,j["(loopage)"]-=1,this}).labelled=!0,by("break",function(){var a=x.value;return j["(breakage)"]===0&&be("Unexpected '{a}'.",x,this.value),bu(this),x.id!==";"&&O.line===x.line&&(j[a]!=="label"?be("'{a}' is not a statement label.",x,a):G[a]!==j&&be("'{a}' is out of scope.",x,a),this.first=x,bm()),bO("break"),this}).exps=!0,by("continue",function(){var a=x.value;return j["(breakage)"]===0&&be("Unexpected '{a}'.",x,this.value),bu(this),x.id!==";"?O.line===x.line&&(j[a]!=="label"?be("'{a}' is not a statement label.",x,a):G[a]!==j&&be("'{a}' is out of scope.",x,a),this.first=x,bm()):j["(loopage)"]||be("Unexpected '{a}'.",x,this.value),bO("continue"),this}).exps=!0,by("return",function(){return bu(this),x.id==="(regexp)"&&be("Wrap the /regexp/ literal in parens to disambiguate the slash operator."),x.id!==";"&&!x.reach&&(br(O,x),this.first=bn(20)),bO("return"),this}).exps=!0,by("throw",function(){return bu(this),br(O,x),this.first=bn(20),bO("throw"),this}).exps=!0,bD("class"),bD("const"),bD("enum"),bD("export"),bD("extends"),bD("import"),bD("super"),bD("let"),bD("yield"),bD("implements"),bD("interface"),bD("package"),bD("private"),bD("protected"),bD("public"),bD("static");var b$=function(a,b,c){var e,f,g;d.errors=[],B=Object.create(J),bb(B,c||{});if(b){e=b.predef;if(e)if(Array.isArray(e))for(f=0;f0&&(a.implieds=d),P.length>0&&(a.urls=P),c=Object.keys(G),c.length>0&&(a.globals=c);for(f=1;f0&&(a.unused=j),h=[];for(i in u)if(typeof u[i]=="number"){a.member=u;break}return a},b$.report=function(a){function o(a,b){var c,d,e;if(b){m.push("
"+a+" "),b=b.sort();for(d=0;d")}}var b=b$.data(),c=[],d,e,f,g,h,i,j,k="",l,m=[],n;if(b.errors||b.implieds||b.unused){f=!0,m.push("
Error:");if(b.errors)for(h=0;hProblem"+(isFinite(d.line)?" at line "+d.line+" character "+d.character:"")+": "+d.reason.entityify()+"

"+(e&&(e.length>80?e.slice(0,77)+"...":e).entityify())+"

"));if(b.implieds){n=[];for(h=0;h"+b.implieds[h].name+" "+b.implieds[h].line+"";m.push("

Implied global: "+n.join(", ")+"

")}if(b.unused){n=[];for(h=0;h"+b.unused[h].name+" "+b.unused[h].line+" "+b.unused[h]["function"]+"";m.push("

Unused variable: "+n.join(", ")+"

")}b.json&&m.push("

JSON: bad.

"),m.push("
")}if(!a){m.push("
"),b.urls&&o("URLs
",b.urls,"
"),b.json&&!f?m.push("

JSON: good.

"):b.globals?m.push("
Global "+b.globals.sort().join(", ")+"
"):m.push("
No new global variables introduced.
");for(h=0;h
"+g.line+"-"+g.last+" "+(g.name||"")+"("+(g.param?g.param.join(", "):"")+")
"),o("Unused",g.unused),o("Closure",g.closure),o("Variable",g["var"]),o("Exception",g.exception),o("Outer",g.outer),o("Global",g.global),o("Label",g.label);if(b.member){c=Object.keys(b.member);if(c.length){c=c.sort(),k="
/*members ",j=10;for(h=0;h72&&(m.push(k+"
"),k=" ",j=1),j+=l.length+2,b.member[i]===1&&(l=""+l+""),h*/
")}m.push("
")}}return m.join("")},b$.jshint=b$,b$.edition="2011-04-16",b$}();typeof b=="object"&&b&&(b.JSHINT=d)}),define("ace/narcissus/jsparse",["require","exports","module","ace/narcissus/jslex","ace/narcissus/jsdefs"],function(require,exports,module){function pushDestructuringVarDecls(a,b){for(var c in a){var d=a[c];d.type===IDENTIFIER?b.varDecls.push(d):pushDestructuringVarDecls(d,b)}}function StaticContext(a,b,c,d){this.parentScript=a,this.parentBlock=b||a,this.inModule=c||!1,this.inFunction=d||!1,this.inForLoopInit=!1,this.topLevel=!0,this.allLabels=new Stack,this.currentLabels=new Stack,this.labeledTargets=new Stack,this.defaultLoopTarget=null,this.defaultTarget=null,this.blackList=blackLists[Narcissus.options.version],Narcissus.options.ecma3OnlyMode&&(this.ecma3OnlyMode=!0),Narcissus.options.parenFreeMode&&(this.parenFreeMode=!0)}function Script(a,b,c){var d=new Node(a,scriptInit());return Statements(a,new StaticContext(d,d,b,c),d),d}function Node(a,b){var c=a.token;c?(this.type=c.type,this.value=c.value,this.lineno=c.lineno,this.start=c.start,this.end=c.end):this.lineno=a.lineno,this.tokenizer=a,this.children=[];for(var d in b)this[d]=b[d]}function SyntheticNode(a,b){this.tokenizer=a,this.children=[];for(var c in b)this[c]=b[c];this.synthetic=!0}function unevalableConst(a){var b=definitions.tokens[a],c=definitions.opTypeNames.hasOwnProperty(b)?definitions.opTypeNames[b]:b in definitions.keywords?b.toUpperCase():b;return{toSource:function(){return c}}}function tokenString(a){var b=definitions.tokens[a];return/^\W/.test(b)?definitions.opTypeNames[b]:b.toUpperCase()}function blockInit(){return{type:BLOCK,varDecls:[]}}function scriptInit(){return{type:SCRIPT,funDecls:[],varDecls:[],modDefns:new StringMap,modAssns:new StringMap,modDecls:new StringMap,modLoads:new StringMap,impDecls:[],expDecls:[],exports:new StringMap,hasEmptyReturn:!1,hasReturnWithValue:!1,isGenerator:!1}}function MaybeLeftParen(a,b){return b.parenFreeMode?a.match(LEFT_PAREN)?LEFT_PAREN:END:a.mustMatch(LEFT_PAREN).type}function MaybeRightParen(a,b){b===LEFT_PAREN&&a.mustMatch(RIGHT_PAREN)}function Statements(a,b,c){try{while(!a.done&&a.peek(!0)!==RIGHT_CURLY)c.push(Statement(a,b))}catch(d){throw a.done&&(a.unexpectedEOF=!0),d}}function Block(a,b){a.mustMatch(LEFT_CURLY);var c=new Node(a,blockInit());return Statements(a,b.update({parentBlock:c}).pushTarget(c),c),a.mustMatch(RIGHT_CURLY),c}function Export(a,b){this.node=a,this.isDefinition=b,this.resolved=null}function registerExport(a,b){function c(b,c){if(a.has(b))throw new SyntaxError("multiple exports of "+b);a.set(b,c)}switch(b.type){case MODULE:case FUNCTION:c(b.name,new Export(b,!0));break;case VAR:for(var d=0;d=0)throw a.newSyntaxError("More than one switch default");case CASE:f=new Node(a),j===DEFAULT?e.defaultIndex=e.cases.length:f.caseLabel=Expression(a,l,COLON);break;default:throw a.newSyntaxError("Invalid switch case")}a.mustMatch(COLON),f.statements=new Node(a,blockInit());while((j=a.peek(!0))!==CASE&&j!==DEFAULT&&j!==RIGHT_CURLY)f.statements.push(Statement(a,l));e.cases.push(f)}return e;case FOR:e=new Node(a,LOOP_INIT),e.blockComments=n,a.match(IDENTIFIER)&&(a.token.value==="each"?e.isEach=!0:a.unget()),b.parenFreeMode||a.mustMatch(LEFT_PAREN),l=b.pushTarget(e).nest(),m=b.update({inForLoopInit:!0}),f=null,(j=a.peek(!0))!==SEMICOLON&&(j===VAR||j===CONST?(a.get(),f=Variables(a,m)):j===LET?(a.get(),a.peek()===LEFT_PAREN?f=LetBlock(a,m,!1):(m.parentBlock=e,e.varDecls=[],f=Variables(a,m))):f=Expression(a,m));if(f&&a.match(IN)){e.type=FOR_IN,e.object=Expression(a,m);if(f.type===VAR||f.type===LET){h=f.children;if(h.length!==1&&f.destructurings.length!==1)throw new SyntaxError("Invalid for..in left-hand side",a.filename,f.lineno);f.destructurings.length>0?e.iterator=f.destructurings[0]:e.iterator=h[0],e.varDecl=f}else{if(f.type===ARRAY_INIT||f.type===OBJECT_INIT)f.destructuredNames=checkDestructuring(a,m,f);e.iterator=f}}else{m.inForLoopInit=!1,e.setup=f,a.mustMatch(SEMICOLON);if(e.isEach)throw a.newSyntaxError("Invalid for each..in loop");e.condition=a.peek(!0)===SEMICOLON?null:Expression(a,m),a.mustMatch(SEMICOLON),k=a.peek(!0),e.update=(b.parenFreeMode?k===LEFT_CURLY||definitions.isStatementStartCode[k]:k===RIGHT_PAREN)?null:Expression(a,m)}return b.parenFreeMode||a.mustMatch(RIGHT_PAREN),e.body=Statement(a,l),e;case WHILE:return e=new Node(a,{isLoop:!0}),e.blockComments=n,e.condition=HeadExpression(a,b),e.body=Statement(a,b.pushTarget(e).nest()),e;case DO:e=new Node(a,{isLoop:!0}),e.blockComments=n,e.body=Statement(a,b.pushTarget(e).nest()),a.mustMatch(WHILE),e.condition=HeadExpression(a,b);if(!b.ecmaStrictMode)return a.match(SEMICOLON),e;break;case BREAK:case CONTINUE:e=new Node(a),e.blockComments=n,l=b.pushTarget(e),a.peekOnSameLine()===IDENTIFIER&&(a.get(),e.label=a.token.value),e.label?e.target=l.labeledTargets.find(function(a){return a.labels.has(e.label)}):j===CONTINUE?e.target=l.defaultLoopTarget:e.target=l.defaultTarget;if(!e.target)throw a.newSyntaxError("Invalid "+(j===BREAK?"break":"continue"));if(!e.target.isLoop&&j===CONTINUE)throw a.newSyntaxError("Invalid continue");break;case TRY:e=new Node(a,{catchClauses:[]}),e.blockComments=n,e.tryBlock=Block(a,b);while(a.match(CATCH)){f=new Node(a),g=MaybeLeftParen(a,b);switch(a.get()){case LEFT_BRACKET:case LEFT_CURLY:a.unget(),f.varName=DestructuringExpression(a,b,!0);break;case IDENTIFIER:f.varName=a.token.value;break;default:throw a.newSyntaxError("missing identifier in catch")}if(a.match(IF)){if(b.ecma3OnlyMode)throw a.newSyntaxError("Illegal catch guard");if(e.catchClauses.length&&!e.catchClauses.top().guard)throw a.newSyntaxError("Guarded catch after unguarded");f.guard=Expression(a,b)}MaybeRightParen(a,g),f.block=Block(a,b),e.catchClauses.push(f)}a.match(FINALLY)&&(e.finallyBlock=Block(a,b));if(!e.catchClauses.length&&!e.finallyBlock)throw a.newSyntaxError("Invalid try statement");return e;case CATCH:case FINALLY:throw a.newSyntaxError(definitions.tokens[j]+" without preceding try");case THROW:e=new Node(a),e.exception=Expression(a,b);break;case RETURN:e=ReturnOrYield(a,b);break;case WITH:return e=new Node(a),e.blockComments=n,e.object=HeadExpression(a,b),e.body=Statement(a,b.pushTarget(e).nest()),e;case VAR:case CONST:e=Variables(a,b);break;case LET:a.peek()===LEFT_PAREN?e=LetBlock(a,b,!0):e=Variables(a,b);break;case DEBUGGER:e=new Node(a);break;case NEWLINE:case SEMICOLON:return e=new Node(a,{type:SEMICOLON}),e.blockComments=n,e.expression=null,e;default:if(j===IDENTIFIER){j=a.peek();if(j===COLON){d=a.token.value;if(b.allLabels.has(d))throw a.newSyntaxError("Duplicate label");return a.get(),e=new Node(a,{type:LABEL,label:d}),e.blockComments=n,e.statement=Statement(a,b.pushLabel(d).nest()),e.target=e.statement.type===LABEL?e.statement.target:e.statement,e}}e=new Node(a,{type:SEMICOLON}),a.unget(),e.blockComments=n,e.expression=Expression(a,b),e.end=e.expression.end}return e.blockComments=n,MagicalSemicolon(a),e}function MagicalSemicolon(a){var b;if(a.lineno===a.token.lineno){b=a.peekOnSameLine();if(b!==END&&b!==NEWLINE&&b!==SEMICOLON&&b!==RIGHT_CURLY)throw a.newSyntaxError("missing ; before statement")}a.match(SEMICOLON)}function ReturnOrYield(a,b){var c,d,e=a.token.type,f,g=b.parentScript;if(e===RETURN){if(!b.inFunction)throw a.newSyntaxError("Return not in function")}else{if(!b.inFunction)throw a.newSyntaxError("Yield not in function");g.isGenerator=!0}c=new Node(a,{value:undefined}),f=e===RETURN?a.peekOnSameLine(!0):a.peek(!0),f!==END&&f!==NEWLINE&&f!==SEMICOLON&&f!==RIGHT_CURLY&&(e!==YIELD||f!==e&&f!==RIGHT_BRACKET&&f!==RIGHT_PAREN&&f!==COLON&&f!==COMMA)?e===RETURN?(c.value=Expression(a,b),g.hasReturnWithValue=!0):c.value=AssignExpression(a,b):e===RETURN&&(g.hasEmptyReturn=!0);if(g.hasReturnWithValue&&g.isGenerator)throw a.newSyntaxError("Generator returns a value");return c}function ModuleExpression(a,b){return a.match(STRING)?new Node(a):QualifiedPath(a,b)}function ImportPathList(a,b){var c=[];do c.push(ImportPath(a,b));while(a.match(COMMA));return c}function ImportPath(a,b){var c=QualifiedPath(a,b);if(!a.match(DOT)){if(c.type===IDENTIFIER)throw a.newSyntaxError("cannot import local variable");return c}var d=new Node(a);return d.push(c),d.push(ImportSpecifierSet(a,b)),d}function ExplicitSpecifierSet(a,b,c){var d,e,f,g;d=new Node(a,{type:OBJECT_INIT}),a.mustMatch(LEFT_CURLY);if(!a.match(RIGHT_CURLY))do f=Identifier(a,b),a.match(COLON)?(e=new Node(a,{type:PROPERTY_INIT}),e.push(f),e.push(c(a,b)),d.push(e)):d.push(f);while(!a.match(RIGHT_CURLY)&&a.mustMatch(COMMA));return d}function ImportSpecifierSet(a,b){return a.match(MUL)?new Node(a,{type:IDENTIFIER,name:"*"}):ExplicitSpecifierSet(a,b,Identifier)}function Identifier(a,b){return a.mustMatch(IDENTIFIER),new Node(a,{type:IDENTIFIER})}function IdentifierName(a){if(a.match(IDENTIFIER))return new Node(a,{type:IDENTIFIER});a.get();if(a.token.value in definitions.keywords)return new Node(a,{type:IDENTIFIER});throw a.newSyntaxError("missing IdentifierName")}function QualifiedPath(a,b){var c,d;c=Identifier(a,b);while(a.match(DOT)){if(a.peek()!==IDENTIFIER){a.unget();break}d=new Node(a),d.push(c),d.push(Identifier(a,b)),c=d}return c}function ExportPath(a,b){return a.peek()===LEFT_CURLY?ExplicitSpecifierSet(a,b,QualifiedPath):QualifiedPath(a,b)}function ExportPathList(a,b){var c=[];do c.push(ExportPath(a,b));while(a.match(COMMA));return c}function FunctionDefinition(a,b,c,d,e){var f,g=new Node(a,{params:[],paramComments:[]});typeof comment=="undefined"&&(comment=null),g.blockComments=e,g.type!==FUNCTION&&(g.type=g.value==="get"?GETTER:SETTER);if(a.match(IDENTIFIER))g.name=a.token.value;else if(c)throw a.newSyntaxError("missing function identifier");var h=b?b.inModule:!1,i=new StaticContext(null,null,h,!0);a.mustMatch(LEFT_PAREN);if(!a.match(RIGHT_PAREN)){do{f=a.get(),g.paramComments.push(a.lastBlockComment());switch(f){case LEFT_BRACKET:case LEFT_CURLY:a.unget(),g.params.push(DestructuringExpression(a,i));break;case IDENTIFIER:g.params.push(a.token.value);break;default:throw a.newSyntaxError("missing formal parameter")}}while(a.match(COMMA));a.mustMatch(RIGHT_PAREN)}f=a.get(),f!==LEFT_CURLY&&a.unget();if(f!==LEFT_CURLY){g.body=AssignExpression(a,i);if(g.body.isGenerator)throw a.newSyntaxError("Generator returns a value")}else g.body=Script(a,h,!0);return f===LEFT_CURLY&&a.mustMatch(RIGHT_CURLY),g.end=a.token.end,g.functionForm=d,d===DECLARED_FORM&&b.parentScript.funDecls.push(g),g}function ModuleVariables(a,b,c){var d,e;do d=Identifier(a,b),a.match(ASSIGN)&&(e=ModuleExpression(a,b),d.initializer=e,e.type===STRING?b.parentScript.modLoads.set(d.value,e.value):b.parentScript.modAssns.set(d.value,d)),c.push(d);while(a.match(COMMA))}function Variables(a,b,c){var d,e,f,g,h,i;i=a.token.type;switch(i){case VAR:case CONST:h=b.parentScript;break;case LET:h=b.parentBlock;break;case LEFT_PAREN:i=LET,h=c}d=new Node(a,{type:i,destructurings:[]});do{i=a.get();if(i===LEFT_BRACKET||i===LEFT_CURLY){a.unget();var j=DestructuringExpression(a,b,!0);e=new Node(a,{type:IDENTIFIER,name:j,readOnly:d.type===CONST}),d.push(e),pushDestructuringVarDecls(e.name.destructuredNames,h),d.destructurings.push({exp:j,decl:e});if(b.inForLoopInit&&a.peek()===IN)continue;a.mustMatch(ASSIGN);if(a.token.assignOp)throw a.newSyntaxError("Invalid variable initialization");e.blockComment=a.lastBlockComment(),e.initializer=AssignExpression(a,b);continue}if(i!==IDENTIFIER)throw a.newSyntaxError("missing variable name");e=new Node(a,{type:IDENTIFIER,name:a.token.value,readOnly:d.type===CONST}),d.push(e),h.varDecls.push(e);if(a.match(ASSIGN)){var k=a.lastBlockComment();if(a.token.assignOp)throw a.newSyntaxError("Invalid variable initialization");e.initializer=AssignExpression(a,b)}else var k=a.lastBlockComment();e.blockComment=k}while(a.match(COMMA));return d}function LetBlock(a,b,c){var d,e;return d=new Node(a,{type:LET_BLOCK,varDecls:[]}),a.mustMatch(LEFT_PAREN),d.variables=Variables(a,b,d),a.mustMatch(RIGHT_PAREN),c&&a.peek()!==LEFT_CURLY&&(e=new Node(a,{type:SEMICOLON,expression:d}),c=!1),c?d.block=Block(a,b):d.expression=AssignExpression(a,b),d}function checkDestructuring(a,b,c,d){if(c.type===ARRAY_COMP)throw a.newSyntaxError("Invalid array comprehension left-hand side");if(c.type!==ARRAY_INIT&&c.type!==OBJECT_INIT)return;var e={},f,g,h,i,j,k=c.children;for(var l=0,m=k.length;l1||a.peek(!0)===COMMA)throw a.newSyntaxError("Generator expression must be parenthesized")}c.push(d)}while(a.match(COMMA));return a.mustMatch(RIGHT_PAREN),c}function PrimaryExpression(a,b){var c,d,e=a.get(!0);switch(e){case FUNCTION:c=FunctionDefinition(a,b,!1,EXPRESSED_FORM);break;case LEFT_BRACKET:c=new Node(a,{type:ARRAY_INIT});while((e=a.peek(!0))!==RIGHT_BRACKET){if(e===COMMA){a.get(),c.push(null);continue}c.push(AssignExpression(a,b));if(e!==COMMA&&!a.match(COMMA))break}c.children.length===1&&a.match(FOR)&&(d=new Node(a,{type:ARRAY_COMP,expression:c.children[0],tail:ComprehensionTail(a,b)}),c=d),a.mustMatch(RIGHT_BRACKET);break;case LEFT_CURLY:var f,g;c=new Node(a,{type:OBJECT_INIT});h:if(!a.match(RIGHT_CURLY)){do{e=a.get();if(a.token.value!=="get"&&a.token.value!=="set"||a.peek()!==IDENTIFIER){var i=a.blockComments;switch(e){case IDENTIFIER:case NUMBER:case STRING:f=new Node(a,{type:IDENTIFIER});break;case RIGHT_CURLY:if(b.ecma3OnlyMode)throw a.newSyntaxError("Illegal trailing ,");break h;default:if(a.token.value in definitions.keywords){f=new Node(a,{type:IDENTIFIER});break}throw a.newSyntaxError("Invalid property name")}if(a.match(COLON))d=new Node(a,{type:PROPERTY_INIT}),d.push(f),d.push(AssignExpression(a,b)),d.blockComments=i,c.push(d);else{if(a.peek()!==COMMA&&a.peek()!==RIGHT_CURLY)throw a.newSyntaxError("missing : after property");c.push(f)}}else{if(b.ecma3OnlyMode)throw a.newSyntaxError("Illegal property accessor");c.push(FunctionDefinition(a,b,!0,EXPRESSED_FORM))}}while(a.match(COMMA));a.mustMatch(RIGHT_CURLY)}break;case LEFT_PAREN:c=ParenExpression(a,b),a.mustMatch(RIGHT_PAREN),c.parenthesized=!0;break;case LET:c=LetBlock(a,b,!1);break;case NULL:case THIS:case TRUE:case FALSE:case IDENTIFIER:case NUMBER:case STRING:case REGEXP:c=new Node(a);break;default:throw a.newSyntaxError("missing operand")}return c}function parse(a,b,c){var d=new lexer.Tokenizer(a,b,c),e=Script(d,!1,!1);if(!d.done)throw d.newSyntaxError("Syntax error");return e}function parseStdin(a,b,c,d){if(a.match(/^[\s]*\.begin[\s]*$/))return++b.value,parseMultiline(b,c);d(a.trim())&&(a="");for(;;)try{var e=new lexer.Tokenizer(a,"stdin",b.value),f=Script(e,!1,!1);return b.value=e.lineno,f}catch(g){if(!e.unexpectedEOF)throw g;var h;do{c&&putstr(c),h=readline();if(!h)throw g}while(d(h.trim()));a+="\n"+h}}function parseMultiline(a,b){var c="";for(;;){b&&putstr(b);var d=readline();if(d===null)return null;if(d.match(/^[\s]*\.end[\s]*$/))break;c+="\n"+d}var e=new lexer.Tokenizer(c,"stdin",a.value),f=Script(e,!1,!1);return a.value=e.lineno,f}var lexer=require("ace/narcissus/jslex"),definitions=require("ace/narcissus/jsdefs");const StringMap=definitions.StringMap,Stack=definitions.Stack;eval(definitions.consts);const blackLists={160:{},185:{},harmony:{}};blackLists[160][IMPORT]=!0,blackLists[160][EXPORT]=!0,blackLists[160][LET]=!0,blackLists[160][MODULE]=!0,blackLists[160][YIELD]=!0,blackLists[185][IMPORT]=!0,blackLists[185][EXPORT]=!0,blackLists[185][MODULE]=!0,blackLists.harmony[WITH]=!0,StaticContext.prototype={ecma3OnlyMode:!1,parenFreeMode:!1,update:function(a){var b={};for(var c in a)b[c]={value:a[c],writable:!0,enumerable:!0,configurable:!0};return Object.create(this,b)},pushLabel:function(a){return this.update({currentLabels:this.currentLabels.push(a),allLabels:this.allLabels.push(a)})},pushTarget:function(a){var b=a.isLoop,c=b||a.type===SWITCH;return this.currentLabels.isEmpty()?(b&&this.update({defaultLoopTarget:a}),c&&this.update({defaultTarget:a}),this):(a.labels=new StringMap,this.currentLabels.forEach(function(b){a.labels.set(b,!0)}),this.update({currentLabels:new Stack,labeledTargets:this.labeledTargets.push(a),defaultLoopTarget:b?a:this.defaultLoopTarget,defaultTarget:c?a:this.defaultTarget}))},nest:function(){return this.topLevel?this.update({topLevel:!1}):this},allow:function(a){switch(a){case EXPORT:if(!this.inModule||this.inFunction||!this.topLevel)return!1;case IMPORT:return!this.inFunction&&this.topLevel;case MODULE:return!this.inFunction&&this.topLevel;default:return!0}}},definitions.defineProperty(Array.prototype,"top",function(){return this.length&&this[this.length-1]},!1,!1,!0);var Np=Node.prototype=SyntheticNode.prototype={};Np.constructor=Node;const TO_SOURCE_SKIP={type:!0,value:!0,lineno:!0,start:!0,end:!0,tokenizer:!0,assignOp:!0};Np.toSource=function(){var a={},b=this;a.type=unevalableConst(this.type),"value"in this&&(a.value=this.value),"lineno"in this&&(a.lineno=this.lineno),"start"in this&&(a.start=this.start),"end"in this&&(a.end=this.end),this.assignOp&&(a.assignOp=unevalableConst(this.assignOp));for(var c in this)this.hasOwnProperty(c)&&!(c in TO_SOURCE_SKIP)&&(a[c]=this[c]);return a.toSource()},Np.push=function(a){return a!==null&&(a.start=0)b+=c;return b},!1,!1,!0);const DECLARED_FORM=0,EXPRESSED_FORM=1,STATEMENT_FORM=2;return{parse:parse,parseStdin:parseStdin,Node:Node,SyntheticNode:SyntheticNode,DECLARED_FORM:DECLARED_FORM,EXPRESSED_FORM:EXPRESSED_FORM,STATEMENT_FORM:STATEMENT_FORM,Tokenizer:lexer.Tokenizer,FunctionDefinition:FunctionDefinition,Module:Module,Export:Export}}),define("ace/narcissus/jslex",["require","exports","module","ace/narcissus/jsdefs"],function(require,exports,module){function Tokenizer(a,b,c){this.cursor=0,this.source=String(a),this.tokens=[],this.tokenIndex=0,this.lookahead=0,this.scanNewlines=!1,this.unexpectedEOF=!1,this.filename=b||"",this.lineno=c||1,this.blackList=blackLists[Narcissus.options.version],this.blockComments=null}var definitions=require("ace/narcissus/jsdefs");eval(definitions.consts);const blackLists={160:{},185:{},harmony:{}};blackLists[160][LET]=!0,blackLists[160][MODULE]=!0,blackLists[160][YIELD]=!0,blackLists[185][MODULE]=!0;var opTokens={};for(var op in definitions.opTypeNames){if(op==="\n"||op===".")continue;var node=opTokens;for(var i=0;i"9")throw this.newSyntaxError("Missing exponent");do ch=a[this.cursor++];while(ch>="0"&&ch<="9");return this.cursor--,!0}return!1},lexZeroNumber:function(a){var b=this.token,c=this.source;b.type=NUMBER,a=c[this.cursor++];if(a==="."){do a=c[this.cursor++];while(a>="0"&&a<="9");this.cursor--,this.lexExponent(),b.value=parseFloat(b.start,this.cursor)}else if(a==="x"||a==="X"){do a=c[this.cursor++];while(a>="0"&&a<="9"||a>="a"&&a<="f"||a>="A"&&a<="F");this.cursor--,b.value=parseInt(c.substring(b.start,this.cursor))}else if(a>="0"&&a<="7"){do a=c[this.cursor++];while(a>="0"&&a<="7");this.cursor--,b.value=parseInt(c.substring(b.start,this.cursor))}else this.cursor--,this.lexExponent(),b.value=0},lexNumber:function(a){var b=this.token,c=this.source;b.type=NUMBER;var d=!1;do a=c[this.cursor++],a==="."&&!d&&(d=!0,a=c[this.cursor++]);while(a>="0"&&a<="9");this.cursor--;var e=this.lexExponent();d=d||e;var f=c.substring(b.start,this.cursor);b.value=d?parseFloat(f):parseInt(f)},lexDot:function(a){var b=this.token,c=this.source,d=c[this.cursor];if(d>="0"&&d<="9"){do a=c[this.cursor++];while(a>="0"&&a<="9");this.cursor--,this.lexExponent(),b.type=NUMBER,b.value=parseFloat(b.start,this.cursor)}else b.type=DOT,b.assignOp=null,b.value="."},lexString:function(ch){var token=this.token,input=this.source;token.type=STRING;var hasEscapes=!1,delim=ch;if(input.length<=this.cursor)throw this.newSyntaxError("Unterminated string literal");while((ch=input[this.cursor++])!==delim){if(this.cursor==input.length)throw this.newSyntaxError("Unterminated string literal");if(ch==="\\"){hasEscapes=!0;if(++this.cursor==input.length)throw this.newSyntaxError("Unterminated string literal")}}token.value=hasEscapes?eval(input.substring(token.start,this.cursor)):input.substring(token.start+1,this.cursor-1)},lexRegExp:function(ch){var token=this.token,input=this.source;token.type=REGEXP;do{ch=input[this.cursor++];if(ch==="\\")this.cursor++;else if(ch==="["){do{if(ch===undefined)throw this.newSyntaxError("Unterminated character class");ch==="\\"&&this.cursor++,ch=input[this.cursor++]}while(ch!=="]")}else if(ch===undefined)throw this.newSyntaxError("Unterminated regex")}while(ch!=="/");do ch=input[this.cursor++];while(ch>="a"&&ch<="z");this.cursor--,token.value=eval(input.substring(token.start,this.cursor))},lexOp:function(a){var b=this.token,c=this.source,d=opTokens[a],e=c[this.cursor];e in d&&(d=d[e],this.cursor++,e=c[this.cursor],e in d&&(d=d[e],this.cursor++,e=c[this.cursor]));var f=d.op;definitions.assignOps[f]&&c[this.cursor]==="="?(this.cursor++,b.type=ASSIGN,b.assignOp=definitions.tokenIds[definitions.opTypeNames[f]],f+="="):(b.type=definitions.tokenIds[definitions.opTypeNames[f]],b.assignOp=null),b.value=f},lexIdent:function(a){var b=this.token,c=a;while((a=this.getValidIdentifierChar(!1))!==null)c+=a;b.type=definitions.keywords[c]||IDENTIFIER,b.type in this.blackList&&(b.type=IDENTIFIER),b.value=c},get:function(a){var b;while(this.lookahead){--this.lookahead,this.tokenIndex=this.tokenIndex+1&3,b=this.tokens[this.tokenIndex];if(b.type!==NEWLINE||this.scanNewlines)return b.type}this.skip(),this.tokenIndex=this.tokenIndex+1&3,b=this.tokens[this.tokenIndex],b||(this.tokens[this.tokenIndex]=b={});var c=this.source;if(this.cursor>=c.length)return b.type=END;b.start=this.cursor,b.lineno=this.lineno;var d=this.getValidIdentifierChar(!0),e=d===null?c[this.cursor++]:null;if(d!==null)this.lexIdent(d);else if(a&&e==="/")this.lexRegExp(e);else if(e in opTokens)this.lexOp(e);else if(e===".")this.lexDot(e);else if(e>="1"&&e<="9")this.lexNumber(e);else if(e==="0")this.lexZeroNumber(e);else if(e==='"'||e==="'")this.lexString(e);else{if(!this.scanNewlines||e!=="\n"&&e!=="\r")throw this.newSyntaxError("Illegal token");e==="\r"&&c[this.cursor]==="\n"&&this.cursor++,b.type=NEWLINE,b.value="\n",this.lineno++}return b.end=this.cursor,b.type},unget:function(){if(++this.lookahead===4)throw"PANIC: too much lookahead!";this.tokenIndex=this.tokenIndex-1&3},newSyntaxError:function(a){a=(this.filename?this.filename+":":"")+this.lineno+": "+a;var b=new SyntaxError(a,this.filename,this.lineno);return b.source=this.source,b.cursor=this.lookahead?this.tokens[this.tokenIndex+this.lookahead&3].start:this.cursor,b},getValidIdentifierChar:function(a){var b=this.source;if(this.cursor>=b.length)return null;var c=b[this.cursor];if(c==="\\"&&b[this.cursor+1]==="u"){try{c=String.fromCharCode(parseInt(b.substring(this.cursor+2,this.cursor+6),16))}catch(d){return null}this.cursor+=5}if(c<="")return c>="a"&&c<="z"||c>="A"&&c<="Z"||c==="$"||c==="_"||!a&&c>="0"&&c<="9"?(this.cursor++,c):null;var e={};e["x"+c]=!0,e[c]=!0;var f=!1;try{f=Function("x","return (x."+(a?"":"x")+c+");")(e)===!0}catch(d){}return f&&this.cursor++,f?c:null}},{Tokenizer:Tokenizer}}),define("ace/narcissus/jsdefs",["require","exports","module"],function(require,exports,module){function defineGetter(a,b,c,d,e){Object.defineProperty(a,b,{get:c,configurable:!d,enumerable:!e})}function defineGetterSetter(a,b,c,d,e,f){Object.defineProperty(a,b,{get:c,set:d,configurable:!e,enumerable:!f})}function defineMemoGetter(a,b,c,d,e){Object.defineProperty(a,b,{get:function(){var f=c();return defineProperty(a,b,f,d,!0,e),f},configurable:!0,enumerable:!e})}function defineProperty(a,b,c,d,e,f){Object.defineProperty(a,b,{value:c,writable:!e,configurable:!d,enumerable:!f})}function isNativeCode(a){return typeof a=="function"&&a.toString().match(/\[native code\]/)}function getPropertyDescriptor(a,b){while(a){if({}.hasOwnProperty.call(a,b))return Object.getOwnPropertyDescriptor(a,b);a=Object.getPrototypeOf(a)}}function getPropertyNames(a){var b=Object.create(null,{});while(a){var c=Object.getOwnPropertyNames(a);for(var d=0,e=c.length;d=",">","<<",">>",">>>","+","-","*","/","%","!","~","UNARY_PLUS","UNARY_MINUS","++","--",".","[","]","{","}","(",")","SCRIPT","BLOCK","LABEL","FOR_IN","CALL","NEW_WITH_ARGS","INDEX","ARRAY_INIT","OBJECT_INIT","PROPERTY_INIT","GETTER","SETTER","GROUP","LIST","LET_BLOCK","ARRAY_COMP","GENERATOR","COMP_TAIL","IDENTIFIER","NUMBER","STRING","REGEXP","break","case","catch","const","continue","debugger","default","delete","do","else","export","false","finally","for","function","if","import","in","instanceof","let","module","new","null","return","switch","this","throw","true","try","typeof","var","void","yield","while","with"],statementStartTokens=["break","const","continue","debugger","do","for","if","return","switch","throw","try","var","yield","while","with"],whitespaceChars=["\t"," ","\f"," "," ",""," ","á Ž"," ","â€"," "," "," "," "," "," "," "," "," "," ","âŸ"," "],whitespace={};for(var i=0;i>>":"URSH",">>":"RSH",">=":"GE",">":"GT","++":"INCREMENT","--":"DECREMENT","+":"PLUS","-":"MINUS","*":"MUL","/":"DIV","%":"MOD","!":"NOT","~":"BITWISE_NOT",".":"DOT","[":"LEFT_BRACKET","]":"RIGHT_BRACKET","{":"LEFT_CURLY","}":"RIGHT_CURLY","(":"LEFT_PAREN",")":"RIGHT_PAREN"},keywords={"__proto__":null},tokenIds={},consts=Narcissus.hostSupportsEvalConst?"const ":"var ";for(var i=0,j=tokens.length;i0&&(consts+=", ");var t=tokens[i],name;/^[a-z]/.test(t)?(name=t.toUpperCase(),keywords[t]=i):name=/^\W/.test(t)?opTypeNames[t]:t,consts+=name+" = "+i,tokenIds[name]=i,tokens[t]=i}consts+=";";var isStatementStartCode={"__proto__":null};for(i=0,j=statementStartTokens.length;i>",">>>","+","-","*","/","%"];for(i=0,j=assignOps.length;i
'; } function sendSearchRequest (searchField, evt) { if (evt.getCharCode() != Ext.EventObject.RETURN) { return; } // Clear any previous errors showSearchError(''); // Clear the result list var resultList = Ext.getDom('searchResults'); while (resultList.childNodes[0]) { resultList.removeChild( resultList.childNodes[0] ); } Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'browser/search/', method: 'POST', success: handleSearchResponse, failure: handleSearchFailure, params: {query: searchField.getValue()} }); } function handleSearchResponse (response, options) { var text = response.responseText; if (text == '') { showSearchError('Nothing matched your query'); return; } var resultList = Ext.getDom('searchResults'); var results = text.split(','); Ext.each(results, function (item) { var li = document.createElement('li'); li.innerHTML = '' + item + ''; resultList.appendChild(li); }); } function handleSearchFailure (response, options) { showSearchError('Search request failed'); } // Auto-Completer Tab function createCompleterPanel() { var metricCompleter = new MetricCompleter({emptyText: 'Start typing a metric name...'}); metricCompleter.on('specialkey', function (field, e) { if (e.getKey() == e.ENTER) { var target = metricCompleter.getValue(); Composer.toggleTarget(target); } }); return new Ext.Panel({ title: 'Auto-Completer', layout: { type: 'vbox', align: 'stretch' }, items: [ metricCompleter, new Ext.form.Label({html: ' Help '}) ] }); } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/completer.js0000664000000000000000000000302300000000000022003 0ustar00rootroot00000000000000// From Ext library /*global Ext*/ var MetricCompleter; MetricCompleter = Ext.extend(Ext.form.ComboBox, { displayField: 'path', listEmptyText: 'No matching metrics', mode: 'remote', hideTrigger: true, queryDelay: 100, queryParam: 'query', typeAhead: false, minChars: 1, initComponent: function () { var _this = this; var store = new Ext.data.JsonStore({ url: document.body.dataset.baseUrl + 'metrics/find/', root: 'metrics', fields: ['path', 'name'], baseParams: {format: 'completer'} }); var config = {store: store}; Ext.apply(this, config); Ext.apply(this.initialConfig, config); MetricCompleter.superclass.initComponent.call(this); this.addListener('beforequery', this.prepareQuery.createDelegate(this)); this.addListener('specialkey', this.onSpecialKey.createDelegate(this)); this.addListener('afterrender', function () { _this.getEl().addListener('specialkey', function (el, e) { _this.onSpecialKey(_this.getEl(), e); } ); } ); }, prepareQuery: function (queryEvent) { if (queryEvent.query.substr(-1) != '*') { queryEvent.query += '*'; } }, onSpecialKey: function (field, e) { if (e.getKey() == e.TAB) { // This was a pain in the ass to actually get it working right field.getEl().blur(); field.getEl().focus(50); field.doQuery( field.getValue() ); e.stopEvent(); return false; } } }); Ext.reg('metriccompleter', MetricCompleter); ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/composer.js0000664000000000000000000002025700000000000021650 0ustar00rootroot00000000000000/* Copyright 2008 Orbitz WorldWide * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // From Ext library /*global Ext*/ // Defined in composer_widgets.js /*global createComposerWindow*/ // Defined in composer.html /*global addTarget getTargetRecord TargetStore*/ var RENDER_BASE_URL = window.location.protocol + '//' + window.location.host + document.body.dataset.baseUrl + 'render/?'; /* GraphiteComposer encapsulates a set of Ext UI Panels, * as well as a ParameterizedURL for the displayed graph. */ function GraphiteComposer () { this.url = new ParameterizedURL(RENDER_BASE_URL); this.state = {}; // For storing non-querystring state information this.window = createComposerWindow(this); } GraphiteComposer.prototype = { toggleTargetWithoutUpdate: function(target) { this.toggleTarget(target, false); }, toggleTarget: function (target, updateImage) { /* Add the given target to the graph if it does not exist, * otherwise remove it. * Optionally reload the image. (default = do update) */ var record = getTargetRecord(target); if (record) { TargetStore.remove(record); } else { // toggle it on addTarget(target); } this.syncTargetList(); // If the updateImage parameter is unspecified or true, reload the image. if(undefined == updateImage || true == updateImage) { this.updateImage(); } }, loadMyGraph: function (name, url) { this.state.myGraphName = name; this.loadURL(url); }, loadURL: function (url) { /* Take the targets out of the URL and add them to the store properly */ TargetStore.removeAll(); var tempUrl = new ParameterizedURL(RENDER_BASE_URL); tempUrl.copyQueryStringFromURL(url); var targets = tempUrl.getParamList('target'); tempUrl.removeParam('target'); this.url.setQueryString(tempUrl.queryString); /* Use ...WithoutUpdate here to avoid loading the image too soon. If * there are lots of targets, each modification would cause an extra * render. */ Ext.each(targets, this.toggleTargetWithoutUpdate, this); // Fit the image into the window this.url.setParam('width', this.window.getInnerWidth()); this.url.setParam('height', this.window.getInnerHeight()); // And don't forget to update the time display widget var from = this.url.getParam('from'); var until = this.url.getParam('until'); var timeInfo = {}; if (!from) { // No time interval specified, use the default timeInfo.mode = 'recent'; timeInfo.quantity = '24'; timeInfo.units = 'hours'; } else { var match = from.match(/^-(\d+)(\w+)/); if (match) { // Relative time timeInfo.mode = 'recent'; timeInfo.quantity = match[1]; timeInfo.units = match[2]; } else { // Absolute time timeInfo.mode = 'date-range'; timeInfo.startDate = this.parseDate(from); timeInfo.endDate = this.parseDate(until); } } this.window.updateTimeDisplay(timeInfo); this.window.updateUI(); this.updateImage(true); }, syncTargetList: function () { this.url.removeParam('target'); TargetStore.each(function (record) { this.url.addParam('target', record.data.value); }, this); }, updateImage: function (urlLoad) { /* Set the image's url to reflect this.url's current params */ var img = this.window.getImage(); if (img) { var now = new Date(); var unixTime = now.valueOf() / 1000; this.url.setParam('_salt', unixTime.toString() ); img.src = this.url.getURL(); if (this.topWindow && !urlLoad) { this.url.removeParam('_salt'); this.topWindow.history.pushState('', '', '?' + this.url.queryString); } } }, enableHistory: function (topWindow) { if (topWindow.history && topWindow.history.pushState) { this.topWindow = topWindow; var that = this; topWindow.onpopstate = function() { that.loadURL(topWindow.location.href); }; } }, parseDate: function(dateString) { // Format is HH:MM_YYYYMMDD var hour = dateString.substr(0,2); var minute = dateString.substr(3,2); var year = dateString.substr(6,4); var month = dateString.substr(10,2); var day = dateString.substr(12,14); month = parseInt(month) - 1; // Date assumes months are zero-indexed return new Date(year, month, day, hour, minute, 0, 0); } }; /* ParameterizedURL encapsulates a URL and * provides methods to access and modify the * query string parameters in a structured fashion. * This code should not be specific to Graphite or * the Composer in any way. */ function ParameterizedURL (baseURL) { this.baseURL = baseURL ? baseURL : ''; this.params = {}; this.queryString = ''; } ParameterizedURL.prototype = { /* Parameter access methods */ getParam: function (key) { /* Return the first value of this parameter */ var values = this.params[key]; return values ? values[0] : null; }, getParamList: function (key) { /* Return an array of all values for this parameter */ var values = this.params[key]; return values ? values : new Array(); }, getURL: function () { /* Return the current URL */ return this.baseURL + this.queryString; }, /* Parameter modification methods */ addParam: function (key, value) { /* Add a parameter value */ var values = this.getParamList(key); values.push(value); this.params[key] = values; this.syncQueryString(); }, removeParam: function (key, value) { /* Remove one or all values for a given parameter */ if (value == null) { //Remove all values this.params[key] = null; // in case it didn't exist, delete won't break now delete this.params[key]; } else { //Remove a specific value var newValues = this.getParamList(key); newValues.remove(value); if (newValues.length) { this.params[key] = newValues; } else { this.params[key] = null; delete this.params[key]; } } this.syncQueryString(); }, setParam: function (key, value) { /* Give the param only the given value */ this.params[key] = [value]; this.syncQueryString(); }, setParamList: function (key, values) { /* Give the param a given list of values */ this.params[key] = values; this.syncQueryString(); }, setParamHash: function (params) { /* Use the given params Hash (and update this.queryString to match) */ this.params = params; this.syncQueryString(); }, syncParams: function () { /* Set the value of this.params to reflect the parameters in this.queryString * Call this whenever you modify this.queryString */ var params = Ext.urlDecode( this.queryString ); Ext.iterate(params, function(key, value) { //We want all of our param values to be arrays if ( Ext.isString(value) ) { params[key] = [value]; } if (value == 'undefined' || value == undefined) { params[key] = null; delete params[key]; } }); this.params = params; }, setQueryString: function (qs) { /* Use the given query string (and update this.params to match) */ this.queryString = qs this.syncParams(); this.syncQueryString(); }, syncQueryString: function () { /* Set the value of this.queryString to reflect the parameters in this.params * Call this whenever you modify this.params */ this.queryString = Ext.urlEncode(this.params).replace(/#/,'%23'); }, copyQueryStringFromURL: function (url) { /* Make this object reflect the parameters of the given url */ var i = url.indexOf('?'); if (i == -1) { // No query string this.setParamHash({}); return; } var queryString = url.substr(i+1); this.setQueryString(queryString); } }; ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/composer_widgets.js0000664000000000000000000015325700000000000023405 0ustar00rootroot00000000000000/* Copyright 2008 Orbitz WorldWide * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * * ====================================================================== * * PLEASE DO NOT USE A COMMA AFTER THE FINAL ITEM IN A LIST. * * ====================================================================== * * It works fine in FF / Chrome, but completely breaks Internet Explorer. * Thank you. * */ // From Ext library /*global Ext*/ // Defined in composer.html /*global addTarget Browser GraphiteConfig indexOfTarget insertTarget removeTarget replaceTarget TargetStore*/ // Defined in composer.js /*global MetricCompleter*/ var DEFAULT_WINDOW_WIDTH = 600; var DEFAULT_WINDOW_HEIGHT = 400; var Composer; function createComposerWindow(myComposer) { //This global is an ugly hack, probly need to make these widgets into more formal objects //and keep their associated Composer object as an attribute. Composer = myComposer; //Can't define this inline because I need a reference in a closure below var timeDisplay = new Ext.Toolbar.TextItem({text: 'Now showing the past 24 hours'}); var topToolbar = [ createToolbarButton('Update Graph', 'refresh.png', updateGraph), createToolbarButton('Select a Date Range', 'calendar.png', toggleWindow(createCalendarWindow) ), createToolbarButton('Select Recent Data', 'clock.png', toggleWindow(createRecentWindow) ), createToolbarButton('Create from URL', 'upload.png', toggleWindow(createURLWindow) ), createToolbarButton('Short URL', 'share.png', showShortUrl), '-', timeDisplay ]; if (GraphiteConfig.showMyGraphs) { var saveButton = createToolbarButton('Save to My Graphs', 'save.png', saveMyGraph); var deleteButton = createToolbarButton('Delete from My Graphs', 'trash.png', deleteMyGraph); topToolbar.splice(0, 0, saveButton, deleteButton); } var bottomToolbar = [ { text: 'Graph Options', menu: createOptionsMenu() }, { text: 'Graph Data', handler: toggleWindow(GraphDataWindow.create.createDelegate(GraphDataWindow)) }, { text: 'Auto-Refresh', id: 'autorefresh_button', enableToggle: true, toggleHandler: toggleAutoRefresh } ]; var win = new Ext.Window({ width: DEFAULT_WINDOW_WIDTH, height: DEFAULT_WINDOW_HEIGHT, title: 'Graphite Composer', layout: 'border', region: 'center', maximizable: true, closable: false, tbar: topToolbar, buttons: bottomToolbar, buttonAlign: 'left', items: { html: '', region: 'center' }, listeners: { activate: keepDataWindowOnTop, show: fitImageToWindow, resize: fitImageToWindow } }); // Tack on some convenience closures win.updateTimeDisplay = function (time) { var text; if (time.mode == 'date-range') { text = 'From ' + time.startDate.toLocaleString(); text += ' Until ' + time.endDate.toLocaleString(); text = text.replace(/:00 /g, ' '); // Strip out the seconds } else if (time.mode == 'recent') { text = 'Now showing the past ' + time.quantity + ' ' + time.units; } timeDisplay.getEl().dom.innerHTML = text; }; win.updateUI = function () { var toggled = Composer.url.getParam('autorefresh') ? true : false; Ext.getCmp('autorefresh_button').toggle(toggled); updateCheckItems(); }; win.getImage = function () { return Ext.getDom('image-viewer'); }; return win; } function toggleWindow(createFunc) { // Convenience for lazily creating toggled dialogs function toggler (button, e) { if (!button.window) { //First click, create the window button.window = createFunc(); } if (button.window.isVisible()) { button.window.hide(); } else { button.window.show(); } } return toggler; } function ifEnter(func) { // Convenience decorator for specialkey listener definitions return function (widget, e) { if (e.getCharCode() == Ext.EventObject.RETURN) { func(widget); } } } function keepDataWindowOnTop () { if (GraphDataWindow.window && GraphDataWindow.window.isVisible()) { GraphDataWindow.window.toFront(); } } function fitImageToWindow(win) { Composer.url.setParam('width', win.getInnerWidth()); Composer.url.setParam('height', win.getInnerHeight()); try { Composer.updateImage(); } catch (err) { //An exception gets thrown when the initial resize event //occurs prior to rendering the image viewer. Safe to ignore. } } /* Toolbar stuff */ function createToolbarButton(tip, icon, handler) { return new Ext.Toolbar.Button({ style: 'margin: 0 5px; background:transparent url(' + document.body.dataset.staticRoot + 'img/' + icon + ') no-repeat scroll 0% 50%', handler: handler, handleMouseEvents: false, text: '   ', listeners: { render: function (button) { button.el.toolTip = new Ext.ToolTip({ html: tip, showDelay: 100, dismissDelay: 10000, target: button.el }); } } }); } /* "Date Range" Calendar */ function createCalendarWindow() { // Start/End labels var style = 'font-family: tahoma,arial,verdana,sans-serif; font-size:11px;'; var startDateHeader = { html: '
Start Date
' }; var endDateHeader = { html: '
End Date
' }; // Date controls var startDateControl = new Ext.DatePicker({ id: 'start-date', maxDate: new Date() }); var endDateControl = new Ext.DatePicker({ id: 'end-date', maxDate: new Date() }); startDateControl.on('select', calendarSelectionMade); endDateControl.on('select', calendarSelectionMade); // Time controls var startTimeControl = new Ext.form.TimeField({ id: 'start-time', increment: 30, allowBlank: false, value: '12:00 AM', listeners: {select: calendarSelectionMade, specialkey: ifEnter(calendarSelectionMade)} }); var endTimeControl = new Ext.form.TimeField({ id: 'end-time', allowBlank: false, value: '11:59 PM', listeners: {select: calendarSelectionMade, specialkey: ifEnter(calendarSelectionMade)} }); var myWindow; var resizeStuff = function () { startTimeControl.setWidth( startDateControl.el.getWidth() ); endTimeControl.setWidth( endDateControl.el.getWidth() ); myWindow.setWidth( startDateControl.el.getWidth() + endDateControl.el.getWidth() + myWindow.getFrameWidth() ); //myWindow.setHeight( startDateControl.el.getHeight() + startTimeControl.el.getHeight() + myWindow.getFrameHeight() ); }; myWindow = new Ext.Window({ title: 'Select Date Range', layout: 'table', height: 300, width: 400, layoutConfig: { columns: 2 }, closeAction: 'hide', items: [ startDateHeader, endDateHeader, startDateControl, endDateControl, startTimeControl, endTimeControl ], listeners: {show: resizeStuff} }); return myWindow; } function calendarSelectionMade(datePicker, selectedDate) { var startDate = getCalendarSelection('start'); var endDate = getCalendarSelection('end'); Composer.url.setParam('from', asDateString(startDate) ); Composer.url.setParam('until', asDateString(endDate) ); Composer.updateImage(); Composer.window.updateTimeDisplay({ mode: 'date-range', startDate: startDate, endDate: endDate }); } function getCalendarSelection(which) { var myDate = Ext.getCmp(which + '-date').getValue(); var myTime = Ext.getCmp(which + '-time').getEl().dom.value; // Need to grab the raw textfield value, which may not be selected var myHour = myTime.match(/(\d+):/)[1]; var myMinute = myTime.match(/:(\d+)/)[1]; if (myTime.match(/\bAM\b/i) && myHour == '12') { myHour = 0; } if (myTime.match(/\bPM\b/i) && myHour != '12') { myHour = parseInt(myHour) + 12; } return myDate.add(Date.HOUR, myHour).add(Date.MINUTE, myMinute); } function asDateString(dateObj) { return dateObj.format('H:i_Ymd'); } /* Short url window */ function showShortUrl() { var showUrl = function(options, success, response) { if(success) { var win = new Ext.Window({ title: 'Graph URL', width: 600, height: 125, layout: 'border', modal: true, items: [ { xtype: 'label', region: 'north', style: 'text-align: center;', text: 'Short Direct URL to this graph' }, { xtype: 'textfield', region: 'center', value: window.location.origin + response.responseText, editable: false, style: 'text-align: center; font-size: large;', listeners: { focus: function (field) { field.selectText(); } } } ], buttonAlign: 'center', buttons: [ {text: 'Close', handler: function () { win.close(); } } ] }); win.show(); } } Ext.Ajax.request({ method: 'GET', url: document.body.dataset.baseUrl + 's/render/?' + Composer.url.queryString, callback: showUrl }); } /* "Recent Data" dialog */ function toggleWindow(createFunc) { function toggler (button, e) { if (!button.window) { //First click, create the window button.window = createFunc(); } if (button.window.isVisible()) { button.window.hide(); } else { button.window.show(); } } return toggler; } function createURLWindow() { var urlField = new Ext.form.TextField({ id: 'from-url', allowBlank: false, vtype: 'url', listeners: { change: urlChosen, specialkey: ifEnter(urlChosen) } }); return new Ext.Window({ title: 'Enter a URL to build graph from', layout: 'fit', height: 60, width: 450, closeAction: 'hide', items: [ urlField ] }); } function urlChosen() { var url = Ext.getCmp('from-url').getValue(); Composer.loadMyGraph('temp', decodeURIComponent(url)) } function createRecentWindow() { var quantityField = new Ext.form.NumberField({ id: 'time-quantity', grow: true, value: 24, listeners: {change: recentSelectionMade, specialkey: ifEnter(recentSelectionMade)} }); var unitSelector = new Ext.form.ComboBox({ id: 'time-units', editable: false, triggerAction: 'all', mode: 'local', store: ['minutes', 'hours', 'days', 'weeks', 'months', 'years'], width: 75, value: 'hours', listeners: {select: recentSelectionMade} }); return new Ext.Window({ title: 'Select a Recent Time Range', layout: 'table', height: 60, //there's gotta be a way to auto-size these windows! width: 235, layoutConfig: { columns: 3 }, closeAction: 'hide', items: [ { html: '
View the past
', style: 'border: none; background-color: rgb(223,232,246)' }, quantityField, unitSelector ] }); } function recentSelectionMade(combo, record, index) { var quantity = Ext.getCmp('time-quantity').getValue(); var units = Ext.getCmp('time-units').getValue(); var fromString = '-' + quantity + units; Composer.url.setParam('from', fromString); Composer.url.removeParam('until'); Composer.updateImage(); Composer.window.updateTimeDisplay({ mode: 'recent', quantity: quantity, units: units }); } /* "Save to MyGraphs" */ function saveMyGraph(button, e) { var myGraphName = ''; if (Composer.state.myGraphName) { myGraphName = Composer.state.myGraphName; var tmpArray = myGraphName.split('.'); if (tmpArray.length > 1) { tmpArray = tmpArray.slice(1, tmpArray.length); myGraphName = tmpArray.join('.'); } } Ext.MessageBox.prompt( 'Save to My Graphs', //title 'Please enter a name for your Graph', //prompt message function (button, text) { //handler if (button != 'ok') { return; } if (!text) { Ext.Msg.alert('You must enter a graph name!'); return; } if (text.charAt(text.length - 1) == '.') { Ext.Msg.alert('Graph names cannot end in a period.'); return; } //Save the name for future use and re-load the "My Graphs" tree Composer.state.myGraphName = text; //Send the request Ext.Ajax.request({ method: 'GET', url: document.body.dataset.baseUrl + 'composer/mygraph/', params: {action: 'save', graphName: text, url: Composer.url.getURL()}, callback: handleSaveMyGraphResponse }); }, this, //scope false, //multiline myGraphName ? myGraphName : '' //default value ); } function handleSaveMyGraphResponse(options, success, response) { var message; if (success) { Browser.trees.mygraphs.reload(); message = 'Graph saved successfully'; } else { message = 'There was an error saving your Graph, please try again later.'; } Ext.MessageBox.show({ title: 'Save to My Graphs - Result', msg: message, buttons: Ext.MessageBox.OK }); } function deleteMyGraph() { Ext.MessageBox.prompt( 'Delete a saved My Graph', //title 'Please enter the name of the My Graph you wish to delete', //prompt message function (button, text) { //handler if (button != 'ok') { return; } if (!text) { Ext.Msg.alert('Invalid My Graph name!'); return; } //Send the request Ext.Ajax.request({ method: 'GET', url: document.body.dataset.baseUrl + 'composer/mygraph/', params: {action: 'delete', graphName: text}, callback: function (options, success, response) { var message; if (success) { Browser.trees.mygraphs.reload(); message = 'Graph deleted successfully'; } else { message = 'There was an error performing the operation.'; } Ext.Msg.show({ title: 'Delete My Graph', msg: message, buttons: Ext.Msg.OK }); } }); }, this, //scope false, //multiline Composer.state.myGraphName ? Composer.state.myGraphName : '' //default value ); } /* Graph Data dialog */ var GraphDataWindow = { create: function () { var _this = this; this.targetList = new Ext.ListView({ store: TargetStore, multiSelect: true, emptyText: 'No graph targets', reserveScrollOffset: true, columnSort: false, hideHeaders: true, width: 385, height: 140, columns: [ { header: 'Graph Targets', width: 1.0, dataIndex: 'value', tpl: '{value:htmlEncode}' } ], listeners: { contextmenu: this.targetContextMenu, afterrender: this.targetChanged, selectionchange: this.targetChanged, dblclick: function (targetList, index, node, e) { targetList.select(index); this.editTarget(); }, scope: this } }); var targetsPanel = new Ext.Panel({ region: 'center', width: 400, height: 200, layout: 'fit', items: this.targetList }); var buttonPanel = new Ext.Panel({ region: 'east', width: 100, baseCls: 'x-window-mc', layout: { type: 'vbox', align: 'stretch' }, defaults: { xtype: 'button', disabled: true }, items: [ { text: 'Add', handler: this.addTarget.createDelegate(this), disabled: false }, { text: 'Edit', id: 'editTargetButton', handler: this.editTarget.createDelegate(this) }, { text: 'Remove', id: 'removeTargetButton', handler: this.removeTarget.createDelegate(this) }, { text: 'Move', id: 'moveButton', menuAlign: 'tr-tl', menu: { subMenuAlign: 'tr-tl', defaults: { defaultAlign: 'tr-tl' }, items: [ { text: 'Move Up', handler: this.moveTargetUp.createDelegate(this) }, { text: 'Move Down', handler: this.moveTargetDown.createDelegate(this) }, { text: 'Swap', handler: this.swapTargets.createDelegate(this), id: 'menuSwapTargets' } ] } }, { text: 'Apply Function', id: 'applyFunctionButton', menuAlign: 'tr-tl', menu: { subMenuAlign: 'tr-tl', defaults: { defaultAlign: 'tr-tl' }, items: createFunctionsMenu() } }, { text: 'Undo Function', handler: this.removeOuterCall.createDelegate(this), id: 'undoFunctionButton' } ] }); this.window = new Ext.Window({ title: 'Graph Data', height: 200, width: 600, closeAction: 'hide', layout: 'border', items: [ targetsPanel, buttonPanel ], listeners: { afterrender: function () { if (_this.targetList.getNodes().length > 0) { _this.targetList.select(0); } } } }); return this.window; }, targetChanged: function () { if (!this.targetList) { return; } // Ignore initial call var selected; try { selected = this.getSelectedTargets().length; } catch (e) { return; } if (selected == 0) { Ext.getCmp('editTargetButton').disable(); Ext.getCmp('removeTargetButton').disable(); Ext.getCmp('applyFunctionButton').disable(); Ext.getCmp('undoFunctionButton').disable(); Ext.getCmp('moveButton').disable(); } else { Ext.getCmp('editTargetButton').enable(); Ext.getCmp('removeTargetButton').enable(); Ext.getCmp('applyFunctionButton').enable(); Ext.getCmp('undoFunctionButton').enable(); Ext.getCmp('moveButton').enable(); } // Swap Targets if (selected == 2) Ext.getCmp('menuSwapTargets').enable(); else Ext.getCmp('menuSwapTargets').disable(); }, targetContextMenu: function (targetList, index, node, e) { /* Select the right-clicked row unless it is already selected */ if (! targetList.isSelected(index) ) { targetList.select(index); } var removeItem = {text: 'Remove', handler: this.removeTarget.createDelegate(this)}; var editItem = {text: 'Edit', handler: this.editTarget.createDelegate(this)}; var moveMenu = { text: 'Move', menu: [ { text: 'Move Up', handler: this.moveTargetUp.createDelegate(this) }, { text: 'Move Down', handler: this.moveTargetDown.createDelegate(this) }, { text: 'Swap', handler: this.swapTargets.createDelegate(this), disabled: true } ] }; if (this.getSelectedTargets().length == 0) { removeItem.disabled = true; editItem.disabled = true; moveMenu.disabled = true; } if (this.getSelectedTargets().length == 2) moveMenu.menu[2].disabled = false; var contextMenu = new Ext.menu.Menu({ items: [removeItem, editItem, moveMenu] }); contextMenu.showAt( e.getXY() ); e.stopEvent(); }, applyFuncToEach: function (funcName, extraArg) { var _this = this; function applyFunc() { Ext.each(_this.getSelectedTargets(), function (target) { var newTarget; if (extraArg) { newTarget = funcName + '(' + target + ',' + extraArg + ')'; } else { newTarget = funcName + '(' + target + ')'; } replaceTarget(target, newTarget); _this.targetList.select( TargetStore.findExact('value', newTarget), true); } ); Composer.syncTargetList(); Composer.updateImage(); } return applyFunc; }, applyFuncToEachWithInput: function (funcName, question, options) { if (options == null) { options = {}; } function applyFunc() { Ext.MessageBox.prompt( 'Input Required', //title question, //message function (button, inputValue) { //handler if (button == 'ok' && (options.allowBlank || inputValue != '')) { if (options.quote) { inputValue = '"' + inputValue + '"'; } applyFuncToEach(funcName, inputValue)(); } }, this, //scope false, //multiline '' //initial value ); } applyFunc = applyFunc.createDelegate(this); return applyFunc; }, applyFuncToAll: function (funcName) { function applyFunc() { var args = this.getSelectedTargets().join(','); var oldTargets = this.getSelectedTargets(); var firstTarget = oldTargets.shift(); var newTarget = funcName + '(' + args + ')'; // Insert new target where the first selected was replaceTarget(firstTarget,newTarget); Ext.each(oldTargets, function (target) { removeTarget(target); } ); Composer.syncTargetList(); Composer.updateImage(); this.targetList.select( TargetStore.findExact('value', newTarget), true); } applyFunc = applyFunc.createDelegate(this); return applyFunc; }, removeOuterCall: function () { /* It turns out that this is a big pain in the ass to do properly. * The following code is *almost* correct. It will fail if there is * an argument with a quoted parenthesis in it. Who cares... */ var _this = this; Ext.each(this.getSelectedTargets(), function (target) { var args = []; var i, c; var lastArg = 0; var depth = 0; var argString = target.replace(/^[^(]+\((.+)\)/, '$1'); //First we strip it down to just args for (i = 0; i < argString.length; i++) { switch (argString.charAt(i)) { case '(': depth += 1; break; case '{': depth += 1; break; case ')': depth -= 1; break; case '}': depth -= 1; break; case ',': if (depth > 0) { continue; } if (depth < 0) { Ext.Msg.alert('Malformed target, cannot remove outer call.'); return; } args.push( argString.substring(lastArg, i).replace(/^\s+/, '').replace(/\s+$/, '') ); lastArg = i + 1; break; } } args.push( argString.substring(lastArg, i) ); var firstIndex = indexOfTarget(target); removeTarget(target); args.reverse() Ext.each(args, function (arg) { if (!arg.match(/^([0123456789\.]+|".+"|'.*')$/)) { //Skip string and number literals insertTarget(firstIndex, arg); _this.targetList.select( TargetStore.findExact('value', arg), true); } }); Composer.syncTargetList(); Composer.updateImage(); } ); }, addTarget: function (target) { var metricCompleter; var win; metricCompleter = new MetricCompleter({ listeners: { specialkey: function (field, e) { if (e.getKey() == e.ENTER) { var target = metricCompleter.getValue(); addTarget(target); Composer.syncTargetList(); Composer.updateImage(); win.close(); e.stopEvent(); return false; } }, afterrender: function (field) { metricCompleter.focus('', 500); } } }); win = new Ext.Window({ title: 'Add a new Graph Target', id: 'addTargetWindow', modal: true, width: 400, height: 115, layout: { type: 'vbox', align:'stretch', pack: 'center' }, items: [ {xtype: 'label', text: 'Type the path of your new Graph Target.'}, metricCompleter ], buttonAlign: 'center', buttons: [ { xtype: 'button', text: 'OK', handler: function () { var target = metricCompleter.getValue(); addTarget(target); Composer.syncTargetList(); Composer.updateImage(); win.close(); } }, { xtype: 'button', text: 'Cancel', handler: function () { Ext.getCmp('addTargetWindow').close(); } } ] }); win.show(); }, removeTarget: function (item, e) { Ext.each(this.getSelectedTargets(), function (target) { removeTarget(target); }); Composer.syncTargetList(); Composer.updateImage(); }, editTarget: function (item, e) { var selected = this.targetList.getSelectedRecords(); if (selected.length != 1) { Ext.MessageBox.show({ title: 'Error', msg: 'You must select exactly one target to edit.', icon: Ext.MessageBox.ERROR, buttons: Ext.MessageBox.OK }); return; } var record = selected[0]; var metricCompleter; var win; metricCompleter = new MetricCompleter({ value: record.get('value'), listeners: { specialkey: function (field, e) { if (e.getKey() == e.ENTER) { var target = metricCompleter.getValue(); record.set('value', target); record.commit(); Composer.syncTargetList(); Composer.updateImage(); win.close(); e.stopEvent(); return false; } }, afterrender: function (field) { metricCompleter.focus('', 500); } } }); function editHandler () { var newValue = metricCompleter.getValue(); if (newValue != '') { record.set('value', newValue); record.commit(); Composer.syncTargetList(); Composer.updateImage(); } win.close(); } editHandler = editHandler.createDelegate(this); //dynamic scoping can really be a bitch win = new Ext.Window({ title: 'Edit Graph Target', id: 'editTargetWindow', modal: true, width: 400, height: 115, layout: { type: 'vbox', align:'stretch', pack: 'center' }, items: [ {xtype: 'label', text: 'Edit the path of your Graph Target.'}, metricCompleter ], buttonAlign: 'center', buttons: [ { xtype: 'button', text: 'OK', handler: editHandler }, { xtype: 'button', text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); }, moveTargetUp: function() { this._moveTarget(-1); }, moveTargetDown: function() { this._moveTarget(1); }, swapTargets: function() { this._swapTargets(); }, _moveTarget: function(direction) { var store = this.targetList.getStore(); var selectedRecords = this.targetList.getSelectedRecords(); // Don't move past boundaries var exit = false; Ext.each(selectedRecords, function(record) { var index = store.indexOf(record); if (direction == -1 && index == 0) { exit = true; return false; } else if (direction == 1 && index == store.getCount() - 1) { exit = true; return false; } }); if (exit) return; var newSelections = []; Ext.each(selectedRecords, function(recordA) { var indexA = store.indexOf( recordA ); var valueA = recordA.get('value'); var recordB = store.getAt( indexA + direction ); // swap recordA.set('value', recordB.get('value')); recordB.set('value', valueA); recordA.commit(); recordB.commit(); newSelections.push( indexA + direction ); }); Composer.syncTargetList(); Composer.updateImage(); this.targetList.select(newSelections); }, _swapTargets: function() { var selectedRecords = this.targetList.getSelectedRecords(); if (selectedRecords.length != 2) return; var recordA = selectedRecords[0]; var recordB = selectedRecords[1]; var valueA = recordA.get('value'); recordA.set('value', recordB.get('value')); recordB.set('value', valueA); recordA.commit(); recordB.commit(); Composer.syncTargetList(); Composer.updateImage(); }, addWlSelected: function (item, e) { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'whitelist/add', method: 'POST', success: function () { Ext.Msg.alert('Result', 'Successfully added metrics to whitelist.'); }, failure: function () { Ext.Msg.alert('Result', 'Failed to add metrics to whitelist.'); }, params: {metrics: this.getSelectedTargets().join('\n') } }); }, removeWlSelected: function (item, e) { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'whitelist/remove', method: 'POST', success: function () { Ext.Msg.alert('Result', 'Successfully removed metrics from whitelist.'); }, failure: function () { Ext.Msg.alert('Result', 'Failed to remove metrics from whitelist.'); }, params: {metrics: this.getSelectedTargets().join('\n') } }); }, getSelectedTargets: function () { var targets = []; Ext.each(this.targetList.getSelectedRecords(), function (record) { targets.push( record.get('value') ); }); return targets; } }; /* Yet another ghetto api hack */ var applyFuncToAll = GraphDataWindow.applyFuncToAll.createDelegate(GraphDataWindow); var applyFuncToEach = GraphDataWindow.applyFuncToEach.createDelegate(GraphDataWindow); var applyFuncToEachWithInput = GraphDataWindow.applyFuncToEachWithInput.createDelegate(GraphDataWindow); function createFunctionsMenu() { return [{ text: 'Combine', menu: [ {text: 'Sum', handler: applyFuncToAll('sumSeries')}, {text: 'Sum (of series lists)', handler: applyFuncToAll('sumSeriesLists')}, {text: 'Average', handler: applyFuncToAll('averageSeries')}, {text: 'Product', handler: applyFuncToAll('multiplySeries')}, {text: 'Product (of series lists)', handler: applyFuncToAll('multiplySeriesLists')}, {text: 'Min Values', handler: applyFuncToAll('minSeries')}, {text: 'Max Values', handler: applyFuncToAll('maxSeries')}, {text: 'Group', handler: applyFuncToAll('group')}, {text: 'Range', handler: applyFuncToAll('rangeOfSeries')}, {text: 'Count', handler: applyFuncToEach('countSeries')} ] }, { text: 'Transform', menu: [ {text: 'Absolute Value', handler: applyFuncToEach('absolute')}, {text: 'Add', handler: applyFuncToEachWithInput('add', 'Please enter a constant')}, {text: 'Delay', handler: applyFuncToEachWithInput('delay', 'Please enter the number of steps to delay')}, {text: 'Derivative', handler: applyFuncToEach('derivative')}, {text: 'Exp', handler: applyFuncToEach('exp')}, {text: 'Hit Count', handler: applyFuncToEachWithInput('hitcount', 'Please enter a summary interval (examples: 10min, 1h, 7d)', {quote: true})}, {text: 'Interpolate', handler: applyFuncToEach('interpolate')}, {text: 'Integral', handler: applyFuncToEach('integral')}, {text: 'Integral by Interval', handler: applyFuncToEachWithInput('integralByInterval', 'Integral this metric with a reset every ___ (examples: 1d, 1h, 10min)', {quote: true})}, {text: 'Invert', handler: applyFuncToEach('invert')}, {text: 'Log', handler: applyFuncToEachWithInput('log', 'Please enter a base')}, {text: 'Logit', handler: applyFuncToEach('logit')}, {text: 'Non-negative Derivative', handler: applyFuncToEachWithInput('nonNegativeDerivative', 'Please enter a maximum value if this metric is a wrapping counter (or just leave this blank)', {allowBlank: true})}, {text: 'Offset', handler: applyFuncToEachWithInput('offset', 'Please enter the value to offset Y-values by')}, {text: 'OffsetToZero', handler: applyFuncToEach('offsetToZero')}, {text: 'Percentile Values', handler: applyFuncToEachWithInput('percentileOfSeries', 'Please enter the percentile to use')}, {text: 'Power', handler: applyFuncToEachWithInput('pow', 'Please enter a power factor')}, {text: 'Power Series', handler: applyFuncToEachWithInput('powSeries', 'Please enter at least 2 series')}, {text: 'Summarize', handler: applyFuncToEachWithInput('summarize', 'Please enter a summary interval (examples: 10min, 1h, 7d)', {quote: true})}, {text: 'Scale', handler: applyFuncToEachWithInput('scale', 'Please enter a scale factor')}, {text: 'ScaleToSeconds', handler: applyFuncToEachWithInput('scaleToSeconds', 'Please enter a number of seconds to scale to')}, {text: 'Sigmoid', handler: applyFuncToEach('sigmoid')}, {text: 'Square Root', handler: applyFuncToEach('squareRoot')}, {text: 'timeShift', handler: applyFuncToEachWithInput('timeShift', 'Shift this metric ___ back in time (examples: 10min, 7d, 2w)', {quote: true})}, {text: 'timeSlice', handler: applyFuncToEachWithInput('timeSlice', 'Start showing metric at (example: 14:57 20150115)', {quote: true})}, {text: 'Time-adjusted Derivative', handler: applyFuncToEachWithInput('perSecond', 'Please enter a maximum value if this metric is a wrapping counter (or just leave this blank)', {allowBlank: true})} ] }, { text: 'Calculate', menu: [ {text: 'Moving Average', handler: applyFuncToEachWithInput('movingAverage', 'Moving average for the last ___ data points')}, {text: 'Moving Median', handler: applyFuncToEachWithInput('movingMedian', 'Moving median for the last ___ data points')}, {text: 'Moving Standard Deviation', handler: applyFuncToEachWithInput('stdev', 'Moving standard deviation for the last ___ data points')}, {text: 'Moving Sum', handler: applyFuncToEachWithInput('movingSum', 'Moving sum for the last ___ data points')}, {text: 'Moving Min', handler: applyFuncToEachWithInput('movingMin', 'Moving minimum for the last ___ data points')}, {text: 'Moving Max', handler: applyFuncToEachWithInput('movingMax', 'Moving maximum for the last ___ data points')}, {text: 'Holt-Winters Forecast', handler: applyFuncToEach('holtWintersForecast')}, {text: 'Holt-Winters Confidence Bands', handler: applyFuncToEach('holtWintersConfidenceBands')}, {text: 'Holt-Winters Aberration', handler: applyFuncToEach('holtWintersAberration')}, {text: 'Linear Regression', handler: applyFuncToEachWithInput('linearRegression', 'Start source of regression at (example: 14:57 20150115)', {quote: true})}, {text: 'As Percent', handler: applyFuncToEachWithInput('asPercent', 'Please enter the value that corresponds to 100% or leave blank to use the total', {allowBlank: true})}, {text: 'Difference (of 2 series)', handler: applyFuncToAll('diffSeries')}, {text: 'Difference (of series lists)', handler: applyFuncToAll('diffSeriesLists')}, {text: 'Ratio (of 2 series)', handler: applyFuncToAll('divideSeries')}, {text: 'Ratio (of series lists)', handler: applyFuncToAll('divideSeriesLists')}, {text: 'Exponential Moving Average', handler: applyFuncToEachWithInput('exponentialMovingAverage', 'EMA for the last __ data points')} ] }, { text: 'Filter', menu: [ { text: 'Data Filters', menu: [ {text: 'Remove Above Value', handler: applyFuncToEachWithInput('removeAboveValue', 'Set any values above ___ to None')}, {text: 'Remove Above Percentile', handler: applyFuncToEachWithInput('removeAbovePercentile', 'Set any values above the ___th percentile to None')}, {text: 'Remove Below Value', handler: applyFuncToEachWithInput('removeBelowValue', 'Set any values below ___ to None')}, {text: 'Remove Below Percentile', handler: applyFuncToEachWithInput('removeBelowPercentile', 'Set any values below the ___th percentile to None')} ] }, {text: 'Most Deviant', handler: applyFuncToEachWithInput('mostDeviant', 'Draw the ___ metrics with the highest standard deviation')}, {text: 'Highest Current Value', handler: applyFuncToEachWithInput('highestCurrent', 'Draw the ___ metrics with the highest current value')}, {text: 'Lowest Current Value', handler: applyFuncToEachWithInput('lowestCurrent', 'Draw the ___ metrics with the lowest current value')}, {text: 'Highest Maximum Value', handler: applyFuncToEachWithInput('highestMax', 'Draw the ___ metrics with the highest maximum value')}, {text: 'Nth Percentile Value', handler: applyFuncToEachWithInput('nPercentile', 'Draw the ___th Percentile for each metric.')}, {text: 'Remove Between Percentile', handler: applyFuncToEachWithInput('removeBetweenPercentile', 'Draw the metrics that have a value outside the ___th percentile of the average at a time')}, {text: 'Current Value Above', handler: applyFuncToEachWithInput('currentAbove', 'Draw all metrics whose current value is above ___')}, {text: 'Current Value Below', handler: applyFuncToEachWithInput('currentBelow', 'Draw all metrics whose current value is below ___')}, {text: 'Highest Average Value', handler: applyFuncToEachWithInput('highestAverage', 'Draw the ___ metrics with the highest average value')}, {text: 'Lowest Average Value', handler: applyFuncToEachWithInput('lowestAverage', 'Draw the ___ metrics with the lowest average value')}, {text: 'Average Value Above', handler: applyFuncToEachWithInput('averageAbove', 'Draw all metrics whose average value is above ___')}, {text: 'Average Value Below', handler: applyFuncToEachWithInput('averageBelow', 'Draw all metrics whose average value is below ___')}, {text: 'Average Outside Percentile Value', handler: applyFuncToEachWithInput('averageOutsidePercentile', 'Draw the metrics which average lies outside the ___th percentile of all averages')}, {text: 'Maximum Value Above', handler: applyFuncToEachWithInput('maximumAbove', 'Draw all metrics whose maximum value is above ___')}, {text: 'Maximum Value Below', handler: applyFuncToEachWithInput('maximumBelow', 'Draw all metrics whose maximum value is below ___')}, {text: 'Minimum Value Above', handler: applyFuncToEachWithInput('minimumAbove', 'Draw all metrics whose minimum value is above ___')}, {text: 'Minimum Value Below', handler: applyFuncToEachWithInput('minimumBelow', 'Draw all metrics whose minimum value is below ___')}, {text: 'sortByName', handler: applyFuncToEach('sortByName')}, {text: 'sortByTotal', handler: applyFuncToEach('sortByTotal')}, {text: 'sortByMaxima', handler: applyFuncToEach('sortByMaxima')}, {text: 'sortByMinima', handler: applyFuncToEach('sortByMinima')}, {text: 'limit', handler: applyFuncToEachWithInput('limit', 'Limit to first ___ of a list of metrics')}, {text: 'Exclude', handler: applyFuncToEachWithInput('exclude', 'Exclude metrics that match a regular expression')}, {text: 'Grep', handler: applyFuncToEachWithInput('grep', 'Exclude metrics that don\'t match a regular expression')}, {text: 'Remove Empty Series', handler: applyFuncToEachWithInput('removeEmptySeries', 'Removes series with no data from graph')}, {text: 'Remove Duplicates By Name', handler: applyFuncToAll('unique')} ] }, { text: 'Special', menu: [ {text: 'Set Legend Name', handler: applyFuncToEachWithInput('alias', 'Enter a legend label for this graph target', {quote: true})}, {text: 'Set Legend Name By Metric', handler: applyFuncToEach('aliasByMetric')}, {text: 'Set Legend Name By Node', handler: applyFuncToEachWithInput('aliasByNode', 'Enter the 0-indexed node to display')}, {text: 'Add Values to Legend Name', menu: [ {text: 'Cacti Style Legend', handler: applyFuncToEach('cactiStyle')}, {text: 'Last Value', handler: applyFuncToEach('legendValue', '"last"')}, {text: 'Average Value', handler: applyFuncToEach('legendValue', '"avg"')}, {text: 'Total Value', handler: applyFuncToEach('legendValue', '"total"')}, {text: 'Min Value', handler: applyFuncToEach('legendValue', '"min"')}, {text: 'Max Value', handler: applyFuncToEach('legendValue', '"max"')} ]}, {text: 'Color', handler: applyFuncToEachWithInput('color', 'Set the color for this graph target', {quote: true})}, {text: 'Alpha', handler: applyFuncToEachWithInput('alpha', 'Set the alpha (transparency) for this graph target (between 0.0 and 1.0)')}, {text: 'Consolidate By', menu: [ {text: 'Sum', handler: applyFuncToEach('consolidateBy', '"sum"')}, {text: 'Max', handler: applyFuncToEach('consolidateBy', '"max"')}, {text: 'Min', handler: applyFuncToEach('consolidateBy', '"min"')} ]}, {text: 'Draw non-zero As Infinite', handler: applyFuncToEach('drawAsInfinite')}, {text: 'Line Width', handler: applyFuncToEachWithInput('lineWidth', 'Please enter a line width for this graph target')}, {text: 'Dashed Line', handler: applyFuncToEach('dashed')}, {text: 'Keep Last Value', handler: applyFuncToEachWithInput('keepLastValue', 'Please enter the maximum number of "None" datapoints to overwrite, or leave empty for no limit. (default: empty)', {allowBlank: true})}, {text: 'Changed', handler: applyFuncToEach('changed')}, {text: 'Transform Nulls', handler: applyFuncToEachWithInput('transformNull', 'Please enter the value to transform null values to')}, {text: 'Count non-nulls', handler: applyFuncToAll('isNonNull')}, {text: 'Substring', handler: applyFuncToEachWithInput('substr', 'Enter a starting position')}, {text: 'Group', handler: applyFuncToAll('group')}, {text: 'Area Between', handler: applyFuncToEach('areaBetween')}, // {text: 'GroupByNode', handler: applyFuncToEachWithInput('group')}, // requires 2 parameters // {text: 'Add Threshold Line', handler: applyFuncToEachWithInput('threshold', 'Enter a threshold value')}, {text: 'Draw Stacked', handler: applyFuncToEach('stacked')}, {text: 'Draw in Second Y Axis', handler: applyFuncToEach('secondYAxis')}, {text: 'Aggregate Line', menu: [ {text: 'Avg', handler: applyFuncToEach('aggregateLine', '"avg"')}, {text: 'Max', handler: applyFuncToEach('aggregateLine', '"max"')}, {text: 'Min', handler: applyFuncToEach('aggregateLine', '"min"')} ] } ] } ]; } /* Auto-Refresh feature */ function toggleAutoRefresh(button, pressed) { //A closure makes this really simple var doRefresh = function () { Composer.updateImage(); //var interval = Math.min.apply(null, [context['interval'] for each (context in MetricContexts)] || [0]) || 60; var interval = GraphiteConfig.refreshInterval; button.timer = setTimeout(doRefresh, interval * 1000) } if (button.timer) { // AutoRefresh is on if (!pressed) { // The button was untoggled, turn off AutoRefresh clearTimeout(button.timer); button.timer = null; } } else { // AutoRefresh is off if (pressed) { // The button was toggled, turn on AutoRefresh doRefresh(); } } } /* Display Options Menu */ function createOptionsMenu() { var yAxisUnitMenu = new Ext.menu.Menu({ items: [ menuRadioItem('yUnit', 'Standard', 'yUnitSystem', 'si'), menuRadioItem('yUnit', 'Binary', 'yUnitSystem', 'binary'), menuRadioItem('yUnit', 'Seconds', 'yUnitSystem', 'sec'), menuRadioItem('yUnit', 'Milliseconds', 'yUnitSystem', 'msec'), menuRadioItem('yUnit', 'None', 'yUnitSystem', 'none') ] }); var yAxisSideMenu = new Ext.menu.Menu({ items: [ menuRadioItem('yAxis', 'Left', 'yAxisSide', 'left'), menuRadioItem('yAxis', 'Right', 'yAxisSide', 'right') ] }); var yAxisLeftMenu = new Ext.menu.Menu({ items: [ menuInputItem('Left Y Label', 'vtitle', 'Left Y Label', /^$/), menuInputItem('Left Y Minimum', 'yMinLeft'), menuInputItem('Left Y Maximum', 'yMaxLeft'), menuInputItem('Left Y Limit', 'yLimitLeft'), menuInputItem('Left Y Step', 'yStepLeft'), menuInputItem('Left Line Width', 'leftWidth'), menuInputItem('Left Line Color', 'leftColor'), menuInputItem('Left Line Dashed (length, in px)', 'leftDashed') ] }); var yAxisRightMenu = new Ext.menu.Menu({ items: [ menuInputItem('Right Y Label', 'vtitleRight', 'Right Y Label', /^$/), menuInputItem('Right Y Minimum', 'yMinRight'), menuInputItem('Right Y Maximum', 'yMaxRight'), menuInputItem('Right Y Limit', 'yLimitRight'), menuInputItem('Right Y Step', 'yStepRight'), menuInputItem('Right Line Width', 'rightWidth'), menuInputItem('Right Line Color', 'rightColor'), menuInputItem('Right Line Dashed (length, in px)', 'rightDashed') ] }); var SecondYAxisMenu = new Ext.menu.Menu({ items: [ {text: 'Left Y-Axis', menu: yAxisLeftMenu}, {text: 'Right Y-Axis', menu: yAxisRightMenu} ] }); var yAxisMenu = new Ext.menu.Menu({ items: [ menuInputItem('Label', 'vtitle', 'Y-Axis Label', /^$/), menuInputItem('Minimum', 'yMin'), menuInputItem('Maximum', 'yMax'), menuInputItem('Minor Lines', 'minorY', 'Enter the number of minor lines to draw', /^[a-zA-Z]/), menuInputItem('Logarithmic Scale', 'logBase', 'Enter the logarithmic base to use (ie. 10, e, etc...)'), menuInputItem('Step', 'yStep', 'Enter the Y-axis step to use (e.g. 0.2)'), menuInputItem('Divisors', 'yDivisors', 'Enter the target number of intermediate Y-axis values (e.g. 4,5,6)', /^[a-zA-Z]/), {text: 'Unit', menu: yAxisUnitMenu}, {text: 'Side', menu: yAxisSideMenu}, {text: 'Dual Y-Axis Options', menu: SecondYAxisMenu}, menuHelpItem('Dual Y-Axis Help', 'To select metrics to associate with the second (right-side) y-axis, go into the Graph Data dialog box, highlight a metric, click Apply Functions, Special, Second Y Axis.') ] }); var xAxisMenu = new Ext.menu.Menu({ items: [ menuInputItem('Time Format', 'xFormat', 'Enter the time format (see Python\'s datetime.strftime())', /^$/), menuInputItem('Timezone', 'tz', 'Enter the timezone to display (e.g. UTC or America/Chicago)', /^$/), menuInputItem('Point-width Consolidation Threshold', 'minXStep', 'Enter the closest number of pixels between points before consolidation') ] }); var areaMenu = new Ext.menu.Menu({ items: [ menuRadioItem('area', 'None', 'areaMode', ''), menuRadioItem('area', 'First Only', 'areaMode', 'first'), menuRadioItem('area', 'Stacked', 'areaMode', 'stacked'), menuRadioItem('area', 'All', 'areaMode', 'all') ] }); var lineMenu = new Ext.menu.Menu({ items: [ menuRadioItem('line', 'Slope Line (default)', 'lineMode', ''), menuRadioItem('line', 'Staircase Line', 'lineMode', 'staircase'), menuRadioItem('line', 'Connected Line', 'lineMode', 'connected'), menuInputItem('Connected Line Limit', 'connectedLimit', 'The number of consecutive None values to jump over when in connected line mode. (default: no limit, leave empty)'), menuCheckItem('Draw Null as Zero', 'drawNullAsZero') ] }); var fontFacesMenu = new Ext.menu.Menu({ items: [ menuRadioItem('fontFace', 'Sans', 'fontName', 'Sans'), menuRadioItem('fontFace', 'Times', 'fontName', 'Times'), menuRadioItem('fontFace', 'Courier', 'fontName', 'Courier'), menuRadioItem('fontFace', 'Helvetica', 'fontName', 'Helvetica') ] }); var fontMenu = new Ext.menu.Menu({ items: [ {text: 'Face', menu: fontFacesMenu}, { text: 'Style', menu: { items: [ menuCheckItem('Italics', 'fontItalic'), menuCheckItem('Bold', 'fontBold') ] } }, menuInputItem('Size', 'fontSize', 'Enter the font size in pt'), {text: 'Color', menu: createColorMenu('fgcolor')} ] }); var displayMenu = new Ext.menu.Menu({ items: [ {text: 'Font', menu: fontMenu}, { text: 'Color', menu: { items: [ menuInputItem('Line Colors', 'colorList', 'Enter an ordered list of comma-separated colors (name or hex values)', /^$/), {text: 'Background', menu: createColorMenu('bgcolor')}, {text: 'Major Grid Line', menu: createColorMenu('majorGridLineColor')}, {text: 'Minor Grid Line', menu: createColorMenu('minorGridLineColor')}, menuInputItem('Filled Area Alpha Value', 'areaAlpha', 'Enter the alpha value (between 0.0 and 1.0)') ] } }, { text: 'Graph Legend', menu: { items: [ menuRadioItem('legend', 'Hide If Too Many', 'hideLegend'), menuRadioItem('legend', 'Always Hide', 'hideLegend', 'true'), menuRadioItem('legend', 'Never Hide', 'hideLegend', 'false'), menuCheckItem('Hide Duplicate Items', 'uniqueLegend'), menuCheckItem('Hide Null Series', 'hideNullFromLegend') ] } }, menuInputItem('Line Thickness', 'lineWidth', 'Enter the line thickness in pixels'), menuInputItem('Margin', 'margin', 'Enter the margin width in pixels'), menuCheckItem('Graph Only', 'graphOnly'), menuCheckItem('Hide Axes', 'hideAxes'), menuCheckItem('Hide Y-Axis', 'hideYAxis'), menuCheckItem('Hide Grid', 'hideGrid'), menuInputItem('Apply Template', 'template', 'Enter the name of a template defined in graphTemplates.conf', /^$/) ] }); return { xtype: 'menu', items: [ menuInputItem('Graph Title', 'title', 'Graph Title', /^$/), {text: 'Display', menu: displayMenu}, {text: 'Line Mode', menu: lineMenu}, {text: 'Area Mode', menu: areaMenu}, {text: 'X-Axis', menu: xAxisMenu}, {text: 'Y-Axis', menu: yAxisMenu} ] }; } /* Graph Options API */ function updateGraph() { return Composer.updateImage(); } function getParam(param) { return Composer.url.getParam(param); } function setParam(param, value) { return Composer.url.setParam(param, value); } function removeParam(param) { return Composer.url.removeParam(param); } /* End of Graph Options API */ function createColorMenu(param) { var colorPicker = new Ext.menu.ColorMenu({hideOnClick: false}); colorPicker.on('select', function (palette, color) { setParam(param, color); updateGraph(); } ); return colorPicker; } function menuInputItem(name, param, question, regexp) { return new Ext.menu.Item({text: name, handler: paramPrompt(question || name, param, regexp)}); } function menuHelpItem(name, message) { return new Ext.menu.Item({text: name, handler: helpMessage(name, message)}); } function paramPrompt(question, param, regexp) { if(regexp == null) { regexp = /[^A-Za-z0-9_.\-]/; } return function (menuItem, e) { Ext.MessageBox.prompt( 'Input Required', question, function (button, value) { if (value.search(regexp) != -1) { Ext.Msg.alert('Input can only contain letters, numbers, underscores, or periods.'); return; } if (value.charAt(value.length - 1) == '.') { Ext.Msg.alert('Input cannot end in a period.'); return; } setParam(param, value); updateGraph(); }, this, //scope false, //multiline getParam(param) || '' //default value ); }; } function helpMessage(myTitle, myMessage) { return function (menuItem, e) { Ext.MessageBox.show( {title: myTitle, msg: myMessage, button: Ext.MessageBox.OK } ); }; } var checkItems = []; function menuCheckItem(name, param, paramValue) { var checkItem = new Ext.menu.CheckItem({text: name, param: param, hideOnClick: false}); checkItems.push(checkItem); //keep a list of each check item we create so we can update them later checkItem.on('checkchange', function (item, checked) { if (paramValue) { // Set param to a specific value if (checked) { setParam(param, paramValue); } else { // Remove the param if we're being unchecked removeParam(param); } } else { // Set the param to true/false setParam(param, checked.toString()); } updateGraph(); } ); return checkItem; } function menuRadioItem(groupName, name, param, paramValue ) { var selectItem = new Ext.menu.CheckItem({text: name, param: param, hideOnClick: false, group: groupName, checked: (paramValue ? false : true)}); selectItem.on('checkchange', function( item, clicked ) { if( paramValue ) { setParam(param, paramValue); } else { removeParam(param); } updateGraph(); } ); return selectItem; } function updateCheckItems() { Ext.each(checkItems, function (item) { var param = item.initialConfig.param; item.setChecked(getParam(param) ? true : false, true); } ); } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/dashboard.js0000664000000000000000000030440100000000000021744 0ustar00rootroot00000000000000// From Ext library /*global Ext*/ // Defined in dashboard.html /*global AUTOCOMPLETE_DELAY CALENDAR_ICON CLOCK_ICON CONTEXT_FIELD_WIDTH FINDER_QUERY_DELAY*/ /*global HELP_ICON NEW_DASHBOARD_REMOVE_GRAPHS REFRESH_ICON REMOVE_ICON RESIZE_ICON*/ /*global SHARE_ICON UI_CONFIG initialState initialError permissions queryString userName*/ /*global UP_ICON DOWN_ICON TRASH_ICON permissionsUnauthenticated schemes*/ // Defined in composer_widgets.js /*global createFunctionsMenu createOptionsMenu updateCheckItems*/ // Global object names var viewport; var contextSelector; var contextSelectorFields = []; var selectedScheme = null; var selectedRecord = null; var metricSelector; var metricSelectorMode; var metricSelectorGrid; var metricSelectorTextField; var graphArea; var graphStore; var graphView; var navBar; var dashboardName; var dashboardURL; var refreshTask; var spacer; var justClosedGraph = false; var NOT_EDITABLE = ['from', 'until', 'width', 'height', 'target', 'uniq', '_uniq']; var editor = null; var cookieProvider = new Ext.state.CookieProvider({ path: document.body.dataset.baseUrl + 'dashboard' }); var NAV_BAR_REGION = cookieProvider.get('navbar-region') || 'north'; var CONFIRM_REMOVE_ALL = cookieProvider.get('confirm-remove-all') != 'false'; var currentlySettingHash = false; function changeHash(hash){ currentlySettingHash = true; window.location.hash = hash; } if ('onhashchange' in window) // does the browser support the hashchange event? window.onhashchange = function () { if (currentlySettingHash){ currentlySettingHash = false; return; } location.reload(); } /* Nav Bar configuration */ var navBarNorthConfig = { region: 'north', layout: 'hbox', layoutConfig: { align: 'stretch' }, collapsible: true, collapseMode: 'mini', collapsed: false, split: true, title: 'untitled', height: 350, listeners: { expand: function() { focusCompleter(); } // defined below } }; var navBarWestConfig = Ext.apply({}, navBarNorthConfig); delete navBarWestConfig.height; navBarWestConfig.region = 'west'; navBarWestConfig.layout = 'vbox'; navBarWestConfig.width = 338; // Record types and stores var SchemeRecord = Ext.data.Record.create([ {name: 'name'}, {name: 'pattern'}, {name: 'fields', type: 'auto'} ]); var schemeRecords = []; var schemesStore = new Ext.data.Store({ fields: SchemeRecord }); var ContextFieldValueRecord = Ext.data.Record.create([ {name: 'name'}, {path: 'path'} ]); var contextFieldStore = new Ext.data.JsonStore({ url: document.body.dataset.baseUrl + 'metrics/find/', root: 'metrics', idProperty: 'name', fields: ContextFieldValueRecord, baseParams: {format: 'completer', wildcards: '1'} }); var GraphRecord = new Ext.data.Record.create([ {name: 'target'}, {name: 'params', type: 'auto'}, {name: 'url'}, {name: 'width', type: 'auto'}, {name: 'height', type: 'auto'}, {name: 'loading'}, ]); var graphStore; function graphStoreUpdated() { if (metricSelectorGrid) metricSelectorGrid.getView().refresh(); } graphStore = new Ext.data.ArrayStore({ fields: GraphRecord, listeners: { add: graphStoreUpdated, remove: graphStoreUpdated, update: graphStoreUpdated } }); var originalDefaultGraphParams = { from: '-2hours', until: 'now', width: UI_CONFIG.default_graph_width, height: UI_CONFIG.default_graph_height }; var defaultGraphParams; //XXX // Per-session default graph params var sessionDefaultParamsJson = cookieProvider.get('defaultGraphParams'); if (sessionDefaultParamsJson && sessionDefaultParamsJson.length > 0) { defaultGraphParams = Ext.decode(sessionDefaultParamsJson); } else { defaultGraphParams = Ext.apply({}, originalDefaultGraphParams); } function isLoggedIn() { return userName != null; } function hasPermission(permission) { for (const i in permissions) { if (permissions[i] === permission) { return true; } } return false; } function htmlEncode(input) { return input.replace(/[^a-zA-Z0-9 ]/g, function (chr) { return '&#' + chr.charCodeAt() + ';'; }); } function initDashboard () { // Populate naming-scheme based datastructures Ext.each(schemes, function (schemeInfo) { schemeInfo.id = schemeInfo.name; schemeRecords.push( new SchemeRecord(schemeInfo) ); Ext.each(schemeInfo.fields, function (field) { // Context Field configuration contextSelectorFields.push( new Ext.form.ComboBox({ id: schemeInfo.name + '-' + field.name, fieldLabel: field.label, width: CONTEXT_FIELD_WIDTH, mode: 'remote', triggerAction: 'all', editable: true, forceSelection: false, store: contextFieldStore, displayField: 'name', queryDelay: 100, queryParam: 'query', minChars: 1, typeAhead: false, value: queryString[field.name] || getContextFieldCookie(field.name) || '*', listeners: { beforequery: buildQuery, change: contextFieldChanged, select: function (thisField) { thisField.triggerBlur(); focusCompleter(); }, afterrender: function (thisField) { thisField.hide(); }, hide: function (thisField) { thisField.getEl().up('.x-form-item').setDisplayed(false); }, show: function (thisField) { thisField.getEl().up('.x-form-item').setDisplayed(true); } } }) ); }); }); schemesStore.add(schemeRecords); spacer = new Ext.form.TextField({ hidden: true, hideMode: 'visibility' }); var metricTypeCombo = new Ext.form.ComboBox({ id: 'metric-type-field', fieldLabel: 'Metric Type', width: CONTEXT_FIELD_WIDTH, mode: 'local', triggerAction: 'all', editable: false, store: schemesStore, displayField: 'name', listeners: { afterrender: function (combo) { var value = (queryString.metricType) ? queryString.metricType : getContextFieldCookie('metric-type'); if (!value) { value = 'Everything'; } var index = combo.store.find('name', value); if (index > -1) { var record = combo.store.getAt(index); combo.setValue(value); metricTypeSelected.defer(250, this, [combo, record, index]); } }, select: metricTypeSelected } }); contextSelector = new Ext.form.FormPanel({ flex: 1, autoScroll: true, labelAlign: 'right', items: [ spacer, metricTypeCombo ].concat(contextSelectorFields) }); function expandNode(node, recurse) { function addAll () { Ext.each(node.childNodes, function (child) { if (child.leaf) { graphAreaToggle(child.id, {dontRemove: true}); } else if (recurse) { expandNode(child, recurse); } }); } if (node.isExpanded()) { addAll(); } else { node.expand(false, false, addAll); } } var folderContextMenu = new Ext.menu.Menu({ items: [{ text: 'Add All Metrics', handler: function (item, e) { expandNode(item.parentMenu.node, false); } }, { text: 'Add All Metrics (recursively)', handler: function (item, e) { expandNode(item.parentMenu.node, true); } }] }); if (NAV_BAR_REGION == 'west') { metricSelectorMode = 'tree'; metricSelector = new Ext.tree.TreePanel({ root: new Ext.tree.TreeNode({}), containerScroll: true, autoScroll: true, flex: 3.0, pathSeparator: '.', rootVisible: false, singleExpand: false, trackMouseOver: true, listeners: { click: metricTreeSelectorNodeClicked, contextmenu: function (node, e) { if (!node.leaf) { folderContextMenu.node = node; folderContextMenu.showAt( e.getXY() ); } } } }); } else { // NAV_BAR_REGION == 'north' metricSelectorMode = 'text'; metricSelectorGrid = new Ext.grid.GridPanel({ region: 'center', hideHeaders: true, loadMask: true, bodyCssClass: 'metric-result', colModel: new Ext.grid.ColumnModel({ defaults: { sortable: false, menuDisabled: true }, columns: [ {header: 'Metric Path', width: 1.0, dataIndex: 'path'} ] }), viewConfig: { forceFit: true, rowOverCls: '', bodyCssClass: 'metric-result', getRowClass: function(record, index) { var toggledClass = ( graphStore.findExact('target', 'target=' + record.data.path) == -1 ) ? 'metric-not-toggled' : 'metric-toggled'; var branchClass = ( record.data['is_leaf'] == '0' ) ? 'result-is-branch-node' : ''; return toggledClass + ' ' + branchClass + ' metric-result'; } }, selModel: new Ext.grid.RowSelectionModel({ singleSelect: false }), store: new Ext.data.JsonStore({ method: 'GET', url: document.body.dataset.baseUrl + 'metrics/find/', autoLoad: true, baseParams: { query: '*', format: 'completer', automatic_variants: (UI_CONFIG.automatic_variants) ? '1' : '0' }, fields: ['path', 'is_leaf'], root: 'metrics' }), listeners: { rowclick: function (thisGrid, rowIndex, e) { var record = thisGrid.getStore().getAt(rowIndex); if (record.data['is_leaf'] == '1') { graphAreaToggle(record.data.path); thisGrid.getView().refresh(); } else { metricSelectorTextField.setValue(record.data.path); } autocompleteTask.delay(50); focusCompleter(); } } }); function completerKeyPress(thisField, e) { var charCode = e.getCharCode(); if (charCode == 8 || //backspace charCode >= 46 || //delete and all printables charCode == 36 || //home charCode == 35) { //end autocompleteTask.delay(AUTOCOMPLETE_DELAY); } } metricSelectorTextField = new Ext.form.TextField({ region: 'south', enableKeyEvents: true, cls: 'completer-input-field', listeners: { keydown: completerKeyPress, afterrender: focusCompleter } }); metricSelector = new Ext.Panel({ flex: 1.5, layout: 'border', items: [metricSelectorGrid, metricSelectorTextField] }); } var autocompleteTask = new Ext.util.DelayedTask(function () { var query = metricSelectorTextField.getValue(); var store = metricSelectorGrid.getStore(); if (query === '') { query = '*' } store.setBaseParam('query', query); store.load(); }); var graphTemplate = new Ext.XTemplate( '', '
', '
', '', '
X
', '
', '
', '
', '
' ); function setupGraphDD () { graphView.dragZone = new Ext.dd.DragZone(graphView.getEl(), { containerScroll: true, ddGroup: 'graphs', getDragData: function (e) { var sourceEl = e.getTarget(graphView.itemSelector, 10); if (sourceEl) { var dupe = sourceEl.cloneNode(true); dupe.id = Ext.id(); return { ddel: dupe, sourceEl: sourceEl, repairXY: Ext.fly(sourceEl).getXY(), sourceStore: graphStore, draggedRecord: graphView.getRecord(sourceEl) } } }, getRepairXY: function () { return this.dragData.repairXY; } }); graphView.dropZone = new Ext.dd.DropZone(graphView.getEl(), { ddGroup: 'graphs', dropAction: 'reorder', mergeEl: Ext.get('merge'), getTargetFromEvent: function (e) { return e.getTarget(graphView.itemSelector); }, onNodeEnter: function (target, dd, e, data) { //Ext.fly(target).addClass('graph-highlight'); this.setDropAction('reorder'); this.mergeTarget = Ext.get(target); this.mergeSwitchTimeout = this.setDropAction.defer(UI_CONFIG.merge_hover_delay, this, ['merge']); }, onNodeOut: function (target, dd, e, data) { //Ext.fly(target).removeClass('graph-highlight'); this.mergeEl.hide(); //this.setDropAction('reorder'); }, onNodeOver: function (target, dd, e, data) { return Ext.dd.DropZone.prototype.dropAllowed; }, setDropAction: function (action) { if (this.mergeSwitchTimeout != null) { clearTimeout(this.mergeSwitchTimeout); this.mergeSwitchTimeout = null; } this.dropAction = action; if (action == 'reorder') { //revert merge ui change this.mergeEl.hide(); } else if (action == 'merge') { //apply merge ui change this.mergeEl.show(); var targetXY = this.mergeTarget.getXY(); var mergeElWidth = Math.max(GraphSize.width * 0.75, 20); var xOffset = (GraphSize.width - mergeElWidth) / 2; var yOffset = -14; this.mergeEl.setXY([targetXY[0] + xOffset, targetXY[1] + yOffset]); this.mergeEl.setWidth(mergeElWidth); } }, onNodeDrop: function (target, dd, e, data){ var nodes = graphView.getNodes(); var dropIndex = nodes.indexOf(target); var dragIndex = graphStore.indexOf(data.draggedRecord); if (dragIndex == dropIndex) { return false; } if (this.dropAction == 'reorder') { graphStore.removeAt(dragIndex); graphStore.insert(dropIndex, data.draggedRecord); updateGraphRecords(); return true; } else if (this.dropAction == 'merge') { var dragRecord = data.draggedRecord; var dropRecord = graphView.getRecord(target); if (dropRecord.data.params.target.length == 1) { if (dropRecord.data.params.target[0] == dropRecord.data.params.title) { delete dropRecord.data.params.title; } } var mergedTargets = uniq( dragRecord.data.params.target.concat(dropRecord.data.params.target) ); dropRecord.data.params.target = mergedTargets; dropRecord.data.target = Ext.urlEncode({target: mergedTargets}); dropRecord.commit(); graphStore.remove(dragRecord); updateGraphRecords(); return true; } return false; } }); } graphView = new Ext.DataView({ store: graphStore, tpl: graphTemplate, overClass: 'graph-over', itemSelector: 'div.graph-container', emptyText: 'Configure your context above, and then select some metrics.', autoScroll: true, // plugins: [ // new Ext.ux.DataViewTransition({ // duration: 750, // idProperty: 'target' // }) // ], listeners: { click: graphClicked, render: setupGraphDD } }); /* Toolbar items */ var relativeTimeRange = { icon: CLOCK_ICON, text: 'Relative Time Range', tooltip: 'View Recent Data', handler: selectRelativeTime, scope: this }; var absoluteTimeRange = { icon: CALENDAR_ICON, text: 'Absolute Time Range', tooltip: 'View Specific Time Range', handler: selectAbsoluteTime, scope: this }; var timeRangeText = { id: 'time-range-text', xtype: 'tbtext', text: getTimeText() }; // Note that some of these items are changed in postLoginMenuAdjust() after login/logout var dashboardMenu = { text: 'Dashboard', menu: { items: [ { text: 'New', handler: function (item, e) { setDashboardName(null); if (NEW_DASHBOARD_REMOVE_GRAPHS) { graphStore.removeAll(); } refreshGraphs(); } }, { text: 'Finder', handler: showDashboardFinder }, { text: 'Template Finder', handler: showTemplateFinder }, { text: 'Save As Template', handler: saveTemplate, disabled: !hasPermission('change') }, { id: 'dashboard-save-button', text: 'Save', handler: function (item, e) { sendSaveRequest(dashboardName); }, disabled: dashboardName == null || !hasPermission('change') }, { id: 'dashboard-save-as-button', text: 'Save As', handler: saveDashboard, disabled: !hasPermission('change') }, { text: 'Configure UI', handler: configureUI }, { text: 'Edit Dashboard', handler: editDashboard }, { id: 'dashboard-login-button', text: getLoginMenuItemText(), handler: function (item, e) { if (isLoggedIn()) { logout(); } else { showLoginForm(); } } } ] } }; var graphsMenu = { text: 'Graphs', menu: { items: [ { text: 'New Graph', menu: { items: [ { text: 'Empty Graph', handler: newEmptyGraph }, { text: 'From URL', handler: newFromUrl }, { text: 'From Saved Graph', handler: newFromSavedGraph }, { text: 'From Metric', handler: newFromMetric } ] } }, { text: 'Edit Default Parameters', handler: editDefaultGraphParameters }, { text: 'Resize', handler: selectGraphSize }, { text: 'Remove All', handler: removeAllGraphs } ] } }; var shareButton = { icon: SHARE_ICON, tooltip: 'Share This Dashboard', text: 'Share', handler: doShare }; var helpButton = { icon: HELP_ICON, tooltip: 'Keyboard Shortcuts', handler: showHelp }; var resizeButton = { icon: RESIZE_ICON, tooltip: 'Resize Graphs', handler: selectGraphSize }; var removeAllButton = { icon: REMOVE_ICON, tooltip: 'Remove All Graphs', handler: removeAllGraphs }; var refreshButton = { icon: REFRESH_ICON, tooltip: 'Refresh Graphs', handler: refreshGraphs }; var autoRefreshButton = { xtype: 'button', id: 'auto-refresh-button', text: 'Auto-Refresh', enableToggle: true, pressed: false, tooltip: 'Toggle auto-refresh', toggleHandler: function (button, pressed) { if (pressed) { startTask(refreshTask); } else { stopTask(refreshTask); } } }; var every = { xtype: 'tbtext', text: 'every' }; var seconds = { xtype: 'tbtext', text: 'seconds' }; var autoRefreshField = { id: 'auto-refresh-field', xtype: 'textfield', width: 25, value: UI_CONFIG.refresh_interval, enableKeyEvents: true, disableKeyFilter: true, listeners: { change: function (field, newValue) { updateAutoRefresh(newValue); }, specialkey: function (field, e) { if (e.getKey() == e.ENTER) { if (field.getValue() >= 1) { updateAutoRefresh( field.getValue() ); } } } } }; var lastRefreshed = { xtype: 'tbtext', text: 'Last Refreshed: ' }; var lastRefreshedText = { id: 'last-refreshed-text', xtype: 'tbtext', text: ( new Date() ).format('g:i:s A') }; graphArea = new Ext.Panel({ region: 'center', layout: 'fit', autoScroll: false, bodyCssClass: 'graph-area-body', items: [graphView], tbar: new Ext.Toolbar({ items: [ dashboardMenu, graphsMenu, '-', shareButton, '-', relativeTimeRange, absoluteTimeRange, ' ', timeRangeText, '->', helpButton, resizeButton, removeAllButton, refreshButton, autoRefreshButton, every, autoRefreshField, seconds, '-', lastRefreshed, lastRefreshedText ] }) }); /* Nav Bar */ navBarNorthConfig.items = [metricSelector]; navBarWestConfig.items = [contextSelector, metricSelector]; var navBarConfig = (NAV_BAR_REGION == 'north') ? navBarNorthConfig : navBarWestConfig; navBar = new Ext.Panel(navBarConfig); viewport = new Ext.Viewport({ layout: 'border', items: [ navBar, graphArea ] }); refreshTask = { run: refreshGraphs, interval: UI_CONFIG.refresh_interval * 1000 }; // Load initial dashboard state if it was passed in if (initialState) { applyState(initialState); navBar.collapse(false); } if(window.location.hash != '') { if (window.location.hash.indexOf('/') != -1) { var nameVal = window.location.hash.substr(1).split('/'); sendLoadTemplateRequest(nameVal[0],nameVal[1]); } else { sendLoadRequest(window.location.hash.substr(1)); } navBar.collapse(false); } if (initialError) { Ext.Msg.alert('Error', htmlEncode(initialError)); } } function showHelp() { var win = new Ext.Window({ title: 'Keyboard Shortcuts', modal: true, width: 550, height: 300, autoLoad: document.body.dataset.baseUrl + 'dashboard/help/' }); win.show(); } function metricTypeSelected (combo, record, index) { selectedScheme = record; // Show only the fields for the selected context Ext.each(contextSelectorFields, function (field) { if (field.getId().indexOf( selectedScheme.get('name') ) == 0) { field.show(); } else { field.hide(); } }); setContextFieldCookie('metric-type', combo.getValue()); contextFieldChanged(); focusCompleter(); } function buildQuery (queryEvent) { var queryString = ''; var parts = selectedScheme.get('pattern').split('.'); var schemeName = selectedScheme.get('name'); // Clear cached records to force JSON queries every time contextFieldStore.removeAll(); delete queryEvent.combo.lastQuery; for (var i = 0; i < parts.length; i++) { var part = parts[i]; var field = part.match(/^<[^>]+>$/) ? part.substr(1, part.length - 2) : null; if (field == null) { queryString += part + '.'; continue; } var combo = Ext.getCmp(schemeName + '-' + field); var value = combo.getValue(); if (UI_CONFIG.automatic_variants) { if (value.indexOf(',') > -1 && value.search(/[{}]/) == -1) { value = '{' + value + '}'; } } if (combo === queryEvent.combo) { queryEvent.query = queryString + queryEvent.query + '*'; return; } else { if (value) { queryString += value + '.'; } else { Ext.Msg.alert('Missing Context', 'Please fill out all of the fields above first.'); queryEvent.cancel = true; return; } } } Ext.Msg.alert('Error', htmlEncode('Failed to build query, could not find "' + queryEvent.combo.getId() + '" field')); queryEvent.cancel = true; } function contextFieldChanged() { var pattern = getContextFieldsPattern(); if (pattern) metricSelectorShow(pattern); } function getContextFieldsPattern() { var schemeName = selectedScheme.get('name'); var pattern = selectedScheme.get('pattern'); var fields = selectedScheme.get('fields'); var missingFields = false; Ext.each(fields, function (field) { var id = schemeName + '-' + field.name; var value = Ext.getCmp(id).getValue(); // Update context field cookies setContextFieldCookie(field.name, value); if (UI_CONFIG.automatic_variants) { if (value.indexOf(',') > -1 && value.search(/[{}]/) == -1) { value = '{' + value + '}'; } } if (value.trim() == '') { missingFields = true; } else { pattern = pattern.replace('<' + field.name + '>', value); } }); if (missingFields) { return; } return pattern; } function metricSelectorShow(pattern) { if (metricSelectorMode == 'tree') { metricTreeSelectorShow(pattern); } else { metricTextSelectorShow(pattern); } } function metricTreeSelectorShow(pattern) { var baseParts = pattern.split('.'); function setParams (loader, node, callback) { loader.baseParams.format = 'treejson'; if (node.id == 'rootMetricSelectorNode') { loader.baseParams.query = pattern + '.*'; } else { var idParts = node.id.split('.'); idParts.splice(0, baseParts.length); //make it relative var relativeId = idParts.join('.'); loader.baseParams.query = pattern + '.' + relativeId + '.*'; } } var loader = new Ext.tree.TreeLoader({ url: document.body.dataset.baseUrl + 'metrics/find/', requestMethod: 'GET', listeners: {beforeload: setParams} }); try { var oldRoot = Ext.getCmp('rootMetricSelectorNode'); oldRoot.destroy(); } catch (err) { } var root = new Ext.tree.AsyncTreeNode({ id: 'rootMetricSelectorNode', loader: loader }); metricSelector.setRootNode(root); root.expand(); } function metricTextSelectorShow(pattern) { var store = metricSelectorGrid.getStore(); store.setBaseParam('query', pattern); store.load(); } function metricTreeSelectorNodeClicked (node, e) { if (!node.leaf) { if (node.expanded) { node.collapse(); } else { node.loaded = false; node.expand(); } return; } graphAreaToggle(node.id); } function graphAreaToggle(target, options) { /* The GraphRecord's id is their URL-encoded target=...&target=... string This function can get called with either the encoded string or just a raw metric path, eg. "foo.bar.baz". */ var graphTargetString; if (target.substr(0,7) == 'target=') { graphTargetString = target; } else { graphTargetString = 'target=' + target; } var graphTargetList = Ext.urlDecode(graphTargetString)['target']; if (typeof graphTargetList == 'string') { graphTargetList = [graphTargetList]; } var existingIndex = graphStore.findExact('target', graphTargetString); if (existingIndex > -1) { if ( (options === undefined) || (!options.dontRemove) ) { graphStore.removeAt(existingIndex); } } else if ( (options === undefined) || (!options.onlyRemove) ) { // Add it var myParams = { target: graphTargetList }; var urlParams = {}; Ext.apply(urlParams, defaultGraphParams); if (options && options.defaultParams) { Ext.apply(urlParams, options.defaultParams); } Ext.apply(urlParams, GraphSize); Ext.apply(urlParams, myParams); var record = new GraphRecord({ target: graphTargetString, params: myParams, url: document.body.dataset.baseUrl + 'render?' + Ext.urlEncode(urlParams) }); graphStore.add([record]); updateGraphRecords(); } } function importGraphUrl(targetUrl, options) { var fullUrl = targetUrl; var i = fullUrl.indexOf('?'); if (i == -1) { return; } var queryString = fullUrl.substr(i+1); var params = Ext.urlDecode(queryString); var graphTargetList = params['target']; if (typeof graphTargetList == 'string') { graphTargetList = [graphTargetList]; } params['target'] = graphTargetList; if (graphTargetList.length == 0) { return; } var graphTargetString = Ext.urlEncode({target: graphTargetList}); var existingIndex = graphStore.findExact('target', graphTargetString); if (existingIndex > -1) { if ( (options === undefined) || (!options.dontRemove) ) { graphStore.removeAt(existingIndex); } } else { var urlParams = {}; Ext.apply(urlParams, defaultGraphParams); Ext.apply(urlParams, params); Ext.apply(urlParams, GraphSize); var record = new GraphRecord({ target: graphTargetString, params: params, url: document.body.dataset.baseUrl + 'render?' + Ext.urlEncode(urlParams) }); graphStore.add([record]); updateGraphRecords(); } } function updateGraphRecords() { graphStore.each(function (item, index) { var params = {}; Ext.apply(params, defaultGraphParams); Ext.apply(params, item.data.params); Ext.apply(params, GraphSize); params._uniq = Math.random(); if (params.title === undefined && params.target.length == 1) { params.title = params.target[0]; } if (!params.uniq === undefined) { delete params['uniq']; } //Preload the image and set it into the UI once it is available. item.set('loading','-loading'); var img = new Image(); img.onload = function() { item.set('url',img.src); item.set('loading',''); }; img.src = document.body.dataset.baseUrl + 'render?' + Ext.urlEncode(params); item.set('width', GraphSize.width); item.set('height', GraphSize.height); item.set('index', index); }); } function refreshGraphs() { updateGraphRecords(); graphView.refresh(); graphArea.getTopToolbar().get('last-refreshed-text').setText( (new Date()).format('g:i:s A') ); } /* function refreshGraph(index) { var node = graphView.getNode(index); var record = graphView.getRecord(node); record.data.params.uniq = Math.random(); record.set('url', '/render?' + Ext.urlEncode(record.get('params'))); // This refreshNode method only refreshes the record data, it doesn't re-render // the template. Which is pretty useless... It would be more efficient if we // could simply re-render the template. Need to see if thats feasible. //graphView.refreshNode(node); // This is *slightly* better than just calling refreshGraphs() because we're only // updating the URL of one graph, so caching should save us from re-rendering each // graph. //graphView.refresh(); } */ function updateAutoRefresh (newValue) { Ext.getCmp('auto-refresh-field').setValue(newValue); var value = parseInt(newValue); if ( isNaN(value) ) { return; } if (Ext.getCmp('auto-refresh-button').pressed) { stopTask(refreshTask); refreshTask.interval = value * 1000; startTask(refreshTask); } else { refreshTask.interval = value * 1000; } } /* Task management */ function stopTask(task) { if (task.running) { Ext.TaskMgr.stop(task); task.running = false; } } function startTask(task) { if (!task.running) { Ext.TaskMgr.start(task); task.running = true; } } /* Time Range management */ defaultGraphParams['from'].match(/([0-9]+)([^0-9]+)/); var defaultRelativeQuantity = RegExp.$1; var defaultRelativeUnits = RegExp.$2; var TimeRange = { // Default to a relative time range type: 'relative', relativeStartQuantity: defaultRelativeQuantity, relativeStartUnits: defaultRelativeUnits, relativeUntilQuantity: '', relativeUntilUnits: 'now', // Absolute time range startDate: new Date(), startTime: '9:00 AM', endDate: new Date(), endTime: '5:00 PM' }; function getTimeText() { if (TimeRange.type == 'relative') { var text = 'Now showing the past ' + TimeRange.relativeStartQuantity + ' ' + TimeRange.relativeStartUnits; if (TimeRange.relativeUntilUnits !== 'now' && TimeRange.relativeUntilUnits !== '') { text = text + ' until ' + TimeRange.relativeUntilQuantity + ' ' + TimeRange.relativeUntilUnits + ' ago'; } return text; } else { var fmt = 'g:ia F jS Y'; return 'Now Showing ' + TimeRange.startDate.format(fmt) + ' through ' + TimeRange.endDate.format(fmt); } } function updateTimeText() { graphArea.getTopToolbar().get('time-range-text').setText( getTimeText() ); } function timeRangeUpdated() { if (TimeRange.type == 'relative') { var fromParam = '-' + TimeRange.relativeStartQuantity + TimeRange.relativeStartUnits; if (TimeRange.relativeUntilUnits == 'now') { var untilParam = 'now'; } else { var untilParam = '-' + TimeRange.relativeUntilQuantity + TimeRange.relativeUntilUnits; } } else { var fromParam = TimeRange.startDate.format('H:i_Ymd'); var untilParam = TimeRange.endDate.format('H:i_Ymd'); } defaultGraphParams.from = fromParam; defaultGraphParams.until = untilParam; saveDefaultGraphParams(); graphStore.each(function () { this.data.params.from = fromParam; this.data.params.until = untilParam; }); updateTimeText(); refreshGraphs(); } function selectRelativeTime() { var quantityField = new Ext.form.TextField({ fieldLabel: 'Show the past', width: 90, allowBlank: false, regex: /\d+/, regexText: 'Please enter a number', value: TimeRange.relativeStartQuantity }); var unitField = new Ext.form.ComboBox({ fieldLabel: '', width: 90, mode: 'local', editable: false, triggerAction: 'all', allowBlank: false, forceSelection: true, store: ['minutes', 'hours', 'days', 'weeks', 'months'], value: TimeRange.relativeStartUnits }); var untilQuantityField = new Ext.form.TextField({ id: 'until-quantity-field', fieldLabel: 'Until', width: 90, allowBlank: true, regex: /\d+/, regexText: 'Please enter a number', value: TimeRange.relativeUntilQuantity }); var untilUnitField = new Ext.form.ComboBox({ fieldLabel: '', width: 90, mode: 'local', editable: false, triggerAction: 'all', allowBlank: true, forceSelection: false, store: ['now', 'minutes', 'hours', 'days', 'weeks', 'months'], value: TimeRange.relativeUntilUnits, listeners: { select: function(combo, record, index) { if (index == 0) { Ext.getCmp('until-quantity-field').setValue(''); Ext.getCmp('until-quantity-field').setDisabled(true); } else { Ext.getCmp('until-quantity-field').setDisabled(false); } }, render: function(combo) { if (combo.getValue() == 'now') { Ext.getCmp('until-quantity-field').setValue(''); Ext.getCmp('until-quantity-field').setDisabled(true); } else { Ext.getCmp('until-quantity-field').setDisabled(false); } } } }); var win; function updateTimeRange() { TimeRange.type = 'relative'; TimeRange.relativeStartQuantity = quantityField.getValue(); TimeRange.relativeStartUnits = unitField.getValue(); TimeRange.relativeUntilQuantity = untilQuantityField.getValue(); TimeRange.relativeUntilUnits = untilUnitField.getValue(); win.close(); timeRangeUpdated(); } win = new Ext.Window({ title: 'Select Relative Time Range', width: 205, height: 170, resizable: false, modal: true, layout: 'form', labelAlign: 'right', labelWidth: 90, items: [quantityField, unitField, untilQuantityField, untilUnitField], buttonAlign: 'center', buttons: [ {text: 'Ok', handler: updateTimeRange}, {text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); } function selectAbsoluteTime() { var startDateField = new Ext.form.DateField({ fieldLabel: 'Start Date', width: 125, value: TimeRange.startDate || '' }); var startTimeField = new Ext.form.TimeField({ fieldLabel: 'Start Time', width: 125, allowBlank: false, increment: 30, value: TimeRange.startTime || '' }); var endDateField = new Ext.form.DateField({ fieldLabel: 'End Date', width: 125, value: TimeRange.endDate || '' }); var endTimeField = new Ext.form.TimeField({ fieldLabel: 'End Time', width: 125, allowBlank: false, increment: 30, value: TimeRange.endTime || '' }); var win; function updateTimeRange() { TimeRange.type = 'absolute'; TimeRange.startDate = new Date(startDateField.getValue().format('Y/m/d ') + startTimeField.getValue()); TimeRange.startTime = startTimeField.getValue(); TimeRange.endDate = new Date(endDateField.getValue().format('Y/m/d ') + endTimeField.getValue()); TimeRange.endTime = endTimeField.getValue(); win.close(); timeRangeUpdated(); } win = new Ext.Window({ title: 'Select Absolute Time Range', width: 225, height: 180, resizable: false, modal: true, layout: 'form', labelAlign: 'right', labelWidth: 70, items: [startDateField, startTimeField, endDateField, endTimeField], buttonAlign: 'center', buttons: [ {text: 'Ok', handler: updateTimeRange}, {text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); } /* Graph size stuff */ var GraphSize = { width: UI_CONFIG.default_graph_width, height: UI_CONFIG.default_graph_height }; // New empty Graph function newEmptyGraph() { var myParams = { target: [] }; var graphTargetString = Ext.urlEncode({target: ''}); var urlParams = {}; Ext.apply(urlParams, defaultGraphParams); Ext.apply(urlParams, myParams); Ext.apply(urlParams, GraphSize); myParams['from'] = urlParams.from; myParams['until'] = urlParams.until; var record = new GraphRecord({ target: graphTargetString, params: myParams, url: document.body.dataset.baseUrl + 'render?' + Ext.urlEncode(urlParams), 'width': GraphSize.width, 'height': GraphSize.height, }); graphStore.add([record]); var canvasId = graphStore.indexOf(record); graphStore.getAt(canvasId).data.index = canvasId; updateGraphRecords(); } function newFromUrl() { function applyUrl() { var inputUrl = Ext.getCmp('import-url-field').getValue(); importGraphUrl(inputUrl); win.close(); } var urlField = new Ext.form.TextField({ id: 'import-url-field', fieldLabel: 'Graph URL', region: 'center', width: '100%', listeners: { specialkey: function (field, e) { if (e.getKey() == e.ENTER) { applyUrl(); } }, afterrender: function (field) { field.focus(false, 100); } } }); var win = new Ext.Window({ title: 'Import Graph From URL', width: 470, height: 87, layout: 'form', resizable: true, modal: true, items: [urlField], buttonAlign: 'center', buttons: [ { text: 'OK', handler: applyUrl }, { text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); } function newFromSavedGraph() { function setParams(loader, node) { var nodeId = node.id.replace(/^[A-Za-z]+Tree\.?/,''); loader.baseParams.query = (nodeId == '') ? '*' : (nodeId + '.*'); loader.baseParams.format = 'treejson'; loader.baseParams.contexts = '1'; loader.baseParams.path = nodeId; if (node.parentNode && node.parentNode.id == 'UserGraphsTree') { loader.baseParams.user = node.id; } } var userGraphsNode = new Ext.tree.AsyncTreeNode({ id: 'UserGraphsTree', leaf: false, allowChildren: true, expandable: true, allowDrag: false, loader: new Ext.tree.TreeLoader({ url: document.body.dataset.baseUrl + 'browser/usergraph/', requestMethod: 'GET', listeners: {beforeload: setParams} }) }); function handleSelects(selModel, nodes) { Ext.each(nodes, function (node, index) { if (!node.leaf) { node.unselect(); node.toggle(); } }); if (selModel.getSelectedNodes().length == 0) { Ext.getCmp('user-graphs-select-button').setDisabled(true); } else { Ext.getCmp('user-graphs-select-button').setDisabled(false); } } var treePanel = new Ext.tree.TreePanel({ id: 'user-graphs-tree', header: false, region: 'center', root: userGraphsNode, containerScroll: true, autoScroll: true, pathSeparator: '.', rootVisible: false, singleExpand: false, trackMouseOver: true, selModel: new Ext.tree.MultiSelectionModel({ listeners: { selectionchange: handleSelects } }) }); function selectUserGraphs(selectedNodes) { Ext.each(selectedNodes, function (node, index) { importGraphUrl(node.attributes.graphUrl); }); } var win = new Ext.Window({ title: 'Import From User Graphs', width: 300, height: 400, layout: 'border', resizable: true, modal: true, items: [treePanel], buttonAlign: 'center', buttons: [ { id: 'user-graphs-select-button', text: 'Select', disabled: true, handler: function () { selectUserGraphs(Ext.getCmp('user-graphs-tree').getSelectionModel().getSelectedNodes()); win.close(); } }, { text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); } function newFromMetric() { function applyMetric() { var inputMetric = Ext.getCmp('import-metric-field').getValue(); if (inputMetric == '') { return; } var graphTargetString = Ext.urlEncode({target: inputMetric}); var myParams = { target: [inputMetric] }; var urlParams = {}; Ext.apply(urlParams, defaultGraphParams); Ext.apply(urlParams, myParams); Ext.apply(urlParams, GraphSize); var record = new GraphRecord({ target: graphTargetString, params: myParams, url: document.body.dataset.baseUrl + 'render?' + Ext.urlEncode(urlParams) }); graphStore.add([record]); updateGraphRecords(); win.close(); } var urlField = new Ext.form.TextField({ id: 'import-metric-field', fieldLabel: 'Metric', region: 'center', width: '100%', listeners: { specialkey: function (field, e) { if (e.getKey() == e.ENTER) { applyMetric(); } }, afterrender: function (field) { field.focus(false, 100); } } }); var win = new Ext.Window({ title: 'Import Graph From Metric', width: 470, height: 87, layout: 'form', resizable: true, modal: true, items: [urlField], buttonAlign: 'center', buttons: [ { text: 'OK', handler: applyMetric }, { text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); } function editDefaultGraphParameters() { var editParams = Ext.apply({}, defaultGraphParams); removeUneditable(editParams); function applyParams() { var paramsString = Ext.getCmp('default-params-field').getValue(); var params = Ext.urlDecode(paramsString); copyUneditable(defaultGraphParams, params); defaultGraphParams = params; saveDefaultGraphParams(); refreshGraphs(); win.close(); } var paramsField = new Ext.form.TextField({ id: 'default-params-field', region: 'center', value: Ext.urlEncode(editParams), listeners: { specialkey: function (field, e) { if (e.getKey() == e.ENTER) { applyParams(); } }, afterrender: function (field) { field.focus(false, 100); } } }); var win = new Ext.Window({ title: 'Default Graph Parameters', width: 470, height: 87, layout: 'border', resizable: true, modal: true, items: [paramsField], buttonAlign: 'center', buttons: [ { text: 'OK', handler: applyParams }, { text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); } function selectGraphSize() { var presetCombo = new Ext.form.ComboBox({ fieldLabel: 'Preset', width: 80, editable: false, forceSelection: true, triggerAction: 'all', mode: 'local', value: 'Custom', store: ['Custom', 'Small', 'Medium', 'Large'], listeners: { select: function (combo, record, index) { var w = ''; var h = ''; if (index == 1) { //small w = 300; h = 230; } else if (index == 2) { //medium w = 400; h = 300; } else if (index == 3) { //large w = 500; h = 400; } Ext.getCmp('width-field').setValue(w); Ext.getCmp('height-field').setValue(h); } } }); var widthField = new Ext.form.TextField({ id: 'width-field', fieldLabel: 'Width', width: 80, regex: /\d+/, regexText: 'Please enter a number', allowBlank: false, value: GraphSize.width || UI_CONFIG.default_graph_width }); var heightField = new Ext.form.TextField({ id: 'height-field', fieldLabel: 'Height', width: 80, regex: /\d+/, regexText: 'Please enter a number', allowBlank: false, value: GraphSize.height || UI_CONFIG.default_graph_height }) var win; function resize() { GraphSize.width = defaultGraphParams.width = widthField.getValue(); GraphSize.height = defaultGraphParams.height = heightField.getValue(); saveDefaultGraphParams(); win.close(); refreshGraphs(); } win = new Ext.Window({ title: 'Change Graph Size', width: 185, height: 160, resizable: false, layout: 'form', labelAlign: 'right', labelWidth: 80, modal: true, items: [presetCombo, widthField, heightField], buttonAlign: 'center', buttons: [ {text: 'Ok', handler: resize}, {text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); } function doShare() { if (dashboardName == null) { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'dashboard/create-temporary/', method: 'POST', params: { state: Ext.encode( getState() ) }, callback: function (options, success, response) { var result = Ext.decode(response.responseText); if (result.error) { Ext.Msg.alert('Error', htmlEncode('There was an error saving this dashboard: ' + result.error)); } else { setDashboardName(result.name); sendSaveRequest(result.name); // Resave the state with the proper dashboardName now showShareWindow(); } } }); } else { // Prompt the user to save their dashboard so they are aware only saved changes get shared Ext.Msg.show({ title: 'Save Dashboard And Share', msg: 'You must save changes to your dashboard in order to share it.', buttons: Ext.Msg.OKCANCEL, fn: function (button) { if (button == 'ok') { sendSaveRequest(dashboardName); showShareWindow(); } } }); } } function showShareWindow() { var win = new Ext.Window({ title: 'Share Dashboard', width: 600, height: 125, layout: 'border', modal: true, items: [ { xtype: 'label', region: 'north', style: 'text-align: center;', text: 'You can use this URL to access the current dashboard.' }, { xtype: 'textfield', region: 'center', value: dashboardURL, editable: false, style: 'text-align: center; font-size: large;', listeners: { focus: function (field) { field.selectText(); } } } ], buttonAlign: 'center', buttons: [ {text: 'Close', handler: function () { win.close(); } } ] }); win.show(); } /* Other stuff */ var targetGrid; var activeMenu; function graphClicked(graphView, graphIndex, element, evt) { Ext.get('merge').hide(); var record = graphStore.getAt(graphIndex); if (!record) { return; } if (justClosedGraph) { justClosedGraph = false; return; } if ( (activeMenu != null) && (selectedRecord == record) ) { activeMenu.destroy(); activeMenu = null; return; } selectedRecord = record; // global state hack for graph options API var menu; var menuItems = []; function applyChanges (field, e) { if (e.getKey() != e.ENTER) { return; } var targets = []; Ext.each(menuItems, function (field) { if ((!field.getXType) || field.getXType() != 'textfield') { return; } if (field.initialConfig.isTargetField) { targets.push( field.getValue() ); } else { var newParams = Ext.urlDecode( field.getValue() ); copyUneditable(record.data.params, newParams); record.data.params = newParams; } }); record.data.target = Ext.urlEncode( {target: targets} ); record.data.params.target = targets; refreshGraphs(); menu.destroy(); } function syncGraphs(thisStore, record, operation) { var targets = []; thisStore.each(function (rec) { targets.push(rec.data.target.replace(/'/g, '"')); }); selectedRecord.data.params.target = targets; selectedRecord.data.target = Ext.urlEncode({target: targets}); refreshGraphs(); } /* Inline store definition hackery*/ var functionsButton; var targets = record.data.params.target; targets = map(targets, function (t) { return {target: t}; }); var targetStore = new Ext.data.JsonStore({ fields: ['target'], data: targets, listeners: { update: syncGraphs, remove: syncGraphs, add: syncGraphs, } }); var buttonWidth = 115; var rowHeight = 21; var maxRows = 6; var frameHeight = 5; var gridWidth = (buttonWidth * 4) + 2; var gridHeight = (rowHeight * Math.min(targets.length, maxRows)) + frameHeight; targetGrid = new Ext.grid.EditorGridPanel({ //frame: true, width: gridWidth, height: gridHeight, store: targetStore, hideHeaders: true, viewConfig: { markDirty: false, forceFit: true, autoFill: true, scrollOffset: 0 }, colModel: new Ext.grid.ColumnModel({ columns: [ { id: 'target', header: 'Target', dataIndex: 'target', width: gridWidth - 90, renderer: 'htmlEncode', editor: {xtype: 'textfield'} }, { xtype: 'actioncolumn', width: 30, sortable: false, items: [{ icon: UP_ICON, tooltip: 'Move Up', handler: function(grid, rowIndex, colIndex) { var record = targetStore.getAt(rowIndex); var target = record.data.target;                targetStore.remove(record); if(rowIndex > 0) { targetStore.insert(rowIndex-1, record); } else { targetStore.add(record); } } }] }, { xtype: 'actioncolumn', width: 30, sortable: false, items: [{ icon: DOWN_ICON, tooltip: 'Move Down', handler: function(grid, rowIndex, colIndex) { var record = targetStore.getAt(rowIndex); var target = record.data.target;                targetStore.remove(record); if(rowIndex < targetStore.getTotalCount()-1) { targetStore.insert(rowIndex+1, record); } else { targetStore.insert(0, record); } } }] }, { xtype: 'actioncolumn', width: 30, sortable: false, items: [{ icon: TRASH_ICON, tooltip: 'Delete Row', handler: function(grid, rowIndex, colIndex) { var record = targetStore.getAt(rowIndex); var target = record.data.target;                   targetStore.remove(record); targets.remove(target); } }] }, ] }), selModel: new Ext.grid.RowSelectionModel({ singleSelect: false, listeners: { selectionchange: function (thisSelModel) { functionsButton.setDisabled(thisSelModel.getCount() == 0); } } }), clicksToEdit: 2, listeners: { afterrender: function (thisGrid) { thisGrid.getSelectionModel().selectFirstRow.defer(50, thisGrid.getSelectionModel()); }, resize: function (thisGrid) { thisGrid.findParentByType('menu').doLayout(); } } }); menuItems.push(targetGrid); /* Setup our menus */ var functionsMenu = new Ext.menu.Menu({ allowOtherMenus: true, items: createFunctionsMenu().concat([ {text: 'Remove Outer Call', handler: removeOuterCall} ]) }); functionsButton = new Ext.Button({ text: 'Apply Function', disabled: true, width: buttonWidth, handler: function (thisButton) { if (functionsMenu.isVisible()) { functionsMenu.hide(); } else { operationsMenu.hide(); optionsMenu.doHide(); // private method... yuck functionsMenu.show(thisButton.getEl()); } } }); var optionsMenuConfig = createOptionsMenu(); // defined in composer_widgets.js optionsMenuConfig.allowOtherMenus = true; var optionsMenu = new Ext.menu.Menu(optionsMenuConfig); optionsMenu.on('hide', function () { menu.hide(); }); updateCheckItems(); var operationsMenu = new Ext.menu.Menu({ allowOtherMenus: true, items: [{ xtype: 'button', fieldLabel: '', text: 'Breakout', width: 100, handler: function () { menu.destroy(); breakoutGraph(record); } }, { xtype: 'button', fieldLabel: '', text: 'Clone', width: 100, handler: function () { menu.destroy(); cloneGraph(record); } }, { xtype: 'button', fieldLabel: '', text: 'Email', width: 100, handler: function () { menu.destroy(); mailGraph(record); } }, { xtype: 'button', fieldLabel: '', text: 'Direct URL', width: 100, handler: function () { menu.destroy(); var win = new Ext.Window({ title: 'Graph URL', width: 600, height: 125, layout: 'border', modal: true, items: [ { xtype: 'label', region: 'north', style: 'text-align: center;', text: 'Direct URL to this graph' }, { xtype: 'textfield', region: 'center', value: record.data.url, editable: false, style: 'text-align: center; font-size: large;', listeners: { focus: function (field) { field.selectText(); } } } ], buttonAlign: 'center', buttons: [ {text: 'Close', handler: function () { win.close(); } } ] }); win.show(); }, }, { xtype: 'button', fieldLabel: '', text: 'Short Direct URL', width: 100, handler: function () { menu.destroy(); var showUrl = function(options, success, response) { if(success) { var win = new Ext.Window({ title: 'Graph URL', width: 600, height: 125, layout: 'border', modal: true, items: [ { xtype: 'label', region: 'north', style: 'text-align: center;', text: 'Short Direct URL to this graph' }, { xtype: 'textfield', region: 'center', value: window.location.origin + response.responseText, editable: false, style: 'text-align: center; font-size: large;', listeners: { focus: function (field) { field.selectText(); } } } ], buttonAlign: 'center', buttons: [ {text: 'Close', handler: function () { win.close(); } } ] }); win.show(); } } Ext.Ajax.request({ method: 'GET', url: document.body.dataset.baseUrl + 's' + record.data.url, callback: showUrl, }); } }, { xtype: 'button', text: 'History', width: 100, handler: function () { menu.destroy(); historyGraph(record);} }] }); var buttons = [functionsButton]; buttons.push({ xtype: 'button', text: 'Render Options', width: buttonWidth, handler: function (thisButton) { if (optionsMenu.isVisible()) { optionsMenu.doHide(); // private method... yuck (no other way to hide w/out trigging hide event handler) } else { operationsMenu.hide(); functionsMenu.hide(); optionsMenu.show(thisButton.getEl()); } } }); buttons.push({ xtype: 'button', text: 'Graph Operations', width: buttonWidth, handler: function (thisButton) { if (operationsMenu.isVisible()) { operationsMenu.hide(); } else { optionsMenu.doHide(); // private method... yuck functionsMenu.hide(); operationsMenu.show(thisButton.getEl()); } } }); //create new row   buttons.push({ xtype: 'button',     text: 'Add Target', width: buttonWidth,     handler: function() { // Hide the other menus operationsMenu.hide(); optionsMenu.doHide(); // private method... yuck functionsMenu.hide(); targetStore.add([ new targetStore.recordType({target: 'Edit to save'}) ]); targets.push('Edit to save'); targetGrid.setHeight((rowHeight * Math.min(targets.length, maxRows)) + frameHeight);     }   }); menuItems.push({ xtype: 'panel', layout: 'hbox', items: buttons }); menu = new Ext.menu.Menu({ layout: 'anchor', allowOtherMenus: true, items: menuItems }); activeMenu = menu; var position = evt.getXY(); position[0] -= (buttonWidth * 1.5) + 10; //horizontally center menu with the mouse menu.showAt(position); menu.get(0).focus(false, 50); menu.keyNav.disable(); menu.on('hide', function () { var graphMenuParams = Ext.getCmp('graphMenuParams'); if (graphMenuParams) { graphMenuParams.destroy(); } } ); menu.on('destroy', function () { optionsMenu.destroy(); operationsMenu.destroy(); functionsMenu.destroy(); } ); } function removeUneditable (obj) { Ext.each(NOT_EDITABLE, function (p) { delete obj[p]; }); return obj; } function copyUneditable (src, dst) { Ext.each(NOT_EDITABLE, function (p) { if (src[p] === undefined) { delete dst[p]; } else { dst[p] = src[p]; } }); } function breakoutGraph(record) { /* We have to gather some context from the graph target's expressions so we can reapply functions after the expressions get expanded. */ var pathExpressions = []; var exprInfo = {}; try { Ext.each(record.data.params.target, function(target) { var exprsInThisTarget = 0; map(target.split(','), function (arg) { var arglets = arg.split('('); map(arglets[arglets.length-1].split(')'), function (expr) { expr = expr.replace(/^\s*(.+?)\s*$/, '$1'); if (expr.length == 0 || expr[0] == '"' || expr[0] == '\'') return; if (expr.match(/[a-z].*\..*[a-z]/i)) { exprsInThisTarget++; if (exprsInThisTarget > 1) { throw 'arrr!'; } pathExpressions.push(expr); var i = target.indexOf(expr); exprInfo[expr] = { expr: expr, pre: target.substr(0, i), post: target.substr(i + expr.length) } } }); //map arglets }); //map args }); //each target } catch (err) { Ext.Msg.alert('Graph contains unbreakable target', 'Graph targets containing more than one metric expression cannot be broken out.'); return; } Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'metrics/expand/', params: { groupByExpr: '1', leavesOnly: '1', query: pathExpressions }, callback: function (options, success, response) { var responseObj = Ext.decode(response.responseText); graphStore.remove(record); for (var expr in responseObj.results) { var pre = exprInfo[expr].pre; var post = exprInfo[expr].post; map(responseObj.results[expr], function (metricPath) { metricPath = pre + metricPath + post; graphAreaToggle(metricPath, {dontRemove: true, defaultParams: record.data.params}); }); } } }); } function mailGraph(record) { var mygraphParams = record.get('params'); var newparams = Ext.encode(Ext.apply(mygraphParams, defaultGraphParams)); var fromField = new Ext.form.TextField({ fieldLabel: 'From', name: 'sender', width: 300, allowBlank: false }); var toField = new Ext.form.TextField({ fieldLabel: 'To', name: 'recipients', width: 300, allowBlank: false }); var subjectField = new Ext.form.TextField({ fieldLabel: 'Subject', name: 'subject', width: 300, allowBlank: false }); var msgField = new Ext.form.TextArea({ fieldLabel: 'Message', name: 'message', width: 300, height: 75 }); var graphParamsField = new Ext.form.TextField({ name: 'graph_params', hidden: true, value: newparams }); var contactForm = new Ext.form.FormPanel({ width: 300, labelWidth: 90, items: [fromField, toField, subjectField, msgField, graphParamsField], buttons: [{ text: 'Cancel', handler: function(){win.close();} }, { text: 'Send', handler: function(){ if(contactForm.getForm().isValid()){ contactForm.getForm().submit({ url: document.body.dataset.baseUrl + 'dashboard/email', waitMsg: 'Processing Request', success: function (contactForm, response) { win.close(); } }); } } }] }); var win; win = new Ext.Window({ title: 'Send graph via email', width: 450, height: 230, resizable: true, modal: true, layout: 'fit', items: [contactForm] }); win.show(); } function cloneGraph(record) { var index = graphStore.indexOf(record); var clone = cloneGraphRecord(record); graphStore.insert(index+1, [clone]); refreshGraphs(); } function cloneGraphRecord(record) { //ensure we are working with copies, not references var props = { url: record.data.url, target: record.data.target, params: Ext.apply({}, record.data.params) }; props.params.target = Ext.urlDecode(props.target).target; if (typeof props.params.target == 'string') { props.params.target = [props.params.target]; } return new GraphRecord(props); } function historyGraph(record){ var graphHistoryStore = new Ext.data.ArrayStore({ fields: GraphRecord, listeners: { add: graphStoreUpdated, remove: graphStoreUpdated, update: graphStoreUpdated } }); function getProps(record){ var props = { url: record.data.url, target: record.data.target, params: Ext.apply({}, record.data.params) }; props.params.target = Ext.urlDecode(props.target).target; if (typeof props.params.target == 'string') { props.params.target = [props.params.target]; } props.params.width = '750'; props.params.height = '300'; props.params.until = '-'; return props; } var props = getProps(record); var title = ''; title = (props.params.title != undefined) ? props.params.title : ''; props = getProps(record); props.params.title = title + ' 1 hour'; props.params.from = '-1hour'; graphHistoryStore.insert(0,new GraphRecord(props)); props = getProps(record); props.params.title = title + ' 1 day'; props.params.from = '-1day'; graphHistoryStore.insert(1,new GraphRecord(props)); props = getProps(record); props.params.title = title + ' 7 day'; props.params.from = '-7day'; graphHistoryStore.insert(2,new GraphRecord(props)); props = getProps(record); props.params.title = title + ' 30 day'; props.params.from = '-30day'; graphHistoryStore.insert(3,new GraphRecord(props)); var graphTemplate = new Ext.XTemplate( '', '
', '
', '', '
', '
', '
', '
' ); updateDataHistory(); function updateDataHistory(){ graphHistoryStore.each(function (item, index) { var params = {}; Ext.apply(params, defaultGraphParams); Ext.apply(params, item.data.params); //Ext.apply(params, GraphSize); params._uniq = Math.random(); if (params.title === undefined && params.target.length == 1) { params.title = params.target[0]; } if (!params.uniq === undefined) { delete params['uniq']; } item.set('url', '/render?' + Ext.urlEncode(params)); item.set('width', item.data.params.width); item.set('height', item.data.params.height); item.set('index', index); }); } var graphHistoryView = new Ext.DataView({ store: graphHistoryStore, tpl: graphTemplate, overClass: 'graph-over', itemSelector: 'div.graph-container', emptyText: 'Configure your context above, and then select some metrics.', autoScroll: true, listeners: { } }); var win = new Ext.Window({ title: 'Graph History', width: 800, height: 800, resizable: true, modal: true, layout: 'fit', items: graphHistoryView }); win.show(); } function removeAllGraphs() { if (CONFIRM_REMOVE_ALL) { /* Ext.Msg.confirm( "Are you sure?", "Are you sure you want to remove all the graphs?", function (choice) { if (choice == 'yes') { graphStore.removeAll(); refreshGraphs(); } } ); */ var win; win = new Ext.Window({ title: 'Remove All Graphs', width: 200, height: 120, modal: true, layout: 'vbox', layoutConfig: { align: 'center' }, items: [ { xtype: 'label', text: 'Are You Sure?', style: 'font-size: large;' }, { id: 'always-ask-me', xtype: 'checkbox', boxLabel: 'Always Ask Me', name: 'ask-me', inputValue: 'yes', checked: true } ], buttonAlign: 'center', buttons: [ { text: 'Yes', handler: function () { if (Ext.getCmp('always-ask-me').getValue()) { CONFIRM_REMOVE_ALL = true; cookieProvider.set('confirm-remove-all', 'true'); } else { CONFIRM_REMOVE_ALL = false; cookieProvider.set('confirm-remove-all', 'false'); } graphStore.removeAll(); refreshGraphs(); win.close(); } }, { text: 'No', handler: function () { win.close(); } } ] }); win.show(); } else { graphStore.removeAll(); refreshGraphs(); } } function toggleToolbar() { var tbar = graphArea.getTopToolbar(); tbar.setVisible( ! tbar.isVisible() ); graphArea.doLayout(); } function toggleNavBar() { navBar.toggleCollapse(true); } function focusCompleter() { if (metricSelectorTextField) metricSelectorTextField.focus(false, 50); } /* Keyboard shortcuts */ var keyEventHandlers = { toggle_toolbar: toggleToolbar, toggle_metrics_panel: toggleNavBar, give_completer_focus: focusCompleter, erase_all_graphs: function () { graphStore.removeAll(); refreshGraphs(); graphStoreUpdated(); }, completer_add_metrics: function () { if (metricSelectorGrid) { metricSelectorGrid.getStore().each(function (record) { if (record.data.path[ record.data.path.length - 1] != '.') { graphAreaToggle(record.data.path, {dontRemove: true}); } }); focusCompleter(); } }, completer_del_metrics: function () { if (metricSelectorGrid) { metricSelectorGrid.getStore().each(function (record) { graphAreaToggle(record.data.path, {onlyRemove: true}); }); focusCompleter(); } }, save_dashboard: function () { if (dashboardName == null) { saveDashboard(); } else { sendSaveRequest(dashboardName); } } }; var specialKeys = { space: 32, enter: Ext.EventObject.ENTER, backspace: Ext.EventObject.BACKSPACE }; var keyMapConfigs = []; for (var event_name in UI_CONFIG.keyboard_shortcuts) { var config = {handler: keyEventHandlers[event_name]}; if (!config.handler) { continue; } var keyString = UI_CONFIG.keyboard_shortcuts[event_name]; var keys = keyString.split('-'); config.ctrl = keys.indexOf('ctrl') > -1; config.alt = keys.indexOf('alt') > -1; config.shift = keys.indexOf('shift') > -1; config.key = keys[keys.length - 1]; if (specialKeys[config.key]) { config.key = specialKeys[config.key]; } keyMapConfigs.push(config); } var keyMap = new Ext.KeyMap(document, keyMapConfigs); /* Dashboard functions */ function editDashboard() { var editDashboardWin = new Ext.Window({ title: 'Edit Dashboard', id: 'editor-window', width: 700, height: 500, layout: 'vbox', layoutConfig: {align: 'stretch', pack: 'start'}, modal: true, items: [ { xtype: 'container', flex: 1, id: 'editor', title: 'ace', listeners: { resize: function () { if (editor) editor.resize(); } } } ], listeners: { afterrender: { scope: this, fn: function (obj) { setupEditor(obj.body.dom); getInitialState() } } }, buttons: [ {text: 'Update (doesn\'t save)', handler: updateAfterEdit}, {text: 'Cancel', handler: function () { editDashboardWin.close(); } } ] }); function updateAfterEdit(btn, target) { var graphString = editor.getSession().getValue(); var targets = JSON.parse(graphString); graphStore.removeAll(); var graphs = []; for (var i = 0; i < targets.length; i++) { var myParams = {}; Ext.apply(myParams, targets[i]); var urlParams = {}; Ext.apply(urlParams, defaultGraphParams); Ext.apply(urlParams, GraphSize); Ext.apply(urlParams, myParams); graphs.push([ Ext.urlEncode({target: targets[i].target}), myParams, document.body.dataset.baseUrl + 'render?' + Ext.urlEncode(urlParams) ]); } graphStore.loadData(graphs); refreshGraphs(); editDashboardWin.close(); } function getInitialState() { var graphs = []; graphStore.each(function () { var params = {}; Ext.apply(params, this.data.params); delete params['from']; delete params['until']; graphs.push(params); }); editor.getSession().setValue(JSON.stringify(graphs, null, 2)); } function setupEditor(obj) { editor = ace.edit('editor'); editor.setTheme('ace/theme/textmate'); var JSONMode = require('ace/mode/json').Mode; var session = editor.getSession(); session.setMode(new JSONMode()); session.setUseSoftTabs(true); session.setTabSize(2); } editDashboardWin.show(); } function saveDashboard() { Ext.Msg.prompt( 'Save Dashboard', 'Enter the name to save this dashboard as', function (button, text) { if (button == 'ok') { setDashboardName(text); sendSaveRequest(text); } }, this, false, (dashboardName) ? dashboardName : '' ); } function saveTemplate() { var nameField = new Ext.form.TextField({ id: 'dashboard-save-template-name', fieldLabel: 'Template Name', width: 240, allowBlank: false, align: 'center', value: dashboardName ? dashboardName.split('/')[0]: '', }); var keyField = new Ext.form.TextField({ id: 'dashboard-save-template-key', fieldLabel: 'String to replace', width: 240, allowBlank: false, align: 'center', }); var win; function save() { sendSaveTemplateRequest(nameField.getValue(), keyField.getValue()); win.close(); } win = new Ext.Window({ title: 'Save dashboard as a template', width: 400, height: 120, resizable: false, layout: 'form', labelAlign: 'right', labelWidth: 120, items: [nameField,keyField], buttonAlign: 'center', buttons: [ {text: 'Ok', handler: save}, {text: 'Cancel', handler: function () { win.close(); } } ] }); win.show(); } function sendSaveTemplateRequest(name, key) { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'dashboard/save_template/' + name + '/' + key, method: 'POST', params: { state: Ext.encode( getState() ) }, success: function (response) { var result = Ext.decode(response.responseText); if (result.error) { Ext.Msg.alert('Error', htmlEncode('There was an error saving this dashboard as a template: ' + result.error)); } }, failure: failedAjaxCall }); } function sendSaveRequest(name) { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'dashboard/save/' + name, method: 'POST', params: { state: Ext.encode( getState() ) }, success: function (response) { var result = Ext.decode(response.responseText); if (result.error) { Ext.Msg.alert('Error', htmlEncode('There was an error saving this dashboard: ' + result.error)); } if(newURL) { window.location = newURL; } else { changeHash(name); } }, failure: failedAjaxCall }); } function sendLoadRequest(name) { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'dashboard/load/' + name, success: function (response) { var result = Ext.decode(response.responseText); if (result.error) { Ext.Msg.alert('Error Loading Dashboard', htmlEncode(result.error)); } else { applyState(result.state); navBar.collapse(false); } }, failure: failedAjaxCall }); } function sendLoadTemplateRequest(name, value) { var urlparts = window.location.href.split('#') if(urlparts[0].split('?')[1]) { var newLocation = urlparts[0].split('?')[0] + '#'+name+'/'+value; window.location.href = newLocation; } else { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'dashboard/load_template/' + name + '/' + value, success: function (response) { var result = Ext.decode(response.responseText); if (result.error) { Ext.Msg.alert('Error Loading Template', htmlEncode(result.error)); } else { applyState(result.state); navBar.collapse(false); } }, failure: failedAjaxCall }); } } function getState() { var graphs = []; graphStore.each( function (record) { graphs.push([ record.data.id, record.data.target, record.data.params, record.data.url ]); } ); return { name: dashboardName, timeConfig: TimeRange, refreshConfig: { enabled: Ext.getCmp('auto-refresh-button').pressed, interval: refreshTask.interval }, graphSize: GraphSize, defaultGraphParams: defaultGraphParams, graphs: graphs }; } function applyState(state) { setDashboardName(state.name); //state.timeConfig = {type, quantity, units, untilQuantity, untilUnits, startDate, startTime, endDate, endTime} var timeConfig = state.timeConfig TimeRange.type = timeConfig.type; TimeRange.relativeStartQuantity = timeConfig.relativeStartQuantity; TimeRange.relativeStartUnits = timeConfig.relativeStartUnits; TimeRange.relativeUntilQuantity = timeConfig.relativeUntilQuantity; TimeRange.relativeUntilUnits = timeConfig.relativeUntilUnits; TimeRange.startDate = new Date(timeConfig.startDate); TimeRange.startTime = timeConfig.startTime; TimeRange.endDate = new Date(timeConfig.endDate); TimeRange.endTime = timeConfig.endTime; if (queryString.from && queryString.until) { // The URL contains a "from" and "until" parameters (format "YYYY-MM-DDThh:mm:ss") => use the timestamps as default absolute range of the dashboard var from = new Date(queryString.from); var until = new Date(queryString.until); TimeRange.startDate = from; TimeRange.startTime = from.format('H:m'); TimeRange.endDate = until; TimeRange.endTime = until.format('H:m'); TimeRange.type = 'absolute'; state.timeConfig = TimeRange; state.defaultGraphParams.from = from.format('H:i_Ymd'); state.defaultGraphParams.until = until.format('H:i_Ymd'); } updateTimeText(); //state.refreshConfig = {enabled, interval} var refreshConfig = state.refreshConfig; if (refreshConfig.enabled) { stopTask(refreshTask); startTask(refreshTask); Ext.getCmp('auto-refresh-button').toggle(true); } else { stopTask(refreshTask); Ext.getCmp('auto-refresh-button').toggle(false); } //refreshTask.interval = refreshConfig.interval; updateAutoRefresh(refreshConfig.interval / 1000); //state.graphSize = {width, height} var graphSize = state.graphSize; GraphSize.width = graphSize.width; GraphSize.height = graphSize.height; //state.defaultGraphParams = {...} defaultGraphParams = state.defaultGraphParams || originalDefaultGraphParams; //state.graphs = [ [id, target, params, url], ... ] //Fix url param to be correct for this document.body.dataset.baseUrl var graphs = []; for (var i = 0; i < state.graphs.length; i++) { var myParams = {}; var renderType = state.graphs[i][3]; Ext.apply(myParams, state.graphs[i][1]); var urlParams = {}; Ext.apply(urlParams, defaultGraphParams); Ext.apply(urlParams, GraphSize); Ext.apply(urlParams, myParams); graphs.push([ state.graphs[i][0], myParams, document.body.dataset.baseUrl + 'render?' + Ext.urlEncode(urlParams), renderType ]); } graphStore.loadData(graphs); refreshGraphs(); } function deleteDashboard(name) { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'dashboard/delete/' + name, success: function (response) { var result = Ext.decode(response.responseText); if (result.error) { Ext.Msg.alert('Error', htmlEncode('Failed to delete dashboard \'' + name + '\': ' + result.error)); } else { Ext.Msg.alert('Dashboard Deleted', htmlEncode('The ' + name + ' dashboard was deleted successfully.')); } }, failure: failedAjaxCall }); } function deleteTemplate(name) { Ext.Ajax.request({ url: document.body.dataset.baseUrl + 'dashboard/delete_template/' + name, success: function (response) { var result = Ext.decode(response.responseText); if (result.error) { Ext.Msg.alert('Error', htmlEncode('Failed to delete template \'' + name + '\': ' + result.error)); } else { Ext.Msg.alert('Template Deleted', htmlEncode('The ' + name + ' template was deleted successfully.')); } }, failure: failedAjaxCall }); } function setDashboardName(name) { dashboardName = name; var saveButton = Ext.getCmp('dashboard-save-button'); if (name == null || !hasPermission('change')) { dashboardURL = null; document.title = 'untitled - Graphite Dashboard'; navBar.setTitle('untitled'); saveButton.setText('Save'); saveButton.disable(); } else { var urlparts = location.href.split('#')[0].split('/'); var i = urlparts.indexOf('dashboard'); if (i == -1) { Ext.Msg.alert('Error', htmlEncode('urlparts = ' + Ext.encode(urlparts) + ' and indexOf(dashboard) = ' + i)); return; } urlparts = urlparts.slice(0, i+1); urlparts.push( encodeURI(name) ) dashboardURL = urlparts.join('/'); document.title = name + ' - Graphite Dashboard'; changeHash(name); navBar.setTitle(htmlEncode(name + ' - (' + dashboardURL + ')')); saveButton.setText(htmlEncode('Save "' + name + '"')); saveButton.enable(); } } function failedAjaxCall(response, options) { Ext.Msg.alert( 'Ajax Error', htmlEncode('Ajax call failed, response was :' + response.responseText) ); } var configureUIWin; function configureUI() { if (configureUIWin) { configureUIWin.close(); } function updateOrientation() { if (Ext.getCmp('navbar-left-radio').getValue()) { updateNavBar('west'); } else { updateNavBar('north'); } configureUIWin.close(); configureUIWin = null; } configureUIWin = new Ext.Window({ title: 'Configure UI', layout: 'form', width: 300, height: 125, labelWidth: 120, labelAlign: 'right', items: [ { id: 'navbar-left-radio', xtype: 'radio', fieldLabel: 'Navigation Mode', boxLabel: 'Tree (left nav)', name: 'navbar-position', inputValue: 'left', checked: (NAV_BAR_REGION == 'west') }, { id: 'navbar-top-radio', xtype: 'radio', fieldLabel: '', boxLabel: 'Completer (top nav)', name: 'navbar-position', inputValue: 'top', checked: (NAV_BAR_REGION == 'north') } ], buttons: [ {text: 'Ok', handler: updateOrientation}, {text: 'Cancel', handler: function () { configureUIWin.close(); configureUIWin = null; } } ] }); configureUIWin.show(); } function updateNavBar(region) { if (region == NAV_BAR_REGION) { return; } cookieProvider.set('navbar-region', region); NAV_BAR_REGION = region; if (graphStore.getCount() == 0) { window.location.reload() } else { Ext.Msg.alert('Cookie Updated', 'You must refresh the page to update the nav bar\'s location.'); //TODO prompt the user to save their dashboard and refresh for them } } // Dashboard Finder function showDashboardFinder() { var win; var dashboardsList; var queryField; var dashboardsStore = new Ext.data.JsonStore({ url: document.body.dataset.baseUrl + 'dashboard/find/', method: 'GET', params: {query: 'e'}, fields: [{ name: 'name', sortType: function(value) { // Make sorting case-insensitive return value.toLowerCase(); } }], root: 'dashboards', sortInfo: { field: 'name', direction: 'ASC' }, listeners: { beforeload: function (store) { store.setBaseParam('query', queryField.getValue()); } } }); function openSelected() { var selected = dashboardsList.getSelectedRecords(); if (selected.length > 0) { sendLoadRequest(selected[0].data.name); } win.close(); } function deleteSelected() { var selected = dashboardsList.getSelectedRecords(); if (selected.length > 0) { var record = selected[0]; var name = record.data.name; Ext.Msg.confirm( 'Delete Dashboard', htmlEncode('Are you sure you want to delete the ' + name + ' dashboard?'), function (button) { if (button == 'yes') { deleteDashboard(name); dashboardsStore.remove(record); dashboardsList.refresh(); } } ); } } dashboardsList = new Ext.list.ListView({ columns: [ {header: 'Dashboard', width: 1.0, dataIndex: 'name', sortable: false, tpl:'{name:htmlEncode}'} ], columnSort: false, emptyText: 'No dashboards found', hideHeaders: true, listeners: { selectionchange: function (listView, selections) { if (listView.getSelectedRecords().length == 0) { Ext.getCmp('finder-open-button').disable(); Ext.getCmp('finder-delete-button').disable(); } else { Ext.getCmp('finder-open-button').enable(); if (hasPermission('delete')) { Ext.getCmp('finder-delete-button').enable(); } else { Ext.getCmp('finder-delete-button').disable(); } } }, dblclick: function (listView, index, node, e) { var record = dashboardsStore.getAt(index); sendLoadRequest(record.data.name); win.close(); } }, overClass: '', region: 'center', reserveScrollOffset: true, singleSelect: true, store: dashboardsStore, style: 'background-color: white;' }); var lastQuery = null; var queryUpdateTask = new Ext.util.DelayedTask( function () { var currentQuery = queryField.getValue(); if (lastQuery != currentQuery) { dashboardsStore.load(); } lastQuery = currentQuery; } ); queryField = new Ext.form.TextField({ region: 'south', emptyText: 'filter dashboard listing', enableKeyEvents: true, listeners: { keyup: function (field, e) { if (e.getKey() == e.ENTER) { sendLoadRequest(field.getValue()); win.close(); } else { queryUpdateTask.delay(FINDER_QUERY_DELAY); } } } }); win = new Ext.Window({ title: 'Dashboard Finder', width: 400, height: 500, layout: 'border', modal: true, items: [ dashboardsList, queryField ], buttons: [ { id: 'finder-open-button', text: 'Open', disabled: true, handler: openSelected }, { id: 'finder-delete-button', text: 'Delete', disabled: true, handler: deleteSelected }, { text: 'Close', handler: function () { win.close(); } } ] }); dashboardsStore.load(); win.show(); } // Template Finder function showTemplateFinder() { var win; var templatesList; var queryField; var valueField; var templatesStore = new Ext.data.JsonStore({ url: document.body.dataset.baseUrl + 'dashboard/find_template/', method: 'GET', params: {query: 'e'}, fields: ['name'], root: 'templates', listeners: { beforeload: function (store) { store.setBaseParam('query', queryField.getValue()); } } }); function openSelected() { var selected = templatesList.getSelectedRecords(); if (selected.length > 0) { sendLoadTemplateRequest(selected[0].data.name, valueField.getValue()); } win.close(); } function deleteSelected() { var selected = templatesList.getSelectedRecords(); if (selected.length > 0) { var record = selected[0]; var name = record.data.name; Ext.Msg.confirm( 'Delete Template', htmlEncode('Are you sure you want to delete the ' + name + ' template?'), function (button) { if (button == 'yes') { deleteTemplate(name); templatesStore.remove(record); templatesList.refresh(); } } ); } } templatesList = new Ext.list.ListView({ columns: [ {header: 'Template', width: 1.0, dataIndex: 'name', sortable: false} ], columnSort: false, emptyText: 'No templates found', hideHeaders: true, listeners: { selectionchange: function (listView, selections) { if (listView.getSelectedRecords().length == 0) { Ext.getCmp('finder-open-button').disable(); Ext.getCmp('finder-delete-button').disable(); } else { if (valueField.getValue()) { Ext.getCmp('finder-open-button').enable(); } Ext.getCmp('finder-delete-button').enable(); } }, }, overClass: '', region: 'center', reserveScrollOffset: true, singleSelect: true, store: templatesStore, style: 'background-color: white;' }); var lastQuery = null; var queryUpdateTask = new Ext.util.DelayedTask( function () { var currentQuery = queryField.getValue(); if (lastQuery != currentQuery) { templatesStore.load(); } lastQuery = currentQuery; } ); queryField = new Ext.form.TextField({ region: 'south', emptyText: 'filter template listing', enableKeyEvents: true, listeners: { keyup: function (field, e) { if (e.getKey() == e.ENTER) { sendLoadRequest(field.getValue(), reset_params=true); win.close(); } else { queryUpdateTask.delay(FINDER_QUERY_DELAY); } } } }); valueField = new Ext.form.TextField({ region: 'north', emptyText: 'Value to use' }); win = new Ext.Window({ title: 'Template Finder', width: 400, height: 500, layout: 'border', modal: true, items: [ valueField, templatesList, queryField, ], buttons: [ { id: 'finder-open-button', text: 'Open', disabled: true, handler: openSelected }, { id: 'finder-delete-button', text: 'Delete', disabled: true, handler: deleteSelected }, { text: 'Close', handler: function () { win.close(); } } ] }); templatesStore.load(); win.show(); } /* Graph Options API (to reuse createOptionsMenu from composer_widgets.js) */ function updateGraph() { refreshGraphs(); var graphMenuParams = Ext.getCmp('graphMenuParams'); if (graphMenuParams) { var editParams = Ext.apply({}, selectedRecord.data.params); removeUneditable(editParams); graphMenuParams.setValue( Ext.urlEncode(editParams) ); } } function getParam(param) { return selectedRecord.data.params[param]; } function setParam(param, value) { selectedRecord.data.params[param] = value; selectedRecord.commit(); } function removeParam(param) { delete selectedRecord.data.params[param]; selectedRecord.commit(); } function removeTargetFromSelectedGraph(target) { selectedRecord.data.params.target.remove(target); selectedRecord.data.target = Ext.urlEncode({target: selectedRecord.data.params.target}); } function getSelectedTargets() { if (targetGrid) { return map(targetGrid.getSelectionModel().getSelections(), function (r) { return r.data.target; }); } return []; } function applyFuncToEach(funcName, extraArg) { function applyFunc() { Ext.each(targetGrid.getSelectionModel().getSelections(), function (record) { var target = record.data.target; var newTarget; var targetStore = targetGrid.getStore(); targetStore.remove(record); removeTargetFromSelectedGraph(target); if (extraArg) { newTarget = funcName + '(' + target + ',' + extraArg + ')'; } else { newTarget = funcName + '(' + target + ')'; } // Add newTarget to selectedRecord targetStore.add([ new targetStore.recordType({target: newTarget}, newTarget) ]); targetGrid.getSelectionModel().selectRow(targetStore.findExact('target', newTarget), true); } ); refreshGraphs(); } return applyFunc; } function applyFuncToEachWithInput (funcName, question, options) { if (options == null) { options = {}; } function applyFunc() { Ext.MessageBox.prompt( 'Input Required', //title question, //message function (button, inputValue) { //handler if (button == 'ok' && (options.allowBlank || inputValue != '')) { if (options.quote) { inputValue = '"' + inputValue + '"'; } applyFuncToEach(funcName, inputValue)(); } }, this, //scope false, //multiline '' //initial value ); } applyFunc = applyFunc.createDelegate(this); return applyFunc; } function applyFuncToAll (funcName) { function applyFunc() { var args = getSelectedTargets().join(','); var newTarget = funcName + '(' + args + ')'; var targetStore = targetGrid.getStore(); Ext.each(targetGrid.getSelectionModel().getSelections(), function (record) { targetStore.remove(record); removeTargetFromSelectedGraph(record.data.target); } ); targetStore.add([ new targetStore.recordType({target: newTarget}, newTarget) ]); targetGrid.getSelectionModel().selectRow(targetStore.findExact('target', newTarget), true); refreshGraphs(); } applyFunc = applyFunc.createDelegate(this); return applyFunc; } function removeOuterCall() { // blatantly repurposed from composer_widgets.js (don't hate) Ext.each(targetGrid.getSelectionModel().getSelections(), function (record) { var target = record.data.target; var targetStore = targetGrid.getStore(); var args = []; var i, c; var lastArg = 0; var depth = 0; var argString = target.replace(/^[^(]+\((.+)\)/, '$1'); //First we strip it down to just args for (i = 0; i < argString.length; i++) { switch (argString.charAt(i)) { case '(': depth += 1; break; case '{': depth += 1; break; case ')': depth -= 1; break; case '}': depth -= 1; break; case ',': if (depth > 0) { continue; } if (depth < 0) { Ext.Msg.alert('Malformed target, cannot remove outer call.'); return; } args.push( argString.substring(lastArg, i).replace(/^\s+/, '').replace(/\s+$/, '') ); lastArg = i + 1; break; } } args.push( argString.substring(lastArg, i) ); targetStore.remove(record); selectedRecord.data.params.target.remove(target); Ext.each(args, function (arg) { if (!arg.match(/^([0123456789\.]+|".+")$/)) { //Skip string and number literals targetStore.add([ new targetStore.recordType({target: arg}) ]); targetGrid.getSelectionModel().selectRow(targetStore.findExact('target', arg), true); } }); }); refreshGraphs(); } function saveDefaultGraphParams() { cookieProvider.set('defaultGraphParams', Ext.encode(defaultGraphParams)); } /* Cookie stuff */ function getContextFieldCookie(field) { return cookieProvider.get(field); } function setContextFieldCookie(field, value) { cookieProvider.set(field, value); } /* Misc */ function uniq(myArray) { var uniqArray = []; for (var i=0; i'about:blank', except for IE in secure mode, which is 'javascript:""'). * @type String */ SSL_SECURE_URL : isSecure && isIE ? 'javascript:""' : 'about:blank', /** * True if the browser is in strict (standards-compliant) mode, as opposed to quirks mode * @type Boolean */ isStrict : isStrict, /** * True if the page is running over SSL * @type Boolean */ isSecure : isSecure, /** * True when the document is fully initialized and ready for action * @type Boolean */ isReady : false, /** * True if the {@link Ext.Fx} Class is available * @type Boolean * @property enableFx */ /** * HIGHLY EXPERIMENTAL * True to force css based border-box model override and turning off javascript based adjustments. This is a * runtime configuration and must be set before onReady. * @type Boolean */ enableForcedBoxModel : false, /** * True to automatically uncache orphaned Ext.Elements periodically (defaults to true) * @type Boolean */ enableGarbageCollector : true, /** * True to automatically purge event listeners during garbageCollection (defaults to false). * @type Boolean */ enableListenerCollection : false, /** * EXPERIMENTAL - True to cascade listener removal to child elements when an element is removed. * Currently not optimized for performance. * @type Boolean */ enableNestedListenerRemoval : false, /** * Indicates whether to use native browser parsing for JSON methods. * This option is ignored if the browser does not support native JSON methods. * Note: Native JSON methods will not work with objects that have functions. * Also, property names must be quoted, otherwise the data will not parse. (Defaults to false) * @type Boolean */ USE_NATIVE_JSON : false, /** * Copies all the properties of config to obj if they don't already exist. * @param {Object} obj The receiver of the properties * @param {Object} config The source of the properties * @return {Object} returns obj */ applyIf : function(o, c){ if(o){ for(var p in c){ if(!Ext.isDefined(o[p])){ o[p] = c[p]; } } } return o; }, /** * Generates unique ids. If the element already has an id, it is unchanged * @param {Mixed} el (optional) The element to generate an id for * @param {String} prefix (optional) Id prefix (defaults "ext-gen") * @return {String} The generated Id. */ id : function(el, prefix){ el = Ext.getDom(el, true) || {}; if (!el.id) { el.id = (prefix || "ext-gen") + (++idSeed); } return el.id; }, /** *

Extends one class to create a subclass and optionally overrides members with the passed literal. This method * also adds the function "override()" to the subclass that can be used to override members of the class.

* For example, to create a subclass of Ext GridPanel: *

MyGridPanel = Ext.extend(Ext.grid.GridPanel, {
    constructor: function(config) {

//      Create configuration for this Grid.
        var store = new Ext.data.Store({...});
        var colModel = new Ext.grid.ColumnModel({...});

//      Create a new config object containing our computed properties
//      *plus* whatever was in the config parameter.
        config = Ext.apply({
            store: store,
            colModel: colModel
        }, config);

        MyGridPanel.superclass.constructor.call(this, config);

//      Your postprocessing here
    },

    yourMethod: function() {
        // etc.
    }
});
* *

This function also supports a 3-argument call in which the subclass's constructor is * passed as an argument. In this form, the parameters are as follows:

*
    *
  • subclass : Function
    The subclass constructor.
  • *
  • superclass : Function
    The constructor of class being extended
  • *
  • overrides : Object
    A literal with members which are copied into the subclass's * prototype, and are therefore shared among all instances of the new class.
  • *
* * @param {Function} superclass The constructor of class being extended. * @param {Object} overrides

A literal with members which are copied into the subclass's * prototype, and are therefore shared between all instances of the new class.

*

This may contain a special member named constructor. This is used * to define the constructor of the new class, and is returned. If this property is * not specified, a constructor is generated and returned which just calls the * superclass's constructor passing on its parameters.

*

It is essential that you call the superclass constructor in any provided constructor. See example code.

* @return {Function} The subclass constructor from the overrides parameter, or a generated one if not provided. */ extend : function(){ // inline overrides var io = function(o){ for(var m in o){ this[m] = o[m]; } }; var oc = Object.prototype.constructor; return function(sb, sp, overrides){ if(typeof sp == 'object'){ overrides = sp; sp = sb; sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);}; } var F = function(){}, sbp, spp = sp.prototype; F.prototype = spp; sbp = sb.prototype = new F(); sbp.constructor=sb; sb.superclass=spp; if(spp.constructor == oc){ spp.constructor=sp; } sb.override = function(o){ Ext.override(sb, o); }; sbp.superclass = sbp.supr = (function(){ return spp; }); sbp.override = io; Ext.override(sb, overrides); sb.extend = function(o){return Ext.extend(sb, o);}; return sb; }; }(), /** * Adds a list of functions to the prototype of an existing class, overwriting any existing methods with the same name. * Usage:

Ext.override(MyClass, {
    newMethod1: function(){
        // etc.
    },
    newMethod2: function(foo){
        // etc.
    }
});
* @param {Object} origclass The class to override * @param {Object} overrides The list of functions to add to origClass. This should be specified as an object literal * containing one or more methods. * @method override */ override : function(origclass, overrides){ if(overrides){ var p = origclass.prototype; Ext.apply(p, overrides); if(Ext.isIE && overrides.hasOwnProperty('toString')){ p.toString = overrides.toString; } } }, /** * Creates namespaces to be used for scoping variables and classes so that they are not global. * Specifying the last node of a namespace implicitly creates all other nodes. Usage: *

Ext.namespace('Company', 'Company.data');
Ext.namespace('Company.data'); // equivalent and preferable to above syntax
Company.Widget = function() { ... }
Company.data.CustomStore = function(config) { ... }
* @param {String} namespace1 * @param {String} namespace2 * @param {String} etc * @return {Object} The namespace object. (If multiple arguments are passed, this will be the last namespace created) * @method namespace */ namespace : function(){ var len1 = arguments.length, i = 0, len2, j, main, ns, sub, current; for(; i < len1; ++i) { main = arguments[i]; ns = arguments[i].split('.'); current = window[ns[0]]; if (current === undefined) { current = window[ns[0]] = {}; } sub = ns.slice(1); len2 = sub.length; for(j = 0; j < len2; ++j) { current = current[sub[j]] = current[sub[j]] || {}; } } return current; }, /** * Takes an object and converts it to an encoded URL. e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2". Optionally, property values can be arrays, instead of keys and the resulting string that's returned will contain a name/value pair for each array value. * @param {Object} o * @param {String} pre (optional) A prefix to add to the url encoded string * @return {String} */ urlEncode : function(o, pre){ var empty, buf = [], e = encodeURIComponent; Ext.iterate(o, function(key, item){ empty = Ext.isEmpty(item); Ext.each(empty ? key : item, function(val){ buf.push('&', e(key), '=', (!Ext.isEmpty(val) && (val != key || !empty)) ? (Ext.isDate(val) ? Ext.encode(val).replace(/"/g, '') : e(val)) : ''); }); }); if(!pre){ buf.shift(); pre = ''; } return pre + buf.join(''); }, /** * Takes an encoded URL and and converts it to an object. Example:

Ext.urlDecode("foo=1&bar=2"); // returns {foo: "1", bar: "2"}
Ext.urlDecode("foo=1&bar=2&bar=3&bar=4", false); // returns {foo: "1", bar: ["2", "3", "4"]}
* @param {String} string * @param {Boolean} overwrite (optional) Items of the same name will overwrite previous values instead of creating an an array (Defaults to false). * @return {Object} A literal with members */ urlDecode : function(string, overwrite){ if(Ext.isEmpty(string)){ return {}; } var obj = {}, pairs = string.split('&'), d = decodeURIComponent, name, value; Ext.each(pairs, function(pair) { pair = pair.split('='); name = d(pair[0]); value = d(pair[1]); obj[name] = overwrite || !obj[name] ? value : [].concat(obj[name]).concat(value); }); return obj; }, /** * Appends content to the query string of a URL, handling logic for whether to place * a question mark or ampersand. * @param {String} url The URL to append to. * @param {String} s The content to append to the URL. * @return (String) The resulting URL */ urlAppend : function(url, s){ if(!Ext.isEmpty(s)){ return url + (url.indexOf('?') === -1 ? '?' : '&') + s; } return url; }, /** * Converts any iterable (numeric indices and a length property) into a true array * Don't use this on strings. IE doesn't support "abc"[0] which this implementation depends on. * For strings, use this instead: "abc".match(/./g) => [a,b,c]; * @param {Iterable} the iterable object to be turned into a true Array. * @return (Array) array */ toArray : function(){ return isIE ? function(a, i, j, res){ res = []; for(var x = 0, len = a.length; x < len; x++) { res.push(a[x]); } return res.slice(i || 0, j || res.length); } : function(a, i, j){ return Array.prototype.slice.call(a, i || 0, j || a.length); }; }(), isIterable : function(v){ //check for array or arguments if(Ext.isArray(v) || v.callee){ return true; } //check for node list type if(/NodeList|HTMLCollection/.test(toString.call(v))){ return true; } //NodeList has an item and length property //IXMLDOMNodeList has nextNode method, needs to be checked first. return ((typeof v.nextNode != 'undefined' || v.item) && Ext.isNumber(v.length)); }, /** * Iterates an array calling the supplied function. * @param {Array/NodeList/Mixed} array The array to be iterated. If this * argument is not really an array, the supplied function is called once. * @param {Function} fn The function to be called with each item. If the * supplied function returns false, iteration stops and this method returns * the current index. This function is called with * the following arguments: *
    *
  • item : Mixed *
    The item at the current index * in the passed array
  • *
  • index : Number *
    The current index within the array
  • *
  • allItems : Array *
    The array passed as the first * argument to Ext.each.
  • *
* @param {Object} scope The scope (this reference) in which the specified function is executed. * Defaults to the item at the current index * within the passed array. * @return See description for the fn parameter. */ each : function(array, fn, scope){ if(Ext.isEmpty(array, true)){ return; } if(!Ext.isIterable(array) || Ext.isPrimitive(array)){ array = [array]; } for(var i = 0, len = array.length; i < len; i++){ if(fn.call(scope || array[i], array[i], i, array) === false){ return i; }; } }, /** * Iterates either the elements in an array, or each of the properties in an object. * Note: If you are only iterating arrays, it is better to call {@link #each}. * @param {Object/Array} object The object or array to be iterated * @param {Function} fn The function to be called for each iteration. * The iteration will stop if the supplied function returns false, or * all array elements / object properties have been covered. The signature * varies depending on the type of object being interated: *
    *
  • Arrays : (Object item, Number index, Array allItems) *
    * When iterating an array, the supplied function is called with each item.
  • *
  • Objects : (String key, Object value, Object) *
    * When iterating an object, the supplied function is called with each key-value pair in * the object, and the iterated object
  • *
* @param {Object} scope The scope (this reference) in which the specified function is executed. Defaults to * the object being iterated. */ iterate : function(obj, fn, scope){ if(Ext.isEmpty(obj)){ return; } if(Ext.isIterable(obj)){ Ext.each(obj, fn, scope); return; }else if(typeof obj == 'object'){ for(var prop in obj){ if(obj.hasOwnProperty(prop)){ if(fn.call(scope || obj, prop, obj[prop], obj) === false){ return; }; } } } }, /** * Return the dom node for the passed String (id), dom node, or Ext.Element. * Optional 'strict' flag is needed for IE since it can return 'name' and * 'id' elements by using getElementById. * Here are some examples: *

// gets dom node based on id
var elDom = Ext.getDom('elId');
// gets dom node based on the dom node
var elDom1 = Ext.getDom(elDom);

// If we don't know if we are working with an
// Ext.Element or a dom node use Ext.getDom
function(el){
    var dom = Ext.getDom(el);
    // do something with the dom node
}
         * 
* Note: the dom node to be found actually needs to exist (be rendered, etc) * when this method is called to be successful. * @param {Mixed} el * @return HTMLElement */ getDom : function(el, strict){ if(!el || !DOC){ return null; } if (el.dom){ return el.dom; } else { if (typeof el == 'string') { var e = DOC.getElementById(el); // IE returns elements with the 'name' and 'id' attribute. // we do a strict check to return the element with only the id attribute if (e && isIE && strict) { if (el == e.getAttribute('id')) { return e; } else { return null; } } return e; } else { return el; } } }, /** * Returns the current document body as an {@link Ext.Element}. * @return Ext.Element The document body */ getBody : function(){ return Ext.get(DOC.body || DOC.documentElement); }, /** * Returns the current document body as an {@link Ext.Element}. * @return Ext.Element The document body */ getHead : function() { var head; return function() { if (head == undefined) { head = Ext.get(DOC.getElementsByTagName("head")[0]); } return head; }; }(), /** * Removes a DOM node from the document. */ /** *

Removes this element from the document, removes all DOM event listeners, and deletes the cache reference. * All DOM event listeners are removed from this element. If {@link Ext#enableNestedListenerRemoval} is * true, then DOM event listeners are also removed from all child nodes. The body node * will be ignored if passed in.

* @param {HTMLElement} node The node to remove */ removeNode : isIE && !isIE8 ? function(){ var d; return function(n){ if(n && n.tagName != 'BODY'){ (Ext.enableNestedListenerRemoval) ? Ext.EventManager.purgeElement(n, true) : Ext.EventManager.removeAll(n); d = d || DOC.createElement('div'); d.appendChild(n); d.innerHTML = ''; delete Ext.elCache[n.id]; } }; }() : function(n){ if(n && n.parentNode && n.tagName != 'BODY'){ (Ext.enableNestedListenerRemoval) ? Ext.EventManager.purgeElement(n, true) : Ext.EventManager.removeAll(n); n.parentNode.removeChild(n); delete Ext.elCache[n.id]; } }, /** *

Returns true if the passed value is empty.

*

The value is deemed to be empty if it is

    *
  • null
  • *
  • undefined
  • *
  • an empty array
  • *
  • a zero length string (Unless the allowBlank parameter is true)
  • *
* @param {Mixed} value The value to test * @param {Boolean} allowBlank (optional) true to allow empty strings (defaults to false) * @return {Boolean} */ isEmpty : function(v, allowBlank){ return v === null || v === undefined || ((Ext.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false); }, /** * Returns true if the passed value is a JavaScript array, otherwise false. * @param {Mixed} value The value to test * @return {Boolean} */ isArray : function(v){ return toString.apply(v) === '[object Array]'; }, /** * Returns true if the passed object is a JavaScript date object, otherwise false. * @param {Object} object The object to test * @return {Boolean} */ isDate : function(v){ return toString.apply(v) === '[object Date]'; }, /** * Returns true if the passed value is a JavaScript Object, otherwise false. * @param {Mixed} value The value to test * @return {Boolean} */ isObject : function(v){ return !!v && Object.prototype.toString.call(v) === '[object Object]'; }, /** * Returns true if the passed value is a JavaScript 'primitive', a string, number or boolean. * @param {Mixed} value The value to test * @return {Boolean} */ isPrimitive : function(v){ return Ext.isString(v) || Ext.isNumber(v) || Ext.isBoolean(v); }, /** * Returns true if the passed value is a JavaScript Function, otherwise false. * @param {Mixed} value The value to test * @return {Boolean} */ isFunction : function(v){ return toString.apply(v) === '[object Function]'; }, /** * Returns true if the passed value is a number. Returns false for non-finite numbers. * @param {Mixed} value The value to test * @return {Boolean} */ isNumber : function(v){ return typeof v === 'number' && isFinite(v); }, /** * Returns true if the passed value is a string. * @param {Mixed} value The value to test * @return {Boolean} */ isString : function(v){ return typeof v === 'string'; }, /** * Returns true if the passed value is a boolean. * @param {Mixed} value The value to test * @return {Boolean} */ isBoolean : function(v){ return typeof v === 'boolean'; }, /** * Returns true if the passed value is an HTMLElement * @param {Mixed} value The value to test * @return {Boolean} */ isElement : function(v) { return v ? !!v.tagName : false; }, /** * Returns true if the passed value is not undefined. * @param {Mixed} value The value to test * @return {Boolean} */ isDefined : function(v){ return typeof v !== 'undefined'; }, /** * True if the detected browser is Opera. * @type Boolean */ isOpera : isOpera, /** * True if the detected browser uses WebKit. * @type Boolean */ isWebKit : isWebKit, /** * True if the detected browser is Chrome. * @type Boolean */ isChrome : isChrome, /** * True if the detected browser is Safari. * @type Boolean */ isSafari : isSafari, /** * True if the detected browser is Safari 3.x. * @type Boolean */ isSafari3 : isSafari3, /** * True if the detected browser is Safari 4.x. * @type Boolean */ isSafari4 : isSafari4, /** * True if the detected browser is Safari 2.x. * @type Boolean */ isSafari2 : isSafari2, /** * True if the detected browser is Internet Explorer. * @type Boolean */ isIE : isIE, /** * True if the detected browser is Internet Explorer 6.x. * @type Boolean */ isIE6 : isIE6, /** * True if the detected browser is Internet Explorer 7.x. * @type Boolean */ isIE7 : isIE7, /** * True if the detected browser is Internet Explorer 8.x. * @type Boolean */ isIE8 : isIE8, /** * True if the detected browser is Internet Explorer 9.x. * @type Boolean */ isIE9 : isIE9, /** * True if the detected browser uses the Gecko layout engine (e.g. Mozilla, Firefox). * @type Boolean */ isGecko : isGecko, /** * True if the detected browser uses a pre-Gecko 1.9 layout engine (e.g. Firefox 2.x). * @type Boolean */ isGecko2 : isGecko2, /** * True if the detected browser uses a Gecko 1.9+ layout engine (e.g. Firefox 3.x). * @type Boolean */ isGecko3 : isGecko3, /** * True if the detected browser is Internet Explorer running in non-strict mode. * @type Boolean */ isBorderBox : isBorderBox, /** * True if the detected platform is Linux. * @type Boolean */ isLinux : isLinux, /** * True if the detected platform is Windows. * @type Boolean */ isWindows : isWindows, /** * True if the detected platform is Mac OS. * @type Boolean */ isMac : isMac, /** * True if the detected platform is Adobe Air. * @type Boolean */ isAir : isAir }); /** * Creates namespaces to be used for scoping variables and classes so that they are not global. * Specifying the last node of a namespace implicitly creates all other nodes. Usage: *

Ext.namespace('Company', 'Company.data');
Ext.namespace('Company.data'); // equivalent and preferable to above syntax
Company.Widget = function() { ... }
Company.data.CustomStore = function(config) { ... }
* @param {String} namespace1 * @param {String} namespace2 * @param {String} etc * @return {Object} The namespace object. (If multiple arguments are passed, this will be the last namespace created) * @method ns */ Ext.ns = Ext.namespace; })(); Ext.ns('Ext.util', 'Ext.lib', 'Ext.data', 'Ext.supports'); Ext.elCache = {}; /** * @class Function * These functions are available on every Function object (any JavaScript function). */ Ext.apply(Function.prototype, { /** * Creates an interceptor function. The passed function is called before the original one. If it returns false, * the original one is not called. The resulting function returns the results of the original function. * The passed function is called with the parameters of the original function. Example usage: *

var sayHi = function(name){
    alert('Hi, ' + name);
}

sayHi('Fred'); // alerts "Hi, Fred"

// create a new function that validates input without
// directly modifying the original function:
var sayHiToFriend = sayHi.createInterceptor(function(name){
    return name == 'Brian';
});

sayHiToFriend('Fred');  // no alert
sayHiToFriend('Brian'); // alerts "Hi, Brian"
* @param {Function} fcn The function to call before the original * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed. * If omitted, defaults to the scope in which the original function is called or the browser window. * @return {Function} The new function */ createInterceptor : function(fcn, scope){ var method = this; return !Ext.isFunction(fcn) ? this : function() { var me = this, args = arguments; fcn.target = me; fcn.method = method; return (fcn.apply(scope || me || window, args) !== false) ? method.apply(me || window, args) : null; }; }, /** * Creates a callback that passes arguments[0], arguments[1], arguments[2], ... * Call directly on any function. Example: myFunction.createCallback(arg1, arg2) * Will create a function that is bound to those 2 args. If a specific scope is required in the * callback, use {@link #createDelegate} instead. The function returned by createCallback always * executes in the window scope. *

This method is required when you want to pass arguments to a callback function. If no arguments * are needed, you can simply pass a reference to the function as a callback (e.g., callback: myFn). * However, if you tried to pass a function with arguments (e.g., callback: myFn(arg1, arg2)) the function * would simply execute immediately when the code is parsed. Example usage: *


var sayHi = function(name){
    alert('Hi, ' + name);
}

// clicking the button alerts "Hi, Fred"
new Ext.Button({
    text: 'Say Hi',
    renderTo: Ext.getBody(),
    handler: sayHi.createCallback('Fred')
});
* @return {Function} The new function */ createCallback : function(/*args...*/){ // make args available, in function below var args = arguments, method = this; return function() { return method.apply(window, args); }; }, /** * Creates a delegate (callback) that sets the scope to obj. * Call directly on any function. Example: this.myFunction.createDelegate(this, [arg1, arg2]) * Will create a function that is automatically scoped to obj so that the this variable inside the * callback points to obj. Example usage: *

var sayHi = function(name){
    // Note this use of "this.text" here.  This function expects to
    // execute within a scope that contains a text property.  In this
    // example, the "this" variable is pointing to the btn object that
    // was passed in createDelegate below.
    alert('Hi, ' + name + '. You clicked the "' + this.text + '" button.');
}

var btn = new Ext.Button({
    text: 'Say Hi',
    renderTo: Ext.getBody()
});

// This callback will execute in the scope of the
// button instance. Clicking the button alerts
// "Hi, Fred. You clicked the "Say Hi" button."
btn.on('click', sayHi.createDelegate(btn, ['Fred']));
* @param {Object} scope (optional) The scope (this reference) in which the function is executed. * If omitted, defaults to the browser window. * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller) * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding, * if a number the args are inserted at the specified position * @return {Function} The new function */ createDelegate : function(obj, args, appendArgs){ var method = this; return function() { var callArgs = args || arguments; if (appendArgs === true){ callArgs = Array.prototype.slice.call(arguments, 0); callArgs = callArgs.concat(args); }else if (Ext.isNumber(appendArgs)){ callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first var applyArgs = [appendArgs, 0].concat(args); // create method call params Array.prototype.splice.apply(callArgs, applyArgs); // splice them in } return method.apply(obj || window, callArgs); }; }, /** * Calls this function after the number of millseconds specified, optionally in a specific scope. Example usage: *

var sayHi = function(name){
    alert('Hi, ' + name);
}

// executes immediately:
sayHi('Fred');

// executes after 2 seconds:
sayHi.defer(2000, this, ['Fred']);

// this syntax is sometimes useful for deferring
// execution of an anonymous function:
(function(){
    alert('Anonymous');
}).defer(100);
* @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately) * @param {Object} scope (optional) The scope (this reference) in which the function is executed. * If omitted, defaults to the browser window. * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller) * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding, * if a number the args are inserted at the specified position * @return {Number} The timeout id that can be used with clearTimeout */ defer : function(millis, obj, args, appendArgs){ var fn = this.createDelegate(obj, args, appendArgs); if(millis > 0){ return setTimeout(fn, millis); } fn(); return 0; } }); /** * @class String * These functions are available on every String object. */ Ext.applyIf(String, { /** * Allows you to define a tokenized string and pass an arbitrary number of arguments to replace the tokens. Each * token must be unique, and must increment in the format {0}, {1}, etc. Example usage: *

var cls = 'my-class', text = 'Some text';
var s = String.format('<div class="{0}">{1}</div>', cls, text);
// s now contains the string: '<div class="my-class">Some text</div>'
     * 
* @param {String} string The tokenized string to be formatted * @param {String} value1 The value to replace token {0} * @param {String} value2 Etc... * @return {String} The formatted string * @static */ format : function(format){ var args = Ext.toArray(arguments, 1); return format.replace(/\{(\d+)\}/g, function(m, i){ return args[i]; }); } }); /** * @class Array */ Ext.applyIf(Array.prototype, { /** * Checks whether or not the specified object exists in the array. * @param {Object} o The object to check for * @param {Number} from (Optional) The index at which to begin the search * @return {Number} The index of o in the array (or -1 if it is not found) */ indexOf : function(o, from){ var len = this.length; from = from || 0; from += (from < 0) ? len : 0; for (; from < len; ++from){ if(this[from] === o){ return from; } } return -1; }, /** * Removes the specified object from the array. If the object is not found nothing happens. * @param {Object} o The object to remove * @return {Array} this array */ remove : function(o){ var index = this.indexOf(o); if(index != -1){ this.splice(index, 1); } return this; } }); /** * @class Ext.util.TaskRunner * Provides the ability to execute one or more arbitrary tasks in a multithreaded * manner. Generally, you can use the singleton {@link Ext.TaskMgr} instead, but * if needed, you can create separate instances of TaskRunner. Any number of * separate tasks can be started at any time and will run independently of each * other. Example usage: *

// Start a simple clock task that updates a div once per second
var updateClock = function(){
    Ext.fly('clock').update(new Date().format('g:i:s A'));
} 
var task = {
    run: updateClock,
    interval: 1000 //1 second
}
var runner = new Ext.util.TaskRunner();
runner.start(task);

// equivalent using TaskMgr
Ext.TaskMgr.start({
    run: updateClock,
    interval: 1000
});

 * 
*

See the {@link #start} method for details about how to configure a task object.

* Also see {@link Ext.util.DelayedTask}. * * @constructor * @param {Number} interval (optional) The minimum precision in milliseconds supported by this TaskRunner instance * (defaults to 10) */ Ext.util.TaskRunner = function(interval){ interval = interval || 10; var tasks = [], removeQueue = [], id = 0, running = false, // private stopThread = function(){ running = false; clearInterval(id); id = 0; }, // private startThread = function(){ if(!running){ running = true; id = setInterval(runTasks, interval); } }, // private removeTask = function(t){ removeQueue.push(t); if(t.onStop){ t.onStop.apply(t.scope || t); } }, // private runTasks = function(){ var rqLen = removeQueue.length, now = new Date().getTime(); if(rqLen > 0){ for(var i = 0; i < rqLen; i++){ tasks.remove(removeQueue[i]); } removeQueue = []; if(tasks.length < 1){ stopThread(); return; } } for(var i = 0, t, itime, rt, len = tasks.length; i < len; ++i){ t = tasks[i]; itime = now - t.taskRunTime; if(t.interval <= itime){ rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]); t.taskRunTime = now; if(rt === false || t.taskRunCount === t.repeat){ removeTask(t); return; } } if(t.duration && t.duration <= (now - t.taskStartTime)){ removeTask(t); } } }; /** * Starts a new task. * @method start * @param {Object} task

A config object that supports the following properties:

    *
  • run : Function

    The function to execute each time the task is invoked. The * function will be called at each interval and passed the args argument if specified, and the * current invocation count if not.

    *

    If a particular scope (this reference) is required, be sure to specify it using the scope argument.

    *

    Return false from this function to terminate the task.

  • *
  • interval : Number
    The frequency in milliseconds with which the task * should be invoked.
  • *
  • args : Array
    (optional) An array of arguments to be passed to the function * specified by run. If not specified, the current invocation count is passed.
  • *
  • scope : Object
    (optional) The scope (this reference) in which to execute the * run function. Defaults to the task config object.
  • *
  • duration : Number
    (optional) The length of time in milliseconds to invoke * the task before stopping automatically (defaults to indefinite).
  • *
  • repeat : Number
    (optional) The number of times to invoke the task before * stopping automatically (defaults to indefinite).
  • *

*

Before each invocation, Ext injects the property taskRunCount into the task object so * that calculations based on the repeat count can be performed.

* @return {Object} The task */ this.start = function(task){ tasks.push(task); task.taskStartTime = new Date().getTime(); task.taskRunTime = 0; task.taskRunCount = 0; startThread(); return task; }; /** * Stops an existing running task. * @method stop * @param {Object} task The task to stop * @return {Object} The task */ this.stop = function(task){ removeTask(task); return task; }; /** * Stops all tasks that are currently running. * @method stopAll */ this.stopAll = function(){ stopThread(); for(var i = 0, len = tasks.length; i < len; i++){ if(tasks[i].onStop){ tasks[i].onStop(); } } tasks = []; removeQueue = []; }; }; /** * @class Ext.TaskMgr * @extends Ext.util.TaskRunner * A static {@link Ext.util.TaskRunner} instance that can be used to start and stop arbitrary tasks. See * {@link Ext.util.TaskRunner} for supported methods and task config properties. *

// Start a simple clock task that updates a div once per second
var task = {
    run: function(){
        Ext.fly('clock').update(new Date().format('g:i:s A'));
    },
    interval: 1000 //1 second
}
Ext.TaskMgr.start(task);
*

See the {@link #start} method for details about how to configure a task object.

* @singleton */ Ext.TaskMgr = new Ext.util.TaskRunner();(function(){ var libFlyweight; function fly(el) { if (!libFlyweight) { libFlyweight = new Ext.Element.Flyweight(); } libFlyweight.dom = el; return libFlyweight; } (function(){ var doc = document, isCSS1 = doc.compatMode == "CSS1Compat", MAX = Math.max, ROUND = Math.round, PARSEINT = parseInt; Ext.lib.Dom = { isAncestor : function(p, c) { var ret = false; p = Ext.getDom(p); c = Ext.getDom(c); if (p && c) { if (p.contains) { return p.contains(c); } else if (p.compareDocumentPosition) { return !!(p.compareDocumentPosition(c) & 16); } else { while (c = c.parentNode) { ret = c == p || ret; } } } return ret; }, getViewWidth : function(full) { return full ? this.getDocumentWidth() : this.getViewportWidth(); }, getViewHeight : function(full) { return full ? this.getDocumentHeight() : this.getViewportHeight(); }, getDocumentHeight: function() { return MAX(!isCSS1 ? doc.body.scrollHeight : doc.documentElement.scrollHeight, this.getViewportHeight()); }, getDocumentWidth: function() { return MAX(!isCSS1 ? doc.body.scrollWidth : doc.documentElement.scrollWidth, this.getViewportWidth()); }, getViewportHeight: function(){ return Ext.isIE ? (Ext.isStrict ? doc.documentElement.clientHeight : doc.body.clientHeight) : self.innerHeight; }, getViewportWidth : function() { return !Ext.isStrict && !Ext.isOpera ? doc.body.clientWidth : Ext.isIE ? doc.documentElement.clientWidth : self.innerWidth; }, getY : function(el) { return this.getXY(el)[1]; }, getX : function(el) { return this.getXY(el)[0]; }, getXY : function(el) { var p, pe, b, bt, bl, dbd, x = 0, y = 0, scroll, hasAbsolute, bd = (doc.body || doc.documentElement), ret = [0,0]; el = Ext.getDom(el); if(el != bd){ if (el.getBoundingClientRect) { b = el.getBoundingClientRect(); scroll = fly(document).getScroll(); ret = [ROUND(b.left + scroll.left), ROUND(b.top + scroll.top)]; } else { p = el; hasAbsolute = fly(el).isStyle("position", "absolute"); while (p) { pe = fly(p); x += p.offsetLeft; y += p.offsetTop; hasAbsolute = hasAbsolute || pe.isStyle("position", "absolute"); if (Ext.isGecko) { y += bt = PARSEINT(pe.getStyle("borderTopWidth"), 10) || 0; x += bl = PARSEINT(pe.getStyle("borderLeftWidth"), 10) || 0; if (p != el && !pe.isStyle('overflow','visible')) { x += bl; y += bt; } } p = p.offsetParent; } if (Ext.isSafari && hasAbsolute) { x -= bd.offsetLeft; y -= bd.offsetTop; } if (Ext.isGecko && !hasAbsolute) { dbd = fly(bd); x += PARSEINT(dbd.getStyle("borderLeftWidth"), 10) || 0; y += PARSEINT(dbd.getStyle("borderTopWidth"), 10) || 0; } p = el.parentNode; while (p && p != bd) { if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) { x -= p.scrollLeft; y -= p.scrollTop; } p = p.parentNode; } ret = [x,y]; } } return ret; }, setXY : function(el, xy) { (el = Ext.fly(el, '_setXY')).position(); var pts = el.translatePoints(xy), style = el.dom.style, pos; for (pos in pts) { if (!isNaN(pts[pos])) { style[pos] = pts[pos] + "px"; } } }, setX : function(el, x) { this.setXY(el, [x, false]); }, setY : function(el, y) { this.setXY(el, [false, y]); } }; })();Ext.lib.Event = function() { var loadComplete = false, unloadListeners = {}, retryCount = 0, onAvailStack = [], _interval, locked = false, win = window, doc = document, // constants POLL_RETRYS = 200, POLL_INTERVAL = 20, TYPE = 0, FN = 1, OBJ = 2, ADJ_SCOPE = 3, SCROLLLEFT = 'scrollLeft', SCROLLTOP = 'scrollTop', UNLOAD = 'unload', MOUSEOVER = 'mouseover', MOUSEOUT = 'mouseout', // private doAdd = function() { var ret; if (win.addEventListener) { ret = function(el, eventName, fn, capture) { if (eventName == 'mouseenter') { fn = fn.createInterceptor(checkRelatedTarget); el.addEventListener(MOUSEOVER, fn, (capture)); } else if (eventName == 'mouseleave') { fn = fn.createInterceptor(checkRelatedTarget); el.addEventListener(MOUSEOUT, fn, (capture)); } else { el.addEventListener(eventName, fn, (capture)); } return fn; }; } else if (win.attachEvent) { ret = function(el, eventName, fn, capture) { el.attachEvent("on" + eventName, fn); return fn; }; } else { ret = function(){}; } return ret; }(), // private doRemove = function(){ var ret; if (win.removeEventListener) { ret = function (el, eventName, fn, capture) { if (eventName == 'mouseenter') { eventName = MOUSEOVER; } else if (eventName == 'mouseleave') { eventName = MOUSEOUT; } el.removeEventListener(eventName, fn, (capture)); }; } else if (win.detachEvent) { ret = function (el, eventName, fn) { el.detachEvent("on" + eventName, fn); }; } else { ret = function(){}; } return ret; }(); function checkRelatedTarget(e) { return !elContains(e.currentTarget, pub.getRelatedTarget(e)); } function elContains(parent, child) { if(parent && parent.firstChild){ while(child) { if(child === parent) { return true; } child = child.parentNode; if(child && (child.nodeType != 1)) { child = null; } } } return false; } // private function _tryPreloadAttach() { var ret = false, notAvail = [], element, i, v, override, tryAgain = !loadComplete || (retryCount > 0); if(!locked){ locked = true; for(i = 0; i < onAvailStack.length; ++i){ v = onAvailStack[i]; if(v && (element = doc.getElementById(v.id))){ if(!v.checkReady || loadComplete || element.nextSibling || (doc && doc.body)) { override = v.override; element = override ? (override === true ? v.obj : override) : element; v.fn.call(element, v.obj); onAvailStack.remove(v); --i; }else{ notAvail.push(v); } } } retryCount = (notAvail.length === 0) ? 0 : retryCount - 1; if (tryAgain) { startInterval(); } else { clearInterval(_interval); _interval = null; } ret = !(locked = false); } return ret; } // private function startInterval() { if(!_interval){ var callback = function() { _tryPreloadAttach(); }; _interval = setInterval(callback, POLL_INTERVAL); } } // private function getScroll() { var dd = doc.documentElement, db = doc.body; if(dd && (dd[SCROLLTOP] || dd[SCROLLLEFT])){ return [dd[SCROLLLEFT], dd[SCROLLTOP]]; }else if(db){ return [db[SCROLLLEFT], db[SCROLLTOP]]; }else{ return [0, 0]; } } // private function getPageCoord (ev, xy) { ev = ev.browserEvent || ev; var coord = ev['page' + xy]; if (!coord && coord !== 0) { coord = ev['client' + xy] || 0; if (Ext.isIE) { coord += getScroll()[xy == "X" ? 0 : 1]; } } return coord; } var pub = { extAdapter: true, onAvailable : function(p_id, p_fn, p_obj, p_override) { onAvailStack.push({ id: p_id, fn: p_fn, obj: p_obj, override: p_override, checkReady: false }); retryCount = POLL_RETRYS; startInterval(); }, // This function should ALWAYS be called from Ext.EventManager addListener: function(el, eventName, fn) { el = Ext.getDom(el); if (el && fn) { if (eventName == UNLOAD) { if (unloadListeners[el.id] === undefined) { unloadListeners[el.id] = []; } unloadListeners[el.id].push([eventName, fn]); return fn; } return doAdd(el, eventName, fn, false); } return false; }, // This function should ALWAYS be called from Ext.EventManager removeListener: function(el, eventName, fn) { el = Ext.getDom(el); var i, len, li, lis; if (el && fn) { if(eventName == UNLOAD){ if((lis = unloadListeners[el.id]) !== undefined){ for(i = 0, len = lis.length; i < len; i++){ if((li = lis[i]) && li[TYPE] == eventName && li[FN] == fn){ unloadListeners[el.id].splice(i, 1); } } } return; } doRemove(el, eventName, fn, false); } }, getTarget : function(ev) { ev = ev.browserEvent || ev; return this.resolveTextNode(ev.target || ev.srcElement); }, resolveTextNode : Ext.isGecko ? function(node){ if(!node){ return; } // work around firefox bug, https://bugzilla.mozilla.org/show_bug.cgi?id=101197 var s = HTMLElement.prototype.toString.call(node); if(s == '[xpconnect wrapped native prototype]' || s == '[object XULElement]'){ return; } return node.nodeType == 3 ? node.parentNode : node; } : function(node){ return node && node.nodeType == 3 ? node.parentNode : node; }, getRelatedTarget : function(ev) { ev = ev.browserEvent || ev; return this.resolveTextNode(ev.relatedTarget || (/(mouseout|mouseleave)/.test(ev.type) ? ev.toElement : /(mouseover|mouseenter)/.test(ev.type) ? ev.fromElement : null)); }, getPageX : function(ev) { return getPageCoord(ev, "X"); }, getPageY : function(ev) { return getPageCoord(ev, "Y"); }, getXY : function(ev) { return [this.getPageX(ev), this.getPageY(ev)]; }, stopEvent : function(ev) { this.stopPropagation(ev); this.preventDefault(ev); }, stopPropagation : function(ev) { ev = ev.browserEvent || ev; if (ev.stopPropagation) { ev.stopPropagation(); } else { ev.cancelBubble = true; } }, preventDefault : function(ev) { ev = ev.browserEvent || ev; if (ev.preventDefault) { ev.preventDefault(); } else { if (ev.keyCode) { ev.keyCode = 0; } ev.returnValue = false; } }, getEvent : function(e) { e = e || win.event; if (!e) { var c = this.getEvent.caller; while (c) { e = c.arguments[0]; if (e && Event == e.constructor) { break; } c = c.caller; } } return e; }, getCharCode : function(ev) { ev = ev.browserEvent || ev; return ev.charCode || ev.keyCode || 0; }, //clearCache: function() {}, // deprecated, call from EventManager getListeners : function(el, eventName) { Ext.EventManager.getListeners(el, eventName); }, // deprecated, call from EventManager purgeElement : function(el, recurse, eventName) { Ext.EventManager.purgeElement(el, recurse, eventName); }, _load : function(e) { loadComplete = true; if (Ext.isIE && e !== true) { // IE8 complains that _load is null or not an object // so lets remove self via arguments.callee doRemove(win, "load", arguments.callee); } }, _unload : function(e) { var EU = Ext.lib.Event, i, v, ul, id, len, scope; for (id in unloadListeners) { ul = unloadListeners[id]; for (i = 0, len = ul.length; i < len; i++) { v = ul[i]; if (v) { try{ scope = v[ADJ_SCOPE] ? (v[ADJ_SCOPE] === true ? v[OBJ] : v[ADJ_SCOPE]) : win; v[FN].call(scope, EU.getEvent(e), v[OBJ]); }catch(ex){} } } }; Ext.EventManager._unload(); doRemove(win, UNLOAD, EU._unload); } }; // Initialize stuff. pub.on = pub.addListener; pub.un = pub.removeListener; if (doc && doc.body) { pub._load(true); } else { doAdd(win, "load", pub._load); } doAdd(win, UNLOAD, pub._unload); _tryPreloadAttach(); return pub; }(); /* * Portions of this file are based on pieces of Yahoo User Interface Library * Copyright (c) 2007, Yahoo! Inc. All rights reserved. * YUI licensed under the BSD License: * http://developer.yahoo.net/yui/license.txt */ Ext.lib.Ajax = function() { var activeX = ['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP'], CONTENTTYPE = 'Content-Type'; // private function setHeader(o) { var conn = o.conn, prop, headers = {}; function setTheHeaders(conn, headers){ for (prop in headers) { if (headers.hasOwnProperty(prop)) { conn.setRequestHeader(prop, headers[prop]); } } } Ext.apply(headers, pub.headers, pub.defaultHeaders); setTheHeaders(conn, headers); delete pub.headers; } // private function createExceptionObject(tId, callbackArg, isAbort, isTimeout) { return { tId : tId, status : isAbort ? -1 : 0, statusText : isAbort ? 'transaction aborted' : 'communication failure', isAbort: isAbort, isTimeout: isTimeout, argument : callbackArg }; } // private function initHeader(label, value) { (pub.headers = pub.headers || {})[label] = value; } // private function createResponseObject(o, callbackArg) { var headerObj = {}, headerStr, conn = o.conn, t, s, // see: https://prototype.lighthouseapp.com/projects/8886/tickets/129-ie-mangles-http-response-status-code-204-to-1223 isBrokenStatus = conn.status == 1223; try { headerStr = o.conn.getAllResponseHeaders(); Ext.each(headerStr.replace(/\r\n/g, '\n').split('\n'), function(v){ t = v.indexOf(':'); if(t >= 0){ s = v.substr(0, t).toLowerCase(); if(v.charAt(t + 1) == ' '){ ++t; } headerObj[s] = v.substr(t + 1); } }); } catch(e) {} return { tId : o.tId, // Normalize the status and statusText when IE returns 1223, see the above link. status : isBrokenStatus ? 204 : conn.status, statusText : isBrokenStatus ? 'No Content' : conn.statusText, getResponseHeader : function(header){return headerObj[header.toLowerCase()];}, getAllResponseHeaders : function(){return headerStr;}, responseText : conn.responseText, responseXML : conn.responseXML, argument : callbackArg }; } // private function releaseObject(o) { if (o.tId) { pub.conn[o.tId] = null; } o.conn = null; o = null; } // private function handleTransactionResponse(o, callback, isAbort, isTimeout) { if (!callback) { releaseObject(o); return; } var httpStatus, responseObject; try { if (o.conn.status !== undefined && o.conn.status != 0) { httpStatus = o.conn.status; } else { httpStatus = 13030; } } catch(e) { httpStatus = 13030; } if ((httpStatus >= 200 && httpStatus < 300) || (Ext.isIE && httpStatus == 1223)) { responseObject = createResponseObject(o, callback.argument); if (callback.success) { if (!callback.scope) { callback.success(responseObject); } else { callback.success.apply(callback.scope, [responseObject]); } } } else { switch (httpStatus) { case 12002: case 12029: case 12030: case 12031: case 12152: case 13030: responseObject = createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false), isTimeout); if (callback.failure) { if (!callback.scope) { callback.failure(responseObject); } else { callback.failure.apply(callback.scope, [responseObject]); } } break; default: responseObject = createResponseObject(o, callback.argument); if (callback.failure) { if (!callback.scope) { callback.failure(responseObject); } else { callback.failure.apply(callback.scope, [responseObject]); } } } } releaseObject(o); responseObject = null; } function checkResponse(o, callback, conn, tId, poll, cbTimeout){ if (conn && conn.readyState == 4) { clearInterval(poll[tId]); poll[tId] = null; if (cbTimeout) { clearTimeout(pub.timeout[tId]); pub.timeout[tId] = null; } handleTransactionResponse(o, callback); } } function checkTimeout(o, callback){ pub.abort(o, callback, true); } // private function handleReadyState(o, callback){ callback = callback || {}; var conn = o.conn, tId = o.tId, poll = pub.poll, cbTimeout = callback.timeout || null; if (cbTimeout) { pub.conn[tId] = conn; pub.timeout[tId] = setTimeout(checkTimeout.createCallback(o, callback), cbTimeout); } poll[tId] = setInterval(checkResponse.createCallback(o, callback, conn, tId, poll, cbTimeout), pub.pollInterval); } // private function asyncRequest(method, uri, callback, postData) { var o = getConnectionObject() || null; if (o) { o.conn.open(method, uri, true); if (pub.useDefaultXhrHeader) { initHeader('X-Requested-With', pub.defaultXhrHeader); } if(postData && pub.useDefaultHeader && (!pub.headers || !pub.headers[CONTENTTYPE])){ initHeader(CONTENTTYPE, pub.defaultPostHeader); } if (pub.defaultHeaders || pub.headers) { setHeader(o); } handleReadyState(o, callback); o.conn.send(postData || null); } return o; } // private function getConnectionObject() { var o; try { if (o = createXhrObject(pub.transactionId)) { pub.transactionId++; } } catch(e) { } finally { return o; } } // private function createXhrObject(transactionId) { var http; try { http = new XMLHttpRequest(); } catch(e) { for (var i = Ext.isIE6 ? 1 : 0; i < activeX.length; ++i) { try { http = new ActiveXObject(activeX[i]); break; } catch(e) {} } } finally { return {conn : http, tId : transactionId}; } } var pub = { request : function(method, uri, cb, data, options) { if(options){ var me = this, xmlData = options.xmlData, jsonData = options.jsonData, hs; Ext.applyIf(me, options); if(xmlData || jsonData){ hs = me.headers; if(!hs || !hs[CONTENTTYPE]){ initHeader(CONTENTTYPE, xmlData ? 'text/xml' : 'application/json'); } data = xmlData || (!Ext.isPrimitive(jsonData) ? Ext.encode(jsonData) : jsonData); } } return asyncRequest(method || options.method || "POST", uri, cb, data); }, serializeForm : function(form) { var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements, hasSubmit = false, encoder = encodeURIComponent, name, data = '', type, hasValue; Ext.each(fElements, function(element){ name = element.name; type = element.type; if (!element.disabled && name) { if (/select-(one|multiple)/i.test(type)) { Ext.each(element.options, function(opt){ if (opt.selected) { hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified; data += String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text)); } }); } else if (!(/file|undefined|reset|button/i.test(type))) { if (!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) { data += encoder(name) + '=' + encoder(element.value) + '&'; hasSubmit = /submit/i.test(type); } } } }); return data.substr(0, data.length - 1); }, useDefaultHeader : true, defaultPostHeader : 'application/x-www-form-urlencoded; charset=UTF-8', useDefaultXhrHeader : true, defaultXhrHeader : 'XMLHttpRequest', poll : {}, timeout : {}, conn: {}, pollInterval : 50, transactionId : 0, // This is never called - Is it worth exposing this? // setProgId : function(id) { // activeX.unshift(id); // }, // This is never called - Is it worth exposing this? // setDefaultPostHeader : function(b) { // this.useDefaultHeader = b; // }, // This is never called - Is it worth exposing this? // setDefaultXhrHeader : function(b) { // this.useDefaultXhrHeader = b; // }, // This is never called - Is it worth exposing this? // setPollingInterval : function(i) { // if (typeof i == 'number' && isFinite(i)) { // this.pollInterval = i; // } // }, // This is never called - Is it worth exposing this? // resetDefaultHeaders : function() { // this.defaultHeaders = null; // }, abort : function(o, callback, isTimeout) { var me = this, tId = o.tId, isAbort = false; if (me.isCallInProgress(o)) { o.conn.abort(); clearInterval(me.poll[tId]); me.poll[tId] = null; clearTimeout(pub.timeout[tId]); me.timeout[tId] = null; handleTransactionResponse(o, callback, (isAbort = true), isTimeout); } return isAbort; }, isCallInProgress : function(o) { // if there is a connection and readyState is not 0 or 4 return o.conn && !{0:true,4:true}[o.conn.readyState]; } }; return pub; }();(function(){ var EXTLIB = Ext.lib, noNegatives = /width|height|opacity|padding/i, offsetAttribute = /^((width|height)|(top|left))$/, defaultUnit = /width|height|top$|bottom$|left$|right$/i, offsetUnit = /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i, isset = function(v){ return typeof v !== 'undefined'; }, now = function(){ return new Date(); }; EXTLIB.Anim = { motion : function(el, args, duration, easing, cb, scope) { return this.run(el, args, duration, easing, cb, scope, Ext.lib.Motion); }, run : function(el, args, duration, easing, cb, scope, type) { type = type || Ext.lib.AnimBase; if (typeof easing == "string") { easing = Ext.lib.Easing[easing]; } var anim = new type(el, args, duration, easing); anim.animateX(function() { if(Ext.isFunction(cb)){ cb.call(scope); } }); return anim; } }; EXTLIB.AnimBase = function(el, attributes, duration, method) { if (el) { this.init(el, attributes, duration, method); } }; EXTLIB.AnimBase.prototype = { doMethod: function(attr, start, end) { var me = this; return me.method(me.curFrame, start, end - start, me.totalFrames); }, setAttr: function(attr, val, unit) { if (noNegatives.test(attr) && val < 0) { val = 0; } Ext.fly(this.el, '_anim').setStyle(attr, val + unit); }, getAttr: function(attr) { var el = Ext.fly(this.el), val = el.getStyle(attr), a = offsetAttribute.exec(attr) || []; if (val !== 'auto' && !offsetUnit.test(val)) { return parseFloat(val); } return (!!(a[2]) || (el.getStyle('position') == 'absolute' && !!(a[3]))) ? el.dom['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)] : 0; }, getDefaultUnit: function(attr) { return defaultUnit.test(attr) ? 'px' : ''; }, animateX : function(callback, scope) { var me = this, f = function() { me.onComplete.removeListener(f); if (Ext.isFunction(callback)) { callback.call(scope || me, me); } }; me.onComplete.addListener(f, me); me.animate(); }, setRunAttr: function(attr) { var me = this, a = this.attributes[attr], to = a.to, by = a.by, from = a.from, unit = a.unit, ra = (this.runAttrs[attr] = {}), end; if (!isset(to) && !isset(by)){ return false; } var start = isset(from) ? from : me.getAttr(attr); if (isset(to)) { end = to; }else if(isset(by)) { if (Ext.isArray(start)){ end = []; for(var i=0,len=start.length; i 0 && isFinite(tweak)){ if(tween.curFrame + tweak >= frames){ tweak = frames - (frame + 1); } tween.curFrame += tweak; } }; }; EXTLIB.Bezier = new function() { this.getPosition = function(points, t) { var n = points.length, tmp = [], c = 1 - t, i, j; for (i = 0; i < n; ++i) { tmp[i] = [points[i][0], points[i][1]]; } for (j = 1; j < n; ++j) { for (i = 0; i < n - j; ++i) { tmp[i][0] = c * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; tmp[i][1] = c * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; } } return [ tmp[0][0], tmp[0][1] ]; }; }; EXTLIB.Easing = { easeNone: function (t, b, c, d) { return c * t / d + b; }, easeIn: function (t, b, c, d) { return c * (t /= d) * t + b; }, easeOut: function (t, b, c, d) { return -c * (t /= d) * (t - 2) + b; } }; (function() { EXTLIB.Motion = function(el, attributes, duration, method) { if (el) { EXTLIB.Motion.superclass.constructor.call(this, el, attributes, duration, method); } }; Ext.extend(EXTLIB.Motion, Ext.lib.AnimBase); var superclass = EXTLIB.Motion.superclass, pointsRe = /^points$/i; Ext.apply(EXTLIB.Motion.prototype, { setAttr: function(attr, val, unit){ var me = this, setAttr = superclass.setAttr; if (pointsRe.test(attr)) { unit = unit || 'px'; setAttr.call(me, 'left', val[0], unit); setAttr.call(me, 'top', val[1], unit); } else { setAttr.call(me, attr, val, unit); } }, getAttr: function(attr){ var me = this, getAttr = superclass.getAttr; return pointsRe.test(attr) ? [getAttr.call(me, 'left'), getAttr.call(me, 'top')] : getAttr.call(me, attr); }, doMethod: function(attr, start, end){ var me = this; return pointsRe.test(attr) ? EXTLIB.Bezier.getPosition(me.runAttrs[attr], me.method(me.curFrame, 0, 100, me.totalFrames) / 100) : superclass.doMethod.call(me, attr, start, end); }, setRunAttr: function(attr){ if(pointsRe.test(attr)){ var me = this, el = this.el, points = this.attributes.points, control = points.control || [], from = points.from, to = points.to, by = points.by, DOM = EXTLIB.Dom, start, i, end, len, ra; if(control.length > 0 && !Ext.isArray(control[0])){ control = [control]; }else{ /* var tmp = []; for (i = 0,len = control.length; i < len; ++i) { tmp[i] = control[i]; } control = tmp; */ } Ext.fly(el, '_anim').position(); DOM.setXY(el, isset(from) ? from : DOM.getXY(el)); start = me.getAttr('points'); if(isset(to)){ end = translateValues.call(me, to, start); for (i = 0,len = control.length; i < len; ++i) { control[i] = translateValues.call(me, control[i], start); } } else if (isset(by)) { end = [start[0] + by[0], start[1] + by[1]]; for (i = 0,len = control.length; i < len; ++i) { control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; } } ra = this.runAttrs[attr] = [start]; if (control.length > 0) { ra = ra.concat(control); } ra[ra.length] = end; }else{ superclass.setRunAttr.call(this, attr); } } }); var translateValues = function(val, start) { var pageXY = EXTLIB.Dom.getXY(this.el); return [val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1]]; }; })(); })();// Easing functions (function(){ // shortcuts to aid compression var abs = Math.abs, pi = Math.PI, asin = Math.asin, pow = Math.pow, sin = Math.sin, EXTLIB = Ext.lib; Ext.apply(EXTLIB.Easing, { easeBoth: function (t, b, c, d) { return ((t /= d / 2) < 1) ? c / 2 * t * t + b : -c / 2 * ((--t) * (t - 2) - 1) + b; }, easeInStrong: function (t, b, c, d) { return c * (t /= d) * t * t * t + b; }, easeOutStrong: function (t, b, c, d) { return -c * ((t = t / d - 1) * t * t * t - 1) + b; }, easeBothStrong: function (t, b, c, d) { return ((t /= d / 2) < 1) ? c / 2 * t * t * t * t + b : -c / 2 * ((t -= 2) * t * t * t - 2) + b; }, elasticIn: function (t, b, c, d, a, p) { if (t == 0 || (t /= d) == 1) { return t == 0 ? b : b + c; } p = p || (d * .3); var s; if (a >= abs(c)) { s = p / (2 * pi) * asin(c / a); } else { a = c; s = p / 4; } return -(a * pow(2, 10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p)) + b; }, elasticOut: function (t, b, c, d, a, p) { if (t == 0 || (t /= d) == 1) { return t == 0 ? b : b + c; } p = p || (d * .3); var s; if (a >= abs(c)) { s = p / (2 * pi) * asin(c / a); } else { a = c; s = p / 4; } return a * pow(2, -10 * t) * sin((t * d - s) * (2 * pi) / p) + c + b; }, elasticBoth: function (t, b, c, d, a, p) { if (t == 0 || (t /= d / 2) == 2) { return t == 0 ? b : b + c; } p = p || (d * (.3 * 1.5)); var s; if (a >= abs(c)) { s = p / (2 * pi) * asin(c / a); } else { a = c; s = p / 4; } return t < 1 ? -.5 * (a * pow(2, 10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p)) + b : a * pow(2, -10 * (t -= 1)) * sin((t * d - s) * (2 * pi) / p) * .5 + c + b; }, backIn: function (t, b, c, d, s) { s = s || 1.70158; return c * (t /= d) * t * ((s + 1) * t - s) + b; }, backOut: function (t, b, c, d, s) { if (!s) { s = 1.70158; } return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; }, backBoth: function (t, b, c, d, s) { s = s || 1.70158; return ((t /= d / 2 ) < 1) ? c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b : c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; }, bounceIn: function (t, b, c, d) { return c - EXTLIB.Easing.bounceOut(d - t, 0, c, d) + b; }, bounceOut: function (t, b, c, d) { if ((t /= d) < (1 / 2.75)) { return c * (7.5625 * t * t) + b; } else if (t < (2 / 2.75)) { return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b; } else if (t < (2.5 / 2.75)) { return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b; } return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b; }, bounceBoth: function (t, b, c, d) { return (t < d / 2) ? EXTLIB.Easing.bounceIn(t * 2, 0, c, d) * .5 + b : EXTLIB.Easing.bounceOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b; } }); })(); (function() { var EXTLIB = Ext.lib; // Color Animation EXTLIB.Anim.color = function(el, args, duration, easing, cb, scope) { return EXTLIB.Anim.run(el, args, duration, easing, cb, scope, EXTLIB.ColorAnim); }; EXTLIB.ColorAnim = function(el, attributes, duration, method) { EXTLIB.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); }; Ext.extend(EXTLIB.ColorAnim, EXTLIB.AnimBase); var superclass = EXTLIB.ColorAnim.superclass, colorRE = /color$/i, transparentRE = /^transparent|rgba\(0, 0, 0, 0\)$/, rgbRE = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i, hexRE= /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i, hex3RE = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i, isset = function(v){ return typeof v !== 'undefined'; }; // private function parseColor(s) { var pi = parseInt, base, out = null, c; if (s.length == 3) { return s; } Ext.each([hexRE, rgbRE, hex3RE], function(re, idx){ base = (idx % 2 == 0) ? 16 : 10; c = re.exec(s); if(c && c.length == 4){ out = [pi(c[1], base), pi(c[2], base), pi(c[3], base)]; return false; } }); return out; } Ext.apply(EXTLIB.ColorAnim.prototype, { getAttr : function(attr) { var me = this, el = me.el, val; if(colorRE.test(attr)){ while(el && transparentRE.test(val = Ext.fly(el).getStyle(attr))){ el = el.parentNode; val = "fff"; } }else{ val = superclass.getAttr.call(me, attr); } return val; }, doMethod : function(attr, start, end) { var me = this, val, floor = Math.floor, i, len, v; if(colorRE.test(attr)){ val = []; end = end || []; for(i = 0, len = start.length; i < len; i++) { v = start[i]; val[i] = superclass.doMethod.call(me, attr, v, end[i]); } val = 'rgb(' + floor(val[0]) + ',' + floor(val[1]) + ',' + floor(val[2]) + ')'; }else{ val = superclass.doMethod.call(me, attr, start, end); } return val; }, setRunAttr : function(attr) { var me = this, a = me.attributes[attr], to = a.to, by = a.by, ra; superclass.setRunAttr.call(me, attr); ra = me.runAttrs[attr]; if(colorRE.test(attr)){ var start = parseColor(ra.start), end = parseColor(ra.end); if(!isset(to) && isset(by)){ end = parseColor(by); for(var i=0,len=start.length; i0){return setTimeout(d,c)}d();return 0}});Ext.applyIf(String,{format:function(b){var a=Ext.toArray(arguments,1);return b.replace(/\{(\d+)\}/g,function(c,d){return a[d]})}});Ext.applyIf(Array.prototype,{indexOf:function(b,c){var a=this.length;c=c||0;c+=(c<0)?a:0;for(;c0){for(var p=0;p0);if(!A){A=true;for(I=0;I=0){B=s.substr(0,A).toLowerCase();if(s.charAt(A+1)==" "){++A}C[B]=s.substr(A+1)}})}catch(z){}return{tId:u.tId,status:v?204:w.status,statusText:v?"No Content":w.statusText,getResponseHeader:function(s){return C[s.toLowerCase()]},getAllResponseHeaders:function(){return x},responseText:w.responseText,responseXML:w.responseXML,argument:y}}function o(s){if(s.tId){k.conn[s.tId]=null}s.conn=null;s=null}function f(x,y,t,s){if(!y){o(x);return}var v,u;try{if(x.conn.status!==undefined&&x.conn.status!=0){v=x.conn.status}else{v=13030}}catch(w){v=13030}if((v>=200&&v<300)||(Ext.isIE&&v==1223)){u=p(x,y.argument);if(y.success){if(!y.scope){y.success(u)}else{y.success.apply(y.scope,[u])}}}else{switch(v){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:u=e(x.tId,y.argument,(t?t:false),s);if(y.failure){if(!y.scope){y.failure(u)}else{y.failure.apply(y.scope,[u])}}break;default:u=p(x,y.argument);if(y.failure){if(!y.scope){y.failure(u)}else{y.failure.apply(y.scope,[u])}}}}o(x);u=null}function m(u,x,s,w,t,v){if(s&&s.readyState==4){clearInterval(t[w]);t[w]=null;if(v){clearTimeout(k.timeout[w]);k.timeout[w]=null}f(u,x)}}function r(s,t){k.abort(s,t,true)}function n(u,x){x=x||{};var s=u.conn,w=u.tId,t=k.poll,v=x.timeout||null;if(v){k.conn[w]=s;k.timeout[w]=setTimeout(r.createCallback(u,x),v)}t[w]=setInterval(m.createCallback(u,x,s,w,t,v),k.pollInterval)}function i(w,t,v,s){var u=l()||null;if(u){u.conn.open(w,t,true);if(k.useDefaultXhrHeader){j("X-Requested-With",k.defaultXhrHeader)}if(s&&k.useDefaultHeader&&(!k.headers||!k.headers[d])){j(d,k.defaultPostHeader)}if(k.defaultHeaders||k.headers){h(u)}n(u,v);u.conn.send(s||null)}return u}function l(){var t;try{if(t=q(k.transactionId)){k.transactionId++}}catch(s){}finally{return t}}function q(v){var s;try{s=new XMLHttpRequest()}catch(u){for(var t=Ext.isIE6?1:0;t0&&isFinite(w)){if(r.curFrame+w>=v){w=v-(u+1)}r.curFrame+=w}}};g.Bezier=new function(){this.getPosition=function(p,o){var r=p.length,m=[],q=1-o,l,k;for(l=0;l0&&!Ext.isArray(s[0])){s=[s]}else{}Ext.fly(p,"_anim").position();A.setXY(p,j(x)?x:A.getXY(p));o=w.getAttr("points");if(j(y)){q=k.call(w,y,o);for(r=0,t=s.length;r0){n=n.concat(s)}n[n.length]=q}else{m.setRunAttr.call(this,u)}}});var k=function(n,p){var o=g.Dom.getXY(this.el);return[n[0]-o[0]+p[0],n[1]-o[1]+p[1]]}})()})();(function(){var d=Math.abs,i=Math.PI,h=Math.asin,g=Math.pow,e=Math.sin,f=Ext.lib;Ext.apply(f.Easing,{easeBoth:function(k,j,m,l){return((k/=l/2)<1)?m/2*k*k+j:-m/2*((--k)*(k-2)-1)+j},easeInStrong:function(k,j,m,l){return m*(k/=l)*k*k*k+j},easeOutStrong:function(k,j,m,l){return -m*((k=k/l-1)*k*k*k-1)+j},easeBothStrong:function(k,j,m,l){return((k/=l/2)<1)?m/2*k*k*k*k+j:-m/2*((k-=2)*k*k*k-2)+j},elasticIn:function(l,j,q,o,k,n){if(l==0||(l/=o)==1){return l==0?j:j+q}n=n||(o*0.3);var m;if(k>=d(q)){m=n/(2*i)*h(q/k)}else{k=q;m=n/4}return -(k*g(2,10*(l-=1))*e((l*o-m)*(2*i)/n))+j},elasticOut:function(l,j,q,o,k,n){if(l==0||(l/=o)==1){return l==0?j:j+q}n=n||(o*0.3);var m;if(k>=d(q)){m=n/(2*i)*h(q/k)}else{k=q;m=n/4}return k*g(2,-10*l)*e((l*o-m)*(2*i)/n)+q+j},elasticBoth:function(l,j,q,o,k,n){if(l==0||(l/=o/2)==2){return l==0?j:j+q}n=n||(o*(0.3*1.5));var m;if(k>=d(q)){m=n/(2*i)*h(q/k)}else{k=q;m=n/4}return l<1?-0.5*(k*g(2,10*(l-=1))*e((l*o-m)*(2*i)/n))+j:k*g(2,-10*(l-=1))*e((l*o-m)*(2*i)/n)*0.5+q+j},backIn:function(k,j,n,m,l){l=l||1.70158;return n*(k/=m)*k*((l+1)*k-l)+j},backOut:function(k,j,n,m,l){if(!l){l=1.70158}return n*((k=k/m-1)*k*((l+1)*k+l)+1)+j},backBoth:function(k,j,n,m,l){l=l||1.70158;return((k/=m/2)<1)?n/2*(k*k*(((l*=(1.525))+1)*k-l))+j:n/2*((k-=2)*k*(((l*=(1.525))+1)*k+l)+2)+j},bounceIn:function(k,j,m,l){return m-f.Easing.bounceOut(l-k,0,m,l)+j},bounceOut:function(k,j,m,l){if((k/=l)<(1/2.75)){return m*(7.5625*k*k)+j}else{if(k<(2/2.75)){return m*(7.5625*(k-=(1.5/2.75))*k+0.75)+j}else{if(k<(2.5/2.75)){return m*(7.5625*(k-=(2.25/2.75))*k+0.9375)+j}}}return m*(7.5625*(k-=(2.625/2.75))*k+0.984375)+j},bounceBoth:function(k,j,m,l){return(k 0; }, suspendEvents : function(queueSuspended){ this.eventsSuspended = TRUE; if(queueSuspended && !this.eventQueue){ this.eventQueue = []; } }, resumeEvents : function(){ var me = this, queued = me.eventQueue || []; me.eventsSuspended = FALSE; delete me.eventQueue; EACH(queued, function(e) { me.fireEvent.apply(me, e); }); } }; var OBSERVABLE = EXTUTIL.Observable.prototype; OBSERVABLE.on = OBSERVABLE.addListener; OBSERVABLE.un = OBSERVABLE.removeListener; EXTUTIL.Observable.releaseCapture = function(o){ o.fireEvent = OBSERVABLE.fireEvent; }; function createTargeted(h, o, scope){ return function(){ if(o.target == arguments[0]){ h.apply(scope, Array.prototype.slice.call(arguments, 0)); } }; }; function createBuffered(h, o, l, scope){ l.task = new EXTUTIL.DelayedTask(); return function(){ l.task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0)); }; }; function createSingle(h, e, fn, scope){ return function(){ e.removeListener(fn, scope); return h.apply(scope, arguments); }; }; function createDelayed(h, o, l, scope){ return function(){ var task = new EXTUTIL.DelayedTask(), args = Array.prototype.slice.call(arguments, 0); if(!l.tasks) { l.tasks = []; } l.tasks.push(task); task.delay(o.delay || 10, function(){ l.tasks.remove(task); h.apply(scope, args); }, scope); }; }; EXTUTIL.Event = function(obj, name){ this.name = name; this.obj = obj; this.listeners = []; }; EXTUTIL.Event.prototype = { addListener : function(fn, scope, options){ var me = this, l; scope = scope || me.obj; if(!me.isListening(fn, scope)){ l = me.createListener(fn, scope, options); if(me.firing){ me.listeners = me.listeners.slice(0); } me.listeners.push(l); } }, createListener: function(fn, scope, o){ o = o || {}; scope = scope || this.obj; var l = { fn: fn, scope: scope, options: o }, h = fn; if(o.target){ h = createTargeted(h, o, scope); } if(o.delay){ h = createDelayed(h, o, l, scope); } if(o.single){ h = createSingle(h, this, fn, scope); } if(o.buffer){ h = createBuffered(h, o, l, scope); } l.fireFn = h; return l; }, findListener : function(fn, scope){ var list = this.listeners, i = list.length, l; scope = scope || this.obj; while(i--){ l = list[i]; if(l){ if(l.fn == fn && l.scope == scope){ return i; } } } return -1; }, isListening : function(fn, scope){ return this.findListener(fn, scope) != -1; }, removeListener : function(fn, scope){ var index, l, k, me = this, ret = FALSE; if((index = me.findListener(fn, scope)) != -1){ if (me.firing) { me.listeners = me.listeners.slice(0); } l = me.listeners[index]; if(l.task) { l.task.cancel(); delete l.task; } k = l.tasks && l.tasks.length; if(k) { while(k--) { l.tasks[k].cancel(); } delete l.tasks; } me.listeners.splice(index, 1); ret = TRUE; } return ret; }, clearListeners : function(){ var me = this, l = me.listeners, i = l.length; while(i--) { me.removeListener(l[i].fn, l[i].scope); } }, fire : function(){ var me = this, listeners = me.listeners, len = listeners.length, i = 0, l; if(len > 0){ me.firing = TRUE; var args = Array.prototype.slice.call(arguments, 0); for (; i < len; i++) { l = listeners[i]; if(l && l.fireFn.apply(l.scope || me.obj || window, args) === FALSE) { return (me.firing = FALSE); } } } me.firing = FALSE; return TRUE; } }; })(); Ext.DomHelper = function(){ var tempTableEl = null, emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i, tableRe = /^table|tbody|tr|td$/i, confRe = /tag|children|cn|html$/i, tableElRe = /td|tr|tbody/i, cssRe = /([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi, endRe = /end/i, pub, afterbegin = 'afterbegin', afterend = 'afterend', beforebegin = 'beforebegin', beforeend = 'beforeend', ts = '', te = '
', tbs = ts+'', tbe = ''+te, trs = tbs + '', tre = ''+tbe; function doInsert(el, o, returnElement, pos, sibling, append){ var newNode = pub.insertHtml(pos, Ext.getDom(el), createHtml(o)); return returnElement ? Ext.get(newNode, true) : newNode; } function createHtml(o){ var b = '', attr, val, key, cn; if(typeof o == "string"){ b = o; } else if (Ext.isArray(o)) { for (var i=0; i < o.length; i++) { if(o[i]) { b += createHtml(o[i]); } }; } else { b += '<' + (o.tag = o.tag || 'div'); for (attr in o) { val = o[attr]; if(!confRe.test(attr)){ if (typeof val == "object") { b += ' ' + attr + '="'; for (key in val) { b += key + ':' + val[key] + ';'; }; b += '"'; }else{ b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"'; } } }; if (emptyTags.test(o.tag)) { b += '/>'; } else { b += '>'; if ((cn = o.children || o.cn)) { b += createHtml(cn); } else if(o.html){ b += o.html; } b += ''; } } return b; } function ieTable(depth, s, h, e){ tempTableEl.innerHTML = [s, h, e].join(''); var i = -1, el = tempTableEl, ns; while(++i < depth){ el = el.firstChild; } if(ns = el.nextSibling){ var df = document.createDocumentFragment(); while(el){ ns = el.nextSibling; df.appendChild(el); el = ns; } el = df; } return el; } function insertIntoTable(tag, where, el, html) { var node, before; tempTableEl = tempTableEl || document.createElement('div'); if(tag == 'td' && (where == afterbegin || where == beforeend) || !tableElRe.test(tag) && (where == beforebegin || where == afterend)) { return; } before = where == beforebegin ? el : where == afterend ? el.nextSibling : where == afterbegin ? el.firstChild : null; if (where == beforebegin || where == afterend) { el = el.parentNode; } if (tag == 'td' || (tag == 'tr' && (where == beforeend || where == afterbegin))) { node = ieTable(4, trs, html, tre); } else if ((tag == 'tbody' && (where == beforeend || where == afterbegin)) || (tag == 'tr' && (where == beforebegin || where == afterend))) { node = ieTable(3, tbs, html, tbe); } else { node = ieTable(2, ts, html, te); } el.insertBefore(node, before); return node; } function createContextualFragment(html){ var div = document.createElement("div"), fragment = document.createDocumentFragment(), i = 0, length, childNodes; div.innerHTML = html; childNodes = div.childNodes; length = childNodes.length; for (; i < length; i++) { fragment.appendChild(childNodes[i].cloneNode(true)); } return fragment; } pub = { markup : function(o){ return createHtml(o); }, applyStyles : function(el, styles){ if (styles) { var matches; el = Ext.fly(el); if (typeof styles == "function") { styles = styles.call(); } if (typeof styles == "string") { cssRe.lastIndex = 0; while ((matches = cssRe.exec(styles))) { el.setStyle(matches[1], matches[2]); } } else if (typeof styles == "object") { el.setStyle(styles); } } }, insertHtml : function(where, el, html){ var hash = {}, hashVal, range, rangeEl, setStart, frag, rs; where = where.toLowerCase(); hash[beforebegin] = ['BeforeBegin', 'previousSibling']; hash[afterend] = ['AfterEnd', 'nextSibling']; if (el.insertAdjacentHTML) { if(tableRe.test(el.tagName) && (rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html))){ return rs; } hash[afterbegin] = ['AfterBegin', 'firstChild']; hash[beforeend] = ['BeforeEnd', 'lastChild']; if ((hashVal = hash[where])) { el.insertAdjacentHTML(hashVal[0], html); return el[hashVal[1]]; } } else { range = el.ownerDocument.createRange(); setStart = 'setStart' + (endRe.test(where) ? 'After' : 'Before'); if (hash[where]) { range[setStart](el); if (!range.createContextualFragment) { frag = createContextualFragment(html); } else { frag = range.createContextualFragment(html); } el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling); return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling']; } else { rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child'; if (el.firstChild) { range[setStart](el[rangeEl]); if (!range.createContextualFragment) { frag = createContextualFragment(html); } else { frag = range.createContextualFragment(html); } if(where == afterbegin){ el.insertBefore(frag, el.firstChild); }else{ el.appendChild(frag); } } else { el.innerHTML = html; } return el[rangeEl]; } } throw 'Illegal insertion point -> "' + where + '"'; }, insertBefore : function(el, o, returnElement){ return doInsert(el, o, returnElement, beforebegin); }, insertAfter : function(el, o, returnElement){ return doInsert(el, o, returnElement, afterend, 'nextSibling'); }, insertFirst : function(el, o, returnElement){ return doInsert(el, o, returnElement, afterbegin, 'firstChild'); }, append : function(el, o, returnElement){ return doInsert(el, o, returnElement, beforeend, '', true); }, overwrite : function(el, o, returnElement){ el = Ext.getDom(el); el.innerHTML = createHtml(o); return returnElement ? Ext.get(el.firstChild) : el.firstChild; }, createHtml : createHtml }; return pub; }(); Ext.Template = function(html){ var me = this, a = arguments, buf = [], v; if (Ext.isArray(html)) { html = html.join(""); } else if (a.length > 1) { for(var i = 0, len = a.length; i < len; i++){ v = a[i]; if(typeof v == 'object'){ Ext.apply(me, v); } else { buf.push(v); } }; html = buf.join(''); } me.html = html; if (me.compiled) { me.compile(); } }; Ext.Template.prototype = { re : /\{([\w\-]+)\}/g, applyTemplate : function(values){ var me = this; return me.compiled ? me.compiled(values) : me.html.replace(me.re, function(m, name){ return values[name] !== undefined ? values[name] : ""; }); }, set : function(html, compile){ var me = this; me.html = html; me.compiled = null; return compile ? me.compile() : me; }, compile : function(){ var me = this, sep = Ext.isGecko ? "+" : ","; function fn(m, name){ name = "values['" + name + "']"; return "'"+ sep + '(' + name + " == undefined ? '' : " + name + ')' + sep + "'"; } eval("this.compiled = function(values){ return " + (Ext.isGecko ? "'" : "['") + me.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) + (Ext.isGecko ? "';};" : "'].join('');};")); return me; }, insertFirst: function(el, values, returnElement){ return this.doInsert('afterBegin', el, values, returnElement); }, insertBefore: function(el, values, returnElement){ return this.doInsert('beforeBegin', el, values, returnElement); }, insertAfter : function(el, values, returnElement){ return this.doInsert('afterEnd', el, values, returnElement); }, append : function(el, values, returnElement){ return this.doInsert('beforeEnd', el, values, returnElement); }, doInsert : function(where, el, values, returnEl){ el = Ext.getDom(el); var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values)); return returnEl ? Ext.get(newNode, true) : newNode; }, overwrite : function(el, values, returnElement){ el = Ext.getDom(el); el.innerHTML = this.applyTemplate(values); return returnElement ? Ext.get(el.firstChild, true) : el.firstChild; } }; Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate; Ext.Template.from = function(el, config){ el = Ext.getDom(el); return new Ext.Template(el.value || el.innerHTML, config || ''); }; Ext.DomQuery = function(){ var cache = {}, simpleCache = {}, valueCache = {}, nonSpace = /\S/, trimRe = /^\s+|\s+$/g, tplRe = /\{(\d+)\}/g, modeRe = /^(\s?[\/>+~]\s?|\s|$)/, tagTokenRe = /^(#)?([\w\-\*]+)/, nthRe = /(\d*)n\+?(\d*)/, nthRe2 = /\D/, isIE = window.ActiveXObject ? true : false, key = 30803; eval("var batch = 30803;"); function child(parent, index){ var i = 0, n = parent.firstChild; while(n){ if(n.nodeType == 1){ if(++i == index){ return n; } } n = n.nextSibling; } return null; } function next(n){ while((n = n.nextSibling) && n.nodeType != 1); return n; } function prev(n){ while((n = n.previousSibling) && n.nodeType != 1); return n; } function children(parent){ var n = parent.firstChild, nodeIndex = -1, nextNode; while(n){ nextNode = n.nextSibling; if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){ parent.removeChild(n); }else{ n.nodeIndex = ++nodeIndex; } n = nextNode; } return this; } function byClassName(nodeSet, cls){ if(!cls){ return nodeSet; } var result = [], ri = -1; for(var i = 0, ci; ci = nodeSet[i]; i++){ if((' '+ci.className+' ').indexOf(cls) != -1){ result[++ri] = ci; } } return result; }; function attrValue(n, attr){ if(!n.tagName && typeof n.length != "undefined"){ n = n[0]; } if(!n){ return null; } if(attr == "for"){ return n.htmlFor; } if(attr == "class" || attr == "className"){ return n.className; } return n.getAttribute(attr) || n[attr]; }; function getNodes(ns, mode, tagName){ var result = [], ri = -1, cs; if(!ns){ return result; } tagName = tagName || "*"; if(typeof ns.getElementsByTagName != "undefined"){ ns = [ns]; } if(!mode){ for(var i = 0, ni; ni = ns[i]; i++){ cs = ni.getElementsByTagName(tagName); for(var j = 0, ci; ci = cs[j]; j++){ result[++ri] = ci; } } } else if(mode == "/" || mode == ">"){ var utag = tagName.toUpperCase(); for(var i = 0, ni, cn; ni = ns[i]; i++){ cn = ni.childNodes; for(var j = 0, cj; cj = cn[j]; j++){ if(cj.nodeName == utag || cj.nodeName == tagName || tagName == '*'){ result[++ri] = cj; } } } }else if(mode == "+"){ var utag = tagName.toUpperCase(); for(var i = 0, n; n = ns[i]; i++){ while((n = n.nextSibling) && n.nodeType != 1); if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){ result[++ri] = n; } } }else if(mode == "~"){ var utag = tagName.toUpperCase(); for(var i = 0, n; n = ns[i]; i++){ while((n = n.nextSibling)){ if (n.nodeName == utag || n.nodeName == tagName || tagName == '*'){ result[++ri] = n; } } } } return result; } function concat(a, b){ if(b.slice){ return a.concat(b); } for(var i = 0, l = b.length; i < l; i++){ a[a.length] = b[i]; } return a; } function byTag(cs, tagName){ if(cs.tagName || cs == document){ cs = [cs]; } if(!tagName){ return cs; } var result = [], ri = -1; tagName = tagName.toLowerCase(); for(var i = 0, ci; ci = cs[i]; i++){ if(ci.nodeType == 1 && ci.tagName.toLowerCase() == tagName){ result[++ri] = ci; } } return result; } function byId(cs, id){ if(cs.tagName || cs == document){ cs = [cs]; } if(!id){ return cs; } var result = [], ri = -1; for(var i = 0, ci; ci = cs[i]; i++){ if(ci && ci.id == id){ result[++ri] = ci; return result; } } return result; } function byAttribute(cs, attr, value, op, custom){ var result = [], ri = -1, useGetStyle = custom == "{", fn = Ext.DomQuery.operators[op], a, xml, hasXml; for(var i = 0, ci; ci = cs[i]; i++){ if(ci.nodeType != 1){ continue; } if(!hasXml){ xml = Ext.DomQuery.isXml(ci); hasXml = true; } if(!xml){ if(useGetStyle){ a = Ext.DomQuery.getStyle(ci, attr); } else if (attr == "class" || attr == "className"){ a = ci.className; } else if (attr == "for"){ a = ci.htmlFor; } else if (attr == "href"){ a = ci.getAttribute("href", 2); } else{ a = ci.getAttribute(attr); } }else{ a = ci.getAttribute(attr); } if((fn && fn(a, value)) || (!fn && a)){ result[++ri] = ci; } } return result; } function byPseudo(cs, name, value){ return Ext.DomQuery.pseudos[name](cs, value); } function nodupIEXml(cs){ var d = ++key, r; cs[0].setAttribute("_nodup", d); r = [cs[0]]; for(var i = 1, len = cs.length; i < len; i++){ var c = cs[i]; if(!c.getAttribute("_nodup") != d){ c.setAttribute("_nodup", d); r[r.length] = c; } } for(var i = 0, len = cs.length; i < len; i++){ cs[i].removeAttribute("_nodup"); } return r; } function nodup(cs){ if(!cs){ return []; } var len = cs.length, c, i, r = cs, cj, ri = -1; if(!len || typeof cs.nodeType != "undefined" || len == 1){ return cs; } if(isIE && typeof cs[0].selectSingleNode != "undefined"){ return nodupIEXml(cs); } var d = ++key; cs[0]._nodup = d; for(i = 1; c = cs[i]; i++){ if(c._nodup != d){ c._nodup = d; }else{ r = []; for(var j = 0; j < i; j++){ r[++ri] = cs[j]; } for(j = i+1; cj = cs[j]; j++){ if(cj._nodup != d){ cj._nodup = d; r[++ri] = cj; } } return r; } } return r; } function quickDiffIEXml(c1, c2){ var d = ++key, r = []; for(var i = 0, len = c1.length; i < len; i++){ c1[i].setAttribute("_qdiff", d); } for(var i = 0, len = c2.length; i < len; i++){ if(c2[i].getAttribute("_qdiff") != d){ r[r.length] = c2[i]; } } for(var i = 0, len = c1.length; i < len; i++){ c1[i].removeAttribute("_qdiff"); } return r; } function quickDiff(c1, c2){ var len1 = c1.length, d = ++key, r = []; if(!len1){ return c2; } if(isIE && typeof c1[0].selectSingleNode != "undefined"){ return quickDiffIEXml(c1, c2); } for(var i = 0; i < len1; i++){ c1[i]._qdiff = d; } for(var i = 0, len = c2.length; i < len; i++){ if(c2[i]._qdiff != d){ r[r.length] = c2[i]; } } return r; } function quickId(ns, mode, root, id){ if(ns == root){ var d = root.ownerDocument || root; return d.getElementById(id); } ns = getNodes(ns, mode, "*"); return byId(ns, id); } return { getStyle : function(el, name){ return Ext.fly(el).getStyle(name); }, compile : function(path, type){ type = type || "select"; var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"], mode, lastPath, matchers = Ext.DomQuery.matchers, matchersLn = matchers.length, modeMatch, lmode = path.match(modeRe); if(lmode && lmode[1]){ fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";'; path = path.replace(lmode[1], ""); } while(path.substr(0, 1)=="/"){ path = path.substr(1); } while(path && lastPath != path){ lastPath = path; var tokenMatch = path.match(tagTokenRe); if(type == "select"){ if(tokenMatch){ if(tokenMatch[1] == "#"){ fn[fn.length] = 'n = quickId(n, mode, root, "'+tokenMatch[2]+'");'; }else{ fn[fn.length] = 'n = getNodes(n, mode, "'+tokenMatch[2]+'");'; } path = path.replace(tokenMatch[0], ""); }else if(path.substr(0, 1) != '@'){ fn[fn.length] = 'n = getNodes(n, mode, "*");'; } }else{ if(tokenMatch){ if(tokenMatch[1] == "#"){ fn[fn.length] = 'n = byId(n, "'+tokenMatch[2]+'");'; }else{ fn[fn.length] = 'n = byTag(n, "'+tokenMatch[2]+'");'; } path = path.replace(tokenMatch[0], ""); } } while(!(modeMatch = path.match(modeRe))){ var matched = false; for(var j = 0; j < matchersLn; j++){ var t = matchers[j]; var m = path.match(t.re); if(m){ fn[fn.length] = t.select.replace(tplRe, function(x, i){ return m[i]; }); path = path.replace(m[0], ""); matched = true; break; } } if(!matched){ throw 'Error parsing selector, parsing failed at "' + path + '"'; } } if(modeMatch[1]){ fn[fn.length] = 'mode="'+modeMatch[1].replace(trimRe, "")+'";'; path = path.replace(modeMatch[1], ""); } } fn[fn.length] = "return nodup(n);\n}"; eval(fn.join("")); return f; }, jsSelect: function(path, root, type){ root = root || document; if(typeof root == "string"){ root = document.getElementById(root); } var paths = path.split(","), results = []; for(var i = 0, len = paths.length; i < len; i++){ var subPath = paths[i].replace(trimRe, ""); if(!cache[subPath]){ cache[subPath] = Ext.DomQuery.compile(subPath); if(!cache[subPath]){ throw subPath + " is not a valid selector"; } } var result = cache[subPath](root); if(result && result != document){ results = results.concat(result); } } if(paths.length > 1){ return nodup(results); } return results; }, isXml: function(el) { var docEl = (el ? el.ownerDocument || el : 0).documentElement; return docEl ? docEl.nodeName !== "HTML" : false; }, select : document.querySelectorAll ? function(path, root, type) { root = root || document; if (!Ext.DomQuery.isXml(root)) { try { var cs = root.querySelectorAll(path); return Ext.toArray(cs); } catch (ex) {} } return Ext.DomQuery.jsSelect.call(this, path, root, type); } : function(path, root, type) { return Ext.DomQuery.jsSelect.call(this, path, root, type); }, selectNode : function(path, root){ return Ext.DomQuery.select(path, root)[0]; }, selectValue : function(path, root, defaultValue){ path = path.replace(trimRe, ""); if(!valueCache[path]){ valueCache[path] = Ext.DomQuery.compile(path, "select"); } var n = valueCache[path](root), v; n = n[0] ? n[0] : n; if (typeof n.normalize == 'function') n.normalize(); v = (n && n.firstChild ? n.firstChild.nodeValue : null); return ((v === null||v === undefined||v==='') ? defaultValue : v); }, selectNumber : function(path, root, defaultValue){ var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0); return parseFloat(v); }, is : function(el, ss){ if(typeof el == "string"){ el = document.getElementById(el); } var isArray = Ext.isArray(el), result = Ext.DomQuery.filter(isArray ? el : [el], ss); return isArray ? (result.length == el.length) : (result.length > 0); }, filter : function(els, ss, nonMatches){ ss = ss.replace(trimRe, ""); if(!simpleCache[ss]){ simpleCache[ss] = Ext.DomQuery.compile(ss, "simple"); } var result = simpleCache[ss](els); return nonMatches ? quickDiff(result, els) : result; }, matchers : [{ re: /^\.([\w\-]+)/, select: 'n = byClassName(n, " {1} ");' }, { re: /^\:([\w\-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/, select: 'n = byPseudo(n, "{1}", "{2}");' },{ re: /^(?:([\[\{])(?:@)?([\w\-]+)\s?(?:(=|.=)\s?(["']?)(.*?)\4)?[\]\}])/, select: 'n = byAttribute(n, "{2}", "{5}", "{3}", "{1}");' }, { re: /^#([\w\-]+)/, select: 'n = byId(n, "{1}");' },{ re: /^@([\w\-]+)/, select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};' } ], /** * Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *=, %=, |= and ~=. * New operators can be added as long as the match the format c= where c is any character other than space, > <. */ operators : { "=" : function(a, v){ return a == v; }, "!=" : function(a, v){ return a != v; }, "^=" : function(a, v){ return a && a.substr(0, v.length) == v; }, "$=" : function(a, v){ return a && a.substr(a.length-v.length) == v; }, "*=" : function(a, v){ return a && a.indexOf(v) !== -1; }, "%=" : function(a, v){ return (a % v) == 0; }, "|=" : function(a, v){ return a && (a == v || a.substr(0, v.length+1) == v+'-'); }, "~=" : function(a, v){ return a && (' '+a+' ').indexOf(' '+v+' ') != -1; } }, /** *

Object hash of "pseudo class" filter functions which are used when filtering selections. Each function is passed * two parameters:

    *
  • c : Array
    An Array of DOM elements to filter.
  • *
  • v : String
    The argument (if any) supplied in the selector.
  • *
*

A filter function returns an Array of DOM elements which conform to the pseudo class.

*

In addition to the provided pseudo classes listed above such as first-child and nth-child, * developers may add additional, custom psuedo class filters to select elements according to application-specific requirements.

*

For example, to filter <a> elements to only return links to external resources:

*
Ext.DomQuery.pseudos.external = function(c, v){
    var r = [], ri = -1;
    for(var i = 0, ci; ci = c[i]; i++){
//      Include in result set only if it's a link to an external resource
        if(ci.hostname != location.hostname){
            r[++ri] = ci;
        }
    }
    return r;
};
* Then external links could be gathered with the following statement:
var externalLinks = Ext.select("a:external");
*/ pseudos : { "first-child" : function(c){ var r = [], ri = -1, n; for(var i = 0, ci; ci = n = c[i]; i++){ while((n = n.previousSibling) && n.nodeType != 1); if(!n){ r[++ri] = ci; } } return r; }, "last-child" : function(c){ var r = [], ri = -1, n; for(var i = 0, ci; ci = n = c[i]; i++){ while((n = n.nextSibling) && n.nodeType != 1); if(!n){ r[++ri] = ci; } } return r; }, "nth-child" : function(c, a) { var r = [], ri = -1, m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a), f = (m[1] || 1) - 0, l = m[2] - 0; for(var i = 0, n; n = c[i]; i++){ var pn = n.parentNode; if (batch != pn._batch) { var j = 0; for(var cn = pn.firstChild; cn; cn = cn.nextSibling){ if(cn.nodeType == 1){ cn.nodeIndex = ++j; } } pn._batch = batch; } if (f == 1) { if (l == 0 || n.nodeIndex == l){ r[++ri] = n; } } else if ((n.nodeIndex + l) % f == 0){ r[++ri] = n; } } return r; }, "only-child" : function(c){ var r = [], ri = -1;; for(var i = 0, ci; ci = c[i]; i++){ if(!prev(ci) && !next(ci)){ r[++ri] = ci; } } return r; }, "empty" : function(c){ var r = [], ri = -1; for(var i = 0, ci; ci = c[i]; i++){ var cns = ci.childNodes, j = 0, cn, empty = true; while(cn = cns[j]){ ++j; if(cn.nodeType == 1 || cn.nodeType == 3){ empty = false; break; } } if(empty){ r[++ri] = ci; } } return r; }, "contains" : function(c, v){ var r = [], ri = -1; for(var i = 0, ci; ci = c[i]; i++){ if((ci.textContent||ci.innerText||'').indexOf(v) != -1){ r[++ri] = ci; } } return r; }, "nodeValue" : function(c, v){ var r = [], ri = -1; for(var i = 0, ci; ci = c[i]; i++){ if(ci.firstChild && ci.firstChild.nodeValue == v){ r[++ri] = ci; } } return r; }, "checked" : function(c){ var r = [], ri = -1; for(var i = 0, ci; ci = c[i]; i++){ if(ci.checked == true){ r[++ri] = ci; } } return r; }, "not" : function(c, ss){ return Ext.DomQuery.filter(c, ss, true); }, "any" : function(c, selectors){ var ss = selectors.split('|'), r = [], ri = -1, s; for(var i = 0, ci; ci = c[i]; i++){ for(var j = 0; s = ss[j]; j++){ if(Ext.DomQuery.is(ci, s)){ r[++ri] = ci; break; } } } return r; }, "odd" : function(c){ return this["nth-child"](c, "odd"); }, "even" : function(c){ return this["nth-child"](c, "even"); }, "nth" : function(c, a){ return c[a-1] || []; }, "first" : function(c){ return c[0] || []; }, "last" : function(c){ return c[c.length-1] || []; }, "has" : function(c, ss){ var s = Ext.DomQuery.select, r = [], ri = -1; for(var i = 0, ci; ci = c[i]; i++){ if(s(ss, ci).length > 0){ r[++ri] = ci; } } return r; }, "next" : function(c, ss){ var is = Ext.DomQuery.is, r = [], ri = -1; for(var i = 0, ci; ci = c[i]; i++){ var n = next(ci); if(n && is(n, ss)){ r[++ri] = ci; } } return r; }, "prev" : function(c, ss){ var is = Ext.DomQuery.is, r = [], ri = -1; for(var i = 0, ci; ci = c[i]; i++){ var n = prev(ci); if(n && is(n, ss)){ r[++ri] = ci; } } return r; } } }; }(); /** * Selects an array of DOM nodes by CSS/XPath selector. Shorthand of {@link Ext.DomQuery#select} * @param {String} path The selector/xpath query * @param {Node} root (optional) The start of the query (defaults to document). * @return {Array} * @member Ext * @method query */ Ext.query = Ext.DomQuery.select; /** * @class Ext.util.DelayedTask *

The DelayedTask class provides a convenient way to "buffer" the execution of a method, * performing setTimeout where a new timeout cancels the old timeout. When called, the * task will wait the specified time period before executing. If durng that time period, * the task is called again, the original call will be cancelled. This continues so that * the function is only called a single time for each iteration.

*

This method is especially useful for things like detecting whether a user has finished * typing in a text field. An example would be performing validation on a keypress. You can * use this class to buffer the keypress events for a certain number of milliseconds, and * perform only if they stop for that amount of time. Usage:


var task = new Ext.util.DelayedTask(function(){
    alert(Ext.getDom('myInputField').value.length);
});
// Wait 500ms before calling our function. If the user presses another key 
// during that 500ms, it will be cancelled and we'll wait another 500ms.
Ext.get('myInputField').on('keypress', function(){
    task.{@link #delay}(500); 
});
 * 
*

Note that we are using a DelayedTask here to illustrate a point. The configuration * option buffer for {@link Ext.util.Observable#addListener addListener/on} will * also setup a delayed task for you to buffer events.

* @constructor The parameters to this constructor serve as defaults and are not required. * @param {Function} fn (optional) The default function to call. * @param {Object} scope The default scope (The this reference) in which the * function is called. If not specified, this will refer to the browser window. * @param {Array} args (optional) The default Array of arguments. */ Ext.util.DelayedTask = function(fn, scope, args){ var me = this, id, call = function(){ clearInterval(id); id = null; fn.apply(scope, args || []); }; /** * Cancels any pending timeout and queues a new one * @param {Number} delay The milliseconds to delay * @param {Function} newFn (optional) Overrides function passed to constructor * @param {Object} newScope (optional) Overrides scope passed to constructor. Remember that if no scope * is specified, this will refer to the browser window. * @param {Array} newArgs (optional) Overrides args passed to constructor */ me.delay = function(delay, newFn, newScope, newArgs){ me.cancel(); fn = newFn || fn; scope = newScope || scope; args = newArgs || args; id = setInterval(call, delay); }; /** * Cancel the last queued timeout */ me.cancel = function(){ if(id){ clearInterval(id); id = null; } }; };/** * @class Ext.Element *

Encapsulates a DOM element, adding simple DOM manipulation facilities, normalizing for browser differences.

*

All instances of this class inherit the methods of {@link Ext.Fx} making visual effects easily available to all DOM elements.

*

Note that the events documented in this class are not Ext events, they encapsulate browser events. To * access the underlying browser event, see {@link Ext.EventObject#browserEvent}. Some older * browsers may not support the full range of events. Which events are supported is beyond the control of ExtJs.

* Usage:

// by id
var el = Ext.get("my-div");

// by DOM element reference
var el = Ext.get(myDivElement);
* Animations
*

When an element is manipulated, by default there is no animation.

*

var el = Ext.get("my-div");

// no animation
el.setWidth(100);
 * 
*

Many of the functions for manipulating an element have an optional "animate" parameter. This * parameter can be specified as boolean (true) for default animation effects.

*

// default animation
el.setWidth(100, true);
 * 
* *

To configure the effects, an object literal with animation options to use as the Element animation * configuration object can also be specified. Note that the supported Element animation configuration * options are a subset of the {@link Ext.Fx} animation options specific to Fx effects. The supported * Element animation configuration options are:

Option    Default   Description
--------- --------  ---------------------------------------------
{@link Ext.Fx#duration duration}  .35       The duration of the animation in seconds
{@link Ext.Fx#easing easing}    easeOut   The easing method
{@link Ext.Fx#callback callback}  none      A function to execute when the anim completes
{@link Ext.Fx#scope scope}     this      The scope (this) of the callback function
* *

// Element animation options object
var opt = {
    {@link Ext.Fx#duration duration}: 1,
    {@link Ext.Fx#easing easing}: 'elasticIn',
    {@link Ext.Fx#callback callback}: this.foo,
    {@link Ext.Fx#scope scope}: this
};
// animation with some options set
el.setWidth(100, opt);
 * 
*

The Element animation object being used for the animation will be set on the options * object as "anim", which allows you to stop or manipulate the animation. Here is an example:

*

// using the "anim" property to get the Anim object
if(opt.anim.isAnimated()){
    opt.anim.stop();
}
 * 
*

Also see the {@link #animate} method for another animation technique.

*

Composite (Collections of) Elements

*

For working with collections of Elements, see {@link Ext.CompositeElement}

* @constructor Create a new Element directly. * @param {String/HTMLElement} element * @param {Boolean} forceNew (optional) By default the constructor checks to see if there is already an instance of this element in the cache and if there is it returns the same instance. This will skip that check (useful for extending this class). */ (function(){ var DOC = document; Ext.Element = function(element, forceNew){ var dom = typeof element == "string" ? DOC.getElementById(element) : element, id; if(!dom) return null; id = dom.id; if(!forceNew && id && Ext.elCache[id]){ // element object already exists return Ext.elCache[id].el; } /** * The DOM element * @type HTMLElement */ this.dom = dom; /** * The DOM element ID * @type String */ this.id = id || Ext.id(dom); }; var DH = Ext.DomHelper, El = Ext.Element, EC = Ext.elCache; El.prototype = { /** * Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function) * @param {Object} o The object with the attributes * @param {Boolean} useSet (optional) false to override the default setAttribute to use expandos. * @return {Ext.Element} this */ set : function(o, useSet){ var el = this.dom, attr, val, useSet = (useSet !== false) && !!el.setAttribute; for (attr in o) { if (o.hasOwnProperty(attr)) { val = o[attr]; if (attr == 'style') { DH.applyStyles(el, val); } else if (attr == 'cls') { el.className = val; } else if (useSet) { el.setAttribute(attr, val); } else { el[attr] = val; } } } return this; }, // Mouse events /** * @event click * Fires when a mouse click is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event contextmenu * Fires when a right click is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event dblclick * Fires when a mouse double click is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event mousedown * Fires when a mousedown is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event mouseup * Fires when a mouseup is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event mouseover * Fires when a mouseover is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event mousemove * Fires when a mousemove is detected with the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event mouseout * Fires when a mouseout is detected with the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event mouseenter * Fires when the mouse enters the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event mouseleave * Fires when the mouse leaves the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ // Keyboard events /** * @event keypress * Fires when a keypress is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event keydown * Fires when a keydown is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event keyup * Fires when a keyup is detected within the element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ // HTML frame/object events /** * @event load * Fires when the user agent finishes loading all content within the element. Only supported by window, frames, objects and images. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event unload * Fires when the user agent removes all content from a window or frame. For elements, it fires when the target element or any of its content has been removed. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event abort * Fires when an object/image is stopped from loading before completely loaded. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event error * Fires when an object/image/frame cannot be loaded properly. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event resize * Fires when a document view is resized. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event scroll * Fires when a document view is scrolled. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ // Form events /** * @event select * Fires when a user selects some text in a text field, including input and textarea. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event change * Fires when a control loses the input focus and its value has been modified since gaining focus. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event submit * Fires when a form is submitted. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event reset * Fires when a form is reset. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event focus * Fires when an element receives focus either via the pointing device or by tab navigation. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event blur * Fires when an element loses focus either via the pointing device or by tabbing navigation. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ // User Interface events /** * @event DOMFocusIn * Where supported. Similar to HTML focus event, but can be applied to any focusable element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event DOMFocusOut * Where supported. Similar to HTML blur event, but can be applied to any focusable element. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event DOMActivate * Where supported. Fires when an element is activated, for instance, through a mouse click or a keypress. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ // DOM Mutation events /** * @event DOMSubtreeModified * Where supported. Fires when the subtree is modified. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event DOMNodeInserted * Where supported. Fires when a node has been added as a child of another node. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event DOMNodeRemoved * Where supported. Fires when a descendant node of the element is removed. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event DOMNodeRemovedFromDocument * Where supported. Fires when a node is being removed from a document. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event DOMNodeInsertedIntoDocument * Where supported. Fires when a node is being inserted into a document. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event DOMAttrModified * Where supported. Fires when an attribute has been modified. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * @event DOMCharacterDataModified * Where supported. Fires when the character data has been modified. * @param {Ext.EventObject} e The {@link Ext.EventObject} encapsulating the DOM event. * @param {HtmlElement} t The target of the event. * @param {Object} o The options configuration passed to the {@link #addListener} call. */ /** * The default unit to append to CSS values where a unit isn't provided (defaults to px). * @type String */ defaultUnit : "px", /** * Returns true if this element matches the passed simple selector (e.g. div.some-class or span:first-child) * @param {String} selector The simple selector to test * @return {Boolean} True if this element matches the selector, else false */ is : function(simpleSelector){ return Ext.DomQuery.is(this.dom, simpleSelector); }, /** * Tries to focus the element. Any exceptions are caught and ignored. * @param {Number} defer (optional) Milliseconds to defer the focus * @return {Ext.Element} this */ focus : function(defer, /* private */ dom) { var me = this, dom = dom || me.dom; try{ if(Number(defer)){ me.focus.defer(defer, null, [null, dom]); }else{ dom.focus(); } }catch(e){} return me; }, /** * Tries to blur the element. Any exceptions are caught and ignored. * @return {Ext.Element} this */ blur : function() { try{ this.dom.blur(); }catch(e){} return this; }, /** * Returns the value of the "value" attribute * @param {Boolean} asNumber true to parse the value as a number * @return {String/Number} */ getValue : function(asNumber){ var val = this.dom.value; return asNumber ? parseInt(val, 10) : val; }, /** * Appends an event handler to this element. The shorthand version {@link #on} is equivalent. * @param {String} eventName The name of event to handle. * @param {Function} fn The handler function the event invokes. This function is passed * the following parameters:
    *
  • evt : EventObject
    The {@link Ext.EventObject EventObject} describing the event.
  • *
  • el : HtmlElement
    The DOM element which was the target of the event. * Note that this may be filtered by using the delegate option.
  • *
  • o : Object
    The options object from the addListener call.
  • *
* @param {Object} scope (optional) The scope (this reference) in which the handler function is executed. * If omitted, defaults to this Element.. * @param {Object} options (optional) An object containing handler configuration properties. * This may contain any of the following properties:
    *
  • scope Object :
    The scope (this reference) in which the handler function is executed. * If omitted, defaults to this Element.
  • *
  • delegate String:
    A simple selector to filter the target or look for a descendant of the target. See below for additional details.
  • *
  • stopEvent Boolean:
    True to stop the event. That is stop propagation, and prevent the default action.
  • *
  • preventDefault Boolean:
    True to prevent the default action
  • *
  • stopPropagation Boolean:
    True to prevent event propagation
  • *
  • normalized Boolean:
    False to pass a browser event to the handler function instead of an Ext.EventObject
  • *
  • target Ext.Element:
    Only call the handler if the event was fired on the target Element, not if the event was bubbled up from a child node.
  • *
  • delay Number:
    The number of milliseconds to delay the invocation of the handler after the event fires.
  • *
  • single Boolean:
    True to add a handler to handle just the next firing of the event, and then remove itself.
  • *
  • buffer Number:
    Causes the handler to be scheduled to run in an {@link Ext.util.DelayedTask} delayed * by the specified number of milliseconds. If the event fires again within that time, the original * handler is not invoked, but the new handler is scheduled in its place.
  • *

*

* Combining Options
* In the following examples, the shorthand form {@link #on} is used rather than the more verbose * addListener. The two are equivalent. Using the options argument, it is possible to combine different * types of listeners:
*
* A delayed, one-time listener that auto stops the event and adds a custom argument (forumId) to the * options object. The options object is available as the third parameter in the handler function.

* Code:

el.on('click', this.onClick, this, {
    single: true,
    delay: 100,
    stopEvent : true,
    forumId: 4
});

*

* Attaching multiple handlers in 1 call
* The method also allows for a single argument to be passed which is a config object containing properties * which specify multiple handlers.

*

* Code:


el.on({
    'click' : {
        fn: this.onClick,
        scope: this,
        delay: 100
    },
    'mouseover' : {
        fn: this.onMouseOver,
        scope: this
    },
    'mouseout' : {
        fn: this.onMouseOut,
        scope: this
    }
});
*

* Or a shorthand syntax:
* Code:

el.on({ 'click' : this.onClick, 'mouseover' : this.onMouseOver, 'mouseout' : this.onMouseOut, scope: this }); *

*

delegate

*

This is a configuration option that you can pass along when registering a handler for * an event to assist with event delegation. Event delegation is a technique that is used to * reduce memory consumption and prevent exposure to memory-leaks. By registering an event * for a container element as opposed to each element within a container. By setting this * configuration option to a simple selector, the target element will be filtered to look for * a descendant of the target. * For example:


// using this markup:
<div id='elId'>
    <p id='p1'>paragraph one</p>
    <p id='p2' class='clickable'>paragraph two</p>
    <p id='p3'>paragraph three</p>
</div>
// utilize event delegation to registering just one handler on the container element:
el = Ext.get('elId');
el.on(
    'click',
    function(e,t) {
        // handle click
        console.info(t.id); // 'p2'
    },
    this,
    {
        // filter the target element to be a descendant with the class 'clickable'
        delegate: '.clickable'
    }
);
     * 

* @return {Ext.Element} this */ addListener : function(eventName, fn, scope, options){ Ext.EventManager.on(this.dom, eventName, fn, scope || this, options); return this; }, /** * Removes an event handler from this element. The shorthand version {@link #un} is equivalent. * Note: if a scope was explicitly specified when {@link #addListener adding} the * listener, the same scope must be specified here. * Example: *

el.removeListener('click', this.handlerFn);
// or
el.un('click', this.handlerFn);
* @param {String} eventName The name of the event from which to remove the handler. * @param {Function} fn The handler function to remove. This must be a reference to the function passed into the {@link #addListener} call. * @param {Object} scope If a scope (this reference) was specified when the listener was added, * then this must refer to the same object. * @return {Ext.Element} this */ removeListener : function(eventName, fn, scope){ Ext.EventManager.removeListener(this.dom, eventName, fn, scope || this); return this; }, /** * Removes all previous added listeners from this element * @return {Ext.Element} this */ removeAllListeners : function(){ Ext.EventManager.removeAll(this.dom); return this; }, /** * Recursively removes all previous added listeners from this element and its children * @return {Ext.Element} this */ purgeAllListeners : function() { Ext.EventManager.purgeElement(this, true); return this; }, /** * @private Test if size has a unit, otherwise appends the default */ addUnits : function(size){ if(size === "" || size == "auto" || size === undefined){ size = size || ''; } else if(!isNaN(size) || !unitPattern.test(size)){ size = size + (this.defaultUnit || 'px'); } return size; }, /** *

Updates the Same Origin Policy

*

Updating innerHTML of an element will not execute embedded <script> elements. This is a browser restriction.

* @param {Mixed} options. Either a sring containing the URL from which to load the HTML, or an {@link Ext.Ajax#request} options object specifying * exactly how to request the HTML. * @return {Ext.Element} this */ load : function(url, params, cb){ Ext.Ajax.request(Ext.apply({ params: params, url: url.url || url, callback: cb, el: this.dom, indicatorText: url.indicatorText || '' }, Ext.isObject(url) ? url : {})); return this; }, isBorderBox : function(){ return Ext.isBorderBox || Ext.isForcedBorderBox || noBoxAdjust[(this.dom.tagName || "").toLowerCase()]; }, remove : function(){ var me = this, dom = me.dom; if (dom) { delete me.dom; Ext.removeNode(dom); } }, hover : function(overFn, outFn, scope, options){ var me = this; me.on('mouseenter', overFn, scope || me.dom, options); me.on('mouseleave', outFn, scope || me.dom, options); return me; }, contains : function(el){ return !el ? false : Ext.lib.Dom.isAncestor(this.dom, el.dom ? el.dom : el); }, getAttributeNS : function(ns, name){ return this.getAttribute(name, ns); }, getAttribute: (function(){ var test = document.createElement('table'), isBrokenOnTable = false, hasGetAttribute = 'getAttribute' in test, unknownRe = /undefined|unknown/; if (hasGetAttribute) { try { test.getAttribute('ext:qtip'); } catch (e) { isBrokenOnTable = true; } return function(name, ns) { var el = this.dom, value; if (el.getAttributeNS) { value = el.getAttributeNS(ns, name) || null; } if (value == null) { if (ns) { if (isBrokenOnTable && el.tagName.toUpperCase() == 'TABLE') { try { value = el.getAttribute(ns + ':' + name); } catch (e) { value = ''; } } else { value = el.getAttribute(ns + ':' + name); } } else { value = el.getAttribute(name) || el[name]; } } return value || ''; }; } else { return function(name, ns) { var el = this.om, value, attribute; if (ns) { attribute = el[ns + ':' + name]; value = unknownRe.test(typeof attribute) ? undefined : attribute; } else { value = el[name]; } return value || ''; }; } test = null; })(), update : function(html) { if (this.dom) { this.dom.innerHTML = html; } return this; } }; var ep = El.prototype; El.addMethods = function(o){ Ext.apply(ep, o); }; ep.on = ep.addListener; ep.un = ep.removeListener; ep.autoBoxAdjust = true; var unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i, docEl; El.get = function(el){ var ex, elm, id; if(!el){ return null; } if (typeof el == "string") { if (!(elm = DOC.getElementById(el))) { return null; } if (EC[el] && EC[el].el) { ex = EC[el].el; ex.dom = elm; } else { ex = El.addToCache(new El(elm)); } return ex; } else if (el.tagName) { if(!(id = el.id)){ id = Ext.id(el); } if (EC[id] && EC[id].el) { ex = EC[id].el; ex.dom = el; } else { ex = El.addToCache(new El(el)); } return ex; } else if (el instanceof El) { if(el != docEl){ if (Ext.isIE && (el.id == undefined || el.id == '')) { el.dom = el.dom; } else { el.dom = DOC.getElementById(el.id) || el.dom; } } return el; } else if(el.isComposite) { return el; } else if(Ext.isArray(el)) { return El.select(el); } else if(el == DOC) { if(!docEl){ var f = function(){}; f.prototype = El.prototype; docEl = new f(); docEl.dom = DOC; } return docEl; } return null; }; El.addToCache = function(el, id){ id = id || el.id; EC[id] = { el: el, data: {}, events: {} }; return el; }; El.data = function(el, key, value){ el = El.get(el); if (!el) { return null; } var c = EC[el.id].data; if(arguments.length == 2){ return c[key]; }else{ return (c[key] = value); } }; function garbageCollect(){ if(!Ext.enableGarbageCollector){ clearInterval(El.collectorThreadId); } else { var eid, el, d, o; for(eid in EC){ o = EC[eid]; if(o.skipGC){ continue; } el = o.el; d = el.dom; if(!d || !d.parentNode || (!d.offsetParent && !DOC.getElementById(eid))){ if(Ext.enableListenerCollection){ Ext.EventManager.removeAll(d); } delete EC[eid]; } } if (Ext.isIE) { var t = {}; for (eid in EC) { t[eid] = EC[eid]; } EC = Ext.elCache = t; } } } El.collectorThreadId = setInterval(garbageCollect, 30000); var flyFn = function(){}; flyFn.prototype = El.prototype; El.Flyweight = function(dom){ this.dom = dom; }; El.Flyweight.prototype = new flyFn(); El.Flyweight.prototype.isFlyweight = true; El._flyweights = {}; El.fly = function(el, named){ var ret = null; named = named || '_global'; if (el = Ext.getDom(el)) { (El._flyweights[named] = El._flyweights[named] || new El.Flyweight()).dom = el; ret = El._flyweights[named]; } return ret; }; Ext.get = El.get; Ext.fly = El.fly; var noBoxAdjust = Ext.isStrict ? { select:1 } : { input:1, select:1, textarea:1 }; if(Ext.isIE || Ext.isGecko){ noBoxAdjust['button'] = 1; } })(); Ext.Element.addMethods(function(){ var PARENTNODE = 'parentNode', NEXTSIBLING = 'nextSibling', PREVIOUSSIBLING = 'previousSibling', DQ = Ext.DomQuery, GET = Ext.get; return { findParent : function(simpleSelector, maxDepth, returnEl){ var p = this.dom, b = document.body, depth = 0, stopEl; if(Ext.isGecko && Object.prototype.toString.call(p) == '[object XULElement]') { return null; } maxDepth = maxDepth || 50; if (isNaN(maxDepth)) { stopEl = Ext.getDom(maxDepth); maxDepth = Number.MAX_VALUE; } while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){ if(DQ.is(p, simpleSelector)){ return returnEl ? GET(p) : p; } depth++; p = p.parentNode; } return null; }, findParentNode : function(simpleSelector, maxDepth, returnEl){ var p = Ext.fly(this.dom.parentNode, '_internal'); return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null; }, up : function(simpleSelector, maxDepth){ return this.findParentNode(simpleSelector, maxDepth, true); }, select : function(selector){ return Ext.Element.select(selector, this.dom); }, query : function(selector){ return DQ.select(selector, this.dom); }, child : function(selector, returnDom){ var n = DQ.selectNode(selector, this.dom); return returnDom ? n : GET(n); }, down : function(selector, returnDom){ var n = DQ.selectNode(" > " + selector, this.dom); return returnDom ? n : GET(n); }, parent : function(selector, returnDom){ return this.matchNode(PARENTNODE, PARENTNODE, selector, returnDom); }, next : function(selector, returnDom){ return this.matchNode(NEXTSIBLING, NEXTSIBLING, selector, returnDom); }, prev : function(selector, returnDom){ return this.matchNode(PREVIOUSSIBLING, PREVIOUSSIBLING, selector, returnDom); }, first : function(selector, returnDom){ return this.matchNode(NEXTSIBLING, 'firstChild', selector, returnDom); }, last : function(selector, returnDom){ return this.matchNode(PREVIOUSSIBLING, 'lastChild', selector, returnDom); }, matchNode : function(dir, start, selector, returnDom){ var n = this.dom[start]; while(n){ if(n.nodeType == 1 && (!selector || DQ.is(n, selector))){ return !returnDom ? GET(n) : n; } n = n[dir]; } return null; } }; }()); Ext.Element.addMethods( function() { var GETDOM = Ext.getDom, GET = Ext.get, DH = Ext.DomHelper; return { appendChild: function(el){ return GET(el).appendTo(this); }, appendTo: function(el){ GETDOM(el).appendChild(this.dom); return this; }, insertBefore: function(el){ (el = GETDOM(el)).parentNode.insertBefore(this.dom, el); return this; }, insertAfter: function(el){ (el = GETDOM(el)).parentNode.insertBefore(this.dom, el.nextSibling); return this; }, insertFirst: function(el, returnDom){ el = el || {}; if(el.nodeType || el.dom || typeof el == 'string'){ el = GETDOM(el); this.dom.insertBefore(el, this.dom.firstChild); return !returnDom ? GET(el) : el; }else{ return this.createChild(el, this.dom.firstChild, returnDom); } }, replace: function(el){ el = GET(el); this.insertBefore(el); el.remove(); return this; }, replaceWith: function(el){ var me = this; if(el.nodeType || el.dom || typeof el == 'string'){ el = GETDOM(el); me.dom.parentNode.insertBefore(el, me.dom); }else{ el = DH.insertBefore(me.dom, el); } delete Ext.elCache[me.id]; Ext.removeNode(me.dom); me.id = Ext.id(me.dom = el); Ext.Element.addToCache(me.isFlyweight ? new Ext.Element(me.dom) : me); return me; }, createChild: function(config, insertBefore, returnDom){ config = config || {tag:'div'}; return insertBefore ? DH.insertBefore(insertBefore, config, returnDom !== true) : DH[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config, returnDom !== true); }, wrap: function(config, returnDom){ var newEl = DH.insertBefore(this.dom, config || {tag: "div"}, !returnDom); newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom); return newEl; }, insertHtml : function(where, html, returnEl){ var el = DH.insertHtml(where, this.dom, html); return returnEl ? Ext.get(el) : el; } }; }()); Ext.Element.addMethods(function(){ var supports = Ext.supports, propCache = {}, camelRe = /(-[a-z])/gi, view = document.defaultView, opacityRe = /alpha\(opacity=(.*)\)/i, trimRe = /^\s+|\s+$/g, EL = Ext.Element, spacesRe = /\s+/, wordsRe = /\w/g, PADDING = "padding", MARGIN = "margin", BORDER = "border", LEFT = "-left", RIGHT = "-right", TOP = "-top", BOTTOM = "-bottom", WIDTH = "-width", MATH = Math, HIDDEN = 'hidden', ISCLIPPED = 'isClipped', OVERFLOW = 'overflow', OVERFLOWX = 'overflow-x', OVERFLOWY = 'overflow-y', ORIGINALCLIP = 'originalClip', borders = {l: BORDER + LEFT + WIDTH, r: BORDER + RIGHT + WIDTH, t: BORDER + TOP + WIDTH, b: BORDER + BOTTOM + WIDTH}, paddings = {l: PADDING + LEFT, r: PADDING + RIGHT, t: PADDING + TOP, b: PADDING + BOTTOM}, margins = {l: MARGIN + LEFT, r: MARGIN + RIGHT, t: MARGIN + TOP, b: MARGIN + BOTTOM}, data = Ext.Element.data; function camelFn(m, a) { return a.charAt(1).toUpperCase(); } function chkCache(prop) { return propCache[prop] || (propCache[prop] = prop == 'float' ? (supports.cssFloat ? 'cssFloat' : 'styleFloat') : prop.replace(camelRe, camelFn)); } return { adjustWidth : function(width) { var me = this; var isNum = (typeof width == "number"); if(isNum && me.autoBoxAdjust && !me.isBorderBox()){ width -= (me.getBorderWidth("lr") + me.getPadding("lr")); } return (isNum && width < 0) ? 0 : width; }, adjustHeight : function(height) { var me = this; var isNum = (typeof height == "number"); if(isNum && me.autoBoxAdjust && !me.isBorderBox()){ height -= (me.getBorderWidth("tb") + me.getPadding("tb")); } return (isNum && height < 0) ? 0 : height; }, addClass : function(className){ var me = this, i, len, v, cls = []; if (!Ext.isArray(className)) { if (typeof className == 'string' && !this.hasClass(className)) { me.dom.className += " " + className; } } else { for (i = 0, len = className.length; i < len; i++) { v = className[i]; if (typeof v == 'string' && (' ' + me.dom.className + ' ').indexOf(' ' + v + ' ') == -1) { cls.push(v); } } if (cls.length) { me.dom.className += " " + cls.join(" "); } } return me; }, removeClass : function(className){ var me = this, i, idx, len, cls, elClasses; if (!Ext.isArray(className)){ className = [className]; } if (me.dom && me.dom.className) { elClasses = me.dom.className.replace(trimRe, '').split(spacesRe); for (i = 0, len = className.length; i < len; i++) { cls = className[i]; if (typeof cls == 'string') { cls = cls.replace(trimRe, ''); idx = elClasses.indexOf(cls); if (idx != -1) { elClasses.splice(idx, 1); } } } me.dom.className = elClasses.join(" "); } return me; }, radioClass : function(className){ var cn = this.dom.parentNode.childNodes, v, i, len; className = Ext.isArray(className) ? className : [className]; for (i = 0, len = cn.length; i < len; i++) { v = cn[i]; if (v && v.nodeType == 1) { Ext.fly(v, '_internal').removeClass(className); } }; return this.addClass(className); }, toggleClass : function(className){ return this.hasClass(className) ? this.removeClass(className) : this.addClass(className); }, hasClass : function(className){ return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1; }, replaceClass : function(oldClassName, newClassName){ return this.removeClass(oldClassName).addClass(newClassName); }, isStyle : function(style, val) { return this.getStyle(style) == val; }, getStyle : function(){ return view && view.getComputedStyle ? function(prop){ var el = this.dom, v, cs, out, display; if(el == document){ return null; } prop = chkCache(prop); out = (v = el.style[prop]) ? v : (cs = view.getComputedStyle(el, "")) ? cs[prop] : null; if(prop == 'marginRight' && out != '0px' && !supports.correctRightMargin){ display = el.style.display; el.style.display = 'inline-block'; out = view.getComputedStyle(el, '').marginRight; el.style.display = display; } if(prop == 'backgroundColor' && out == 'rgba(0, 0, 0, 0)' && !supports.correctTransparentColor){ out = 'transparent'; } return out; } : function(prop){ var el = this.dom, m, cs; if(el == document) return null; if (prop == 'opacity') { if (el.style.filter.match) { if(m = el.style.filter.match(opacityRe)){ var fv = parseFloat(m[1]); if(!isNaN(fv)){ return fv ? fv / 100 : 0; } } } return 1; } prop = chkCache(prop); return el.style[prop] || ((cs = el.currentStyle) ? cs[prop] : null); }; }(), getColor : function(attr, defaultValue, prefix){ var v = this.getStyle(attr), color = (typeof prefix != 'undefined') ? prefix : '#', h; if(!v || (/transparent|inherit/.test(v))) { return defaultValue; } if(/^r/.test(v)){ Ext.each(v.slice(4, v.length -1).split(','), function(s){ h = parseInt(s, 10); color += (h < 16 ? '0' : '') + h.toString(16); }); }else{ v = v.replace('#', ''); color += v.length == 3 ? v.replace(/^(\w)(\w)(\w)$/, '$1$1$2$2$3$3') : v; } return(color.length > 5 ? color.toLowerCase() : defaultValue); }, setStyle : function(prop, value){ var tmp, style; if (typeof prop != 'object') { tmp = {}; tmp[prop] = value; prop = tmp; } for (style in prop) { value = prop[style]; style == 'opacity' ? this.setOpacity(value) : this.dom.style[chkCache(style)] = value; } return this; }, setOpacity : function(opacity, animate){ var me = this, s = me.dom.style; if(!animate || !me.anim){ if(Ext.isIE){ var opac = opacity < 1 ? 'alpha(opacity=' + opacity * 100 + ')' : '', val = s.filter.replace(opacityRe, '').replace(trimRe, ''); s.zoom = 1; s.filter = val + (val.length > 0 ? ' ' : '') + opac; }else{ s.opacity = opacity; } }else{ me.anim({opacity: {to: opacity}}, me.preanim(arguments, 1), null, .35, 'easeIn'); } return me; }, clearOpacity : function(){ var style = this.dom.style; if(Ext.isIE){ if(!Ext.isEmpty(style.filter)){ style.filter = style.filter.replace(opacityRe, '').replace(trimRe, ''); } }else{ style.opacity = style['-moz-opacity'] = style['-khtml-opacity'] = ''; } return this; }, getHeight : function(contentHeight){ var me = this, dom = me.dom, hidden = Ext.isIE && me.isStyle('display', 'none'), h = MATH.max(dom.offsetHeight, hidden ? 0 : dom.clientHeight) || 0; h = !contentHeight ? h : h - me.getBorderWidth("tb") - me.getPadding("tb"); return h < 0 ? 0 : h; }, getWidth : function(contentWidth){ var me = this, dom = me.dom, hidden = Ext.isIE && me.isStyle('display', 'none'), w = MATH.max(dom.offsetWidth, hidden ? 0 : dom.clientWidth) || 0; w = !contentWidth ? w : w - me.getBorderWidth("lr") - me.getPadding("lr"); return w < 0 ? 0 : w; }, setWidth : function(width, animate){ var me = this; width = me.adjustWidth(width); !animate || !me.anim ? me.dom.style.width = me.addUnits(width) : me.anim({width : {to : width}}, me.preanim(arguments, 1)); return me; }, setHeight : function(height, animate){ var me = this; height = me.adjustHeight(height); !animate || !me.anim ? me.dom.style.height = me.addUnits(height) : me.anim({height : {to : height}}, me.preanim(arguments, 1)); return me; }, getBorderWidth : function(side){ return this.addStyles(side, borders); }, getPadding : function(side){ return this.addStyles(side, paddings); }, clip : function(){ var me = this, dom = me.dom; if(!data(dom, ISCLIPPED)){ data(dom, ISCLIPPED, true); data(dom, ORIGINALCLIP, { o: me.getStyle(OVERFLOW), x: me.getStyle(OVERFLOWX), y: me.getStyle(OVERFLOWY) }); me.setStyle(OVERFLOW, HIDDEN); me.setStyle(OVERFLOWX, HIDDEN); me.setStyle(OVERFLOWY, HIDDEN); } return me; }, unclip : function(){ var me = this, dom = me.dom; if(data(dom, ISCLIPPED)){ data(dom, ISCLIPPED, false); var o = data(dom, ORIGINALCLIP); if(o.o){ me.setStyle(OVERFLOW, o.o); } if(o.x){ me.setStyle(OVERFLOWX, o.x); } if(o.y){ me.setStyle(OVERFLOWY, o.y); } } return me; }, addStyles : function(sides, styles){ var ttlSize = 0, sidesArr = sides.match(wordsRe), side, size, i, len = sidesArr.length; for (i = 0; i < len; i++) { side = sidesArr[i]; size = side && parseInt(this.getStyle(styles[side]), 10); if (size) { ttlSize += MATH.abs(size); } } return ttlSize; }, margins : margins }; }() ); (function(){ var D = Ext.lib.Dom, LEFT = "left", RIGHT = "right", TOP = "top", BOTTOM = "bottom", POSITION = "position", STATIC = "static", RELATIVE = "relative", AUTO = "auto", ZINDEX = "z-index"; Ext.Element.addMethods({ getX : function(){ return D.getX(this.dom); }, getY : function(){ return D.getY(this.dom); }, getXY : function(){ return D.getXY(this.dom); }, getOffsetsTo : function(el){ var o = this.getXY(), e = Ext.fly(el, '_internal').getXY(); return [o[0]-e[0],o[1]-e[1]]; }, setX : function(x, animate){ return this.setXY([x, this.getY()], this.animTest(arguments, animate, 1)); }, setY : function(y, animate){ return this.setXY([this.getX(), y], this.animTest(arguments, animate, 1)); }, setLeft : function(left){ this.setStyle(LEFT, this.addUnits(left)); return this; }, setTop : function(top){ this.setStyle(TOP, this.addUnits(top)); return this; }, setRight : function(right){ this.setStyle(RIGHT, this.addUnits(right)); return this; }, setBottom : function(bottom){ this.setStyle(BOTTOM, this.addUnits(bottom)); return this; }, setXY : function(pos, animate){ var me = this; if(!animate || !me.anim){ D.setXY(me.dom, pos); }else{ me.anim({points: {to: pos}}, me.preanim(arguments, 1), 'motion'); } return me; }, setLocation : function(x, y, animate){ return this.setXY([x, y], this.animTest(arguments, animate, 2)); }, moveTo : function(x, y, animate){ return this.setXY([x, y], this.animTest(arguments, animate, 2)); }, getLeft : function(local){ return !local ? this.getX() : parseInt(this.getStyle(LEFT), 10) || 0; }, getRight : function(local){ var me = this; return !local ? me.getX() + me.getWidth() : (me.getLeft(true) + me.getWidth()) || 0; }, getTop : function(local) { return !local ? this.getY() : parseInt(this.getStyle(TOP), 10) || 0; }, getBottom : function(local){ var me = this; return !local ? me.getY() + me.getHeight() : (me.getTop(true) + me.getHeight()) || 0; }, position : function(pos, zIndex, x, y){ var me = this; if(!pos && me.isStyle(POSITION, STATIC)){ me.setStyle(POSITION, RELATIVE); } else if(pos) { me.setStyle(POSITION, pos); } if(zIndex){ me.setStyle(ZINDEX, zIndex); } if(x || y) me.setXY([x || false, y || false]); }, clearPositioning : function(value){ value = value || ''; this.setStyle({ left : value, right : value, top : value, bottom : value, "z-index" : "", position : STATIC }); return this; }, getPositioning : function(){ var l = this.getStyle(LEFT); var t = this.getStyle(TOP); return { "position" : this.getStyle(POSITION), "left" : l, "right" : l ? "" : this.getStyle(RIGHT), "top" : t, "bottom" : t ? "" : this.getStyle(BOTTOM), "z-index" : this.getStyle(ZINDEX) }; }, setPositioning : function(pc){ var me = this, style = me.dom.style; me.setStyle(pc); if(pc.right == AUTO){ style.right = ""; } if(pc.bottom == AUTO){ style.bottom = ""; } return me; }, translatePoints : function(x, y){ y = isNaN(x[1]) ? y : x[1]; x = isNaN(x[0]) ? x : x[0]; var me = this, relative = me.isStyle(POSITION, RELATIVE), o = me.getXY(), l = parseInt(me.getStyle(LEFT), 10), t = parseInt(me.getStyle(TOP), 10); l = !isNaN(l) ? l : (relative ? 0 : me.dom.offsetLeft); t = !isNaN(t) ? t : (relative ? 0 : me.dom.offsetTop); return {left: (x - o[0] + l), top: (y - o[1] + t)}; }, animTest : function(args, animate, i) { return !!animate && this.preanim ? this.preanim(args, i) : false; } }); })(); Ext.Element.addMethods({ isScrollable : function(){ var dom = this.dom; return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth; }, scrollTo : function(side, value){ this.dom["scroll" + (/top/i.test(side) ? "Top" : "Left")] = value; return this; }, getScroll : function(){ var d = this.dom, doc = document, body = doc.body, docElement = doc.documentElement, l, t, ret; if(d == doc || d == body){ if(Ext.isIE && Ext.isStrict){ l = docElement.scrollLeft; t = docElement.scrollTop; }else{ l = window.pageXOffset; t = window.pageYOffset; } ret = {left: l || (body ? body.scrollLeft : 0), top: t || (body ? body.scrollTop : 0)}; }else{ ret = {left: d.scrollLeft, top: d.scrollTop}; } return ret; } }); Ext.Element.VISIBILITY = 1; Ext.Element.DISPLAY = 2; Ext.Element.OFFSETS = 3; Ext.Element.ASCLASS = 4; Ext.Element.visibilityCls = 'x-hide-nosize'; Ext.Element.addMethods(function(){ var El = Ext.Element, OPACITY = "opacity", VISIBILITY = "visibility", DISPLAY = "display", HIDDEN = "hidden", OFFSETS = "offsets", ASCLASS = "asclass", NONE = "none", NOSIZE = 'nosize', ORIGINALDISPLAY = 'originalDisplay', VISMODE = 'visibilityMode', ISVISIBLE = 'isVisible', data = El.data, getDisplay = function(dom){ var d = data(dom, ORIGINALDISPLAY); if(d === undefined){ data(dom, ORIGINALDISPLAY, d = ''); } return d; }, getVisMode = function(dom){ var m = data(dom, VISMODE); if(m === undefined){ data(dom, VISMODE, m = 1); } return m; }; return { originalDisplay : "", visibilityMode : 1, setVisibilityMode : function(visMode){ data(this.dom, VISMODE, visMode); return this; }, animate : function(args, duration, onComplete, easing, animType){ this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType); return this; }, anim : function(args, opt, animType, defaultDur, defaultEase, cb){ animType = animType || 'run'; opt = opt || {}; var me = this, anim = Ext.lib.Anim[animType]( me.dom, args, (opt.duration || defaultDur) || .35, (opt.easing || defaultEase) || 'easeOut', function(){ if(cb) cb.call(me); if(opt.callback) opt.callback.call(opt.scope || me, me, opt); }, me ); opt.anim = anim; return anim; }, preanim : function(a, i){ return !a[i] ? false : (typeof a[i] == 'object' ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]}); }, isVisible : function() { var me = this, dom = me.dom, visible = data(dom, ISVISIBLE); if(typeof visible == 'boolean'){ return visible; } visible = !me.isStyle(VISIBILITY, HIDDEN) && !me.isStyle(DISPLAY, NONE) && !((getVisMode(dom) == El.ASCLASS) && me.hasClass(me.visibilityCls || El.visibilityCls)); data(dom, ISVISIBLE, visible); return visible; }, setVisible : function(visible, animate){ var me = this, isDisplay, isVisibility, isOffsets, isNosize, dom = me.dom, visMode = getVisMode(dom); if (typeof animate == 'string'){ switch (animate) { case DISPLAY: visMode = El.DISPLAY; break; case VISIBILITY: visMode = El.VISIBILITY; break; case OFFSETS: visMode = El.OFFSETS; break; case NOSIZE: case ASCLASS: visMode = El.ASCLASS; break; } me.setVisibilityMode(visMode); animate = false; } if (!animate || !me.anim) { if(visMode == El.ASCLASS ){ me[visible?'removeClass':'addClass'](me.visibilityCls || El.visibilityCls); } else if (visMode == El.DISPLAY){ return me.setDisplayed(visible); } else if (visMode == El.OFFSETS){ if (!visible){ me.hideModeStyles = { position: me.getStyle('position'), top: me.getStyle('top'), left: me.getStyle('left') }; me.applyStyles({position: 'absolute', top: '-10000px', left: '-10000px'}); } else { me.applyStyles(me.hideModeStyles || {position: '', top: '', left: ''}); delete me.hideModeStyles; } }else{ me.fixDisplay(); dom.style.visibility = visible ? "visible" : HIDDEN; } }else{ if(visible){ me.setOpacity(.01); me.setVisible(true); } me.anim({opacity: { to: (visible?1:0) }}, me.preanim(arguments, 1), null, .35, 'easeIn', function(){ visible || me.setVisible(false).setOpacity(1); }); } data(dom, ISVISIBLE, visible); return me; }, hasMetrics : function(){ var dom = this.dom; return this.isVisible() || (getVisMode(dom) == El.VISIBILITY); }, toggle : function(animate){ var me = this; me.setVisible(!me.isVisible(), me.preanim(arguments, 0)); return me; }, setDisplayed : function(value) { if(typeof value == "boolean"){ value = value ? getDisplay(this.dom) : NONE; } this.setStyle(DISPLAY, value); return this; }, fixDisplay : function(){ var me = this; if(me.isStyle(DISPLAY, NONE)){ me.setStyle(VISIBILITY, HIDDEN); me.setStyle(DISPLAY, getDisplay(this.dom)); if(me.isStyle(DISPLAY, NONE)){ me.setStyle(DISPLAY, "block"); } } }, hide : function(animate){ if (typeof animate == 'string'){ this.setVisible(false, animate); return this; } this.setVisible(false, this.preanim(arguments, 0)); return this; }, show : function(animate){ if (typeof animate == 'string'){ this.setVisible(true, animate); return this; } this.setVisible(true, this.preanim(arguments, 0)); return this; } }; }());(function(){ var NULL = null, UNDEFINED = undefined, TRUE = true, FALSE = false, SETX = "setX", SETY = "setY", SETXY = "setXY", LEFT = "left", BOTTOM = "bottom", TOP = "top", RIGHT = "right", HEIGHT = "height", WIDTH = "width", POINTS = "points", HIDDEN = "hidden", ABSOLUTE = "absolute", VISIBLE = "visible", MOTION = "motion", POSITION = "position", EASEOUT = "easeOut", flyEl = new Ext.Element.Flyweight(), queues = {}, getObject = function(o){ return o || {}; }, fly = function(dom){ flyEl.dom = dom; flyEl.id = Ext.id(dom); return flyEl; }, getQueue = function(id){ if(!queues[id]){ queues[id] = []; } return queues[id]; }, setQueue = function(id, value){ queues[id] = value; }; Ext.enableFx = TRUE; Ext.Fx = { switchStatements : function(key, fn, argHash){ return fn.apply(this, argHash[key]); }, slideIn : function(anchor, o){ o = getObject(o); var me = this, dom = me.dom, st = dom.style, xy, r, b, wrap, after, st, args, pt, bw, bh; anchor = anchor || "t"; me.queueFx(o, function(){ xy = fly(dom).getXY(); fly(dom).fixDisplay(); r = fly(dom).getFxRestore(); b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight}; b.right = b.x + b.width; b.bottom = b.y + b.height; fly(dom).setWidth(b.width).setHeight(b.height); wrap = fly(dom).fxWrap(r.pos, o, HIDDEN); st.visibility = VISIBLE; st.position = ABSOLUTE; function after(){ fly(dom).fxUnwrap(wrap, r.pos, o); st.width = r.width; st.height = r.height; fly(dom).afterFx(o); } pt = {to: [b.x, b.y]}; bw = {to: b.width}; bh = {to: b.height}; function argCalc(wrap, style, ww, wh, sXY, sXYval, s1, s2, w, h, p){ var ret = {}; fly(wrap).setWidth(ww).setHeight(wh); if(fly(wrap)[sXY]){ fly(wrap)[sXY](sXYval); } style[s1] = style[s2] = "0"; if(w){ ret.width = w; } if(h){ ret.height = h; } if(p){ ret.points = p; } return ret; }; args = fly(dom).switchStatements(anchor.toLowerCase(), argCalc, { t : [wrap, st, b.width, 0, NULL, NULL, LEFT, BOTTOM, NULL, bh, NULL], l : [wrap, st, 0, b.height, NULL, NULL, RIGHT, TOP, bw, NULL, NULL], r : [wrap, st, b.width, b.height, SETX, b.right, LEFT, TOP, NULL, NULL, pt], b : [wrap, st, b.width, b.height, SETY, b.bottom, LEFT, TOP, NULL, bh, pt], tl : [wrap, st, 0, 0, NULL, NULL, RIGHT, BOTTOM, bw, bh, pt], bl : [wrap, st, 0, 0, SETY, b.y + b.height, RIGHT, TOP, bw, bh, pt], br : [wrap, st, 0, 0, SETXY, [b.right, b.bottom], LEFT, TOP, bw, bh, pt], tr : [wrap, st, 0, 0, SETX, b.x + b.width, LEFT, BOTTOM, bw, bh, pt] }); st.visibility = VISIBLE; fly(wrap).show(); arguments.callee.anim = fly(wrap).fxanim(args, o, MOTION, .5, EASEOUT, after); }); return me; }, slideOut : function(anchor, o){ o = getObject(o); var me = this, dom = me.dom, st = dom.style, xy = me.getXY(), wrap, r, b, a, zero = {to: 0}; anchor = anchor || "t"; me.queueFx(o, function(){ r = fly(dom).getFxRestore(); b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight}; b.right = b.x + b.width; b.bottom = b.y + b.height; fly(dom).setWidth(b.width).setHeight(b.height); wrap = fly(dom).fxWrap(r.pos, o, VISIBLE); st.visibility = VISIBLE; st.position = ABSOLUTE; fly(wrap).setWidth(b.width).setHeight(b.height); function after(){ o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide(); fly(dom).fxUnwrap(wrap, r.pos, o); st.width = r.width; st.height = r.height; fly(dom).afterFx(o); } function argCalc(style, s1, s2, p1, v1, p2, v2, p3, v3){ var ret = {}; style[s1] = style[s2] = "0"; ret[p1] = v1; if(p2){ ret[p2] = v2; } if(p3){ ret[p3] = v3; } return ret; }; a = fly(dom).switchStatements(anchor.toLowerCase(), argCalc, { t : [st, LEFT, BOTTOM, HEIGHT, zero], l : [st, RIGHT, TOP, WIDTH, zero], r : [st, LEFT, TOP, WIDTH, zero, POINTS, {to : [b.right, b.y]}], b : [st, LEFT, TOP, HEIGHT, zero, POINTS, {to : [b.x, b.bottom]}], tl : [st, RIGHT, BOTTOM, WIDTH, zero, HEIGHT, zero], bl : [st, RIGHT, TOP, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.x, b.bottom]}], br : [st, LEFT, TOP, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.x + b.width, b.bottom]}], tr : [st, LEFT, BOTTOM, WIDTH, zero, HEIGHT, zero, POINTS, {to : [b.right, b.y]}] }); arguments.callee.anim = fly(wrap).fxanim(a, o, MOTION, .5, EASEOUT, after); }); return me; }, puff : function(o){ o = getObject(o); var me = this, dom = me.dom, st = dom.style, width, height, r; me.queueFx(o, function(){ width = fly(dom).getWidth(); height = fly(dom).getHeight(); fly(dom).clearOpacity(); fly(dom).show(); r = fly(dom).getFxRestore(); function after(){ o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide(); fly(dom).clearOpacity(); fly(dom).setPositioning(r.pos); st.width = r.width; st.height = r.height; st.fontSize = ''; fly(dom).afterFx(o); } arguments.callee.anim = fly(dom).fxanim({ width : {to : fly(dom).adjustWidth(width * 2)}, height : {to : fly(dom).adjustHeight(height * 2)}, points : {by : [-width * .5, -height * .5]}, opacity : {to : 0}, fontSize: {to : 200, unit: "%"} }, o, MOTION, .5, EASEOUT, after); }); return me; }, switchOff : function(o){ o = getObject(o); var me = this, dom = me.dom, st = dom.style, r; me.queueFx(o, function(){ fly(dom).clearOpacity(); fly(dom).clip(); r = fly(dom).getFxRestore(); function after(){ o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide(); fly(dom).clearOpacity(); fly(dom).setPositioning(r.pos); st.width = r.width; st.height = r.height; fly(dom).afterFx(o); }; fly(dom).fxanim({opacity : {to : 0.3}}, NULL, NULL, .1, NULL, function(){ fly(dom).clearOpacity(); (function(){ fly(dom).fxanim({ height : {to : 1}, points : {by : [0, fly(dom).getHeight() * .5]} }, o, MOTION, 0.3, 'easeIn', after); }).defer(100); }); }); return me; }, highlight : function(color, o){ o = getObject(o); var me = this, dom = me.dom, attr = o.attr || "backgroundColor", a = {}, restore; me.queueFx(o, function(){ fly(dom).clearOpacity(); fly(dom).show(); function after(){ dom.style[attr] = restore; fly(dom).afterFx(o); } restore = dom.style[attr]; a[attr] = {from: color || "ffff9c", to: o.endColor || fly(dom).getColor(attr) || "ffffff"}; arguments.callee.anim = fly(dom).fxanim(a, o, 'color', 1, 'easeIn', after); }); return me; }, frame : function(color, count, o){ o = getObject(o); var me = this, dom = me.dom, proxy, active; me.queueFx(o, function(){ color = color || '#C3DAF9'; if(color.length == 6){ color = '#' + color; } count = count || 1; fly(dom).show(); var xy = fly(dom).getXY(), b = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: dom.offsetWidth, height: dom.offsetHeight}, queue = function(){ proxy = fly(document.body || document.documentElement).createChild({ style:{ position : ABSOLUTE, 'z-index': 35000, border : '0px solid ' + color } }); return proxy.queueFx({}, animFn); }; arguments.callee.anim = { isAnimated: true, stop: function() { count = 0; proxy.stopFx(); } }; function animFn(){ var scale = Ext.isBorderBox ? 2 : 1; active = proxy.anim({ top : {from : b.y, to : b.y - 20}, left : {from : b.x, to : b.x - 20}, borderWidth : {from : 0, to : 10}, opacity : {from : 1, to : 0}, height : {from : b.height, to : b.height + 20 * scale}, width : {from : b.width, to : b.width + 20 * scale} },{ duration: o.duration || 1, callback: function() { proxy.remove(); --count > 0 ? queue() : fly(dom).afterFx(o); } }); arguments.callee.anim = { isAnimated: true, stop: function(){ active.stop(); } }; }; queue(); }); return me; }, pause : function(seconds){ var dom = this.dom, t; this.queueFx({}, function(){ t = setTimeout(function(){ fly(dom).afterFx({}); }, seconds * 1000); arguments.callee.anim = { isAnimated: true, stop: function(){ clearTimeout(t); fly(dom).afterFx({}); } }; }); return this; }, fadeIn : function(o){ o = getObject(o); var me = this, dom = me.dom, to = o.endOpacity || 1; me.queueFx(o, function(){ fly(dom).setOpacity(0); fly(dom).fixDisplay(); dom.style.visibility = VISIBLE; arguments.callee.anim = fly(dom).fxanim({opacity:{to:to}}, o, NULL, .5, EASEOUT, function(){ if(to == 1){ fly(dom).clearOpacity(); } fly(dom).afterFx(o); }); }); return me; }, fadeOut : function(o){ o = getObject(o); var me = this, dom = me.dom, style = dom.style, to = o.endOpacity || 0; me.queueFx(o, function(){ arguments.callee.anim = fly(dom).fxanim({ opacity : {to : to}}, o, NULL, .5, EASEOUT, function(){ if(to == 0){ Ext.Element.data(dom, 'visibilityMode') == Ext.Element.DISPLAY || o.useDisplay ? style.display = "none" : style.visibility = HIDDEN; fly(dom).clearOpacity(); } fly(dom).afterFx(o); }); }); return me; }, scale : function(w, h, o){ this.shift(Ext.apply({}, o, { width: w, height: h })); return this; }, shift : function(o){ o = getObject(o); var dom = this.dom, a = {}; this.queueFx(o, function(){ for (var prop in o) { if (o[prop] != UNDEFINED) { a[prop] = {to : o[prop]}; } } a.width ? a.width.to = fly(dom).adjustWidth(o.width) : a; a.height ? a.height.to = fly(dom).adjustWidth(o.height) : a; if (a.x || a.y || a.xy) { a.points = a.xy || {to : [ a.x ? a.x.to : fly(dom).getX(), a.y ? a.y.to : fly(dom).getY()]}; } arguments.callee.anim = fly(dom).fxanim(a, o, MOTION, .35, EASEOUT, function(){ fly(dom).afterFx(o); }); }); return this; }, ghost : function(anchor, o){ o = getObject(o); var me = this, dom = me.dom, st = dom.style, a = {opacity: {to: 0}, points: {}}, pt = a.points, r, w, h; anchor = anchor || "b"; me.queueFx(o, function(){ r = fly(dom).getFxRestore(); w = fly(dom).getWidth(); h = fly(dom).getHeight(); function after(){ o.useDisplay ? fly(dom).setDisplayed(FALSE) : fly(dom).hide(); fly(dom).clearOpacity(); fly(dom).setPositioning(r.pos); st.width = r.width; st.height = r.height; fly(dom).afterFx(o); } pt.by = fly(dom).switchStatements(anchor.toLowerCase(), function(v1,v2){ return [v1, v2];}, { t : [0, -h], l : [-w, 0], r : [w, 0], b : [0, h], tl : [-w, -h], bl : [-w, h], br : [w, h], tr : [w, -h] }); arguments.callee.anim = fly(dom).fxanim(a, o, MOTION, .5, EASEOUT, after); }); return me; }, syncFx : function(){ var me = this; me.fxDefaults = Ext.apply(me.fxDefaults || {}, { block : FALSE, concurrent : TRUE, stopFx : FALSE }); return me; }, sequenceFx : function(){ var me = this; me.fxDefaults = Ext.apply(me.fxDefaults || {}, { block : FALSE, concurrent : FALSE, stopFx : FALSE }); return me; }, nextFx : function(){ var ef = getQueue(this.dom.id)[0]; if(ef){ ef.call(this); } }, hasActiveFx : function(){ return getQueue(this.dom.id)[0]; }, stopFx : function(finish){ var me = this, id = me.dom.id; if(me.hasActiveFx()){ var cur = getQueue(id)[0]; if(cur && cur.anim){ if(cur.anim.isAnimated){ setQueue(id, [cur]); cur.anim.stop(finish !== undefined ? finish : TRUE); }else{ setQueue(id, []); } } } return me; }, beforeFx : function(o){ if(this.hasActiveFx() && !o.concurrent){ if(o.stopFx){ this.stopFx(); return TRUE; } return FALSE; } return TRUE; }, hasFxBlock : function(){ var q = getQueue(this.dom.id); return q && q[0] && q[0].block; }, queueFx : function(o, fn){ var me = fly(this.dom); if(!me.hasFxBlock()){ Ext.applyIf(o, me.fxDefaults); if(!o.concurrent){ var run = me.beforeFx(o); fn.block = o.block; getQueue(me.dom.id).push(fn); if(run){ me.nextFx(); } }else{ fn.call(me); } } return me; }, fxWrap : function(pos, o, vis){ var dom = this.dom, wrap, wrapXY; if(!o.wrap || !(wrap = Ext.getDom(o.wrap))){ if(o.fixPosition){ wrapXY = fly(dom).getXY(); } var div = document.createElement("div"); div.style.visibility = vis; wrap = dom.parentNode.insertBefore(div, dom); fly(wrap).setPositioning(pos); if(fly(wrap).isStyle(POSITION, "static")){ fly(wrap).position("relative"); } fly(dom).clearPositioning('auto'); fly(wrap).clip(); wrap.appendChild(dom); if(wrapXY){ fly(wrap).setXY(wrapXY); } } return wrap; }, fxUnwrap : function(wrap, pos, o){ var dom = this.dom; fly(dom).clearPositioning(); fly(dom).setPositioning(pos); if(!o.wrap){ var pn = fly(wrap).dom.parentNode; pn.insertBefore(dom, wrap); fly(wrap).remove(); } }, getFxRestore : function(){ var st = this.dom.style; return {pos: this.getPositioning(), width: st.width, height : st.height}; }, afterFx : function(o){ var dom = this.dom, id = dom.id; if(o.afterStyle){ fly(dom).setStyle(o.afterStyle); } if(o.afterCls){ fly(dom).addClass(o.afterCls); } if(o.remove == TRUE){ fly(dom).remove(); } if(o.callback){ o.callback.call(o.scope, fly(dom)); } if(!o.concurrent){ getQueue(id).shift(); fly(dom).nextFx(); } }, fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){ animType = animType || 'run'; opt = opt || {}; var anim = Ext.lib.Anim[animType]( this.dom, args, (opt.duration || defaultDur) || .35, (opt.easing || defaultEase) || EASEOUT, cb, this ); opt.anim = anim; return anim; } }; Ext.Fx.resize = Ext.Fx.scale; Ext.Element.addMethods(Ext.Fx); })(); Ext.CompositeElementLite = function(els, root){ this.elements = []; this.add(els, root); this.el = new Ext.Element.Flyweight(); }; Ext.CompositeElementLite.prototype = { isComposite: true, getElement : function(el){ var e = this.el; e.dom = el; e.id = el.id; return e; }, transformElement : function(el){ return Ext.getDom(el); }, getCount : function(){ return this.elements.length; }, add : function(els, root){ var me = this, elements = me.elements; if(!els){ return this; } if(typeof els == "string"){ els = Ext.Element.selectorFunction(els, root); }else if(els.isComposite){ els = els.elements; }else if(!Ext.isIterable(els)){ els = [els]; } for(var i = 0, len = els.length; i < len; ++i){ elements.push(me.transformElement(els[i])); } return me; }, invoke : function(fn, args){ var me = this, els = me.elements, len = els.length, e, i; for(i = 0; i < len; i++) { e = els[i]; if(e){ Ext.Element.prototype[fn].apply(me.getElement(e), args); } } return me; }, item : function(index){ var me = this, el = me.elements[index], out = null; if(el){ out = me.getElement(el); } return out; }, addListener : function(eventName, handler, scope, opt){ var els = this.elements, len = els.length, i, e; for(i = 0; i -1){ replacement = Ext.getDom(replacement); if(domReplace){ d = this.elements[index]; d.parentNode.insertBefore(replacement, d); Ext.removeNode(d); } this.elements.splice(index, 1, replacement); } return this; }, clear : function(){ this.elements = []; } }; Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener; Ext.CompositeElementLite.importElementMethods = function() { var fnName, ElProto = Ext.Element.prototype, CelProto = Ext.CompositeElementLite.prototype; for (fnName in ElProto) { if (typeof ElProto[fnName] == 'function'){ (function(fnName) { CelProto[fnName] = CelProto[fnName] || function() { return this.invoke(fnName, arguments); }; }).call(CelProto, fnName); } } }; Ext.CompositeElementLite.importElementMethods(); if(Ext.DomQuery){ Ext.Element.selectorFunction = Ext.DomQuery.select; } Ext.Element.select = function(selector, root){ var els; if(typeof selector == "string"){ els = Ext.Element.selectorFunction(selector, root); }else if(selector.length !== undefined){ els = selector; }else{ throw "Invalid selector"; } return new Ext.CompositeElementLite(els); }; Ext.select = Ext.Element.select; (function(){ var BEFOREREQUEST = "beforerequest", REQUESTCOMPLETE = "requestcomplete", REQUESTEXCEPTION = "requestexception", UNDEFINED = undefined, LOAD = 'load', POST = 'POST', GET = 'GET', WINDOW = window; Ext.data.Connection = function(config){ Ext.apply(this, config); this.addEvents( BEFOREREQUEST, REQUESTCOMPLETE, REQUESTEXCEPTION ); Ext.data.Connection.superclass.constructor.call(this); }; Ext.extend(Ext.data.Connection, Ext.util.Observable, { timeout : 30000, autoAbort:false, disableCaching: true, disableCachingParam: '_dc', request : function(o){ var me = this; if(me.fireEvent(BEFOREREQUEST, me, o)){ if (o.el) { if(!Ext.isEmpty(o.indicatorText)){ me.indicatorText = '
'+o.indicatorText+"
"; } if(me.indicatorText) { Ext.getDom(o.el).innerHTML = me.indicatorText; } o.success = (Ext.isFunction(o.success) ? o.success : function(){}).createInterceptor(function(response) { Ext.getDom(o.el).innerHTML = response.responseText; }); } var p = o.params, url = o.url || me.url, method, cb = {success: me.handleResponse, failure: me.handleFailure, scope: me, argument: {options: o}, timeout : Ext.num(o.timeout, me.timeout) }, form, serForm; if (Ext.isFunction(p)) { p = p.call(o.scope||WINDOW, o); } p = Ext.urlEncode(me.extraParams, Ext.isObject(p) ? Ext.urlEncode(p) : p); if (Ext.isFunction(url)) { url = url.call(o.scope || WINDOW, o); } if((form = Ext.getDom(o.form))){ url = url || form.action; if(o.isUpload || (/multipart\/form-data/i.test(form.getAttribute("enctype")))) { return me.doFormUpload.call(me, o, p, url); } serForm = Ext.lib.Ajax.serializeForm(form); p = p ? (p + '&' + serForm) : serForm; } method = o.method || me.method || ((p || o.xmlData || o.jsonData) ? POST : GET); if(method === GET && (me.disableCaching && o.disableCaching !== false) || o.disableCaching === true){ var dcp = o.disableCachingParam || me.disableCachingParam; url = Ext.urlAppend(url, dcp + '=' + (new Date().getTime())); } o.headers = Ext.applyIf(o.headers || {}, me.defaultHeaders || {}); if(o.autoAbort === true || me.autoAbort) { me.abort(); } if((method == GET || o.xmlData || o.jsonData) && p){ url = Ext.urlAppend(url, p); p = ''; } return (me.transId = Ext.lib.Ajax.request(method, url, cb, p, o)); }else{ return o.callback ? o.callback.apply(o.scope, [o,UNDEFINED,UNDEFINED]) : null; } }, isLoading : function(transId){ return transId ? Ext.lib.Ajax.isCallInProgress(transId) : !! this.transId; }, abort : function(transId){ if(transId || this.isLoading()){ Ext.lib.Ajax.abort(transId || this.transId); } }, handleResponse : function(response){ this.transId = false; var options = response.argument.options; response.argument = options ? options.argument : null; this.fireEvent(REQUESTCOMPLETE, this, response, options); if(options.success){ options.success.call(options.scope, response, options); } if(options.callback){ options.callback.call(options.scope, options, true, response); } }, handleFailure : function(response, e){ this.transId = false; var options = response.argument.options; response.argument = options ? options.argument : null; this.fireEvent(REQUESTEXCEPTION, this, response, options, e); if(options.failure){ options.failure.call(options.scope, response, options); } if(options.callback){ options.callback.call(options.scope, options, false, response); } }, doFormUpload : function(o, ps, url){ var id = Ext.id(), doc = document, frame = doc.createElement('iframe'), form = Ext.getDom(o.form), hiddens = [], hd, encoding = 'multipart/form-data', buf = { target: form.target, method: form.method, encoding: form.encoding, enctype: form.enctype, action: form.action }; Ext.fly(frame).set({ id: id, name: id, cls: 'x-hidden', src: Ext.SSL_SECURE_URL }); doc.body.appendChild(frame); if(Ext.isIE){ document.frames[id].name = id; } Ext.fly(form).set({ target: id, method: POST, enctype: encoding, encoding: encoding, action: url || buf.action }); Ext.iterate(Ext.urlDecode(ps, false), function(k, v){ hd = doc.createElement('input'); Ext.fly(hd).set({ type: 'hidden', value: v, name: k }); form.appendChild(hd); hiddens.push(hd); }); function cb(){ var me = this, r = {responseText : '', responseXML : null, argument : o.argument}, doc, firstChild; try{ doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document; if(doc){ if(doc.body){ if(/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)){ r.responseText = firstChild.value; }else{ r.responseText = doc.body.innerHTML; } } r.responseXML = doc.XMLDocument || doc; } } catch(e) {} Ext.EventManager.removeListener(frame, LOAD, cb, me); me.fireEvent(REQUESTCOMPLETE, me, r, o); function runCallback(fn, scope, args){ if(Ext.isFunction(fn)){ fn.apply(scope, args); } } runCallback(o.success, o.scope, [r, o]); runCallback(o.callback, o.scope, [o, true, r]); if(!me.debugUploads){ setTimeout(function(){Ext.removeNode(frame);}, 100); } } Ext.EventManager.on(frame, LOAD, cb, this); form.submit(); Ext.fly(form).set(buf); Ext.each(hiddens, function(h) { Ext.removeNode(h); }); } }); })(); Ext.Ajax = new Ext.data.Connection({ autoAbort : false, serializeForm : function(form){ return Ext.lib.Ajax.serializeForm(form); } }); Ext.util.JSON = new (function(){ var useHasOwn = !!{}.hasOwnProperty, isNative = function() { var useNative = null; return function() { if (useNative === null) { useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]'; } return useNative; }; }(), pad = function(n) { return n < 10 ? "0" + n : n; }, doDecode = function(json){ return json ? eval("(" + json + ")") : ""; }, doEncode = function(o){ if(!Ext.isDefined(o) || o === null){ return "null"; }else if(Ext.isArray(o)){ return encodeArray(o); }else if(Ext.isDate(o)){ return Ext.util.JSON.encodeDate(o); }else if(Ext.isString(o)){ return encodeString(o); }else if(typeof o == "number"){ return isFinite(o) ? String(o) : "null"; }else if(Ext.isBoolean(o)){ return String(o); }else { var a = ["{"], b, i, v; for (i in o) { if(!o.getElementsByTagName){ if(!useHasOwn || o.hasOwnProperty(i)) { v = o[i]; switch (typeof v) { case "undefined": case "function": case "unknown": break; default: if(b){ a.push(','); } a.push(doEncode(i), ":", v === null ? "null" : doEncode(v)); b = true; } } } } a.push("}"); return a.join(""); } }, m = { "\b": '\\b', "\t": '\\t', "\n": '\\n', "\f": '\\f', "\r": '\\r', '"' : '\\"', "\\": '\\\\' }, encodeString = function(s){ if (/["\\\x00-\x1f]/.test(s)) { return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) { var c = m[b]; if(c){ return c; } c = b.charCodeAt(); return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }) + '"'; } return '"' + s + '"'; }, encodeArray = function(o){ var a = ["["], b, i, l = o.length, v; for (i = 0; i < l; i += 1) { v = o[i]; switch (typeof v) { case "undefined": case "function": case "unknown": break; default: if (b) { a.push(','); } a.push(v === null ? "null" : Ext.util.JSON.encode(v)); b = true; } } a.push("]"); return a.join(""); }; this.encodeDate = function(o){ return '"' + o.getFullYear() + "-" + pad(o.getMonth() + 1) + "-" + pad(o.getDate()) + "T" + pad(o.getHours()) + ":" + pad(o.getMinutes()) + ":" + pad(o.getSeconds()) + '"'; }; this.encode = function() { var ec; return function(o) { if (!ec) { ec = isNative() ? JSON.stringify : doEncode; } return ec(o); }; }(); this.decode = function() { var dc; return function(json) { if (!dc) { dc = isNative() ? JSON.parse : doDecode; } return dc(json); }; }(); })(); Ext.encode = Ext.util.JSON.encode; Ext.decode = Ext.util.JSON.decode; Ext.EventManager = function(){ var docReadyEvent, docReadyProcId, docReadyState = false, DETECT_NATIVE = Ext.isGecko || Ext.isWebKit || Ext.isSafari, E = Ext.lib.Event, D = Ext.lib.Dom, DOC = document, WINDOW = window, DOMCONTENTLOADED = "DOMContentLoaded", COMPLETE = 'complete', propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/, specialElCache = []; function getId(el){ var id = false, i = 0, len = specialElCache.length, skip = false, o; if (el) { if (el.getElementById || el.navigator) { for(; i < len; ++i){ o = specialElCache[i]; if(o.el === el){ id = o.id; break; } } if(!id){ id = Ext.id(el); specialElCache.push({ id: id, el: el }); skip = true; } }else{ id = Ext.id(el); } if(!Ext.elCache[id]){ Ext.Element.addToCache(new Ext.Element(el), id); if(skip){ Ext.elCache[id].skipGC = true; } } } return id; } function addListener(el, ename, fn, task, wrap, scope){ el = Ext.getDom(el); var id = getId(el), es = Ext.elCache[id].events, wfn; wfn = E.on(el, ename, wrap); es[ename] = es[ename] || []; es[ename].push([fn, wrap, scope, wfn, task]); if(el.addEventListener && ename == "mousewheel"){ var args = ["DOMMouseScroll", wrap, false]; el.addEventListener.apply(el, args); Ext.EventManager.addListener(WINDOW, 'unload', function(){ el.removeEventListener.apply(el, args); }); } if(el == DOC && ename == "mousedown"){ Ext.EventManager.stoppedMouseDownEvent.addListener(wrap); } } function doScrollChk(){ if(window != top){ return false; } try{ DOC.documentElement.doScroll('left'); }catch(e){ return false; } fireDocReady(); return true; } function checkReadyState(e){ if(Ext.isIE && doScrollChk()){ return true; } if(DOC.readyState == COMPLETE){ fireDocReady(); return true; } docReadyState || (docReadyProcId = setTimeout(arguments.callee, 2)); return false; } var styles; function checkStyleSheets(e){ styles || (styles = Ext.query('style, link[rel=stylesheet]')); if(styles.length == DOC.styleSheets.length){ fireDocReady(); return true; } docReadyState || (docReadyProcId = setTimeout(arguments.callee, 2)); return false; } function OperaDOMContentLoaded(e){ DOC.removeEventListener(DOMCONTENTLOADED, arguments.callee, false); checkStyleSheets(); } function fireDocReady(e){ if(!docReadyState){ docReadyState = true; if(docReadyProcId){ clearTimeout(docReadyProcId); } if(DETECT_NATIVE) { DOC.removeEventListener(DOMCONTENTLOADED, fireDocReady, false); } if(Ext.isIE && checkReadyState.bindIE){ DOC.detachEvent('onreadystatechange', checkReadyState); } E.un(WINDOW, "load", arguments.callee); } if(docReadyEvent && !Ext.isReady){ Ext.isReady = true; docReadyEvent.fire(); docReadyEvent.listeners = []; } } function initDocReady(){ docReadyEvent || (docReadyEvent = new Ext.util.Event()); if (DETECT_NATIVE) { DOC.addEventListener(DOMCONTENTLOADED, fireDocReady, false); } if (Ext.isIE){ if(!checkReadyState()){ checkReadyState.bindIE = true; DOC.attachEvent('onreadystatechange', checkReadyState); } }else if(Ext.isOpera ){ (DOC.readyState == COMPLETE && checkStyleSheets()) || DOC.addEventListener(DOMCONTENTLOADED, OperaDOMContentLoaded, false); }else if (Ext.isWebKit){ checkReadyState(); } E.on(WINDOW, "load", fireDocReady); } function createTargeted(h, o){ return function(){ var args = Ext.toArray(arguments); if(o.target == Ext.EventObject.setEvent(args[0]).target){ h.apply(this, args); } }; } function createBuffered(h, o, task){ return function(e){ task.delay(o.buffer, h, null, [new Ext.EventObjectImpl(e)]); }; } function createSingle(h, el, ename, fn, scope){ return function(e){ Ext.EventManager.removeListener(el, ename, fn, scope); h(e); }; } function createDelayed(h, o, fn){ return function(e){ var task = new Ext.util.DelayedTask(h); if(!fn.tasks) { fn.tasks = []; } fn.tasks.push(task); task.delay(o.delay || 10, h, null, [new Ext.EventObjectImpl(e)]); }; } function listen(element, ename, opt, fn, scope){ var o = (!opt || typeof opt == "boolean") ? {} : opt, el = Ext.getDom(element), task; fn = fn || o.fn; scope = scope || o.scope; if(!el){ throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.'; } function h(e){ if(!Ext){ return; } e = Ext.EventObject.setEvent(e); var t; if (o.delegate) { if(!(t = e.getTarget(o.delegate, el))){ return; } } else { t = e.target; } if (o.stopEvent) { e.stopEvent(); } if (o.preventDefault) { e.preventDefault(); } if (o.stopPropagation) { e.stopPropagation(); } if (o.normalized === false) { e = e.browserEvent; } fn.call(scope || el, e, t, o); } if(o.target){ h = createTargeted(h, o); } if(o.delay){ h = createDelayed(h, o, fn); } if(o.single){ h = createSingle(h, el, ename, fn, scope); } if(o.buffer){ task = new Ext.util.DelayedTask(h); h = createBuffered(h, o, task); } addListener(el, ename, fn, task, h, scope); return h; } var pub = { addListener : function(element, eventName, fn, scope, options){ if(typeof eventName == 'object'){ var o = eventName, e, val; for(e in o){ val = o[e]; if(!propRe.test(e)){ if(Ext.isFunction(val)){ listen(element, e, o, val, o.scope); }else{ listen(element, e, val); } } } } else { listen(element, eventName, options, fn, scope); } }, removeListener : function(el, eventName, fn, scope){ el = Ext.getDom(el); var id = getId(el), f = el && (Ext.elCache[id].events)[eventName] || [], wrap, i, l, k, len, fnc; for (i = 0, len = f.length; i < len; i++) { if (Ext.isArray(fnc = f[i]) && fnc[0] == fn && (!scope || fnc[2] == scope)) { if(fnc[4]) { fnc[4].cancel(); } k = fn.tasks && fn.tasks.length; if(k) { while(k--) { fn.tasks[k].cancel(); } delete fn.tasks; } wrap = fnc[1]; E.un(el, eventName, E.extAdapter ? fnc[3] : wrap); if(wrap && el.addEventListener && eventName == "mousewheel"){ el.removeEventListener("DOMMouseScroll", wrap, false); } if(wrap && el == DOC && eventName == "mousedown"){ Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap); } f.splice(i, 1); if (f.length === 0) { delete Ext.elCache[id].events[eventName]; } for (k in Ext.elCache[id].events) { return false; } Ext.elCache[id].events = {}; return false; } } }, removeAll : function(el){ el = Ext.getDom(el); var id = getId(el), ec = Ext.elCache[id] || {}, es = ec.events || {}, f, i, len, ename, fn, k, wrap; for(ename in es){ if(es.hasOwnProperty(ename)){ f = es[ename]; for (i = 0, len = f.length; i < len; i++) { fn = f[i]; if(fn[4]) { fn[4].cancel(); } if(fn[0].tasks && (k = fn[0].tasks.length)) { while(k--) { fn[0].tasks[k].cancel(); } delete fn.tasks; } wrap = fn[1]; E.un(el, ename, E.extAdapter ? fn[3] : wrap); if(el.addEventListener && wrap && ename == "mousewheel"){ el.removeEventListener("DOMMouseScroll", wrap, false); } if(wrap && el == DOC && ename == "mousedown"){ Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap); } } } } if (Ext.elCache[id]) { Ext.elCache[id].events = {}; } }, getListeners : function(el, eventName) { el = Ext.getDom(el); var id = getId(el), ec = Ext.elCache[id] || {}, es = ec.events || {}, results = []; if (es && es[eventName]) { return es[eventName]; } else { return null; } }, purgeElement : function(el, recurse, eventName) { el = Ext.getDom(el); var id = getId(el), ec = Ext.elCache[id] || {}, es = ec.events || {}, i, f, len; if (eventName) { if (es && es.hasOwnProperty(eventName)) { f = es[eventName]; for (i = 0, len = f.length; i < len; i++) { Ext.EventManager.removeListener(el, eventName, f[i][0]); } } } else { Ext.EventManager.removeAll(el); } if (recurse && el && el.childNodes) { for (i = 0, len = el.childNodes.length; i < len; i++) { Ext.EventManager.purgeElement(el.childNodes[i], recurse, eventName); } } }, _unload : function() { var el; for (el in Ext.elCache) { Ext.EventManager.removeAll(el); } delete Ext.elCache; delete Ext.Element._flyweights; var c, conn, tid, ajax = Ext.lib.Ajax; (typeof ajax.conn == 'object') ? conn = ajax.conn : conn = {}; for (tid in conn) { c = conn[tid]; if (c) { ajax.abort({conn: c, tId: tid}); } } }, onDocumentReady : function(fn, scope, options){ if (Ext.isReady) { docReadyEvent || (docReadyEvent = new Ext.util.Event()); docReadyEvent.addListener(fn, scope, options); docReadyEvent.fire(); docReadyEvent.listeners = []; } else { if (!docReadyEvent) { initDocReady(); } options = options || {}; options.delay = options.delay || 1; docReadyEvent.addListener(fn, scope, options); } }, fireDocReady : fireDocReady }; pub.on = pub.addListener; pub.un = pub.removeListener; pub.stoppedMouseDownEvent = new Ext.util.Event(); return pub; }(); Ext.onReady = Ext.EventManager.onDocumentReady; (function(){ var initExtCss = function() { var bd = document.body || document.getElementsByTagName('body')[0]; if (!bd) { return false; } var cls = [' ', Ext.isIE ? "ext-ie " + (Ext.isIE6 ? 'ext-ie6' : (Ext.isIE7 ? 'ext-ie7' : (Ext.isIE8 ? 'ext-ie8' : 'ext-ie9'))) : Ext.isGecko ? "ext-gecko " + (Ext.isGecko2 ? 'ext-gecko2' : 'ext-gecko3') : Ext.isOpera ? "ext-opera" : Ext.isWebKit ? "ext-webkit" : ""]; if (Ext.isSafari) { cls.push("ext-safari " + (Ext.isSafari2 ? 'ext-safari2' : (Ext.isSafari3 ? 'ext-safari3' : 'ext-safari4'))); } else if(Ext.isChrome) { cls.push("ext-chrome"); } if (Ext.isMac) { cls.push("ext-mac"); } if (Ext.isLinux) { cls.push("ext-linux"); } if (Ext.isStrict || Ext.isBorderBox) { var p = bd.parentNode; if (p) { if (!Ext.isStrict) { Ext.fly(p, '_internal').addClass('x-quirks'); if (Ext.isIE && !Ext.isStrict) { Ext.isIEQuirks = true; } } Ext.fly(p, '_internal').addClass(((Ext.isStrict && Ext.isIE ) || (!Ext.enableForcedBoxModel && !Ext.isIE)) ? ' ext-strict' : ' ext-border-box'); } } if (Ext.enableForcedBoxModel && !Ext.isIE) { Ext.isForcedBorderBox = true; cls.push("ext-forced-border-box"); } Ext.fly(bd, '_internal').addClass(cls); return true; }; if (!initExtCss()) { Ext.onReady(initExtCss); } })(); (function(){ var supports = Ext.apply(Ext.supports, { correctRightMargin: true, correctTransparentColor: true, cssFloat: true }); var supportTests = function(){ var div = document.createElement('div'), doc = document, view, last; div.innerHTML = '
'; doc.body.appendChild(div); last = div.lastChild; if((view = doc.defaultView)){ if(view.getComputedStyle(div.firstChild.firstChild, null).marginRight != '0px'){ supports.correctRightMargin = false; } if(view.getComputedStyle(last, null).backgroundColor != 'transparent'){ supports.correctTransparentColor = false; } } supports.cssFloat = !!last.style.cssFloat; doc.body.removeChild(div); }; if (Ext.isReady) { supportTests(); } else { Ext.onReady(supportTests); } })(); Ext.EventObject = function(){ var E = Ext.lib.Event, clickRe = /(dbl)?click/, safariKeys = { 3 : 13, 63234 : 37, 63235 : 39, 63232 : 38, 63233 : 40, 63276 : 33, 63277 : 34, 63272 : 46, 63273 : 36, 63275 : 35 }, btnMap = Ext.isIE ? {1:0,4:1,2:2} : {0:0,1:1,2:2}; Ext.EventObjectImpl = function(e){ if(e){ this.setEvent(e.browserEvent || e); } }; Ext.EventObjectImpl.prototype = { setEvent : function(e){ var me = this; if(e == me || (e && e.browserEvent)){ return e; } me.browserEvent = e; if(e){ me.button = e.button ? btnMap[e.button] : (e.which ? e.which - 1 : -1); if(clickRe.test(e.type) && me.button == -1){ me.button = 0; } me.type = e.type; me.shiftKey = e.shiftKey; me.ctrlKey = e.ctrlKey || e.metaKey || false; me.altKey = e.altKey; me.keyCode = e.keyCode; me.charCode = e.charCode; me.target = E.getTarget(e); me.xy = E.getXY(e); }else{ me.button = -1; me.shiftKey = false; me.ctrlKey = false; me.altKey = false; me.keyCode = 0; me.charCode = 0; me.target = null; me.xy = [0, 0]; } return me; }, stopEvent : function(){ var me = this; if(me.browserEvent){ if(me.browserEvent.type == 'mousedown'){ Ext.EventManager.stoppedMouseDownEvent.fire(me); } E.stopEvent(me.browserEvent); } }, preventDefault : function(){ if(this.browserEvent){ E.preventDefault(this.browserEvent); } }, stopPropagation : function(){ var me = this; if(me.browserEvent){ if(me.browserEvent.type == 'mousedown'){ Ext.EventManager.stoppedMouseDownEvent.fire(me); } E.stopPropagation(me.browserEvent); } }, getCharCode : function(){ return this.charCode || this.keyCode; }, getKey : function(){ return this.normalizeKey(this.keyCode || this.charCode); }, normalizeKey: function(k){ return Ext.isSafari ? (safariKeys[k] || k) : k; }, getPageX : function(){ return this.xy[0]; }, getPageY : function(){ return this.xy[1]; }, getXY : function(){ return this.xy; }, getTarget : function(selector, maxDepth, returnEl){ return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target); }, getRelatedTarget : function(){ return this.browserEvent ? E.getRelatedTarget(this.browserEvent) : null; }, getWheelDelta : function(){ var e = this.browserEvent; var delta = 0; if(e.wheelDelta){ delta = e.wheelDelta/120; }else if(e.detail){ delta = -e.detail/3; } return delta; }, within : function(el, related, allowEl){ if(el){ var t = this[related ? "getRelatedTarget" : "getTarget"](); return t && ((allowEl ? (t == Ext.getDom(el)) : false) || Ext.fly(el).contains(t)); } return false; } }; return new Ext.EventObjectImpl(); }(); Ext.Loader = Ext.apply({}, { load: function(fileList, callback, scope, preserveOrder) { var scope = scope || this, head = document.getElementsByTagName("head")[0], fragment = document.createDocumentFragment(), numFiles = fileList.length, loadedFiles = 0, me = this; var loadFileIndex = function(index) { head.appendChild( me.buildScriptTag(fileList[index], onFileLoaded) ); }; var onFileLoaded = function() { loadedFiles ++; if (numFiles == loadedFiles && typeof callback == 'function') { callback.call(scope); } else { if (preserveOrder === true) { loadFileIndex(loadedFiles); } } }; if (preserveOrder === true) { loadFileIndex.call(this, 0); } else { Ext.each(fileList, function(file, index) { fragment.appendChild( this.buildScriptTag(file, onFileLoaded) ); }, this); head.appendChild(fragment); } }, buildScriptTag: function(filename, callback) { var script = document.createElement('script'); script.type = "text/javascript"; script.src = filename; if (script.readyState) { script.onreadystatechange = function() { if (script.readyState == "loaded" || script.readyState == "complete") { script.onreadystatechange = null; callback(); } }; } else { script.onload = callback; } return script; } }); Ext.ns("Ext.grid", "Ext.list", "Ext.dd", "Ext.tree", "Ext.form", "Ext.menu", "Ext.state", "Ext.layout.boxOverflow", "Ext.app", "Ext.ux", "Ext.chart", "Ext.direct", "Ext.slider"); Ext.apply(Ext, function(){ var E = Ext, idSeed = 0, scrollWidth = null; return { emptyFn : function(){}, BLANK_IMAGE_URL : Ext.isIE6 || Ext.isIE7 || Ext.isAir ? 'http:/' + '/www.extjs.com/s.gif' : 'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', extendX : function(supr, fn){ return Ext.extend(supr, fn(supr.prototype)); }, getDoc : function(){ return Ext.get(document); }, num : function(v, defaultValue){ v = Number(Ext.isEmpty(v) || Ext.isArray(v) || typeof v == 'boolean' || (typeof v == 'string' && v.trim().length == 0) ? NaN : v); return isNaN(v) ? defaultValue : v; }, value : function(v, defaultValue, allowBlank){ return Ext.isEmpty(v, allowBlank) ? defaultValue : v; }, escapeRe : function(s) { return s.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1"); }, sequence : function(o, name, fn, scope){ o[name] = o[name].createSequence(fn, scope); }, addBehaviors : function(o){ if(!Ext.isReady){ Ext.onReady(function(){ Ext.addBehaviors(o); }); } else { var cache = {}, parts, b, s; for (b in o) { if ((parts = b.split('@'))[1]) { s = parts[0]; if(!cache[s]){ cache[s] = Ext.select(s); } cache[s].on(parts[1], o[b]); } } cache = null; } }, getScrollBarWidth: function(force){ if(!Ext.isReady){ return 0; } if(force === true || scrollWidth === null){ var div = Ext.getBody().createChild('
'), child = div.child('div', true); var w1 = child.offsetWidth; div.setStyle('overflow', (Ext.isWebKit || Ext.isGecko) ? 'auto' : 'scroll'); var w2 = child.offsetWidth; div.remove(); scrollWidth = w1 - w2 + 2; } return scrollWidth; }, combine : function(){ var as = arguments, l = as.length, r = []; for(var i = 0; i < l; i++){ var a = as[i]; if(Ext.isArray(a)){ r = r.concat(a); }else if(a.length !== undefined && !a.substr){ r = r.concat(Array.prototype.slice.call(a, 0)); }else{ r.push(a); } } return r; }, copyTo : function(dest, source, names){ if(typeof names == 'string'){ names = names.split(/[,;\s]/); } Ext.each(names, function(name){ if(source.hasOwnProperty(name)){ dest[name] = source[name]; } }, this); return dest; }, destroy : function(){ Ext.each(arguments, function(arg){ if(arg){ if(Ext.isArray(arg)){ this.destroy.apply(this, arg); }else if(typeof arg.destroy == 'function'){ arg.destroy(); }else if(arg.dom){ arg.remove(); } } }, this); }, destroyMembers : function(o, arg1, arg2, etc){ for(var i = 1, a = arguments, len = a.length; i < len; i++) { Ext.destroy(o[a[i]]); delete o[a[i]]; } }, clean : function(arr){ var ret = []; Ext.each(arr, function(v){ if(!!v){ ret.push(v); } }); return ret; }, unique : function(arr){ var ret = [], collect = {}; Ext.each(arr, function(v) { if(!collect[v]){ ret.push(v); } collect[v] = true; }); return ret; }, flatten : function(arr){ var worker = []; function rFlatten(a) { Ext.each(a, function(v) { if(Ext.isArray(v)){ rFlatten(v); }else{ worker.push(v); } }); return worker; } return rFlatten(arr); }, min : function(arr, comp){ var ret = arr[0]; comp = comp || function(a,b){ return a < b ? -1 : 1; }; Ext.each(arr, function(v) { ret = comp(ret, v) == -1 ? ret : v; }); return ret; }, max : function(arr, comp){ var ret = arr[0]; comp = comp || function(a,b){ return a > b ? 1 : -1; }; Ext.each(arr, function(v) { ret = comp(ret, v) == 1 ? ret : v; }); return ret; }, mean : function(arr){ return arr.length > 0 ? Ext.sum(arr) / arr.length : undefined; }, sum : function(arr){ var ret = 0; Ext.each(arr, function(v) { ret += v; }); return ret; }, partition : function(arr, truth){ var ret = [[],[]]; Ext.each(arr, function(v, i, a) { ret[ (truth && truth(v, i, a)) || (!truth && v) ? 0 : 1].push(v); }); return ret; }, invoke : function(arr, methodName){ var ret = [], args = Array.prototype.slice.call(arguments, 2); Ext.each(arr, function(v,i) { if (v && typeof v[methodName] == 'function') { ret.push(v[methodName].apply(v, args)); } else { ret.push(undefined); } }); return ret; }, pluck : function(arr, prop){ var ret = []; Ext.each(arr, function(v) { ret.push( v[prop] ); }); return ret; }, zip : function(){ var parts = Ext.partition(arguments, function( val ){ return typeof val != 'function'; }), arrs = parts[0], fn = parts[1][0], len = Ext.max(Ext.pluck(arrs, "length")), ret = []; for (var i = 0; i < len; i++) { ret[i] = []; if(fn){ ret[i] = fn.apply(fn, Ext.pluck(arrs, i)); }else{ for (var j = 0, aLen = arrs.length; j < aLen; j++){ ret[i].push( arrs[j][i] ); } } } return ret; }, getCmp : function(id){ return Ext.ComponentMgr.get(id); }, useShims: E.isIE6 || (E.isMac && E.isGecko2), type : function(o){ if(o === undefined || o === null){ return false; } if(o.htmlElement){ return 'element'; } var t = typeof o; if(t == 'object' && o.nodeName) { switch(o.nodeType) { case 1: return 'element'; case 3: return (/\S/).test(o.nodeValue) ? 'textnode' : 'whitespace'; } } if(t == 'object' || t == 'function') { switch(o.constructor) { case Array: return 'array'; case RegExp: return 'regexp'; case Date: return 'date'; } if(typeof o.length == 'number' && typeof o.item == 'function') { return 'nodelist'; } } return t; }, intercept : function(o, name, fn, scope){ o[name] = o[name].createInterceptor(fn, scope); }, callback : function(cb, scope, args, delay){ if(typeof cb == 'function'){ if(delay){ cb.defer(delay, scope, args || []); }else{ cb.apply(scope, args || []); } } } }; }()); Ext.apply(Function.prototype, { createSequence : function(fcn, scope){ var method = this; return (typeof fcn != 'function') ? this : function(){ var retval = method.apply(this || window, arguments); fcn.apply(scope || this || window, arguments); return retval; }; } }); Ext.applyIf(String, { escape : function(string) { return string.replace(/('|\\)/g, "\\$1"); }, leftPad : function (val, size, ch) { var result = String(val); if(!ch) { ch = " "; } while (result.length < size) { result = ch + result; } return result; } }); String.prototype.toggle = function(value, other){ return this == value ? other : value; }; String.prototype.trim = function(){ var re = /^\s+|\s+$/g; return function(){ return this.replace(re, ""); }; }(); Date.prototype.getElapsed = function(date) { return Math.abs((date || new Date()).getTime()-this.getTime()); }; Ext.applyIf(Number.prototype, { constrain : function(min, max){ return Math.min(Math.max(this, min), max); } }); Ext.lib.Dom.getRegion = function(el) { return Ext.lib.Region.getRegion(el); }; Ext.lib.Region = function(t, r, b, l) { var me = this; me.top = t; me[1] = t; me.right = r; me.bottom = b; me.left = l; me[0] = l; }; Ext.lib.Region.prototype = { contains : function(region) { var me = this; return ( region.left >= me.left && region.right <= me.right && region.top >= me.top && region.bottom <= me.bottom ); }, getArea : function() { var me = this; return ( (me.bottom - me.top) * (me.right - me.left) ); }, intersect : function(region) { var me = this, t = Math.max(me.top, region.top), r = Math.min(me.right, region.right), b = Math.min(me.bottom, region.bottom), l = Math.max(me.left, region.left); if (b >= t && r >= l) { return new Ext.lib.Region(t, r, b, l); } }, union : function(region) { var me = this, t = Math.min(me.top, region.top), r = Math.max(me.right, region.right), b = Math.max(me.bottom, region.bottom), l = Math.min(me.left, region.left); return new Ext.lib.Region(t, r, b, l); }, constrainTo : function(r) { var me = this; me.top = me.top.constrain(r.top, r.bottom); me.bottom = me.bottom.constrain(r.top, r.bottom); me.left = me.left.constrain(r.left, r.right); me.right = me.right.constrain(r.left, r.right); return me; }, adjust : function(t, l, b, r) { var me = this; me.top += t; me.left += l; me.right += r; me.bottom += b; return me; } }; Ext.lib.Region.getRegion = function(el) { var p = Ext.lib.Dom.getXY(el), t = p[1], r = p[0] + el.offsetWidth, b = p[1] + el.offsetHeight, l = p[0]; return new Ext.lib.Region(t, r, b, l); }; Ext.lib.Point = function(x, y) { if (Ext.isArray(x)) { y = x[1]; x = x[0]; } var me = this; me.x = me.right = me.left = me[0] = x; me.y = me.top = me.bottom = me[1] = y; }; Ext.lib.Point.prototype = new Ext.lib.Region(); Ext.apply(Ext.DomHelper, function(){ var pub, afterbegin = 'afterbegin', afterend = 'afterend', beforebegin = 'beforebegin', beforeend = 'beforeend', confRe = /tag|children|cn|html$/i; function doInsert(el, o, returnElement, pos, sibling, append){ el = Ext.getDom(el); var newNode; if (pub.useDom) { newNode = createDom(o, null); if (append) { el.appendChild(newNode); } else { (sibling == 'firstChild' ? el : el.parentNode).insertBefore(newNode, el[sibling] || el); } } else { newNode = Ext.DomHelper.insertHtml(pos, el, Ext.DomHelper.createHtml(o)); } return returnElement ? Ext.get(newNode, true) : newNode; } function createDom(o, parentNode){ var el, doc = document, useSet, attr, val, cn; if (Ext.isArray(o)) { el = doc.createDocumentFragment(); for (var i = 0, l = o.length; i < l; i++) { createDom(o[i], el); } } else if (typeof o == 'string') { el = doc.createTextNode(o); } else { el = doc.createElement( o.tag || 'div' ); useSet = !!el.setAttribute; for (var attr in o) { if(!confRe.test(attr)){ val = o[attr]; if(attr == 'cls'){ el.className = val; }else{ if(useSet){ el.setAttribute(attr, val); }else{ el[attr] = val; } } } } Ext.DomHelper.applyStyles(el, o.style); if ((cn = o.children || o.cn)) { createDom(cn, el); } else if (o.html) { el.innerHTML = o.html; } } if(parentNode){ parentNode.appendChild(el); } return el; } pub = { createTemplate : function(o){ var html = Ext.DomHelper.createHtml(o); return new Ext.Template(html); }, useDom : false, insertBefore : function(el, o, returnElement){ return doInsert(el, o, returnElement, beforebegin); }, insertAfter : function(el, o, returnElement){ return doInsert(el, o, returnElement, afterend, 'nextSibling'); }, insertFirst : function(el, o, returnElement){ return doInsert(el, o, returnElement, afterbegin, 'firstChild'); }, append: function(el, o, returnElement){ return doInsert(el, o, returnElement, beforeend, '', true); }, createDom: createDom }; return pub; }()); Ext.apply(Ext.Template.prototype, { disableFormats : false, re : /\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, argsRe : /^\s*['"](.*)["']\s*$/, compileARe : /\\/g, compileBRe : /(\r\n|\n)/g, compileCRe : /'/g, /** * Returns an HTML fragment of this template with the specified values applied. * @param {Object/Array} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) * @return {String} The HTML fragment * @hide repeat doc */ applyTemplate : function(values){ var me = this, useF = me.disableFormats !== true, fm = Ext.util.Format, tpl = me; if(me.compiled){ return me.compiled(values); } function fn(m, name, format, args){ if (format && useF) { if (format.substr(0, 5) == "this.") { return tpl.call(format.substr(5), values[name], values); } else { if (args) { // quoted values are required for strings in compiled templates, // but for non compiled we need to strip them // quoted reversed for jsmin var re = me.argsRe; args = args.split(','); for(var i = 0, len = args.length; i < len; i++){ args[i] = args[i].replace(re, "$1"); } args = [values[name]].concat(args); } else { args = [values[name]]; } return fm[format].apply(fm, args); } } else { return values[name] !== undefined ? values[name] : ""; } } return me.html.replace(me.re, fn); }, /** * Compiles the template into an internal function, eliminating the RegEx overhead. * @return {Ext.Template} this * @hide repeat doc */ compile : function(){ var me = this, fm = Ext.util.Format, useF = me.disableFormats !== true, sep = Ext.isGecko ? "+" : ",", body; function fn(m, name, format, args){ if(format && useF){ args = args ? ',' + args : ""; if(format.substr(0, 5) != "this."){ format = "fm." + format + '('; }else{ format = 'this.call("'+ format.substr(5) + '", '; args = ", values"; } }else{ args= ''; format = "(values['" + name + "'] == undefined ? '' : "; } return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'"; } // branched to use + in gecko and [].join() in others if(Ext.isGecko){ body = "this.compiled = function(values){ return '" + me.html.replace(me.compileARe, '\\\\').replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn) + "';};"; }else{ body = ["this.compiled = function(values){ return ['"]; body.push(me.html.replace(me.compileARe, '\\\\').replace(me.compileBRe, '\\n').replace(me.compileCRe, "\\'").replace(me.re, fn)); body.push("'].join('');};"); body = body.join(''); } eval(body); return me; }, // private function used to call members call : function(fnName, value, allValues){ return this[fnName](value, allValues); } }); Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate; /** * @class Ext.util.Functions * @singleton */ Ext.util.Functions = { /** * Creates an interceptor function. The passed function is called before the original one. If it returns false, * the original one is not called. The resulting function returns the results of the original function. * The passed function is called with the parameters of the original function. Example usage: *

var sayHi = function(name){
    alert('Hi, ' + name);
}

sayHi('Fred'); // alerts "Hi, Fred"

// create a new function that validates input without
// directly modifying the original function:
var sayHiToFriend = Ext.createInterceptor(sayHi, function(name){
    return name == 'Brian';
});

sayHiToFriend('Fred');  // no alert
sayHiToFriend('Brian'); // alerts "Hi, Brian"
       
* @param {Function} origFn The original function. * @param {Function} newFn The function to call before the original * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed. * If omitted, defaults to the scope in which the original function is called or the browser window. * @return {Function} The new function */ createInterceptor: function(origFn, newFn, scope) { var method = origFn; if (!Ext.isFunction(newFn)) { return origFn; } else { return function() { var me = this, args = arguments; newFn.target = me; newFn.method = origFn; return (newFn.apply(scope || me || window, args) !== false) ? origFn.apply(me || window, args) : null; }; } }, /** * Creates a delegate (callback) that sets the scope to obj. * Call directly on any function. Example: Ext.createDelegate(this.myFunction, this, [arg1, arg2]) * Will create a function that is automatically scoped to obj so that the this variable inside the * callback points to obj. Example usage: *

var sayHi = function(name){
    // Note this use of "this.text" here.  This function expects to
    // execute within a scope that contains a text property.  In this
    // example, the "this" variable is pointing to the btn object that
    // was passed in createDelegate below.
    alert('Hi, ' + name + '. You clicked the "' + this.text + '" button.');
}

var btn = new Ext.Button({
    text: 'Say Hi',
    renderTo: Ext.getBody()
});

// This callback will execute in the scope of the
// button instance. Clicking the button alerts
// "Hi, Fred. You clicked the "Say Hi" button."
btn.on('click', Ext.createDelegate(sayHi, btn, ['Fred']));
       
* @param {Function} fn The function to delegate. * @param {Object} scope (optional) The scope (this reference) in which the function is executed. * If omitted, defaults to the browser window. * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller) * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding, * if a number the args are inserted at the specified position * @return {Function} The new function */ createDelegate: function(fn, obj, args, appendArgs) { if (!Ext.isFunction(fn)) { return fn; } return function() { var callArgs = args || arguments; if (appendArgs === true) { callArgs = Array.prototype.slice.call(arguments, 0); callArgs = callArgs.concat(args); } else if (Ext.isNumber(appendArgs)) { callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first var applyArgs = [appendArgs, 0].concat(args); // create method call params Array.prototype.splice.apply(callArgs, applyArgs); // splice them in } return fn.apply(obj || window, callArgs); }; }, /** * Calls this function after the number of millseconds specified, optionally in a specific scope. Example usage: *

var sayHi = function(name){
    alert('Hi, ' + name);
}

// executes immediately:
sayHi('Fred');

// executes after 2 seconds:
Ext.defer(sayHi, 2000, this, ['Fred']);

// this syntax is sometimes useful for deferring
// execution of an anonymous function:
Ext.defer(function(){
    alert('Anonymous');
}, 100);
       
* @param {Function} fn The function to defer. * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately) * @param {Object} scope (optional) The scope (this reference) in which the function is executed. * If omitted, defaults to the browser window. * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller) * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding, * if a number the args are inserted at the specified position * @return {Number} The timeout id that can be used with clearTimeout */ defer: function(fn, millis, obj, args, appendArgs) { fn = Ext.util.Functions.createDelegate(fn, obj, args, appendArgs); if (millis > 0) { return setTimeout(fn, millis); } fn(); return 0; }, /** * Create a combined function call sequence of the original function + the passed function. * The resulting function returns the results of the original function. * The passed fcn is called with the parameters of the original function. Example usage: * var sayHi = function(name){ alert('Hi, ' + name); } sayHi('Fred'); // alerts "Hi, Fred" var sayGoodbye = Ext.createSequence(sayHi, function(name){ alert('Bye, ' + name); }); sayGoodbye('Fred'); // both alerts show * @param {Function} origFn The original function. * @param {Function} newFn The function to sequence * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed. * If omitted, defaults to the scope in which the original function is called or the browser window. * @return {Function} The new function */ createSequence: function(origFn, newFn, scope) { if (!Ext.isFunction(newFn)) { return origFn; } else { return function() { var retval = origFn.apply(this || window, arguments); newFn.apply(scope || this || window, arguments); return retval; }; } } }; /** * Shorthand for {@link Ext.util.Functions#defer} * @param {Function} fn The function to defer. * @param {Number} millis The number of milliseconds for the setTimeout call (if less than or equal to 0 the function is executed immediately) * @param {Object} scope (optional) The scope (this reference) in which the function is executed. * If omitted, defaults to the browser window. * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller) * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding, * if a number the args are inserted at the specified position * @return {Number} The timeout id that can be used with clearTimeout * @member Ext * @method defer */ Ext.defer = Ext.util.Functions.defer; /** * Shorthand for {@link Ext.util.Functions#createInterceptor} * @param {Function} origFn The original function. * @param {Function} newFn The function to call before the original * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed. * If omitted, defaults to the scope in which the original function is called or the browser window. * @return {Function} The new function * @member Ext * @method defer */ Ext.createInterceptor = Ext.util.Functions.createInterceptor; /** * Shorthand for {@link Ext.util.Functions#createSequence} * @param {Function} origFn The original function. * @param {Function} newFn The function to sequence * @param {Object} scope (optional) The scope (this reference) in which the passed function is executed. * If omitted, defaults to the scope in which the original function is called or the browser window. * @return {Function} The new function * @member Ext * @method defer */ Ext.createSequence = Ext.util.Functions.createSequence; /** * Shorthand for {@link Ext.util.Functions#createDelegate} * @param {Function} fn The function to delegate. * @param {Object} scope (optional) The scope (this reference) in which the function is executed. * If omitted, defaults to the browser window. * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller) * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding, * if a number the args are inserted at the specified position * @return {Function} The new function * @member Ext * @method defer */ Ext.createDelegate = Ext.util.Functions.createDelegate; /** * @class Ext.util.Observable */ Ext.apply(Ext.util.Observable.prototype, function(){ // this is considered experimental (along with beforeMethod, afterMethod, removeMethodListener?) // allows for easier interceptor and sequences, including cancelling and overwriting the return value of the call // private function getMethodEvent(method){ var e = (this.methodEvents = this.methodEvents || {})[method], returnValue, v, cancel, obj = this; if (!e) { this.methodEvents[method] = e = {}; e.originalFn = this[method]; e.methodName = method; e.before = []; e.after = []; var makeCall = function(fn, scope, args){ if((v = fn.apply(scope || obj, args)) !== undefined){ if (typeof v == 'object') { if(v.returnValue !== undefined){ returnValue = v.returnValue; }else{ returnValue = v; } cancel = !!v.cancel; } else if (v === false) { cancel = true; } else { returnValue = v; } } }; this[method] = function(){ var args = Array.prototype.slice.call(arguments, 0), b; returnValue = v = undefined; cancel = false; for(var i = 0, len = e.before.length; i < len; i++){ b = e.before[i]; makeCall(b.fn, b.scope, args); if (cancel) { return returnValue; } } if((v = e.originalFn.apply(obj, args)) !== undefined){ returnValue = v; } for(var i = 0, len = e.after.length; i < len; i++){ b = e.after[i]; makeCall(b.fn, b.scope, args); if (cancel) { return returnValue; } } return returnValue; }; } return e; } return { // these are considered experimental // allows for easier interceptor and sequences, including cancelling and overwriting the return value of the call // adds an 'interceptor' called before the original method beforeMethod : function(method, fn, scope){ getMethodEvent.call(this, method).before.push({ fn: fn, scope: scope }); }, // adds a 'sequence' called after the original method afterMethod : function(method, fn, scope){ getMethodEvent.call(this, method).after.push({ fn: fn, scope: scope }); }, removeMethodListener: function(method, fn, scope){ var e = this.getMethodEvent(method); for(var i = 0, len = e.before.length; i < len; i++){ if(e.before[i].fn == fn && e.before[i].scope == scope){ e.before.splice(i, 1); return; } } for(var i = 0, len = e.after.length; i < len; i++){ if(e.after[i].fn == fn && e.after[i].scope == scope){ e.after.splice(i, 1); return; } } }, /** * Relays selected events from the specified Observable as if the events were fired by this. * @param {Object} o The Observable whose events this object is to relay. * @param {Array} events Array of event names to relay. */ relayEvents : function(o, events){ var me = this; function createHandler(ename){ return function(){ return me.fireEvent.apply(me, [ename].concat(Array.prototype.slice.call(arguments, 0))); }; } for(var i = 0, len = events.length; i < len; i++){ var ename = events[i]; me.events[ename] = me.events[ename] || true; o.on(ename, createHandler(ename), me); } }, /** *

Enables events fired by this Observable to bubble up an owner hierarchy by calling * this.getBubbleTarget() if present. There is no implementation in the Observable base class.

*

This is commonly used by Ext.Components to bubble events to owner Containers. See {@link Ext.Component.getBubbleTarget}. The default * implementation in Ext.Component returns the Component's immediate owner. But if a known target is required, this can be overridden to * access the required target more quickly.

*

Example:


Ext.override(Ext.form.Field, {
    
    initComponent : Ext.form.Field.prototype.initComponent.createSequence(function() {
        this.enableBubble('change');
    }),

    
    getBubbleTarget : function() {
        if (!this.formPanel) {
            this.formPanel = this.findParentByType('form');
        }
        return this.formPanel;
    }
});

var myForm = new Ext.formPanel({
    title: 'User Details',
    items: [{
        ...
    }],
    listeners: {
        change: function() {
            
            myForm.header.setStyle('color', 'red');
        }
    }
});
* @param {String/Array} events The event name to bubble, or an Array of event names. */ enableBubble : function(events){ var me = this; if(!Ext.isEmpty(events)){ events = Ext.isArray(events) ? events : Array.prototype.slice.call(arguments, 0); for(var i = 0, len = events.length; i < len; i++){ var ename = events[i]; ename = ename.toLowerCase(); var ce = me.events[ename] || true; if (typeof ce == 'boolean') { ce = new Ext.util.Event(me, ename); me.events[ename] = ce; } ce.bubble = true; } } } }; }()); Ext.util.Observable.capture = function(o, fn, scope){ o.fireEvent = o.fireEvent.createInterceptor(fn, scope); }; Ext.util.Observable.observeClass = function(c, listeners){ if(c){ if(!c.fireEvent){ Ext.apply(c, new Ext.util.Observable()); Ext.util.Observable.capture(c.prototype, c.fireEvent, c); } if(typeof listeners == 'object'){ c.on(listeners); } return c; } }; Ext.apply(Ext.EventManager, function(){ var resizeEvent, resizeTask, textEvent, textSize, D = Ext.lib.Dom, propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/, unload = Ext.EventManager._unload, curWidth = 0, curHeight = 0, useKeydown = Ext.isWebKit ? Ext.num(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1]) >= 525 : !((Ext.isGecko && !Ext.isWindows) || Ext.isOpera); return { _unload: function(){ Ext.EventManager.un(window, "resize", this.fireWindowResize, this); unload.call(Ext.EventManager); }, doResizeEvent: function(){ var h = D.getViewHeight(), w = D.getViewWidth(); if(curHeight != h || curWidth != w){ resizeEvent.fire(curWidth = w, curHeight = h); } }, onWindowResize : function(fn, scope, options){ if(!resizeEvent){ resizeEvent = new Ext.util.Event(); resizeTask = new Ext.util.DelayedTask(this.doResizeEvent); Ext.EventManager.on(window, "resize", this.fireWindowResize, this); } resizeEvent.addListener(fn, scope, options); }, fireWindowResize : function(){ if(resizeEvent){ resizeTask.delay(100); } }, onTextResize : function(fn, scope, options){ if(!textEvent){ textEvent = new Ext.util.Event(); var textEl = new Ext.Element(document.createElement('div')); textEl.dom.className = 'x-text-resize'; textEl.dom.innerHTML = 'X'; textEl.appendTo(document.body); textSize = textEl.dom.offsetHeight; setInterval(function(){ if(textEl.dom.offsetHeight != textSize){ textEvent.fire(textSize, textSize = textEl.dom.offsetHeight); } }, this.textResizeInterval); } textEvent.addListener(fn, scope, options); }, removeResizeListener : function(fn, scope){ if(resizeEvent){ resizeEvent.removeListener(fn, scope); } }, fireResize : function(){ if(resizeEvent){ resizeEvent.fire(D.getViewWidth(), D.getViewHeight()); } }, textResizeInterval : 50, ieDeferSrc : false, getKeyEvent : function(){ return useKeydown ? 'keydown' : 'keypress'; }, useKeydown: useKeydown }; }()); Ext.EventManager.on = Ext.EventManager.addListener; Ext.apply(Ext.EventObjectImpl.prototype, { BACKSPACE: 8, TAB: 9, NUM_CENTER: 12, ENTER: 13, RETURN: 13, SHIFT: 16, CTRL: 17, CONTROL : 17, ALT: 18, PAUSE: 19, CAPS_LOCK: 20, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGEUP : 33, PAGE_DOWN: 34, PAGEDOWN : 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, PRINT_SCREEN: 44, INSERT: 45, DELETE: 46, ZERO: 48, ONE: 49, TWO: 50, THREE: 51, FOUR: 52, FIVE: 53, SIX: 54, SEVEN: 55, EIGHT: 56, NINE: 57, A: 65, B: 66, C: 67, D: 68, E: 69, F: 70, G: 71, H: 72, I: 73, J: 74, K: 75, L: 76, M: 77, N: 78, O: 79, P: 80, Q: 81, R: 82, S: 83, T: 84, U: 85, V: 86, W: 87, X: 88, Y: 89, Z: 90, CONTEXT_MENU: 93, NUM_ZERO: 96, NUM_ONE: 97, NUM_TWO: 98, NUM_THREE: 99, NUM_FOUR: 100, NUM_FIVE: 101, NUM_SIX: 102, NUM_SEVEN: 103, NUM_EIGHT: 104, NUM_NINE: 105, NUM_MULTIPLY: 106, NUM_PLUS: 107, NUM_MINUS: 109, NUM_PERIOD: 110, NUM_DIVISION: 111, F1: 112, F2: 113, F3: 114, F4: 115, F5: 116, F6: 117, F7: 118, F8: 119, F9: 120, F10: 121, F11: 122, F12: 123, isNavKeyPress : function(){ var me = this, k = this.normalizeKey(me.keyCode); return (k >= 33 && k <= 40) || k == me.RETURN || k == me.TAB || k == me.ESC; }, isSpecialKey : function(){ var k = this.normalizeKey(this.keyCode); return (this.type == 'keypress' && this.ctrlKey) || this.isNavKeyPress() || (k == this.BACKSPACE) || (k >= 16 && k <= 20) || (k >= 44 && k <= 46); }, getPoint : function(){ return new Ext.lib.Point(this.xy[0], this.xy[1]); }, hasModifier : function(){ return ((this.ctrlKey || this.altKey) || this.shiftKey); } }); Ext.Element.addMethods({ swallowEvent : function(eventName, preventDefault) { var me = this; function fn(e) { e.stopPropagation(); if (preventDefault) { e.preventDefault(); } } if (Ext.isArray(eventName)) { Ext.each(eventName, function(e) { me.on(e, fn); }); return me; } me.on(eventName, fn); return me; }, relayEvent : function(eventName, observable) { this.on(eventName, function(e) { observable.fireEvent(eventName, e); }); }, clean : function(forceReclean) { var me = this, dom = me.dom, n = dom.firstChild, ni = -1; if (Ext.Element.data(dom, 'isCleaned') && forceReclean !== true) { return me; } while (n) { var nx = n.nextSibling; if (n.nodeType == 3 && !(/\S/.test(n.nodeValue))) { dom.removeChild(n); } else { n.nodeIndex = ++ni; } n = nx; } Ext.Element.data(dom, 'isCleaned', true); return me; }, load : function() { var updateManager = this.getUpdater(); updateManager.update.apply(updateManager, arguments); return this; }, getUpdater : function() { return this.updateManager || (this.updateManager = new Ext.Updater(this)); }, update : function(html, loadScripts, callback) { if (!this.dom) { return this; } html = html || ""; if (loadScripts !== true) { this.dom.innerHTML = html; if (typeof callback == 'function') { callback(); } return this; } var id = Ext.id(), dom = this.dom; html += ''; Ext.lib.Event.onAvailable(id, function() { var DOC = document, hd = DOC.getElementsByTagName("head")[0], re = /(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig, srcRe = /\ssrc=([\'\"])(.*?)\1/i, typeRe = /\stype=([\'\"])(.*?)\1/i, match, attrs, srcMatch, typeMatch, el, s; while ((match = re.exec(html))) { attrs = match[1]; srcMatch = attrs ? attrs.match(srcRe) : false; if (srcMatch && srcMatch[2]) { s = DOC.createElement("script"); s.src = srcMatch[2]; typeMatch = attrs.match(typeRe); if (typeMatch && typeMatch[2]) { s.type = typeMatch[2]; } hd.appendChild(s); } else if (match[2] && match[2].length > 0) { if (window.execScript) { window.execScript(match[2]); } else { window.eval(match[2]); } } } el = DOC.getElementById(id); if (el) { Ext.removeNode(el); } if (typeof callback == 'function') { callback(); } }); dom.innerHTML = html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig, ""); return this; }, removeAllListeners : function() { this.removeAnchor(); Ext.EventManager.removeAll(this.dom); return this; }, createProxy : function(config, renderTo, matchBox) { config = (typeof config == 'object') ? config : {tag : "div", cls: config}; var me = this, proxy = renderTo ? Ext.DomHelper.append(renderTo, config, true) : Ext.DomHelper.insertBefore(me.dom, config, true); if (matchBox && me.setBox && me.getBox) { proxy.setBox(me.getBox()); } return proxy; } }); Ext.Element.prototype.getUpdateManager = Ext.Element.prototype.getUpdater; Ext.Element.addMethods({ getAnchorXY : function(anchor, local, s){ anchor = (anchor || "tl").toLowerCase(); s = s || {}; var me = this, vp = me.dom == document.body || me.dom == document, w = s.width || vp ? Ext.lib.Dom.getViewWidth() : me.getWidth(), h = s.height || vp ? Ext.lib.Dom.getViewHeight() : me.getHeight(), xy, r = Math.round, o = me.getXY(), scroll = me.getScroll(), extraX = vp ? scroll.left : !local ? o[0] : 0, extraY = vp ? scroll.top : !local ? o[1] : 0, hash = { c : [r(w * 0.5), r(h * 0.5)], t : [r(w * 0.5), 0], l : [0, r(h * 0.5)], r : [w, r(h * 0.5)], b : [r(w * 0.5), h], tl : [0, 0], bl : [0, h], br : [w, h], tr : [w, 0] }; xy = hash[anchor]; return [xy[0] + extraX, xy[1] + extraY]; }, anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){ var me = this, dom = me.dom, scroll = !Ext.isEmpty(monitorScroll), action = function(){ Ext.fly(dom).alignTo(el, alignment, offsets, animate); Ext.callback(callback, Ext.fly(dom)); }, anchor = this.getAnchor(); this.removeAnchor(); Ext.apply(anchor, { fn: action, scroll: scroll }); Ext.EventManager.onWindowResize(action, null); if(scroll){ Ext.EventManager.on(window, 'scroll', action, null, {buffer: !isNaN(monitorScroll) ? monitorScroll : 50}); } action.call(me); return me; }, removeAnchor : function(){ var me = this, anchor = this.getAnchor(); if(anchor && anchor.fn){ Ext.EventManager.removeResizeListener(anchor.fn); if(anchor.scroll){ Ext.EventManager.un(window, 'scroll', anchor.fn); } delete anchor.fn; } return me; }, getAnchor : function(){ var data = Ext.Element.data, dom = this.dom; if (!dom) { return; } var anchor = data(dom, '_anchor'); if(!anchor){ anchor = data(dom, '_anchor', {}); } return anchor; }, getAlignToXY : function(el, p, o){ el = Ext.get(el); if(!el || !el.dom){ throw "Element.alignToXY with an element that doesn't exist"; } o = o || [0,0]; p = (!p || p == "?" ? "tl-bl?" : (!(/-/).test(p) && p !== "" ? "tl-" + p : p || "tl-bl")).toLowerCase(); var me = this, d = me.dom, a1, a2, x, y, w, h, r, dw = Ext.lib.Dom.getViewWidth() -10, dh = Ext.lib.Dom.getViewHeight()-10, p1y, p1x, p2y, p2x, swapY, swapX, doc = document, docElement = doc.documentElement, docBody = doc.body, scrollX = (docElement.scrollLeft || docBody.scrollLeft || 0)+5, scrollY = (docElement.scrollTop || docBody.scrollTop || 0)+5, c = false, p1 = "", p2 = "", m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/); if(!m){ throw "Element.alignTo with an invalid alignment " + p; } p1 = m[1]; p2 = m[2]; c = !!m[3]; a1 = me.getAnchorXY(p1, true); a2 = el.getAnchorXY(p2, false); x = a2[0] - a1[0] + o[0]; y = a2[1] - a1[1] + o[1]; if(c){ w = me.getWidth(); h = me.getHeight(); r = el.getRegion(); p1y = p1.charAt(0); p1x = p1.charAt(p1.length-1); p2y = p2.charAt(0); p2x = p2.charAt(p2.length-1); swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t")); swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r")); if (x + w > dw + scrollX) { x = swapX ? r.left-w : dw+scrollX-w; } if (x < scrollX) { x = swapX ? r.right : scrollX; } if (y + h > dh + scrollY) { y = swapY ? r.top-h : dh+scrollY-h; } if (y < scrollY){ y = swapY ? r.bottom : scrollY; } } return [x,y]; }, alignTo : function(element, position, offsets, animate){ var me = this; return me.setXY(me.getAlignToXY(element, position, offsets), me.preanim && !!animate ? me.preanim(arguments, 3) : false); }, adjustForConstraints : function(xy, parent, offsets){ return this.getConstrainToXY(parent || document, false, offsets, xy) || xy; }, getConstrainToXY : function(el, local, offsets, proposedXY){ var os = {top:0, left:0, bottom:0, right: 0}; return function(el, local, offsets, proposedXY){ el = Ext.get(el); offsets = offsets ? Ext.applyIf(offsets, os) : os; var vw, vh, vx = 0, vy = 0; if(el.dom == document.body || el.dom == document){ vw =Ext.lib.Dom.getViewWidth(); vh = Ext.lib.Dom.getViewHeight(); }else{ vw = el.dom.clientWidth; vh = el.dom.clientHeight; if(!local){ var vxy = el.getXY(); vx = vxy[0]; vy = vxy[1]; } } var s = el.getScroll(); vx += offsets.left + s.left; vy += offsets.top + s.top; vw -= offsets.right; vh -= offsets.bottom; var vr = vx + vw, vb = vy + vh, xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]), x = xy[0], y = xy[1], offset = this.getConstrainOffset(), w = this.dom.offsetWidth + offset, h = this.dom.offsetHeight + offset; var moved = false; if((x + w) > vr){ x = vr - w; moved = true; } if((y + h) > vb){ y = vb - h; moved = true; } if(x < vx){ x = vx; moved = true; } if(y < vy){ y = vy; moved = true; } return moved ? [x, y] : false; }; }(), getConstrainOffset : function(){ return 0; }, getCenterXY : function(){ return this.getAlignToXY(document, 'c-c'); }, center : function(centerIn){ return this.alignTo(centerIn || document, 'c-c'); } }); Ext.Element.addMethods({ select : function(selector, unique){ return Ext.Element.select(selector, unique, this.dom); } }); Ext.apply(Ext.Element.prototype, function() { var GETDOM = Ext.getDom, GET = Ext.get, DH = Ext.DomHelper; return { insertSibling: function(el, where, returnDom){ var me = this, rt, isAfter = (where || 'before').toLowerCase() == 'after', insertEl; if(Ext.isArray(el)){ insertEl = me; Ext.each(el, function(e) { rt = Ext.fly(insertEl, '_internal').insertSibling(e, where, returnDom); if(isAfter){ insertEl = rt; } }); return rt; } el = el || {}; if(el.nodeType || el.dom){ rt = me.dom.parentNode.insertBefore(GETDOM(el), isAfter ? me.dom.nextSibling : me.dom); if (!returnDom) { rt = GET(rt); } }else{ if (isAfter && !me.dom.nextSibling) { rt = DH.append(me.dom.parentNode, el, !returnDom); } else { rt = DH[isAfter ? 'insertAfter' : 'insertBefore'](me.dom, el, !returnDom); } } return rt; } }; }()); Ext.Element.boxMarkup = '
'; Ext.Element.addMethods(function(){ var INTERNAL = "_internal", pxMatch = /(\d+\.?\d+)px/; return { applyStyles : function(style){ Ext.DomHelper.applyStyles(this.dom, style); return this; }, getStyles : function(){ var ret = {}; Ext.each(arguments, function(v) { ret[v] = this.getStyle(v); }, this); return ret; }, setOverflow : function(v){ var dom = this.dom; if(v=='auto' && Ext.isMac && Ext.isGecko2){ dom.style.overflow = 'hidden'; (function(){dom.style.overflow = 'auto';}).defer(1); }else{ dom.style.overflow = v; } }, boxWrap : function(cls){ cls = cls || 'x-box'; var el = Ext.get(this.insertHtml("beforeBegin", "
" + String.format(Ext.Element.boxMarkup, cls) + "
")); Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom); return el; }, setSize : function(width, height, animate){ var me = this; if(typeof width == 'object'){ height = width.height; width = width.width; } width = me.adjustWidth(width); height = me.adjustHeight(height); if(!animate || !me.anim){ me.dom.style.width = me.addUnits(width); me.dom.style.height = me.addUnits(height); }else{ me.anim({width: {to: width}, height: {to: height}}, me.preanim(arguments, 2)); } return me; }, getComputedHeight : function(){ var me = this, h = Math.max(me.dom.offsetHeight, me.dom.clientHeight); if(!h){ h = parseFloat(me.getStyle('height')) || 0; if(!me.isBorderBox()){ h += me.getFrameWidth('tb'); } } return h; }, getComputedWidth : function(){ var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth); if(!w){ w = parseFloat(this.getStyle('width')) || 0; if(!this.isBorderBox()){ w += this.getFrameWidth('lr'); } } return w; }, getFrameWidth : function(sides, onlyContentBox){ return onlyContentBox && this.isBorderBox() ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides)); }, addClassOnOver : function(className){ this.hover( function(){ Ext.fly(this, INTERNAL).addClass(className); }, function(){ Ext.fly(this, INTERNAL).removeClass(className); } ); return this; }, addClassOnFocus : function(className){ this.on("focus", function(){ Ext.fly(this, INTERNAL).addClass(className); }, this.dom); this.on("blur", function(){ Ext.fly(this, INTERNAL).removeClass(className); }, this.dom); return this; }, addClassOnClick : function(className){ var dom = this.dom; this.on("mousedown", function(){ Ext.fly(dom, INTERNAL).addClass(className); var d = Ext.getDoc(), fn = function(){ Ext.fly(dom, INTERNAL).removeClass(className); d.removeListener("mouseup", fn); }; d.on("mouseup", fn); }); return this; }, getViewSize : function(){ var doc = document, d = this.dom, isDoc = (d == doc || d == doc.body); if (isDoc) { var extdom = Ext.lib.Dom; return { width : extdom.getViewWidth(), height : extdom.getViewHeight() }; } else { return { width : d.clientWidth, height : d.clientHeight }; } }, getStyleSize : function(){ var me = this, w, h, doc = document, d = this.dom, isDoc = (d == doc || d == doc.body), s = d.style; if (isDoc) { var extdom = Ext.lib.Dom; return { width : extdom.getViewWidth(), height : extdom.getViewHeight() }; } if(s.width && s.width != 'auto'){ w = parseFloat(s.width); if(me.isBorderBox()){ w -= me.getFrameWidth('lr'); } } if(s.height && s.height != 'auto'){ h = parseFloat(s.height); if(me.isBorderBox()){ h -= me.getFrameWidth('tb'); } } return {width: w || me.getWidth(true), height: h || me.getHeight(true)}; }, getSize : function(contentSize){ return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)}; }, repaint : function(){ var dom = this.dom; this.addClass("x-repaint"); setTimeout(function(){ Ext.fly(dom).removeClass("x-repaint"); }, 1); return this; }, unselectable : function(){ this.dom.unselectable = "on"; return this.swallowEvent("selectstart", true). applyStyles("-moz-user-select:none;-khtml-user-select:none;"). addClass("x-unselectable"); }, getMargins : function(side){ var me = this, key, hash = {t:"top", l:"left", r:"right", b: "bottom"}, o = {}; if (!side) { for (key in me.margins){ o[hash[key]] = parseFloat(me.getStyle(me.margins[key])) || 0; } return o; } else { return me.addStyles.call(me, side, me.margins); } } }; }()); Ext.Element.addMethods({ setBox : function(box, adjust, animate){ var me = this, w = box.width, h = box.height; if((adjust && !me.autoBoxAdjust) && !me.isBorderBox()){ w -= (me.getBorderWidth("lr") + me.getPadding("lr")); h -= (me.getBorderWidth("tb") + me.getPadding("tb")); } me.setBounds(box.x, box.y, w, h, me.animTest.call(me, arguments, animate, 2)); return me; }, getBox : function(contentBox, local) { var me = this, xy, left, top, getBorderWidth = me.getBorderWidth, getPadding = me.getPadding, l, r, t, b; if(!local){ xy = me.getXY(); }else{ left = parseInt(me.getStyle("left"), 10) || 0; top = parseInt(me.getStyle("top"), 10) || 0; xy = [left, top]; } var el = me.dom, w = el.offsetWidth, h = el.offsetHeight, bx; if(!contentBox){ bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h}; }else{ l = getBorderWidth.call(me, "l") + getPadding.call(me, "l"); r = getBorderWidth.call(me, "r") + getPadding.call(me, "r"); t = getBorderWidth.call(me, "t") + getPadding.call(me, "t"); b = getBorderWidth.call(me, "b") + getPadding.call(me, "b"); bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)}; } bx.right = bx.x + bx.width; bx.bottom = bx.y + bx.height; return bx; }, move : function(direction, distance, animate){ var me = this, xy = me.getXY(), x = xy[0], y = xy[1], left = [x - distance, y], right = [x + distance, y], top = [x, y - distance], bottom = [x, y + distance], hash = { l : left, left : left, r : right, right : right, t : top, top : top, up : top, b : bottom, bottom : bottom, down : bottom }; direction = direction.toLowerCase(); me.moveTo(hash[direction][0], hash[direction][1], me.animTest.call(me, arguments, animate, 2)); }, setLeftTop : function(left, top){ var me = this, style = me.dom.style; style.left = me.addUnits(left); style.top = me.addUnits(top); return me; }, getRegion : function(){ return Ext.lib.Dom.getRegion(this.dom); }, setBounds : function(x, y, width, height, animate){ var me = this; if (!animate || !me.anim) { me.setSize(width, height); me.setLocation(x, y); } else { me.anim({points: {to: [x, y]}, width: {to: me.adjustWidth(width)}, height: {to: me.adjustHeight(height)}}, me.preanim(arguments, 4), 'motion'); } return me; }, setRegion : function(region, animate) { return this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.animTest.call(this, arguments, animate, 1)); } }); Ext.Element.addMethods({ scrollTo : function(side, value, animate) { var top = /top/i.test(side), me = this, dom = me.dom, prop; if (!animate || !me.anim) { prop = 'scroll' + (top ? 'Top' : 'Left'); dom[prop] = value; } else { prop = 'scroll' + (top ? 'Left' : 'Top'); me.anim({scroll: {to: top ? [dom[prop], value] : [value, dom[prop]]}}, me.preanim(arguments, 2), 'scroll'); } return me; }, scrollIntoView : function(container, hscroll) { var c = Ext.getDom(container) || Ext.getBody().dom, el = this.dom, o = this.getOffsetsTo(c), l = o[0] + c.scrollLeft, t = o[1] + c.scrollTop, b = t + el.offsetHeight, r = l + el.offsetWidth, ch = c.clientHeight, ct = parseInt(c.scrollTop, 10), cl = parseInt(c.scrollLeft, 10), cb = ct + ch, cr = cl + c.clientWidth; if (el.offsetHeight > ch || t < ct) { c.scrollTop = t; } else if (b > cb) { c.scrollTop = b-ch; } c.scrollTop = c.scrollTop; if (hscroll !== false) { if (el.offsetWidth > c.clientWidth || l < cl) { c.scrollLeft = l; } else if (r > cr) { c.scrollLeft = r - c.clientWidth; } c.scrollLeft = c.scrollLeft; } return this; }, scrollChildIntoView : function(child, hscroll) { Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll); }, scroll : function(direction, distance, animate) { if (!this.isScrollable()) { return false; } var el = this.dom, l = el.scrollLeft, t = el.scrollTop, w = el.scrollWidth, h = el.scrollHeight, cw = el.clientWidth, ch = el.clientHeight, scrolled = false, v, hash = { l: Math.min(l + distance, w-cw), r: v = Math.max(l - distance, 0), t: Math.max(t - distance, 0), b: Math.min(t + distance, h-ch) }; hash.d = hash.b; hash.u = hash.t; direction = direction.substr(0, 1); if ((v = hash[direction]) > -1) { scrolled = true; this.scrollTo(direction == 'l' || direction == 'r' ? 'left' : 'top', v, this.preanim(arguments, 2)); } return scrolled; } }); Ext.Element.addMethods( function() { var VISIBILITY = "visibility", DISPLAY = "display", HIDDEN = "hidden", NONE = "none", XMASKED = "x-masked", XMASKEDRELATIVE = "x-masked-relative", data = Ext.Element.data; return { isVisible : function(deep) { var vis = !this.isStyle(VISIBILITY, HIDDEN) && !this.isStyle(DISPLAY, NONE), p = this.dom.parentNode; if (deep !== true || !vis) { return vis; } while (p && !(/^body/i.test(p.tagName))) { if (!Ext.fly(p, '_isVisible').isVisible()) { return false; } p = p.parentNode; } return true; }, isDisplayed : function() { return !this.isStyle(DISPLAY, NONE); }, enableDisplayMode : function(display) { this.setVisibilityMode(Ext.Element.DISPLAY); if (!Ext.isEmpty(display)) { data(this.dom, 'originalDisplay', display); } return this; }, mask : function(msg, msgCls) { var me = this, dom = me.dom, dh = Ext.DomHelper, EXTELMASKMSG = "ext-el-mask-msg", el, mask; if (!/^body/i.test(dom.tagName) && me.getStyle('position') == 'static') { me.addClass(XMASKEDRELATIVE); } if (el = data(dom, 'maskMsg')) { el.remove(); } if (el = data(dom, 'mask')) { el.remove(); } mask = dh.append(dom, {cls : "ext-el-mask"}, true); data(dom, 'mask', mask); me.addClass(XMASKED); mask.setDisplayed(true); if (typeof msg == 'string') { var mm = dh.append(dom, {cls : EXTELMASKMSG, cn:{tag:'div'}}, true); data(dom, 'maskMsg', mm); mm.dom.className = msgCls ? EXTELMASKMSG + " " + msgCls : EXTELMASKMSG; mm.dom.firstChild.innerHTML = msg; mm.setDisplayed(true); mm.center(me); } if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && me.getStyle('height') == 'auto') { mask.setSize(undefined, me.getHeight()); } return mask; }, unmask : function() { var me = this, dom = me.dom, mask = data(dom, 'mask'), maskMsg = data(dom, 'maskMsg'); if (mask) { if (maskMsg) { maskMsg.remove(); data(dom, 'maskMsg', undefined); } mask.remove(); data(dom, 'mask', undefined); me.removeClass([XMASKED, XMASKEDRELATIVE]); } }, isMasked : function() { var m = data(this.dom, 'mask'); return m && m.isVisible(); }, createShim : function() { var el = document.createElement('iframe'), shim; el.frameBorder = '0'; el.className = 'ext-shim'; el.src = Ext.SSL_SECURE_URL; shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom)); shim.autoBoxAdjust = false; return shim; } }; }() ); Ext.Element.addMethods({ addKeyListener : function(key, fn, scope){ var config; if(typeof key != 'object' || Ext.isArray(key)){ config = { key: key, fn: fn, scope: scope }; }else{ config = { key : key.key, shift : key.shift, ctrl : key.ctrl, alt : key.alt, fn: fn, scope: scope }; } return new Ext.KeyMap(this, config); }, addKeyMap : function(config){ return new Ext.KeyMap(this, config); } }); Ext.CompositeElementLite.importElementMethods(); Ext.apply(Ext.CompositeElementLite.prototype, { addElements : function(els, root){ if(!els){ return this; } if(typeof els == "string"){ els = Ext.Element.selectorFunction(els, root); } var yels = this.elements; Ext.each(els, function(e) { yels.push(Ext.get(e)); }); return this; }, first : function(){ return this.item(0); }, last : function(){ return this.item(this.getCount()-1); }, contains : function(el){ return this.indexOf(el) != -1; }, removeElement : function(keys, removeDom){ var me = this, els = this.elements, el; Ext.each(keys, function(val){ if ((el = (els[val] || els[val = me.indexOf(val)]))) { if(removeDom){ if(el.dom){ el.remove(); }else{ Ext.removeNode(el); } } els.splice(val, 1); } }); return this; } }); Ext.CompositeElement = Ext.extend(Ext.CompositeElementLite, { constructor : function(els, root){ this.elements = []; this.add(els, root); }, getElement : function(el){ return el; }, transformElement : function(el){ return Ext.get(el); } }); Ext.Element.select = function(selector, unique, root){ var els; if(typeof selector == "string"){ els = Ext.Element.selectorFunction(selector, root); }else if(selector.length !== undefined){ els = selector; }else{ throw "Invalid selector"; } return (unique === true) ? new Ext.CompositeElement(els) : new Ext.CompositeElementLite(els); }; Ext.select = Ext.Element.select; Ext.UpdateManager = Ext.Updater = Ext.extend(Ext.util.Observable, function() { var BEFOREUPDATE = "beforeupdate", UPDATE = "update", FAILURE = "failure"; function processSuccess(response){ var me = this; me.transaction = null; if (response.argument.form && response.argument.reset) { try { response.argument.form.reset(); } catch(e){} } if (me.loadScripts) { me.renderer.render(me.el, response, me, updateComplete.createDelegate(me, [response])); } else { me.renderer.render(me.el, response, me); updateComplete.call(me, response); } } function updateComplete(response, type, success){ this.fireEvent(type || UPDATE, this.el, response); if(Ext.isFunction(response.argument.callback)){ response.argument.callback.call(response.argument.scope, this.el, Ext.isEmpty(success) ? true : false, response, response.argument.options); } } function processFailure(response){ updateComplete.call(this, response, FAILURE, !!(this.transaction = null)); } return { constructor: function(el, forceNew){ var me = this; el = Ext.get(el); if(!forceNew && el.updateManager){ return el.updateManager; } me.el = el; me.defaultUrl = null; me.addEvents( BEFOREUPDATE, UPDATE, FAILURE ); Ext.apply(me, Ext.Updater.defaults); me.transaction = null; me.refreshDelegate = me.refresh.createDelegate(me); me.updateDelegate = me.update.createDelegate(me); me.formUpdateDelegate = (me.formUpdate || function(){}).createDelegate(me); me.renderer = me.renderer || me.getDefaultRenderer(); Ext.Updater.superclass.constructor.call(me); }, setRenderer : function(renderer){ this.renderer = renderer; }, getRenderer : function(){ return this.renderer; }, getDefaultRenderer: function() { return new Ext.Updater.BasicRenderer(); }, setDefaultUrl : function(defaultUrl){ this.defaultUrl = defaultUrl; }, getEl : function(){ return this.el; }, update : function(url, params, callback, discardUrl){ var me = this, cfg, callerScope; if(me.fireEvent(BEFOREUPDATE, me.el, url, params) !== false){ if(Ext.isObject(url)){ cfg = url; url = cfg.url; params = params || cfg.params; callback = callback || cfg.callback; discardUrl = discardUrl || cfg.discardUrl; callerScope = cfg.scope; if(!Ext.isEmpty(cfg.nocache)){me.disableCaching = cfg.nocache;}; if(!Ext.isEmpty(cfg.text)){me.indicatorText = '
'+cfg.text+"
";}; if(!Ext.isEmpty(cfg.scripts)){me.loadScripts = cfg.scripts;}; if(!Ext.isEmpty(cfg.timeout)){me.timeout = cfg.timeout;}; } me.showLoading(); if(!discardUrl){ me.defaultUrl = url; } if(Ext.isFunction(url)){ url = url.call(me); } var o = Ext.apply({}, { url : url, params: (Ext.isFunction(params) && callerScope) ? params.createDelegate(callerScope) : params, success: processSuccess, failure: processFailure, scope: me, callback: undefined, timeout: (me.timeout*1000), disableCaching: me.disableCaching, argument: { "options": cfg, "url": url, "form": null, "callback": callback, "scope": callerScope || window, "params": params } }, cfg); me.transaction = Ext.Ajax.request(o); } }, formUpdate : function(form, url, reset, callback){ var me = this; if(me.fireEvent(BEFOREUPDATE, me.el, form, url) !== false){ if(Ext.isFunction(url)){ url = url.call(me); } form = Ext.getDom(form); me.transaction = Ext.Ajax.request({ form: form, url:url, success: processSuccess, failure: processFailure, scope: me, timeout: (me.timeout*1000), argument: { "url": url, "form": form, "callback": callback, "reset": reset } }); me.showLoading.defer(1, me); } }, startAutoRefresh : function(interval, url, params, callback, refreshNow){ var me = this; if(refreshNow){ me.update(url || me.defaultUrl, params, callback, true); } if(me.autoRefreshProcId){ clearInterval(me.autoRefreshProcId); } me.autoRefreshProcId = setInterval(me.update.createDelegate(me, [url || me.defaultUrl, params, callback, true]), interval * 1000); }, stopAutoRefresh : function(){ if(this.autoRefreshProcId){ clearInterval(this.autoRefreshProcId); delete this.autoRefreshProcId; } }, isAutoRefreshing : function(){ return !!this.autoRefreshProcId; }, showLoading : function(){ if(this.showLoadIndicator){ this.el.dom.innerHTML = this.indicatorText; } }, abort : function(){ if(this.transaction){ Ext.Ajax.abort(this.transaction); } }, isUpdating : function(){ return this.transaction ? Ext.Ajax.isLoading(this.transaction) : false; }, refresh : function(callback){ if(this.defaultUrl){ this.update(this.defaultUrl, null, callback, true); } } }; }()); Ext.Updater.defaults = { timeout : 30, disableCaching : false, showLoadIndicator : true, indicatorText : '
Loading...
', loadScripts : false, sslBlankUrl : Ext.SSL_SECURE_URL }; Ext.Updater.updateElement = function(el, url, params, options){ var um = Ext.get(el).getUpdater(); Ext.apply(um, options); um.update(url, params, options ? options.callback : null); }; Ext.Updater.BasicRenderer = function(){}; Ext.Updater.BasicRenderer.prototype = { render : function(el, response, updateManager, callback){ el.update(response.responseText, updateManager.loadScripts, callback); } }; (function() { Date.useStrict = false; function xf(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/\{(\d+)\}/g, function(m, i) { return args[i]; }); } Date.formatCodeToRegex = function(character, currentGroup) { var p = Date.parseCodes[character]; if (p) { p = typeof p == 'function'? p() : p; Date.parseCodes[character] = p; } return p ? Ext.applyIf({ c: p.c ? xf(p.c, currentGroup || "{0}") : p.c }, p) : { g:0, c:null, s:Ext.escapeRe(character) }; }; var $f = Date.formatCodeToRegex; Ext.apply(Date, { parseFunctions: { "M$": function(input, strict) { var re = new RegExp('\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/'); var r = (input || '').match(re); return r? new Date(((r[1] || '') + r[2]) * 1) : null; } }, parseRegexes: [], formatFunctions: { "M$": function() { return '\\/Date(' + this.getTime() + ')\\/'; } }, y2kYear : 50, MILLI : "ms", SECOND : "s", MINUTE : "mi", HOUR : "h", DAY : "d", MONTH : "mo", YEAR : "y", defaults: {}, dayNames : [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], monthNames : [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], monthNumbers : { Jan:0, Feb:1, Mar:2, Apr:3, May:4, Jun:5, Jul:6, Aug:7, Sep:8, Oct:9, Nov:10, Dec:11 }, getShortMonthName : function(month) { return Date.monthNames[month].substring(0, 3); }, getShortDayName : function(day) { return Date.dayNames[day].substring(0, 3); }, getMonthNumber : function(name) { return Date.monthNumbers[name.substring(0, 1).toUpperCase() + name.substring(1, 3).toLowerCase()]; }, formatContainsHourInfo : (function(){ var stripEscapeRe = /(\\.)/g, hourInfoRe = /([gGhHisucUOPZ]|M\$)/; return function(format){ return hourInfoRe.test(format.replace(stripEscapeRe, '')); }; })(), formatCodes : { d: "String.leftPad(this.getDate(), 2, '0')", D: "Date.getShortDayName(this.getDay())", j: "this.getDate()", l: "Date.dayNames[this.getDay()]", N: "(this.getDay() ? this.getDay() : 7)", S: "this.getSuffix()", w: "this.getDay()", z: "this.getDayOfYear()", W: "String.leftPad(this.getWeekOfYear(), 2, '0')", F: "Date.monthNames[this.getMonth()]", m: "String.leftPad(this.getMonth() + 1, 2, '0')", M: "Date.getShortMonthName(this.getMonth())", n: "(this.getMonth() + 1)", t: "this.getDaysInMonth()", L: "(this.isLeapYear() ? 1 : 0)", o: "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))", Y: "String.leftPad(this.getFullYear(), 4, '0')", y: "('' + this.getFullYear()).substring(2, 4)", a: "(this.getHours() < 12 ? 'am' : 'pm')", A: "(this.getHours() < 12 ? 'AM' : 'PM')", g: "((this.getHours() % 12) ? this.getHours() % 12 : 12)", G: "this.getHours()", h: "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')", H: "String.leftPad(this.getHours(), 2, '0')", i: "String.leftPad(this.getMinutes(), 2, '0')", s: "String.leftPad(this.getSeconds(), 2, '0')", u: "String.leftPad(this.getMilliseconds(), 3, '0')", O: "this.getGMTOffset()", P: "this.getGMTOffset(true)", T: "this.getTimezone()", Z: "(this.getTimezoneOffset() * -60)", c: function() { for (var c = "Y-m-dTH:i:sP", code = [], i = 0, l = c.length; i < l; ++i) { var e = c.charAt(i); code.push(e == "T" ? "'T'" : Date.getFormatCode(e)); } return code.join(" + "); }, U: "Math.round(this.getTime() / 1000)" }, isValid : function(y, m, d, h, i, s, ms) { h = h || 0; i = i || 0; s = s || 0; ms = ms || 0; var dt = new Date(y < 100 ? 100 : y, m - 1, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0); return y == dt.getFullYear() && m == dt.getMonth() + 1 && d == dt.getDate() && h == dt.getHours() && i == dt.getMinutes() && s == dt.getSeconds() && ms == dt.getMilliseconds(); }, parseDate : function(input, format, strict) { var p = Date.parseFunctions; if (p[format] == null) { Date.createParser(format); } return p[format](input, Ext.isDefined(strict) ? strict : Date.useStrict); }, getFormatCode : function(character) { var f = Date.formatCodes[character]; if (f) { f = typeof f == 'function'? f() : f; Date.formatCodes[character] = f; } return f || ("'" + String.escape(character) + "'"); }, createFormat : function(format) { var code = [], special = false, ch = ''; for (var i = 0; i < format.length; ++i) { ch = format.charAt(i); if (!special && ch == "\\") { special = true; } else if (special) { special = false; code.push("'" + String.escape(ch) + "'"); } else { code.push(Date.getFormatCode(ch)); } } Date.formatFunctions[format] = new Function("return " + code.join('+')); }, createParser : function() { var code = [ "var dt, y, m, d, h, i, s, ms, o, z, zz, u, v,", "def = Date.defaults,", "results = String(input).match(Date.parseRegexes[{0}]);", "if(results){", "{1}", "if(u != null){", "v = new Date(u * 1000);", "}else{", "dt = (new Date()).clearTime();", "y = Ext.num(y, Ext.num(def.y, dt.getFullYear()));", "m = Ext.num(m, Ext.num(def.m - 1, dt.getMonth()));", "d = Ext.num(d, Ext.num(def.d, dt.getDate()));", "h = Ext.num(h, Ext.num(def.h, dt.getHours()));", "i = Ext.num(i, Ext.num(def.i, dt.getMinutes()));", "s = Ext.num(s, Ext.num(def.s, dt.getSeconds()));", "ms = Ext.num(ms, Ext.num(def.ms, dt.getMilliseconds()));", "if(z >= 0 && y >= 0){", "v = new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);", "v = !strict? v : (strict === true && (z <= 364 || (v.isLeapYear() && z <= 365))? v.add(Date.DAY, z) : null);", "}else if(strict === true && !Date.isValid(y, m + 1, d, h, i, s, ms)){", "v = null;", "}else{", "v = new Date(y < 100 ? 100 : y, m, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);", "}", "}", "}", "if(v){", "if(zz != null){", "v = v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - zz);", "}else if(o){", "v = v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));", "}", "}", "return v;" ].join('\n'); return function(format) { var regexNum = Date.parseRegexes.length, currentGroup = 1, calc = [], regex = [], special = false, ch = "", i = 0, obj, last; for (; i < format.length; ++i) { ch = format.charAt(i); if (!special && ch == "\\") { special = true; } else if (special) { special = false; regex.push(String.escape(ch)); } else { obj = $f(ch, currentGroup); currentGroup += obj.g; regex.push(obj.s); if (obj.g && obj.c) { if (obj.calcLast) { last = obj.c; } else { calc.push(obj.c); } } } } if (last) { calc.push(last); } Date.parseRegexes[regexNum] = new RegExp("^" + regex.join('') + "$", 'i'); Date.parseFunctions[format] = new Function("input", "strict", xf(code, regexNum, calc.join(''))); }; }(), parseCodes : { d: { g:1, c:"d = parseInt(results[{0}], 10);\n", s:"(\\d{2})" }, j: { g:1, c:"d = parseInt(results[{0}], 10);\n", s:"(\\d{1,2})" }, D: function() { for (var a = [], i = 0; i < 7; a.push(Date.getShortDayName(i)), ++i); return { g:0, c:null, s:"(?:" + a.join("|") +")" }; }, l: function() { return { g:0, c:null, s:"(?:" + Date.dayNames.join("|") + ")" }; }, N: { g:0, c:null, s:"[1-7]" }, S: { g:0, c:null, s:"(?:st|nd|rd|th)" }, w: { g:0, c:null, s:"[0-6]" }, z: { g:1, c:"z = parseInt(results[{0}], 10);\n", s:"(\\d{1,3})" }, W: { g:0, c:null, s:"(?:\\d{2})" }, F: function() { return { g:1, c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n", s:"(" + Date.monthNames.join("|") + ")" }; }, M: function() { for (var a = [], i = 0; i < 12; a.push(Date.getShortMonthName(i)), ++i); return Ext.applyIf({ s:"(" + a.join("|") + ")" }, $f("F")); }, m: { g:1, c:"m = parseInt(results[{0}], 10) - 1;\n", s:"(\\d{2})" }, n: { g:1, c:"m = parseInt(results[{0}], 10) - 1;\n", s:"(\\d{1,2})" }, t: { g:0, c:null, s:"(?:\\d{2})" }, L: { g:0, c:null, s:"(?:1|0)" }, o: function() { return $f("Y"); }, Y: { g:1, c:"y = parseInt(results[{0}], 10);\n", s:"(\\d{4})" }, y: { g:1, c:"var ty = parseInt(results[{0}], 10);\n" + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n", s:"(\\d{1,2})" }, a: function(){ return $f("A"); }, A: { calcLast: true, g:1, c:"if (/(am)/i.test(results[{0}])) {\n" + "if (!h || h == 12) { h = 0; }\n" + "} else { if (!h || h < 12) { h = (h || 0) + 12; }}", s:"(AM|PM|am|pm)" }, g: function() { return $f("G"); }, G: { g:1, c:"h = parseInt(results[{0}], 10);\n", s:"(\\d{1,2})" }, h: function() { return $f("H"); }, H: { g:1, c:"h = parseInt(results[{0}], 10);\n", s:"(\\d{2})" }, i: { g:1, c:"i = parseInt(results[{0}], 10);\n", s:"(\\d{2})" }, s: { g:1, c:"s = parseInt(results[{0}], 10);\n", s:"(\\d{2})" }, u: { g:1, c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n", s:"(\\d+)" }, O: { g:1, c:[ "o = results[{0}];", "var sn = o.substring(0,1),", "hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),", "mn = o.substring(3,5) % 60;", "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" ].join("\n"), s: "([+\-]\\d{4})" }, P: { g:1, c:[ "o = results[{0}];", "var sn = o.substring(0,1),", "hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),", "mn = o.substring(4,6) % 60;", "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" ].join("\n"), s: "([+\-]\\d{2}:\\d{2})" }, T: { g:0, c:null, s:"[A-Z]{1,4}" }, Z: { g:1, c:"zz = results[{0}] * 1;\n" + "zz = (-43200 <= zz && zz <= 50400)? zz : null;\n", s:"([+\-]?\\d{1,5})" }, c: function() { var calc = [], arr = [ $f("Y", 1), $f("m", 2), $f("d", 3), $f("h", 4), $f("i", 5), $f("s", 6), {c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"}, {c:[ "if(results[8]) {", "if(results[8] == 'Z'){", "zz = 0;", "}else if (results[8].indexOf(':') > -1){", $f("P", 8).c, "}else{", $f("O", 8).c, "}", "}" ].join('\n')} ]; for (var i = 0, l = arr.length; i < l; ++i) { calc.push(arr[i].c); } return { g:1, c:calc.join(""), s:[ arr[0].s, "(?:", "-", arr[1].s, "(?:", "-", arr[2].s, "(?:", "(?:T| )?", arr[3].s, ":", arr[4].s, "(?::", arr[5].s, ")?", "(?:(?:\\.|,)(\\d+))?", "(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?", ")?", ")?", ")?" ].join("") }; }, U: { g:1, c:"u = parseInt(results[{0}], 10);\n", s:"(-?\\d+)" } } }); }()); Ext.apply(Date.prototype, { dateFormat : function(format) { if (Date.formatFunctions[format] == null) { Date.createFormat(format); } return Date.formatFunctions[format].call(this); }, getTimezone : function() { return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/, "$1$2").replace(/[^A-Z]/g, ""); }, getGMTOffset : function(colon) { return (this.getTimezoneOffset() > 0 ? "-" : "+") + String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset()) / 60), 2, "0") + (colon ? ":" : "") + String.leftPad(Math.abs(this.getTimezoneOffset() % 60), 2, "0"); }, getDayOfYear: function() { var num = 0, d = this.clone(), m = this.getMonth(), i; for (i = 0, d.setDate(1), d.setMonth(0); i < m; d.setMonth(++i)) { num += d.getDaysInMonth(); } return num + this.getDate() - 1; }, getWeekOfYear : function() { var ms1d = 864e5, ms7d = 7 * ms1d; return function() { var DC3 = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3) / ms1d, AWN = Math.floor(DC3 / 7), Wyr = new Date(AWN * ms7d).getUTCFullYear(); return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1; }; }(), isLeapYear : function() { var year = this.getFullYear(); return !!((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year))); }, getFirstDayOfMonth : function() { var day = (this.getDay() - (this.getDate() - 1)) % 7; return (day < 0) ? (day + 7) : day; }, getLastDayOfMonth : function() { return this.getLastDateOfMonth().getDay(); }, getFirstDateOfMonth : function() { return new Date(this.getFullYear(), this.getMonth(), 1); }, getLastDateOfMonth : function() { return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth()); }, getDaysInMonth: function() { var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; return function() { var m = this.getMonth(); return m == 1 && this.isLeapYear() ? 29 : daysInMonth[m]; }; }(), getSuffix : function() { switch (this.getDate()) { case 1: case 21: case 31: return "st"; case 2: case 22: return "nd"; case 3: case 23: return "rd"; default: return "th"; } }, clone : function() { return new Date(this.getTime()); }, isDST : function() { return new Date(this.getFullYear(), 0, 1).getTimezoneOffset() != this.getTimezoneOffset(); }, clearTime : function(clone) { if (clone) { return this.clone().clearTime(); } var d = this.getDate(); this.setHours(0); this.setMinutes(0); this.setSeconds(0); this.setMilliseconds(0); if (this.getDate() != d) { for (var hr = 1, c = this.add(Date.HOUR, hr); c.getDate() != d; hr++, c = this.add(Date.HOUR, hr)); this.setDate(d); this.setHours(c.getHours()); } return this; }, add : function(interval, value) { var d = this.clone(); if (!interval || value === 0) return d; switch(interval.toLowerCase()) { case Date.MILLI: d.setMilliseconds(this.getMilliseconds() + value); break; case Date.SECOND: d.setSeconds(this.getSeconds() + value); break; case Date.MINUTE: d.setMinutes(this.getMinutes() + value); break; case Date.HOUR: d.setHours(this.getHours() + value); break; case Date.DAY: d.setDate(this.getDate() + value); break; case Date.MONTH: var day = this.getDate(); if (day > 28) { day = Math.min(day, this.getFirstDateOfMonth().add('mo', value).getLastDateOfMonth().getDate()); } d.setDate(day); d.setMonth(this.getMonth() + value); break; case Date.YEAR: d.setFullYear(this.getFullYear() + value); break; } return d; }, between : function(start, end) { var t = this.getTime(); return start.getTime() <= t && t <= end.getTime(); } }); Date.prototype.format = Date.prototype.dateFormat; if (Ext.isSafari && (navigator.userAgent.match(/WebKit\/(\d+)/)[1] || NaN) < 420) { Ext.apply(Date.prototype, { _xMonth : Date.prototype.setMonth, _xDate : Date.prototype.setDate, setMonth : function(num) { if (num <= -1) { var n = Math.ceil(-num), back_year = Math.ceil(n / 12), month = (n % 12) ? 12 - n % 12 : 0; this.setFullYear(this.getFullYear() - back_year); return this._xMonth(month); } else { return this._xMonth(num); } }, setDate : function(d) { return this.setTime(this.getTime() - (this.getDate() - d) * 864e5); } }); } Ext.util.MixedCollection = function(allowFunctions, keyFn){ this.items = []; this.map = {}; this.keys = []; this.length = 0; this.addEvents( 'clear', 'add', 'replace', 'remove', 'sort' ); this.allowFunctions = allowFunctions === true; if(keyFn){ this.getKey = keyFn; } Ext.util.MixedCollection.superclass.constructor.call(this); }; Ext.extend(Ext.util.MixedCollection, Ext.util.Observable, { allowFunctions : false, add : function(key, o){ if(arguments.length == 1){ o = arguments[0]; key = this.getKey(o); } if(typeof key != 'undefined' && key !== null){ var old = this.map[key]; if(typeof old != 'undefined'){ return this.replace(key, o); } this.map[key] = o; } this.length++; this.items.push(o); this.keys.push(key); this.fireEvent('add', this.length-1, o, key); return o; }, getKey : function(o){ return o.id; }, replace : function(key, o){ if(arguments.length == 1){ o = arguments[0]; key = this.getKey(o); } var old = this.map[key]; if(typeof key == 'undefined' || key === null || typeof old == 'undefined'){ return this.add(key, o); } var index = this.indexOfKey(key); this.items[index] = o; this.map[key] = o; this.fireEvent('replace', key, old, o); return o; }, addAll : function(objs){ if(arguments.length > 1 || Ext.isArray(objs)){ var args = arguments.length > 1 ? arguments : objs; for(var i = 0, len = args.length; i < len; i++){ this.add(args[i]); } }else{ for(var key in objs){ if(this.allowFunctions || typeof objs[key] != 'function'){ this.add(key, objs[key]); } } } }, each : function(fn, scope){ var items = [].concat(this.items); for(var i = 0, len = items.length; i < len; i++){ if(fn.call(scope || items[i], items[i], i, len) === false){ break; } } }, eachKey : function(fn, scope){ for(var i = 0, len = this.keys.length; i < len; i++){ fn.call(scope || window, this.keys[i], this.items[i], i, len); } }, find : function(fn, scope){ for(var i = 0, len = this.items.length; i < len; i++){ if(fn.call(scope || window, this.items[i], this.keys[i])){ return this.items[i]; } } return null; }, insert : function(index, key, o){ if(arguments.length == 2){ o = arguments[1]; key = this.getKey(o); } if(this.containsKey(key)){ this.suspendEvents(); this.removeKey(key); this.resumeEvents(); } if(index >= this.length){ return this.add(key, o); } this.length++; this.items.splice(index, 0, o); if(typeof key != 'undefined' && key !== null){ this.map[key] = o; } this.keys.splice(index, 0, key); this.fireEvent('add', index, o, key); return o; }, remove : function(o){ return this.removeAt(this.indexOf(o)); }, removeAt : function(index){ if(index < this.length && index >= 0){ this.length--; var o = this.items[index]; this.items.splice(index, 1); var key = this.keys[index]; if(typeof key != 'undefined'){ delete this.map[key]; } this.keys.splice(index, 1); this.fireEvent('remove', o, key); return o; } return false; }, removeKey : function(key){ return this.removeAt(this.indexOfKey(key)); }, getCount : function(){ return this.length; }, indexOf : function(o){ return this.items.indexOf(o); }, indexOfKey : function(key){ return this.keys.indexOf(key); }, item : function(key){ var mk = this.map[key], item = mk !== undefined ? mk : (typeof key == 'number') ? this.items[key] : undefined; return typeof item != 'function' || this.allowFunctions ? item : null; }, itemAt : function(index){ return this.items[index]; }, key : function(key){ return this.map[key]; }, contains : function(o){ return this.indexOf(o) != -1; }, containsKey : function(key){ return typeof this.map[key] != 'undefined'; }, clear : function(){ this.length = 0; this.items = []; this.keys = []; this.map = {}; this.fireEvent('clear'); }, first : function(){ return this.items[0]; }, last : function(){ return this.items[this.length-1]; }, _sort : function(property, dir, fn){ var i, len, dsc = String(dir).toUpperCase() == 'DESC' ? -1 : 1, c = [], keys = this.keys, items = this.items; fn = fn || function(a, b) { return a - b; }; for(i = 0, len = items.length; i < len; i++){ c[c.length] = { key : keys[i], value: items[i], index: i }; } c.sort(function(a, b){ var v = fn(a[property], b[property]) * dsc; if(v === 0){ v = (a.index < b.index ? -1 : 1); } return v; }); for(i = 0, len = c.length; i < len; i++){ items[i] = c[i].value; keys[i] = c[i].key; } this.fireEvent('sort', this); }, sort : function(dir, fn){ this._sort('value', dir, fn); }, reorder: function(mapping) { this.suspendEvents(); var items = this.items, index = 0, length = items.length, order = [], remaining = [], oldIndex; for (oldIndex in mapping) { order[mapping[oldIndex]] = items[oldIndex]; } for (index = 0; index < length; index++) { if (mapping[index] == undefined) { remaining.push(items[index]); } } for (index = 0; index < length; index++) { if (order[index] == undefined) { order[index] = remaining.shift(); } } this.clear(); this.addAll(order); this.resumeEvents(); this.fireEvent('sort', this); }, keySort : function(dir, fn){ this._sort('key', dir, fn || function(a, b){ var v1 = String(a).toUpperCase(), v2 = String(b).toUpperCase(); return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0); }); }, getRange : function(start, end){ var items = this.items; if(items.length < 1){ return []; } start = start || 0; end = Math.min(typeof end == 'undefined' ? this.length-1 : end, this.length-1); var i, r = []; if(start <= end){ for(i = start; i <= end; i++) { r[r.length] = items[i]; } }else{ for(i = start; i >= end; i--) { r[r.length] = items[i]; } } return r; }, filter : function(property, value, anyMatch, caseSensitive){ if(Ext.isEmpty(value, false)){ return this.clone(); } value = this.createValueMatcher(value, anyMatch, caseSensitive); return this.filterBy(function(o){ return o && value.test(o[property]); }); }, filterBy : function(fn, scope){ var r = new Ext.util.MixedCollection(); r.getKey = this.getKey; var k = this.keys, it = this.items; for(var i = 0, len = it.length; i < len; i++){ if(fn.call(scope||this, it[i], k[i])){ r.add(k[i], it[i]); } } return r; }, findIndex : function(property, value, start, anyMatch, caseSensitive){ if(Ext.isEmpty(value, false)){ return -1; } value = this.createValueMatcher(value, anyMatch, caseSensitive); return this.findIndexBy(function(o){ return o && value.test(o[property]); }, null, start); }, findIndexBy : function(fn, scope, start){ var k = this.keys, it = this.items; for(var i = (start||0), len = it.length; i < len; i++){ if(fn.call(scope||this, it[i], k[i])){ return i; } } return -1; }, createValueMatcher : function(value, anyMatch, caseSensitive, exactMatch) { if (!value.exec) { var er = Ext.escapeRe; value = String(value); if (anyMatch === true) { value = er(value); } else { value = '^' + er(value); if (exactMatch === true) { value += '$'; } } value = new RegExp(value, caseSensitive ? '' : 'i'); } return value; }, clone : function(){ var r = new Ext.util.MixedCollection(); var k = this.keys, it = this.items; for(var i = 0, len = it.length; i < len; i++){ r.add(k[i], it[i]); } r.getKey = this.getKey; return r; } }); Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item; Ext.AbstractManager = Ext.extend(Object, { typeName: 'type', constructor: function(config) { Ext.apply(this, config || {}); this.all = new Ext.util.MixedCollection(); this.types = {}; }, get : function(id){ return this.all.get(id); }, register: function(item) { this.all.add(item); }, unregister: function(item) { this.all.remove(item); }, registerType : function(type, cls){ this.types[type] = cls; cls[this.typeName] = type; }, isRegistered : function(type){ return this.types[type] !== undefined; }, create: function(config, defaultType) { var type = config[this.typeName] || config.type || defaultType, Constructor = this.types[type]; if (Constructor == undefined) { throw new Error(String.format("The '{0}' type has not been registered with this manager", type)); } return new Constructor(config); }, onAvailable : function(id, fn, scope){ var all = this.all; all.on("add", function(index, o){ if (o.id == id) { fn.call(scope || o, o); all.un("add", fn, scope); } }); } }); Ext.util.Format = function() { var trimRe = /^\s+|\s+$/g, stripTagsRE = /<\/?[^>]+>/gi, stripScriptsRe = /(?:)((\n|\r|.)*?)(?:<\/script>)/ig, nl2brRe = /\r?\n/g; return { ellipsis : function(value, len, word) { if (value && value.length > len) { if (word) { var vs = value.substr(0, len - 2), index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?')); if (index == -1 || index < (len - 15)) { return value.substr(0, len - 3) + "..."; } else { return vs.substr(0, index) + "..."; } } else { return value.substr(0, len - 3) + "..."; } } return value; }, undef : function(value) { return value !== undefined ? value : ""; }, defaultValue : function(value, defaultValue) { return value !== undefined && value !== '' ? value : defaultValue; }, htmlEncode : function(value) { return !value ? value : String(value).replace(/&/g, "&").replace(/>/g, ">").replace(/").replace(/</g, "<").replace(/"/g, '"').replace(/&/g, "&"); }, trim : function(value) { return String(value).replace(trimRe, ""); }, substr : function(value, start, length) { return String(value).substr(start, length); }, lowercase : function(value) { return String(value).toLowerCase(); }, uppercase : function(value) { return String(value).toUpperCase(); }, capitalize : function(value) { return !value ? value : value.charAt(0).toUpperCase() + value.substr(1).toLowerCase(); }, call : function(value, fn) { if (arguments.length > 2) { var args = Array.prototype.slice.call(arguments, 2); args.unshift(value); return eval(fn).apply(window, args); } else { return eval(fn).call(window, value); } }, usMoney : function(v) { v = (Math.round((v-0)*100))/100; v = (v == Math.floor(v)) ? v + ".00" : ((v*10 == Math.floor(v*10)) ? v + "0" : v); v = String(v); var ps = v.split('.'), whole = ps[0], sub = ps[1] ? '.'+ ps[1] : '.00', r = /(\d+)(\d{3})/; while (r.test(whole)) { whole = whole.replace(r, '$1' + ',' + '$2'); } v = whole + sub; if (v.charAt(0) == '-') { return '-$' + v.substr(1); } return "$" + v; }, date : function(v, format) { if (!v) { return ""; } if (!Ext.isDate(v)) { v = new Date(Date.parse(v)); } return v.dateFormat(format || "m/d/Y"); }, dateRenderer : function(format) { return function(v) { return Ext.util.Format.date(v, format); }; }, stripTags : function(v) { return !v ? v : String(v).replace(stripTagsRE, ""); }, stripScripts : function(v) { return !v ? v : String(v).replace(stripScriptsRe, ""); }, fileSize : function(size) { if (size < 1024) { return size + " bytes"; } else if (size < 1048576) { return (Math.round(((size*10) / 1024))/10) + " KB"; } else { return (Math.round(((size*10) / 1048576))/10) + " MB"; } }, math : function(){ var fns = {}; return function(v, a){ if (!fns[a]) { fns[a] = new Function('v', 'return v ' + a + ';'); } return fns[a](v); }; }(), round : function(value, precision) { var result = Number(value); if (typeof precision == 'number') { precision = Math.pow(10, precision); result = Math.round(value * precision) / precision; } return result; }, number: function(v, format) { if (!format) { return v; } v = Ext.num(v, NaN); if (isNaN(v)) { return ''; } var comma = ',', dec = '.', i18n = false, neg = v < 0; v = Math.abs(v); if (format.substr(format.length - 2) == '/i') { format = format.substr(0, format.length - 2); i18n = true; comma = '.'; dec = ','; } var hasComma = format.indexOf(comma) != -1, psplit = (i18n ? format.replace(/[^\d\,]/g, '') : format.replace(/[^\d\.]/g, '')).split(dec); if (1 < psplit.length) { v = v.toFixed(psplit[1].length); } else if(2 < psplit.length) { throw ('NumberFormatException: invalid format, formats should have no more than 1 period: ' + format); } else { v = v.toFixed(0); } var fnum = v.toString(); psplit = fnum.split('.'); if (hasComma) { var cnum = psplit[0], parr = [], j = cnum.length, m = Math.floor(j / 3), n = cnum.length % 3 || 3, i; for (i = 0; i < j; i += n) { if (i != 0) { n = 3; } parr[parr.length] = cnum.substr(i, n); m -= 1; } fnum = parr.join(comma); if (psplit[1]) { fnum += dec + psplit[1]; } } else { if (psplit[1]) { fnum = psplit[0] + dec + psplit[1]; } } return (neg ? '-' : '') + format.replace(/[\d,?\.?]+/, fnum); }, numberRenderer : function(format) { return function(v) { return Ext.util.Format.number(v, format); }; }, plural : function(v, s, p) { return v +' ' + (v == 1 ? s : (p ? p : s+'s')); }, nl2br : function(v) { return Ext.isEmpty(v) ? '' : v.replace(nl2brRe, '
'); } }; }(); Ext.XTemplate = function(){ Ext.XTemplate.superclass.constructor.apply(this, arguments); var me = this, s = me.html, re = /]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/, nameRe = /^]*?for="(.*?)"/, ifRe = /^]*?if="(.*?)"/, execRe = /^]*?exec="(.*?)"/, m, id = 0, tpls = [], VALUES = 'values', PARENT = 'parent', XINDEX = 'xindex', XCOUNT = 'xcount', RETURN = 'return ', WITHVALUES = 'with(values){ '; s = ['', s, ''].join(''); while((m = s.match(re))){ var m2 = m[0].match(nameRe), m3 = m[0].match(ifRe), m4 = m[0].match(execRe), exp = null, fn = null, exec = null, name = m2 && m2[1] ? m2[1] : ''; if (m3) { exp = m3 && m3[1] ? m3[1] : null; if(exp){ fn = new Function(VALUES, PARENT, XINDEX, XCOUNT, WITHVALUES + RETURN +(Ext.util.Format.htmlDecode(exp))+'; }'); } } if (m4) { exp = m4 && m4[1] ? m4[1] : null; if(exp){ exec = new Function(VALUES, PARENT, XINDEX, XCOUNT, WITHVALUES +(Ext.util.Format.htmlDecode(exp))+'; }'); } } if(name){ switch(name){ case '.': name = new Function(VALUES, PARENT, WITHVALUES + RETURN + VALUES + '; }'); break; case '..': name = new Function(VALUES, PARENT, WITHVALUES + RETURN + PARENT + '; }'); break; default: name = new Function(VALUES, PARENT, WITHVALUES + RETURN + name + '; }'); } } tpls.push({ id: id, target: name, exec: exec, test: fn, body: m[1]||'' }); s = s.replace(m[0], '{xtpl'+ id + '}'); ++id; } for(var i = tpls.length-1; i >= 0; --i){ me.compileTpl(tpls[i]); } me.master = tpls[tpls.length-1]; me.tpls = tpls; }; Ext.extend(Ext.XTemplate, Ext.Template, { re : /\{([\w\-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g, codeRe : /\{\[((?:\\\]|.|\n)*?)\]\}/g, applySubTemplate : function(id, values, parent, xindex, xcount){ var me = this, len, t = me.tpls[id], vs, buf = []; if ((t.test && !t.test.call(me, values, parent, xindex, xcount)) || (t.exec && t.exec.call(me, values, parent, xindex, xcount))) { return ''; } vs = t.target ? t.target.call(me, values, parent) : values; len = vs.length; parent = t.target ? values : parent; if(t.target && Ext.isArray(vs)){ for(var i = 0, len = vs.length; i < len; i++){ buf[buf.length] = t.compiled.call(me, vs[i], parent, i+1, len); } return buf.join(''); } return t.compiled.call(me, vs, parent, xindex, xcount); }, compileTpl : function(tpl){ var fm = Ext.util.Format, useF = this.disableFormats !== true, sep = Ext.isGecko ? "+" : ",", body; function fn(m, name, format, args, math){ if(name.substr(0, 4) == 'xtpl'){ return "'"+ sep +'this.applySubTemplate('+name.substr(4)+', values, parent, xindex, xcount)'+sep+"'"; } var v; if(name === '.'){ v = 'values'; }else if(name === '#'){ v = 'xindex'; }else if(name.indexOf('.') != -1){ v = name; }else{ v = "values['" + name + "']"; } if(math){ v = '(' + v + math + ')'; } if (format && useF) { args = args ? ',' + args : ""; if(format.substr(0, 5) != "this."){ format = "fm." + format + '('; }else{ format = 'this.call("'+ format.substr(5) + '", '; args = ", values"; } } else { args= ''; format = "("+v+" === undefined ? '' : "; } return "'"+ sep + format + v + args + ")"+sep+"'"; } function codeFn(m, code){ return "'" + sep + '(' + code.replace(/\\'/g, "'") + ')' + sep + "'"; } if(Ext.isGecko){ body = "tpl.compiled = function(values, parent, xindex, xcount){ return '" + tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn) + "';};"; }else{ body = ["tpl.compiled = function(values, parent, xindex, xcount){ return ['"]; body.push(tpl.body.replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn).replace(this.codeRe, codeFn)); body.push("'].join('');};"); body = body.join(''); } eval(body); return this; }, applyTemplate : function(values){ return this.master.compiled.call(this, values, {}, 1, 1); }, compile : function(){return this;} }); Ext.XTemplate.prototype.apply = Ext.XTemplate.prototype.applyTemplate; Ext.XTemplate.from = function(el){ el = Ext.getDom(el); return new Ext.XTemplate(el.value || el.innerHTML); }; Ext.util.CSS = function(){ var rules = null; var doc = document; var camelRe = /(-[a-z])/gi; var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); }; return { createStyleSheet : function(cssText, id){ var ss; var head = doc.getElementsByTagName("head")[0]; var rules = doc.createElement("style"); rules.setAttribute("type", "text/css"); if(id){ rules.setAttribute("id", id); } if(Ext.isIE){ head.appendChild(rules); ss = rules.styleSheet; ss.cssText = cssText; }else{ try{ rules.appendChild(doc.createTextNode(cssText)); }catch(e){ rules.cssText = cssText; } head.appendChild(rules); ss = rules.styleSheet ? rules.styleSheet : (rules.sheet || doc.styleSheets[doc.styleSheets.length-1]); } this.cacheStyleSheet(ss); return ss; }, removeStyleSheet : function(id){ var existing = doc.getElementById(id); if(existing){ existing.parentNode.removeChild(existing); } }, swapStyleSheet : function(id, url){ this.removeStyleSheet(id); var ss = doc.createElement("link"); ss.setAttribute("rel", "stylesheet"); ss.setAttribute("type", "text/css"); ss.setAttribute("id", id); ss.setAttribute("href", url); doc.getElementsByTagName("head")[0].appendChild(ss); }, refreshCache : function(){ return this.getRules(true); }, cacheStyleSheet : function(ss){ if(!rules){ rules = {}; } try{ var ssRules = ss.cssRules || ss.rules; for(var j = ssRules.length-1; j >= 0; --j){ rules[ssRules[j].selectorText.toLowerCase()] = ssRules[j]; } }catch(e){} }, getRules : function(refreshCache){ if(rules === null || refreshCache){ rules = {}; var ds = doc.styleSheets; for(var i =0, len = ds.length; i < len; i++){ try{ this.cacheStyleSheet(ds[i]); }catch(e){} } } return rules; }, getRule : function(selector, refreshCache){ var rs = this.getRules(refreshCache); if(!Ext.isArray(selector)){ return rs[selector.toLowerCase()]; } for(var i = 0; i < selector.length; i++){ if(rs[selector[i]]){ return rs[selector[i].toLowerCase()]; } } return null; }, updateRule : function(selector, property, value){ if(!Ext.isArray(selector)){ var rule = this.getRule(selector); if(rule){ rule.style[property.replace(camelRe, camelFn)] = value; return true; } }else{ for(var i = 0; i < selector.length; i++){ if(this.updateRule(selector[i], property, value)){ return true; } } } return false; } }; }(); Ext.util.ClickRepeater = Ext.extend(Ext.util.Observable, { constructor : function(el, config){ this.el = Ext.get(el); this.el.unselectable(); Ext.apply(this, config); this.addEvents( "mousedown", "click", "mouseup" ); if(!this.disabled){ this.disabled = true; this.enable(); } if(this.handler){ this.on("click", this.handler, this.scope || this); } Ext.util.ClickRepeater.superclass.constructor.call(this); }, interval : 20, delay: 250, preventDefault : true, stopDefault : false, timer : 0, enable: function(){ if(this.disabled){ this.el.on('mousedown', this.handleMouseDown, this); if (Ext.isIE){ this.el.on('dblclick', this.handleDblClick, this); } if(this.preventDefault || this.stopDefault){ this.el.on('click', this.eventOptions, this); } } this.disabled = false; }, disable: function( force){ if(force || !this.disabled){ clearTimeout(this.timer); if(this.pressClass){ this.el.removeClass(this.pressClass); } Ext.getDoc().un('mouseup', this.handleMouseUp, this); this.el.removeAllListeners(); } this.disabled = true; }, setDisabled: function(disabled){ this[disabled ? 'disable' : 'enable'](); }, eventOptions: function(e){ if(this.preventDefault){ e.preventDefault(); } if(this.stopDefault){ e.stopEvent(); } }, destroy : function() { this.disable(true); Ext.destroy(this.el); this.purgeListeners(); }, handleDblClick : function(e){ clearTimeout(this.timer); this.el.blur(); this.fireEvent("mousedown", this, e); this.fireEvent("click", this, e); }, handleMouseDown : function(e){ clearTimeout(this.timer); this.el.blur(); if(this.pressClass){ this.el.addClass(this.pressClass); } this.mousedownTime = new Date(); Ext.getDoc().on("mouseup", this.handleMouseUp, this); this.el.on("mouseout", this.handleMouseOut, this); this.fireEvent("mousedown", this, e); this.fireEvent("click", this, e); if (this.accelerate) { this.delay = 400; } this.timer = this.click.defer(this.delay || this.interval, this, [e]); }, click : function(e){ this.fireEvent("click", this, e); this.timer = this.click.defer(this.accelerate ? this.easeOutExpo(this.mousedownTime.getElapsed(), 400, -390, 12000) : this.interval, this, [e]); }, easeOutExpo : function (t, b, c, d) { return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; }, handleMouseOut : function(){ clearTimeout(this.timer); if(this.pressClass){ this.el.removeClass(this.pressClass); } this.el.on("mouseover", this.handleMouseReturn, this); }, handleMouseReturn : function(){ this.el.un("mouseover", this.handleMouseReturn, this); if(this.pressClass){ this.el.addClass(this.pressClass); } this.click(); }, handleMouseUp : function(e){ clearTimeout(this.timer); this.el.un("mouseover", this.handleMouseReturn, this); this.el.un("mouseout", this.handleMouseOut, this); Ext.getDoc().un("mouseup", this.handleMouseUp, this); this.el.removeClass(this.pressClass); this.fireEvent("mouseup", this, e); } }); Ext.KeyNav = function(el, config){ this.el = Ext.get(el); Ext.apply(this, config); if(!this.disabled){ this.disabled = true; this.enable(); } }; Ext.KeyNav.prototype = { disabled : false, defaultEventAction: "stopEvent", forceKeyDown : false, relay : function(e){ var k = e.getKey(), h = this.keyToHandler[k]; if(h && this[h]){ if(this.doRelay(e, this[h], h) !== true){ e[this.defaultEventAction](); } } }, doRelay : function(e, h, hname){ return h.call(this.scope || this, e, hname); }, enter : false, left : false, right : false, up : false, down : false, tab : false, esc : false, pageUp : false, pageDown : false, del : false, home : false, end : false, space : false, keyToHandler : { 37 : "left", 39 : "right", 38 : "up", 40 : "down", 33 : "pageUp", 34 : "pageDown", 46 : "del", 36 : "home", 35 : "end", 13 : "enter", 27 : "esc", 9 : "tab", 32 : "space" }, stopKeyUp: function(e) { var k = e.getKey(); if (k >= 37 && k <= 40) { e.stopEvent(); } }, destroy: function(){ this.disable(); }, enable: function() { if (this.disabled) { if (Ext.isSafari2) { this.el.on('keyup', this.stopKeyUp, this); } this.el.on(this.isKeydown()? 'keydown' : 'keypress', this.relay, this); this.disabled = false; } }, disable: function() { if (!this.disabled) { if (Ext.isSafari2) { this.el.un('keyup', this.stopKeyUp, this); } this.el.un(this.isKeydown()? 'keydown' : 'keypress', this.relay, this); this.disabled = true; } }, setDisabled : function(disabled){ this[disabled ? "disable" : "enable"](); }, isKeydown: function(){ return this.forceKeyDown || Ext.EventManager.useKeydown; } }; Ext.KeyMap = function(el, config, eventName){ this.el = Ext.get(el); this.eventName = eventName || "keydown"; this.bindings = []; if(config){ this.addBinding(config); } this.enable(); }; Ext.KeyMap.prototype = { stopEvent : false, addBinding : function(config){ if(Ext.isArray(config)){ Ext.each(config, function(c){ this.addBinding(c); }, this); return; } var keyCode = config.key, fn = config.fn || config.handler, scope = config.scope; if (config.stopEvent) { this.stopEvent = config.stopEvent; } if(typeof keyCode == "string"){ var ks = []; var keyString = keyCode.toUpperCase(); for(var j = 0, len = keyString.length; j < len; j++){ ks.push(keyString.charCodeAt(j)); } keyCode = ks; } var keyArray = Ext.isArray(keyCode); var handler = function(e){ if(this.checkModifiers(config, e)){ var k = e.getKey(); if(keyArray){ for(var i = 0, len = keyCode.length; i < len; i++){ if(keyCode[i] == k){ if(this.stopEvent){ e.stopEvent(); } fn.call(scope || window, k, e); return; } } }else{ if(k == keyCode){ if(this.stopEvent){ e.stopEvent(); } fn.call(scope || window, k, e); } } } }; this.bindings.push(handler); }, checkModifiers: function(config, e){ var val, key, keys = ['shift', 'ctrl', 'alt']; for (var i = 0, len = keys.length; i < len; ++i){ key = keys[i]; val = config[key]; if(!(val === undefined || (val === e[key + 'Key']))){ return false; } } return true; }, on : function(key, fn, scope){ var keyCode, shift, ctrl, alt; if(typeof key == "object" && !Ext.isArray(key)){ keyCode = key.key; shift = key.shift; ctrl = key.ctrl; alt = key.alt; }else{ keyCode = key; } this.addBinding({ key: keyCode, shift: shift, ctrl: ctrl, alt: alt, fn: fn, scope: scope }); }, handleKeyDown : function(e){ if(this.enabled){ var b = this.bindings; for(var i = 0, len = b.length; i < len; i++){ b[i].call(this, e); } } }, isEnabled : function(){ return this.enabled; }, enable: function(){ if(!this.enabled){ this.el.on(this.eventName, this.handleKeyDown, this); this.enabled = true; } }, disable: function(){ if(this.enabled){ this.el.removeListener(this.eventName, this.handleKeyDown, this); this.enabled = false; } }, setDisabled : function(disabled){ this[disabled ? "disable" : "enable"](); } }; Ext.util.TextMetrics = function(){ var shared; return { measure : function(el, text, fixedWidth){ if(!shared){ shared = Ext.util.TextMetrics.Instance(el, fixedWidth); } shared.bind(el); shared.setFixedWidth(fixedWidth || 'auto'); return shared.getSize(text); }, createInstance : function(el, fixedWidth){ return Ext.util.TextMetrics.Instance(el, fixedWidth); } }; }(); Ext.util.TextMetrics.Instance = function(bindTo, fixedWidth){ var ml = new Ext.Element(document.createElement('div')); document.body.appendChild(ml.dom); ml.position('absolute'); ml.setLeftTop(-1000, -1000); ml.hide(); if(fixedWidth){ ml.setWidth(fixedWidth); } var instance = { getSize : function(text){ ml.update(text); var s = ml.getSize(); ml.update(''); return s; }, bind : function(el){ ml.setStyle( Ext.fly(el).getStyles('font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing') ); }, setFixedWidth : function(width){ ml.setWidth(width); }, getWidth : function(text){ ml.dom.style.width = 'auto'; return this.getSize(text).width; }, getHeight : function(text){ return this.getSize(text).height; } }; instance.bind(bindTo); return instance; }; Ext.Element.addMethods({ getTextWidth : function(text, min, max){ return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text, this.dom.innerHTML, true)).width).constrain(min || 0, max || 1000000); } }); Ext.util.Cookies = { set : function(name, value){ var argv = arguments; var argc = arguments.length; var expires = (argc > 2) ? argv[2] : null; var path = (argc > 3) ? argv[3] : '/'; var domain = (argc > 4) ? argv[4] : null; var secure = (argc > 5) ? argv[5] : false; document.cookie = name + "=" + escape(value) + ((expires === null) ? "" : ("; expires=" + expires.toGMTString())) + ((path === null) ? "" : ("; path=" + path)) + ((domain === null) ? "" : ("; domain=" + domain)) + ((secure === true) ? "; secure" : ""); }, get : function(name){ var arg = name + "="; var alen = arg.length; var clen = document.cookie.length; var i = 0; var j = 0; while(i < clen){ j = i + alen; if(document.cookie.substring(i, j) == arg){ return Ext.util.Cookies.getCookieVal(j); } i = document.cookie.indexOf(" ", i) + 1; if(i === 0){ break; } } return null; }, clear : function(name){ if(Ext.util.Cookies.get(name)){ document.cookie = name + "=" + "; expires=Thu, 01-Jan-70 00:00:01 GMT"; } }, getCookieVal : function(offset){ var endstr = document.cookie.indexOf(";", offset); if(endstr == -1){ endstr = document.cookie.length; } return unescape(document.cookie.substring(offset, endstr)); } }; Ext.handleError = function(e) { throw e; }; Ext.Error = function(message) { this.message = (this.lang[message]) ? this.lang[message] : message; }; Ext.Error.prototype = new Error(); Ext.apply(Ext.Error.prototype, { lang: {}, name: 'Ext.Error', getName : function() { return this.name; }, getMessage : function() { return this.message; }, toJson : function() { return Ext.encode(this); } }); Ext.ComponentMgr = function(){ var all = new Ext.util.MixedCollection(); var types = {}; var ptypes = {}; return { register : function(c){ all.add(c); }, unregister : function(c){ all.remove(c); }, get : function(id){ return all.get(id); }, onAvailable : function(id, fn, scope){ all.on("add", function(index, o){ if(o.id == id){ fn.call(scope || o, o); all.un("add", fn, scope); } }); }, all : all, types : types, ptypes: ptypes, isRegistered : function(xtype){ return types[xtype] !== undefined; }, isPluginRegistered : function(ptype){ return ptypes[ptype] !== undefined; }, registerType : function(xtype, cls){ types[xtype] = cls; cls.xtype = xtype; }, create : function(config, defaultType){ return config.render ? config : new types[config.xtype || defaultType](config); }, registerPlugin : function(ptype, cls){ ptypes[ptype] = cls; cls.ptype = ptype; }, createPlugin : function(config, defaultType){ var PluginCls = ptypes[config.ptype || defaultType]; if (PluginCls.init) { return PluginCls; } else { return new PluginCls(config); } } }; }(); Ext.reg = Ext.ComponentMgr.registerType; Ext.preg = Ext.ComponentMgr.registerPlugin; Ext.create = Ext.ComponentMgr.create; Ext.Component = function(config){ config = config || {}; if(config.initialConfig){ if(config.isAction){ this.baseAction = config; } config = config.initialConfig; }else if(config.tagName || config.dom || Ext.isString(config)){ config = {applyTo: config, id: config.id || config}; } this.initialConfig = config; Ext.apply(this, config); this.addEvents( 'added', 'disable', 'enable', 'beforeshow', 'show', 'beforehide', 'hide', 'removed', 'beforerender', 'render', 'afterrender', 'beforedestroy', 'destroy', 'beforestaterestore', 'staterestore', 'beforestatesave', 'statesave' ); this.getId(); Ext.ComponentMgr.register(this); Ext.Component.superclass.constructor.call(this); if(this.baseAction){ this.baseAction.addComponent(this); } this.initComponent(); if(this.plugins){ if(Ext.isArray(this.plugins)){ for(var i = 0, len = this.plugins.length; i < len; i++){ this.plugins[i] = this.initPlugin(this.plugins[i]); } }else{ this.plugins = this.initPlugin(this.plugins); } } if(this.stateful !== false){ this.initState(); } if(this.applyTo){ this.applyToMarkup(this.applyTo); delete this.applyTo; }else if(this.renderTo){ this.render(this.renderTo); delete this.renderTo; } }; Ext.Component.AUTO_ID = 1000; Ext.extend(Ext.Component, Ext.util.Observable, { disabled : false, hidden : false, autoEl : 'div', disabledClass : 'x-item-disabled', allowDomMove : true, autoShow : false, hideMode : 'display', hideParent : false, rendered : false, tplWriteMode : 'overwrite', bubbleEvents: [], ctype : 'Ext.Component', actionMode : 'el', getActionEl : function(){ return this[this.actionMode]; }, initPlugin : function(p){ if(p.ptype && !Ext.isFunction(p.init)){ p = Ext.ComponentMgr.createPlugin(p); }else if(Ext.isString(p)){ p = Ext.ComponentMgr.createPlugin({ ptype: p }); } p.init(this); return p; }, initComponent : function(){ if(this.listeners){ this.on(this.listeners); delete this.listeners; } this.enableBubble(this.bubbleEvents); }, render : function(container, position){ if(!this.rendered && this.fireEvent('beforerender', this) !== false){ if(!container && this.el){ this.el = Ext.get(this.el); container = this.el.dom.parentNode; this.allowDomMove = false; } this.container = Ext.get(container); if(this.ctCls){ this.container.addClass(this.ctCls); } this.rendered = true; if(position !== undefined){ if(Ext.isNumber(position)){ position = this.container.dom.childNodes[position]; }else{ position = Ext.getDom(position); } } this.onRender(this.container, position || null); if(this.autoShow){ this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]); } if(this.cls){ this.el.addClass(this.cls); delete this.cls; } if(this.style){ this.el.applyStyles(this.style); delete this.style; } if(this.overCls){ this.el.addClassOnOver(this.overCls); } this.fireEvent('render', this); var contentTarget = this.getContentTarget(); if (this.html){ contentTarget.update(Ext.DomHelper.markup(this.html)); delete this.html; } if (this.contentEl){ var ce = Ext.getDom(this.contentEl); Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']); contentTarget.appendChild(ce); } if (this.tpl) { if (!this.tpl.compile) { this.tpl = new Ext.XTemplate(this.tpl); } if (this.data) { this.tpl[this.tplWriteMode](contentTarget, this.data); delete this.data; } } this.afterRender(this.container); if(this.hidden){ this.doHide(); } if(this.disabled){ this.disable(true); } if(this.stateful !== false){ this.initStateEvents(); } this.fireEvent('afterrender', this); } return this; }, update: function(htmlOrData, loadScripts, cb) { var contentTarget = this.getContentTarget(); if (this.tpl && typeof htmlOrData !== "string") { this.tpl[this.tplWriteMode](contentTarget, htmlOrData || {}); } else { var html = Ext.isObject(htmlOrData) ? Ext.DomHelper.markup(htmlOrData) : htmlOrData; contentTarget.update(html, loadScripts, cb); } }, onAdded : function(container, pos) { this.ownerCt = container; this.initRef(); this.fireEvent('added', this, container, pos); }, onRemoved : function() { this.removeRef(); this.fireEvent('removed', this, this.ownerCt); delete this.ownerCt; }, initRef : function() { if(this.ref && !this.refOwner){ var levels = this.ref.split('/'), last = levels.length, i = 0, t = this; while(t && i < last){ t = t.ownerCt; ++i; } if(t){ t[this.refName = levels[--i]] = this; this.refOwner = t; } } }, removeRef : function() { if (this.refOwner && this.refName) { delete this.refOwner[this.refName]; delete this.refOwner; } }, initState : function(){ if(Ext.state.Manager){ var id = this.getStateId(); if(id){ var state = Ext.state.Manager.get(id); if(state){ if(this.fireEvent('beforestaterestore', this, state) !== false){ this.applyState(Ext.apply({}, state)); this.fireEvent('staterestore', this, state); } } } } }, getStateId : function(){ return this.stateId || ((/^(ext-comp-|ext-gen)/).test(String(this.id)) ? null : this.id); }, initStateEvents : function(){ if(this.stateEvents){ for(var i = 0, e; e = this.stateEvents[i]; i++){ this.on(e, this.saveState, this, {delay:100}); } } }, applyState : function(state){ if(state){ Ext.apply(this, state); } }, getState : function(){ return null; }, saveState : function(){ if(Ext.state.Manager && this.stateful !== false){ var id = this.getStateId(); if(id){ var state = this.getState(); if(this.fireEvent('beforestatesave', this, state) !== false){ Ext.state.Manager.set(id, state); this.fireEvent('statesave', this, state); } } } }, applyToMarkup : function(el){ this.allowDomMove = false; this.el = Ext.get(el); this.render(this.el.dom.parentNode); }, addClass : function(cls){ if(this.el){ this.el.addClass(cls); }else{ this.cls = this.cls ? this.cls + ' ' + cls : cls; } return this; }, removeClass : function(cls){ if(this.el){ this.el.removeClass(cls); }else if(this.cls){ this.cls = this.cls.split(' ').remove(cls).join(' '); } return this; }, onRender : function(ct, position){ if(!this.el && this.autoEl){ if(Ext.isString(this.autoEl)){ this.el = document.createElement(this.autoEl); }else{ var div = document.createElement('div'); Ext.DomHelper.overwrite(div, this.autoEl); this.el = div.firstChild; } if (!this.el.id) { this.el.id = this.getId(); } } if(this.el){ this.el = Ext.get(this.el); if(this.allowDomMove !== false){ ct.dom.insertBefore(this.el.dom, position); if (div) { Ext.removeNode(div); div = null; } } } }, getAutoCreate : function(){ var cfg = Ext.isObject(this.autoCreate) ? this.autoCreate : Ext.apply({}, this.defaultAutoCreate); if(this.id && !cfg.id){ cfg.id = this.id; } return cfg; }, afterRender : Ext.emptyFn, destroy : function(){ if(!this.isDestroyed){ if(this.fireEvent('beforedestroy', this) !== false){ this.destroying = true; this.beforeDestroy(); if(this.ownerCt && this.ownerCt.remove){ this.ownerCt.remove(this, false); } if(this.rendered){ this.el.remove(); if(this.actionMode == 'container' || this.removeMode == 'container'){ this.container.remove(); } } if(this.focusTask && this.focusTask.cancel){ this.focusTask.cancel(); } this.onDestroy(); Ext.ComponentMgr.unregister(this); this.fireEvent('destroy', this); this.purgeListeners(); this.destroying = false; this.isDestroyed = true; } } }, deleteMembers : function(){ var args = arguments; for(var i = 0, len = args.length; i < len; ++i){ delete this[args[i]]; } }, beforeDestroy : Ext.emptyFn, onDestroy : Ext.emptyFn, getEl : function(){ return this.el; }, getContentTarget : function(){ return this.el; }, getId : function(){ return this.id || (this.id = 'ext-comp-' + (++Ext.Component.AUTO_ID)); }, getItemId : function(){ return this.itemId || this.getId(); }, focus : function(selectText, delay){ if(delay){ this.focusTask = new Ext.util.DelayedTask(this.focus, this, [selectText, false]); this.focusTask.delay(Ext.isNumber(delay) ? delay : 10); return this; } if(this.rendered && !this.isDestroyed){ this.el.focus(); if(selectText === true){ this.el.dom.select(); } } return this; }, blur : function(){ if(this.rendered){ this.el.blur(); } return this; }, disable : function( silent){ if(this.rendered){ this.onDisable(); } this.disabled = true; if(silent !== true){ this.fireEvent('disable', this); } return this; }, onDisable : function(){ this.getActionEl().addClass(this.disabledClass); this.el.dom.disabled = true; }, enable : function(){ if(this.rendered){ this.onEnable(); } this.disabled = false; this.fireEvent('enable', this); return this; }, onEnable : function(){ this.getActionEl().removeClass(this.disabledClass); this.el.dom.disabled = false; }, setDisabled : function(disabled){ return this[disabled ? 'disable' : 'enable'](); }, show : function(){ if(this.fireEvent('beforeshow', this) !== false){ this.hidden = false; if(this.autoRender){ this.render(Ext.isBoolean(this.autoRender) ? Ext.getBody() : this.autoRender); } if(this.rendered){ this.onShow(); } this.fireEvent('show', this); } return this; }, onShow : function(){ this.getVisibilityEl().removeClass('x-hide-' + this.hideMode); }, hide : function(){ if(this.fireEvent('beforehide', this) !== false){ this.doHide(); this.fireEvent('hide', this); } return this; }, doHide: function(){ this.hidden = true; if(this.rendered){ this.onHide(); } }, onHide : function(){ this.getVisibilityEl().addClass('x-hide-' + this.hideMode); }, getVisibilityEl : function(){ return this.hideParent ? this.container : this.getActionEl(); }, setVisible : function(visible){ return this[visible ? 'show' : 'hide'](); }, isVisible : function(){ return this.rendered && this.getVisibilityEl().isVisible(); }, cloneConfig : function(overrides){ overrides = overrides || {}; var id = overrides.id || Ext.id(); var cfg = Ext.applyIf(overrides, this.initialConfig); cfg.id = id; return new this.constructor(cfg); }, getXType : function(){ return this.constructor.xtype; }, isXType : function(xtype, shallow){ if (Ext.isFunction(xtype)){ xtype = xtype.xtype; }else if (Ext.isObject(xtype)){ xtype = xtype.constructor.xtype; } return !shallow ? ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 : this.constructor.xtype == xtype; }, getXTypes : function(){ var tc = this.constructor; if(!tc.xtypes){ var c = [], sc = this; while(sc && sc.constructor.xtype){ c.unshift(sc.constructor.xtype); sc = sc.constructor.superclass; } tc.xtypeChain = c; tc.xtypes = c.join('/'); } return tc.xtypes; }, findParentBy : function(fn) { for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt); return p || null; }, findParentByType : function(xtype, shallow){ return this.findParentBy(function(c){ return c.isXType(xtype, shallow); }); }, bubble : function(fn, scope, args){ var p = this; while(p){ if(fn.apply(scope || p, args || [p]) === false){ break; } p = p.ownerCt; } return this; }, getPositionEl : function(){ return this.positionEl || this.el; }, purgeListeners : function(){ Ext.Component.superclass.purgeListeners.call(this); if(this.mons){ this.on('beforedestroy', this.clearMons, this, {single: true}); } }, clearMons : function(){ Ext.each(this.mons, function(m){ m.item.un(m.ename, m.fn, m.scope); }, this); this.mons = []; }, createMons: function(){ if(!this.mons){ this.mons = []; this.on('beforedestroy', this.clearMons, this, {single: true}); } }, mon : function(item, ename, fn, scope, opt){ this.createMons(); if(Ext.isObject(ename)){ var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/; var o = ename; for(var e in o){ if(propRe.test(e)){ continue; } if(Ext.isFunction(o[e])){ this.mons.push({ item: item, ename: e, fn: o[e], scope: o.scope }); item.on(e, o[e], o.scope, o); }else{ this.mons.push({ item: item, ename: e, fn: o[e], scope: o.scope }); item.on(e, o[e]); } } return; } this.mons.push({ item: item, ename: ename, fn: fn, scope: scope }); item.on(ename, fn, scope, opt); }, mun : function(item, ename, fn, scope){ var found, mon; this.createMons(); for(var i = 0, len = this.mons.length; i < len; ++i){ mon = this.mons[i]; if(item === mon.item && ename == mon.ename && fn === mon.fn && scope === mon.scope){ this.mons.splice(i, 1); item.un(ename, fn, scope); found = true; break; } } return found; }, nextSibling : function(){ if(this.ownerCt){ var index = this.ownerCt.items.indexOf(this); if(index != -1 && index+1 < this.ownerCt.items.getCount()){ return this.ownerCt.items.itemAt(index+1); } } return null; }, previousSibling : function(){ if(this.ownerCt){ var index = this.ownerCt.items.indexOf(this); if(index > 0){ return this.ownerCt.items.itemAt(index-1); } } return null; }, getBubbleTarget : function(){ return this.ownerCt; } }); Ext.reg('component', Ext.Component); Ext.Action = Ext.extend(Object, { constructor : function(config){ this.initialConfig = config; this.itemId = config.itemId = (config.itemId || config.id || Ext.id()); this.items = []; }, isAction : true, setText : function(text){ this.initialConfig.text = text; this.callEach('setText', [text]); }, getText : function(){ return this.initialConfig.text; }, setIconClass : function(cls){ this.initialConfig.iconCls = cls; this.callEach('setIconClass', [cls]); }, getIconClass : function(){ return this.initialConfig.iconCls; }, setDisabled : function(v){ this.initialConfig.disabled = v; this.callEach('setDisabled', [v]); }, enable : function(){ this.setDisabled(false); }, disable : function(){ this.setDisabled(true); }, isDisabled : function(){ return this.initialConfig.disabled; }, setHidden : function(v){ this.initialConfig.hidden = v; this.callEach('setVisible', [!v]); }, show : function(){ this.setHidden(false); }, hide : function(){ this.setHidden(true); }, isHidden : function(){ return this.initialConfig.hidden; }, setHandler : function(fn, scope){ this.initialConfig.handler = fn; this.initialConfig.scope = scope; this.callEach('setHandler', [fn, scope]); }, each : function(fn, scope){ Ext.each(this.items, fn, scope); }, callEach : function(fnName, args){ var cs = this.items; for(var i = 0, len = cs.length; i < len; i++){ cs[i][fnName].apply(cs[i], args); } }, addComponent : function(comp){ this.items.push(comp); comp.on('destroy', this.removeComponent, this); }, removeComponent : function(comp){ this.items.remove(comp); }, execute : function(){ this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments); } }); (function(){ Ext.Layer = function(config, existingEl){ config = config || {}; var dh = Ext.DomHelper, cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body; if (existingEl) { this.dom = Ext.getDom(existingEl); } if(!this.dom){ var o = config.dh || {tag: 'div', cls: 'x-layer'}; this.dom = dh.append(pel, o); } if(config.cls){ this.addClass(config.cls); } this.constrain = config.constrain !== false; this.setVisibilityMode(Ext.Element.VISIBILITY); if(config.id){ this.id = this.dom.id = config.id; }else{ this.id = Ext.id(this.dom); } this.zindex = config.zindex || this.getZIndex(); this.position('absolute', this.zindex); if(config.shadow){ this.shadowOffset = config.shadowOffset || 4; this.shadow = new Ext.Shadow({ offset : this.shadowOffset, mode : config.shadow }); }else{ this.shadowOffset = 0; } this.useShim = config.shim !== false && Ext.useShims; this.useDisplay = config.useDisplay; this.hide(); }; var supr = Ext.Element.prototype; var shims = []; Ext.extend(Ext.Layer, Ext.Element, { getZIndex : function(){ return this.zindex || parseInt((this.getShim() || this).getStyle('z-index'), 10) || 11000; }, getShim : function(){ if(!this.useShim){ return null; } if(this.shim){ return this.shim; } var shim = shims.shift(); if(!shim){ shim = this.createShim(); shim.enableDisplayMode('block'); shim.dom.style.display = 'none'; shim.dom.style.visibility = 'visible'; } var pn = this.dom.parentNode; if(shim.dom.parentNode != pn){ pn.insertBefore(shim.dom, this.dom); } shim.setStyle('z-index', this.getZIndex()-2); this.shim = shim; return shim; }, hideShim : function(){ if(this.shim){ this.shim.setDisplayed(false); shims.push(this.shim); delete this.shim; } }, disableShadow : function(){ if(this.shadow){ this.shadowDisabled = true; this.shadow.hide(); this.lastShadowOffset = this.shadowOffset; this.shadowOffset = 0; } }, enableShadow : function(show){ if(this.shadow){ this.shadowDisabled = false; if(Ext.isDefined(this.lastShadowOffset)) { this.shadowOffset = this.lastShadowOffset; delete this.lastShadowOffset; } if(show){ this.sync(true); } } }, sync : function(doShow){ var shadow = this.shadow; if(!this.updating && this.isVisible() && (shadow || this.useShim)){ var shim = this.getShim(), w = this.getWidth(), h = this.getHeight(), l = this.getLeft(true), t = this.getTop(true); if(shadow && !this.shadowDisabled){ if(doShow && !shadow.isVisible()){ shadow.show(this); }else{ shadow.realign(l, t, w, h); } if(shim){ if(doShow){ shim.show(); } var shadowAdj = shadow.el.getXY(), shimStyle = shim.dom.style, shadowSize = shadow.el.getSize(); shimStyle.left = (shadowAdj[0])+'px'; shimStyle.top = (shadowAdj[1])+'px'; shimStyle.width = (shadowSize.width)+'px'; shimStyle.height = (shadowSize.height)+'px'; } }else if(shim){ if(doShow){ shim.show(); } shim.setSize(w, h); shim.setLeftTop(l, t); } } }, destroy : function(){ this.hideShim(); if(this.shadow){ this.shadow.hide(); } this.removeAllListeners(); Ext.removeNode(this.dom); delete this.dom; }, remove : function(){ this.destroy(); }, beginUpdate : function(){ this.updating = true; }, endUpdate : function(){ this.updating = false; this.sync(true); }, hideUnders : function(negOffset){ if(this.shadow){ this.shadow.hide(); } this.hideShim(); }, constrainXY : function(){ if(this.constrain){ var vw = Ext.lib.Dom.getViewWidth(), vh = Ext.lib.Dom.getViewHeight(); var s = Ext.getDoc().getScroll(); var xy = this.getXY(); var x = xy[0], y = xy[1]; var so = this.shadowOffset; var w = this.dom.offsetWidth+so, h = this.dom.offsetHeight+so; var moved = false; if((x + w) > vw+s.left){ x = vw - w - so; moved = true; } if((y + h) > vh+s.top){ y = vh - h - so; moved = true; } if(x < s.left){ x = s.left; moved = true; } if(y < s.top){ y = s.top; moved = true; } if(moved){ if(this.avoidY){ var ay = this.avoidY; if(y <= ay && (y+h) >= ay){ y = ay-h-5; } } xy = [x, y]; this.storeXY(xy); supr.setXY.call(this, xy); this.sync(); } } return this; }, getConstrainOffset : function(){ return this.shadowOffset; }, isVisible : function(){ return this.visible; }, showAction : function(){ this.visible = true; if(this.useDisplay === true){ this.setDisplayed(''); }else if(this.lastXY){ supr.setXY.call(this, this.lastXY); }else if(this.lastLT){ supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]); } }, hideAction : function(){ this.visible = false; if(this.useDisplay === true){ this.setDisplayed(false); }else{ this.setLeftTop(-10000,-10000); } }, setVisible : function(v, a, d, c, e){ if(v){ this.showAction(); } if(a && v){ var cb = function(){ this.sync(true); if(c){ c(); } }.createDelegate(this); supr.setVisible.call(this, true, true, d, cb, e); }else{ if(!v){ this.hideUnders(true); } var cb = c; if(a){ cb = function(){ this.hideAction(); if(c){ c(); } }.createDelegate(this); } supr.setVisible.call(this, v, a, d, cb, e); if(v){ this.sync(true); }else if(!a){ this.hideAction(); } } return this; }, storeXY : function(xy){ delete this.lastLT; this.lastXY = xy; }, storeLeftTop : function(left, top){ delete this.lastXY; this.lastLT = [left, top]; }, beforeFx : function(){ this.beforeAction(); return Ext.Layer.superclass.beforeFx.apply(this, arguments); }, afterFx : function(){ Ext.Layer.superclass.afterFx.apply(this, arguments); this.sync(this.isVisible()); }, beforeAction : function(){ if(!this.updating && this.shadow){ this.shadow.hide(); } }, setLeft : function(left){ this.storeLeftTop(left, this.getTop(true)); supr.setLeft.apply(this, arguments); this.sync(); return this; }, setTop : function(top){ this.storeLeftTop(this.getLeft(true), top); supr.setTop.apply(this, arguments); this.sync(); return this; }, setLeftTop : function(left, top){ this.storeLeftTop(left, top); supr.setLeftTop.apply(this, arguments); this.sync(); return this; }, setXY : function(xy, a, d, c, e){ this.fixDisplay(); this.beforeAction(); this.storeXY(xy); var cb = this.createCB(c); supr.setXY.call(this, xy, a, d, cb, e); if(!a){ cb(); } return this; }, createCB : function(c){ var el = this; return function(){ el.constrainXY(); el.sync(true); if(c){ c(); } }; }, setX : function(x, a, d, c, e){ this.setXY([x, this.getY()], a, d, c, e); return this; }, setY : function(y, a, d, c, e){ this.setXY([this.getX(), y], a, d, c, e); return this; }, setSize : function(w, h, a, d, c, e){ this.beforeAction(); var cb = this.createCB(c); supr.setSize.call(this, w, h, a, d, cb, e); if(!a){ cb(); } return this; }, setWidth : function(w, a, d, c, e){ this.beforeAction(); var cb = this.createCB(c); supr.setWidth.call(this, w, a, d, cb, e); if(!a){ cb(); } return this; }, setHeight : function(h, a, d, c, e){ this.beforeAction(); var cb = this.createCB(c); supr.setHeight.call(this, h, a, d, cb, e); if(!a){ cb(); } return this; }, setBounds : function(x, y, w, h, a, d, c, e){ this.beforeAction(); var cb = this.createCB(c); if(!a){ this.storeXY([x, y]); supr.setXY.call(this, [x, y]); supr.setSize.call(this, w, h, a, d, cb, e); cb(); }else{ supr.setBounds.call(this, x, y, w, h, a, d, cb, e); } return this; }, setZIndex : function(zindex){ this.zindex = zindex; this.setStyle('z-index', zindex + 2); if(this.shadow){ this.shadow.setZIndex(zindex + 1); } if(this.shim){ this.shim.setStyle('z-index', zindex); } return this; } }); })(); Ext.Shadow = function(config) { Ext.apply(this, config); if (typeof this.mode != "string") { this.mode = this.defaultMode; } var o = this.offset, a = { h: 0 }, rad = Math.floor(this.offset / 2); switch (this.mode.toLowerCase()) { case "drop": a.w = 0; a.l = a.t = o; a.t -= 1; if (Ext.isIE) { a.l -= this.offset + rad; a.t -= this.offset + rad; a.w -= rad; a.h -= rad; a.t += 1; } break; case "sides": a.w = (o * 2); a.l = -o; a.t = o - 1; if (Ext.isIE) { a.l -= (this.offset - rad); a.t -= this.offset + rad; a.l += 1; a.w -= (this.offset - rad) * 2; a.w -= rad + 1; a.h -= 1; } break; case "frame": a.w = a.h = (o * 2); a.l = a.t = -o; a.t += 1; a.h -= 2; if (Ext.isIE) { a.l -= (this.offset - rad); a.t -= (this.offset - rad); a.l += 1; a.w -= (this.offset + rad + 1); a.h -= (this.offset + rad); a.h += 1; } break; }; this.adjusts = a; }; Ext.Shadow.prototype = { offset: 4, defaultMode: "drop", show: function(target) { target = Ext.get(target); if (!this.el) { this.el = Ext.Shadow.Pool.pull(); if (this.el.dom.nextSibling != target.dom) { this.el.insertBefore(target); } } this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10) - 1); if (Ext.isIE) { this.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (this.offset) + ")"; } this.realign( target.getLeft(true), target.getTop(true), target.getWidth(), target.getHeight() ); this.el.dom.style.display = "block"; }, isVisible: function() { return this.el ? true: false; }, realign: function(l, t, w, h) { if (!this.el) { return; } var a = this.adjusts, d = this.el.dom, s = d.style, iea = 0, sw = (w + a.w), sh = (h + a.h), sws = sw + "px", shs = sh + "px", cn, sww; s.left = (l + a.l) + "px"; s.top = (t + a.t) + "px"; if (s.width != sws || s.height != shs) { s.width = sws; s.height = shs; if (!Ext.isIE) { cn = d.childNodes; sww = Math.max(0, (sw - 12)) + "px"; cn[0].childNodes[1].style.width = sww; cn[1].childNodes[1].style.width = sww; cn[2].childNodes[1].style.width = sww; cn[1].style.height = Math.max(0, (sh - 12)) + "px"; } } }, hide: function() { if (this.el) { this.el.dom.style.display = "none"; Ext.Shadow.Pool.push(this.el); delete this.el; } }, setZIndex: function(z) { this.zIndex = z; if (this.el) { this.el.setStyle("z-index", z); } } }; Ext.Shadow.Pool = function() { var p = [], markup = Ext.isIE ? '
': '
'; return { pull: function() { var sh = p.shift(); if (!sh) { sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup)); sh.autoBoxAdjust = false; } return sh; }, push: function(sh) { p.push(sh); } }; }(); Ext.BoxComponent = Ext.extend(Ext.Component, { initComponent : function(){ Ext.BoxComponent.superclass.initComponent.call(this); this.addEvents( 'resize', 'move' ); }, boxReady : false, deferHeight: false, setSize : function(w, h){ if(typeof w == 'object'){ h = w.height; w = w.width; } if (Ext.isDefined(w) && Ext.isDefined(this.boxMinWidth) && (w < this.boxMinWidth)) { w = this.boxMinWidth; } if (Ext.isDefined(h) && Ext.isDefined(this.boxMinHeight) && (h < this.boxMinHeight)) { h = this.boxMinHeight; } if (Ext.isDefined(w) && Ext.isDefined(this.boxMaxWidth) && (w > this.boxMaxWidth)) { w = this.boxMaxWidth; } if (Ext.isDefined(h) && Ext.isDefined(this.boxMaxHeight) && (h > this.boxMaxHeight)) { h = this.boxMaxHeight; } if(!this.boxReady){ this.width = w; this.height = h; return this; } if(this.cacheSizes !== false && this.lastSize && this.lastSize.width == w && this.lastSize.height == h){ return this; } this.lastSize = {width: w, height: h}; var adj = this.adjustSize(w, h), aw = adj.width, ah = adj.height, rz; if(aw !== undefined || ah !== undefined){ rz = this.getResizeEl(); if(!this.deferHeight && aw !== undefined && ah !== undefined){ rz.setSize(aw, ah); }else if(!this.deferHeight && ah !== undefined){ rz.setHeight(ah); }else if(aw !== undefined){ rz.setWidth(aw); } this.onResize(aw, ah, w, h); this.fireEvent('resize', this, aw, ah, w, h); } return this; }, setWidth : function(width){ return this.setSize(width); }, setHeight : function(height){ return this.setSize(undefined, height); }, getSize : function(){ return this.getResizeEl().getSize(); }, getWidth : function(){ return this.getResizeEl().getWidth(); }, getHeight : function(){ return this.getResizeEl().getHeight(); }, getOuterSize : function(){ var el = this.getResizeEl(); return {width: el.getWidth() + el.getMargins('lr'), height: el.getHeight() + el.getMargins('tb')}; }, getPosition : function(local){ var el = this.getPositionEl(); if(local === true){ return [el.getLeft(true), el.getTop(true)]; } return this.xy || el.getXY(); }, getBox : function(local){ var pos = this.getPosition(local); var s = this.getSize(); s.x = pos[0]; s.y = pos[1]; return s; }, updateBox : function(box){ this.setSize(box.width, box.height); this.setPagePosition(box.x, box.y); return this; }, getResizeEl : function(){ return this.resizeEl || this.el; }, setAutoScroll : function(scroll){ if(this.rendered){ this.getContentTarget().setOverflow(scroll ? 'auto' : ''); } this.autoScroll = scroll; return this; }, setPosition : function(x, y){ if(x && typeof x[1] == 'number'){ y = x[1]; x = x[0]; } this.x = x; this.y = y; if(!this.boxReady){ return this; } var adj = this.adjustPosition(x, y); var ax = adj.x, ay = adj.y; var el = this.getPositionEl(); if(ax !== undefined || ay !== undefined){ if(ax !== undefined && ay !== undefined){ el.setLeftTop(ax, ay); }else if(ax !== undefined){ el.setLeft(ax); }else if(ay !== undefined){ el.setTop(ay); } this.onPosition(ax, ay); this.fireEvent('move', this, ax, ay); } return this; }, setPagePosition : function(x, y){ if(x && typeof x[1] == 'number'){ y = x[1]; x = x[0]; } this.pageX = x; this.pageY = y; if(!this.boxReady){ return; } if(x === undefined || y === undefined){ return; } var p = this.getPositionEl().translatePoints(x, y); this.setPosition(p.left, p.top); return this; }, afterRender : function(){ Ext.BoxComponent.superclass.afterRender.call(this); if(this.resizeEl){ this.resizeEl = Ext.get(this.resizeEl); } if(this.positionEl){ this.positionEl = Ext.get(this.positionEl); } this.boxReady = true; Ext.isDefined(this.autoScroll) && this.setAutoScroll(this.autoScroll); this.setSize(this.width, this.height); if(this.x || this.y){ this.setPosition(this.x, this.y); }else if(this.pageX || this.pageY){ this.setPagePosition(this.pageX, this.pageY); } }, syncSize : function(){ delete this.lastSize; this.setSize(this.autoWidth ? undefined : this.getResizeEl().getWidth(), this.autoHeight ? undefined : this.getResizeEl().getHeight()); return this; }, onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){ }, onPosition : function(x, y){ }, adjustSize : function(w, h){ if(this.autoWidth){ w = 'auto'; } if(this.autoHeight){ h = 'auto'; } return {width : w, height: h}; }, adjustPosition : function(x, y){ return {x : x, y: y}; } }); Ext.reg('box', Ext.BoxComponent); Ext.Spacer = Ext.extend(Ext.BoxComponent, { autoEl:'div' }); Ext.reg('spacer', Ext.Spacer); Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){ this.el = Ext.get(dragElement, true); this.el.dom.unselectable = "on"; this.resizingEl = Ext.get(resizingElement, true); this.orientation = orientation || Ext.SplitBar.HORIZONTAL; this.minSize = 0; this.maxSize = 2000; this.animate = false; this.useShim = false; this.shim = null; if(!existingProxy){ this.proxy = Ext.SplitBar.createProxy(this.orientation); }else{ this.proxy = Ext.get(existingProxy).dom; } this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id}); this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this); this.dd.endDrag = this.onEndProxyDrag.createDelegate(this); this.dragSpecs = {}; this.adapter = new Ext.SplitBar.BasicLayoutAdapter(); this.adapter.init(this); if(this.orientation == Ext.SplitBar.HORIZONTAL){ this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT); this.el.addClass("x-splitbar-h"); }else{ this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM); this.el.addClass("x-splitbar-v"); } this.addEvents( "resize", "moved", "beforeresize", "beforeapply" ); Ext.SplitBar.superclass.constructor.call(this); }; Ext.extend(Ext.SplitBar, Ext.util.Observable, { onStartProxyDrag : function(x, y){ this.fireEvent("beforeresize", this); this.overlay = Ext.DomHelper.append(document.body, {cls: "x-drag-overlay", html: " "}, true); this.overlay.unselectable(); this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); this.overlay.show(); Ext.get(this.proxy).setDisplayed("block"); var size = this.adapter.getElementSize(this); this.activeMinSize = this.getMinimumSize(); this.activeMaxSize = this.getMaximumSize(); var c1 = size - this.activeMinSize; var c2 = Math.max(this.activeMaxSize - size, 0); if(this.orientation == Ext.SplitBar.HORIZONTAL){ this.dd.resetConstraints(); this.dd.setXConstraint( this.placement == Ext.SplitBar.LEFT ? c1 : c2, this.placement == Ext.SplitBar.LEFT ? c2 : c1, this.tickSize ); this.dd.setYConstraint(0, 0); }else{ this.dd.resetConstraints(); this.dd.setXConstraint(0, 0); this.dd.setYConstraint( this.placement == Ext.SplitBar.TOP ? c1 : c2, this.placement == Ext.SplitBar.TOP ? c2 : c1, this.tickSize ); } this.dragSpecs.startSize = size; this.dragSpecs.startPoint = [x, y]; Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y); }, onEndProxyDrag : function(e){ Ext.get(this.proxy).setDisplayed(false); var endPoint = Ext.lib.Event.getXY(e); if(this.overlay){ Ext.destroy(this.overlay); delete this.overlay; } var newSize; if(this.orientation == Ext.SplitBar.HORIZONTAL){ newSize = this.dragSpecs.startSize + (this.placement == Ext.SplitBar.LEFT ? endPoint[0] - this.dragSpecs.startPoint[0] : this.dragSpecs.startPoint[0] - endPoint[0] ); }else{ newSize = this.dragSpecs.startSize + (this.placement == Ext.SplitBar.TOP ? endPoint[1] - this.dragSpecs.startPoint[1] : this.dragSpecs.startPoint[1] - endPoint[1] ); } newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize); if(newSize != this.dragSpecs.startSize){ if(this.fireEvent('beforeapply', this, newSize) !== false){ this.adapter.setElementSize(this, newSize); this.fireEvent("moved", this, newSize); this.fireEvent("resize", this, newSize); } } }, getAdapter : function(){ return this.adapter; }, setAdapter : function(adapter){ this.adapter = adapter; this.adapter.init(this); }, getMinimumSize : function(){ return this.minSize; }, setMinimumSize : function(minSize){ this.minSize = minSize; }, getMaximumSize : function(){ return this.maxSize; }, setMaximumSize : function(maxSize){ this.maxSize = maxSize; }, setCurrentSize : function(size){ var oldAnimate = this.animate; this.animate = false; this.adapter.setElementSize(this, size); this.animate = oldAnimate; }, destroy : function(removeEl){ Ext.destroy(this.shim, Ext.get(this.proxy)); this.dd.unreg(); if(removeEl){ this.el.remove(); } this.purgeListeners(); } }); Ext.SplitBar.createProxy = function(dir){ var proxy = new Ext.Element(document.createElement("div")); document.body.appendChild(proxy.dom); proxy.unselectable(); var cls = 'x-splitbar-proxy'; proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v')); return proxy.dom; }; Ext.SplitBar.BasicLayoutAdapter = function(){ }; Ext.SplitBar.BasicLayoutAdapter.prototype = { init : function(s){ }, getElementSize : function(s){ if(s.orientation == Ext.SplitBar.HORIZONTAL){ return s.resizingEl.getWidth(); }else{ return s.resizingEl.getHeight(); } }, setElementSize : function(s, newSize, onComplete){ if(s.orientation == Ext.SplitBar.HORIZONTAL){ if(!s.animate){ s.resizingEl.setWidth(newSize); if(onComplete){ onComplete(s, newSize); } }else{ s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut'); } }else{ if(!s.animate){ s.resizingEl.setHeight(newSize); if(onComplete){ onComplete(s, newSize); } }else{ s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut'); } } } }; Ext.SplitBar.AbsoluteLayoutAdapter = function(container){ this.basic = new Ext.SplitBar.BasicLayoutAdapter(); this.container = Ext.get(container); }; Ext.SplitBar.AbsoluteLayoutAdapter.prototype = { init : function(s){ this.basic.init(s); }, getElementSize : function(s){ return this.basic.getElementSize(s); }, setElementSize : function(s, newSize, onComplete){ this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s])); }, moveSplitter : function(s){ var yes = Ext.SplitBar; switch(s.placement){ case yes.LEFT: s.el.setX(s.resizingEl.getRight()); break; case yes.RIGHT: s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px"); break; case yes.TOP: s.el.setY(s.resizingEl.getBottom()); break; case yes.BOTTOM: s.el.setY(s.resizingEl.getTop() - s.el.getHeight()); break; } } }; Ext.SplitBar.VERTICAL = 1; Ext.SplitBar.HORIZONTAL = 2; Ext.SplitBar.LEFT = 1; Ext.SplitBar.RIGHT = 2; Ext.SplitBar.TOP = 3; Ext.SplitBar.BOTTOM = 4; Ext.Container = Ext.extend(Ext.BoxComponent, { bufferResize: 50, autoDestroy : true, forceLayout: false, defaultType : 'panel', resizeEvent: 'resize', bubbleEvents: ['add', 'remove'], initComponent : function(){ Ext.Container.superclass.initComponent.call(this); this.addEvents( 'afterlayout', 'beforeadd', 'beforeremove', 'add', 'remove' ); var items = this.items; if(items){ delete this.items; this.add(items); } }, initItems : function(){ if(!this.items){ this.items = new Ext.util.MixedCollection(false, this.getComponentId); this.getLayout(); } }, setLayout : function(layout){ if(this.layout && this.layout != layout){ this.layout.setContainer(null); } this.layout = layout; this.initItems(); layout.setContainer(this); }, afterRender: function(){ Ext.Container.superclass.afterRender.call(this); if(!this.layout){ this.layout = 'auto'; } if(Ext.isObject(this.layout) && !this.layout.layout){ this.layoutConfig = this.layout; this.layout = this.layoutConfig.type; } if(Ext.isString(this.layout)){ this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig); } this.setLayout(this.layout); if(this.activeItem !== undefined && this.layout.setActiveItem){ var item = this.activeItem; delete this.activeItem; this.layout.setActiveItem(item); } if(!this.ownerCt){ this.doLayout(false, true); } if(this.monitorResize === true){ Ext.EventManager.onWindowResize(this.doLayout, this, [false]); } }, getLayoutTarget : function(){ return this.el; }, getComponentId : function(comp){ return comp.getItemId(); }, add : function(comp){ this.initItems(); var args = arguments.length > 1; if(args || Ext.isArray(comp)){ var result = []; Ext.each(args ? arguments : comp, function(c){ result.push(this.add(c)); }, this); return result; } var c = this.lookupComponent(this.applyDefaults(comp)); var index = this.items.length; if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){ this.items.add(c); c.onAdded(this, index); this.onAdd(c); this.fireEvent('add', this, c, index); } return c; }, onAdd : function(c){ }, onAdded : function(container, pos) { this.ownerCt = container; this.initRef(); this.cascade(function(c){ c.initRef(); }); this.fireEvent('added', this, container, pos); }, insert : function(index, comp) { var args = arguments, length = args.length, result = [], i, c; this.initItems(); if (length > 2) { for (i = length - 1; i >= 1; --i) { result.push(this.insert(index, args[i])); } return result; } c = this.lookupComponent(this.applyDefaults(comp)); index = Math.min(index, this.items.length); if (this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false) { if (c.ownerCt == this) { this.items.remove(c); } this.items.insert(index, c); c.onAdded(this, index); this.onAdd(c); this.fireEvent('add', this, c, index); } return c; }, applyDefaults : function(c){ var d = this.defaults; if(d){ if(Ext.isFunction(d)){ d = d.call(this, c); } if(Ext.isString(c)){ c = Ext.ComponentMgr.get(c); Ext.apply(c, d); }else if(!c.events){ Ext.applyIf(c.isAction ? c.initialConfig : c, d); }else{ Ext.apply(c, d); } } return c; }, onBeforeAdd : function(item){ if(item.ownerCt){ item.ownerCt.remove(item, false); } if(this.hideBorders === true){ item.border = (item.border === true); } }, remove : function(comp, autoDestroy){ this.initItems(); var c = this.getComponent(comp); if(c && this.fireEvent('beforeremove', this, c) !== false){ this.doRemove(c, autoDestroy); this.fireEvent('remove', this, c); } return c; }, onRemove: function(c){ }, doRemove: function(c, autoDestroy){ var l = this.layout, hasLayout = l && this.rendered; if(hasLayout){ l.onRemove(c); } this.items.remove(c); c.onRemoved(); this.onRemove(c); if(autoDestroy === true || (autoDestroy !== false && this.autoDestroy)){ c.destroy(); } if(hasLayout){ l.afterRemove(c); } }, removeAll: function(autoDestroy){ this.initItems(); var item, rem = [], items = []; this.items.each(function(i){ rem.push(i); }); for (var i = 0, len = rem.length; i < len; ++i){ item = rem[i]; this.remove(item, autoDestroy); if(item.ownerCt !== this){ items.push(item); } } return items; }, getComponent : function(comp){ if(Ext.isObject(comp)){ comp = comp.getItemId(); } return this.items.get(comp); }, lookupComponent : function(comp){ if(Ext.isString(comp)){ return Ext.ComponentMgr.get(comp); }else if(!comp.events){ return this.createComponent(comp); } return comp; }, createComponent : function(config, defaultType){ if (config.render) { return config; } var c = Ext.create(Ext.apply({ ownerCt: this }, config), defaultType || this.defaultType); delete c.initialConfig.ownerCt; delete c.ownerCt; return c; }, canLayout : function() { var el = this.getVisibilityEl(); return el && el.dom && !el.isStyle("display", "none"); }, doLayout : function(shallow, force){ var rendered = this.rendered, forceLayout = force || this.forceLayout; if(this.collapsed || !this.canLayout()){ this.deferLayout = this.deferLayout || !shallow; if(!forceLayout){ return; } shallow = shallow && !this.deferLayout; } else { delete this.deferLayout; } if(rendered && this.layout){ this.layout.layout(); } if(shallow !== true && this.items){ var cs = this.items.items; for(var i = 0, len = cs.length; i < len; i++){ var c = cs[i]; if(c.doLayout){ c.doLayout(false, forceLayout); } } } if(rendered){ this.onLayout(shallow, forceLayout); } this.hasLayout = true; delete this.forceLayout; }, onLayout : Ext.emptyFn, shouldBufferLayout: function(){ var hl = this.hasLayout; if(this.ownerCt){ return hl ? !this.hasLayoutPending() : false; } return hl; }, hasLayoutPending: function(){ var pending = false; this.ownerCt.bubble(function(c){ if(c.layoutPending){ pending = true; return false; } }); return pending; }, onShow : function(){ Ext.Container.superclass.onShow.call(this); if(Ext.isDefined(this.deferLayout)){ delete this.deferLayout; this.doLayout(true); } }, getLayout : function(){ if(!this.layout){ var layout = new Ext.layout.AutoLayout(this.layoutConfig); this.setLayout(layout); } return this.layout; }, beforeDestroy : function(){ var c; if(this.items){ while(c = this.items.first()){ this.doRemove(c, true); } } if(this.monitorResize){ Ext.EventManager.removeResizeListener(this.doLayout, this); } Ext.destroy(this.layout); Ext.Container.superclass.beforeDestroy.call(this); }, cascade : function(fn, scope, args){ if(fn.apply(scope || this, args || [this]) !== false){ if(this.items){ var cs = this.items.items; for(var i = 0, len = cs.length; i < len; i++){ if(cs[i].cascade){ cs[i].cascade(fn, scope, args); }else{ fn.apply(scope || cs[i], args || [cs[i]]); } } } } return this; }, findById : function(id){ var m = null, ct = this; this.cascade(function(c){ if(ct != c && c.id === id){ m = c; return false; } }); return m; }, findByType : function(xtype, shallow){ return this.findBy(function(c){ return c.isXType(xtype, shallow); }); }, find : function(prop, value){ return this.findBy(function(c){ return c[prop] === value; }); }, findBy : function(fn, scope){ var m = [], ct = this; this.cascade(function(c){ if(ct != c && fn.call(scope || c, c, ct) === true){ m.push(c); } }); return m; }, get : function(key){ return this.getComponent(key); } }); Ext.Container.LAYOUTS = {}; Ext.reg('container', Ext.Container); Ext.layout.ContainerLayout = Ext.extend(Object, { monitorResize:false, activeItem : null, constructor : function(config){ this.id = Ext.id(null, 'ext-layout-'); Ext.apply(this, config); }, type: 'container', IEMeasureHack : function(target, viewFlag) { var tChildren = target.dom.childNodes, tLen = tChildren.length, c, d = [], e, i, ret; for (i = 0 ; i < tLen ; i++) { c = tChildren[i]; e = Ext.get(c); if (e) { d[i] = e.getStyle('display'); e.setStyle({display: 'none'}); } } ret = target ? target.getViewSize(viewFlag) : {}; for (i = 0 ; i < tLen ; i++) { c = tChildren[i]; e = Ext.get(c); if (e) { e.setStyle({display: d[i]}); } } return ret; }, getLayoutTargetSize : Ext.EmptyFn, layout : function(){ var ct = this.container, target = ct.getLayoutTarget(); if(!(this.hasLayout || Ext.isEmpty(this.targetCls))){ target.addClass(this.targetCls); } this.onLayout(ct, target); ct.fireEvent('afterlayout', ct, this); }, onLayout : function(ct, target){ this.renderAll(ct, target); }, isValidParent : function(c, target){ return target && c.getPositionEl().dom.parentNode == (target.dom || target); }, renderAll : function(ct, target){ var items = ct.items.items, i, c, len = items.length; for(i = 0; i < len; i++) { c = items[i]; if(c && (!c.rendered || !this.isValidParent(c, target))){ this.renderItem(c, i, target); } } }, renderItem : function(c, position, target){ if (c) { if (!c.rendered) { c.render(target, position); this.configureItem(c); } else if (!this.isValidParent(c, target)) { if (Ext.isNumber(position)) { position = target.dom.childNodes[position]; } target.dom.insertBefore(c.getPositionEl().dom, position || null); c.container = target; this.configureItem(c); } } }, getRenderedItems: function(ct){ var t = ct.getLayoutTarget(), cti = ct.items.items, len = cti.length, i, c, items = []; for (i = 0; i < len; i++) { if((c = cti[i]).rendered && this.isValidParent(c, t) && c.shouldLayout !== false){ items.push(c); } }; return items; }, configureItem: function(c){ if (this.extraCls) { var t = c.getPositionEl ? c.getPositionEl() : c; t.addClass(this.extraCls); } if (c.doLayout && this.forceLayout) { c.doLayout(); } if (this.renderHidden && c != this.activeItem) { c.hide(); } }, onRemove: function(c){ if(this.activeItem == c){ delete this.activeItem; } if(c.rendered && this.extraCls){ var t = c.getPositionEl ? c.getPositionEl() : c; t.removeClass(this.extraCls); } }, afterRemove: function(c){ if(c.removeRestore){ c.removeMode = 'container'; delete c.removeRestore; } }, onResize: function(){ var ct = this.container, b; if(ct.collapsed){ return; } if(b = ct.bufferResize && ct.shouldBufferLayout()){ if(!this.resizeTask){ this.resizeTask = new Ext.util.DelayedTask(this.runLayout, this); this.resizeBuffer = Ext.isNumber(b) ? b : 50; } ct.layoutPending = true; this.resizeTask.delay(this.resizeBuffer); }else{ this.runLayout(); } }, runLayout: function(){ var ct = this.container; this.layout(); ct.onLayout(); delete ct.layoutPending; }, setContainer : function(ct){ if(this.monitorResize && ct != this.container){ var old = this.container; if(old){ old.un(old.resizeEvent, this.onResize, this); } if(ct){ ct.on(ct.resizeEvent, this.onResize, this); } } this.container = ct; }, parseMargins : function(v){ if (Ext.isNumber(v)) { v = v.toString(); } var ms = v.split(' '), len = ms.length; if (len == 1) { ms[1] = ms[2] = ms[3] = ms[0]; } else if(len == 2) { ms[2] = ms[0]; ms[3] = ms[1]; } else if(len == 3) { ms[3] = ms[1]; } return { top :parseInt(ms[0], 10) || 0, right :parseInt(ms[1], 10) || 0, bottom:parseInt(ms[2], 10) || 0, left :parseInt(ms[3], 10) || 0 }; }, fieldTpl: (function() { var t = new Ext.Template( '
', '', '
', '
', '
' ); t.disableFormats = true; return t.compile(); })(), destroy : function(){ if(this.resizeTask && this.resizeTask.cancel){ this.resizeTask.cancel(); } if(this.container) { this.container.un(this.container.resizeEvent, this.onResize, this); } if(!Ext.isEmpty(this.targetCls)){ var target = this.container.getLayoutTarget(); if(target){ target.removeClass(this.targetCls); } } } }); Ext.layout.AutoLayout = Ext.extend(Ext.layout.ContainerLayout, { type: 'auto', monitorResize: true, onLayout : function(ct, target){ Ext.layout.AutoLayout.superclass.onLayout.call(this, ct, target); var cs = this.getRenderedItems(ct), len = cs.length, i, c; for(i = 0; i < len; i++){ c = cs[i]; if (c.doLayout){ c.doLayout(true); } } } }); Ext.Container.LAYOUTS['auto'] = Ext.layout.AutoLayout; Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, { monitorResize:true, type: 'fit', getLayoutTargetSize : function() { var target = this.container.getLayoutTarget(); if (!target) { return {}; } return target.getStyleSize(); }, onLayout : function(ct, target){ Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target); if(!ct.collapsed){ this.setItemSize(this.activeItem || ct.items.itemAt(0), this.getLayoutTargetSize()); } }, setItemSize : function(item, size){ if(item && size.height > 0){ item.setSize(size); } } }); Ext.Container.LAYOUTS['fit'] = Ext.layout.FitLayout; Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, { deferredRender : false, layoutOnCardChange : false, renderHidden : true, type: 'card', setActiveItem : function(item){ var ai = this.activeItem, ct = this.container; item = ct.getComponent(item); if(item && ai != item){ if(ai){ ai.hide(); if (ai.hidden !== true) { return false; } ai.fireEvent('deactivate', ai); } var layout = item.doLayout && (this.layoutOnCardChange || !item.rendered); this.activeItem = item; delete item.deferLayout; item.show(); this.layout(); if(layout){ item.doLayout(); } item.fireEvent('activate', item); } }, renderAll : function(ct, target){ if(this.deferredRender){ this.renderItem(this.activeItem, undefined, target); }else{ Ext.layout.CardLayout.superclass.renderAll.call(this, ct, target); } } }); Ext.Container.LAYOUTS['card'] = Ext.layout.CardLayout; Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, { monitorResize : true, type : 'anchor', defaultAnchor : '100%', parseAnchorRE : /^(r|right|b|bottom)$/i, getLayoutTargetSize : function() { var target = this.container.getLayoutTarget(), ret = {}; if (target) { ret = target.getViewSize(); if (Ext.isIE && Ext.isStrict && ret.width == 0){ ret = target.getStyleSize(); } ret.width -= target.getPadding('lr'); ret.height -= target.getPadding('tb'); } return ret; }, onLayout : function(container, target) { Ext.layout.AnchorLayout.superclass.onLayout.call(this, container, target); var size = this.getLayoutTargetSize(), containerWidth = size.width, containerHeight = size.height, overflow = target.getStyle('overflow'), components = this.getRenderedItems(container), len = components.length, boxes = [], box, anchorWidth, anchorHeight, component, anchorSpec, calcWidth, calcHeight, anchorsArray, totalHeight = 0, i, el; if(containerWidth < 20 && containerHeight < 20){ return; } if(container.anchorSize) { if(typeof container.anchorSize == 'number') { anchorWidth = container.anchorSize; } else { anchorWidth = container.anchorSize.width; anchorHeight = container.anchorSize.height; } } else { anchorWidth = container.initialConfig.width; anchorHeight = container.initialConfig.height; } for(i = 0; i < len; i++) { component = components[i]; el = component.getPositionEl(); if (!component.anchor && component.items && !Ext.isNumber(component.width) && !(Ext.isIE6 && Ext.isStrict)){ component.anchor = this.defaultAnchor; } if(component.anchor) { anchorSpec = component.anchorSpec; if(!anchorSpec){ anchorsArray = component.anchor.split(' '); component.anchorSpec = anchorSpec = { right: this.parseAnchor(anchorsArray[0], component.initialConfig.width, anchorWidth), bottom: this.parseAnchor(anchorsArray[1], component.initialConfig.height, anchorHeight) }; } calcWidth = anchorSpec.right ? this.adjustWidthAnchor(anchorSpec.right(containerWidth) - el.getMargins('lr'), component) : undefined; calcHeight = anchorSpec.bottom ? this.adjustHeightAnchor(anchorSpec.bottom(containerHeight) - el.getMargins('tb'), component) : undefined; if(calcWidth || calcHeight) { boxes.push({ component: component, width: calcWidth || undefined, height: calcHeight || undefined }); } } } for (i = 0, len = boxes.length; i < len; i++) { box = boxes[i]; box.component.setSize(box.width, box.height); } if (overflow && overflow != 'hidden' && !this.adjustmentPass) { var newTargetSize = this.getLayoutTargetSize(); if (newTargetSize.width != size.width || newTargetSize.height != size.height){ this.adjustmentPass = true; this.onLayout(container, target); } } delete this.adjustmentPass; }, parseAnchor : function(a, start, cstart) { if (a && a != 'none') { var last; if (this.parseAnchorRE.test(a)) { var diff = cstart - start; return function(v){ if(v !== last){ last = v; return v - diff; } }; } else if(a.indexOf('%') != -1) { var ratio = parseFloat(a.replace('%', ''))*.01; return function(v){ if(v !== last){ last = v; return Math.floor(v*ratio); } }; } else { a = parseInt(a, 10); if (!isNaN(a)) { return function(v) { if (v !== last) { last = v; return v + a; } }; } } } return false; }, adjustWidthAnchor : function(value, comp){ return value; }, adjustHeightAnchor : function(value, comp){ return value; } }); Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout; Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, { monitorResize:true, type: 'column', extraCls: 'x-column', scrollOffset : 0, targetCls: 'x-column-layout-ct', isValidParent : function(c, target){ return this.innerCt && c.getPositionEl().dom.parentNode == this.innerCt.dom; }, getLayoutTargetSize : function() { var target = this.container.getLayoutTarget(), ret; if (target) { ret = target.getViewSize(); if (Ext.isIE && Ext.isStrict && ret.width == 0){ ret = target.getStyleSize(); } ret.width -= target.getPadding('lr'); ret.height -= target.getPadding('tb'); } return ret; }, renderAll : function(ct, target) { if(!this.innerCt){ this.innerCt = target.createChild({cls:'x-column-inner'}); this.innerCt.createChild({cls:'x-clear'}); } Ext.layout.ColumnLayout.superclass.renderAll.call(this, ct, this.innerCt); }, onLayout : function(ct, target){ var cs = ct.items.items, len = cs.length, c, i, m, margins = []; this.renderAll(ct, target); var size = this.getLayoutTargetSize(); if(size.width < 1 && size.height < 1){ return; } var w = size.width - this.scrollOffset, h = size.height, pw = w; this.innerCt.setWidth(w); for(i = 0; i < len; i++){ c = cs[i]; m = c.getPositionEl().getMargins('lr'); margins[i] = m; if(!c.columnWidth){ pw -= (c.getWidth() + m); } } pw = pw < 0 ? 0 : pw; for(i = 0; i < len; i++){ c = cs[i]; m = margins[i]; if(c.columnWidth){ c.setSize(Math.floor(c.columnWidth * pw) - m); } } if (Ext.isIE) { if (i = target.getStyle('overflow') && i != 'hidden' && !this.adjustmentPass) { var ts = this.getLayoutTargetSize(); if (ts.width != size.width){ this.adjustmentPass = true; this.onLayout(ct, target); } } } delete this.adjustmentPass; } }); Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout; Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, { monitorResize:true, rendered : false, type: 'border', targetCls: 'x-border-layout-ct', getLayoutTargetSize : function() { var target = this.container.getLayoutTarget(); return target ? target.getViewSize() : {}; }, onLayout : function(ct, target){ var collapsed, i, c, pos, items = ct.items.items, len = items.length; if(!this.rendered){ collapsed = []; for(i = 0; i < len; i++) { c = items[i]; pos = c.region; if(c.collapsed){ collapsed.push(c); } c.collapsed = false; if(!c.rendered){ c.render(target, i); c.getPositionEl().addClass('x-border-panel'); } this[pos] = pos != 'center' && c.split ? new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) : new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos); this[pos].render(target, c); } this.rendered = true; } var size = this.getLayoutTargetSize(); if(size.width < 20 || size.height < 20){ if(collapsed){ this.restoreCollapsed = collapsed; } return; }else if(this.restoreCollapsed){ collapsed = this.restoreCollapsed; delete this.restoreCollapsed; } var w = size.width, h = size.height, centerW = w, centerH = h, centerY = 0, centerX = 0, n = this.north, s = this.south, west = this.west, e = this.east, c = this.center, b, m, totalWidth, totalHeight; if(!c && Ext.layout.BorderLayout.WARN !== false){ throw 'No center region defined in BorderLayout ' + ct.id; } if(n && n.isVisible()){ b = n.getSize(); m = n.getMargins(); b.width = w - (m.left+m.right); b.x = m.left; b.y = m.top; centerY = b.height + b.y + m.bottom; centerH -= centerY; n.applyLayout(b); } if(s && s.isVisible()){ b = s.getSize(); m = s.getMargins(); b.width = w - (m.left+m.right); b.x = m.left; totalHeight = (b.height + m.top + m.bottom); b.y = h - totalHeight + m.top; centerH -= totalHeight; s.applyLayout(b); } if(west && west.isVisible()){ b = west.getSize(); m = west.getMargins(); b.height = centerH - (m.top+m.bottom); b.x = m.left; b.y = centerY + m.top; totalWidth = (b.width + m.left + m.right); centerX += totalWidth; centerW -= totalWidth; west.applyLayout(b); } if(e && e.isVisible()){ b = e.getSize(); m = e.getMargins(); b.height = centerH - (m.top+m.bottom); totalWidth = (b.width + m.left + m.right); b.x = w - totalWidth + m.left; b.y = centerY + m.top; centerW -= totalWidth; e.applyLayout(b); } if(c){ m = c.getMargins(); var centerBox = { x: centerX + m.left, y: centerY + m.top, width: centerW - (m.left+m.right), height: centerH - (m.top+m.bottom) }; c.applyLayout(centerBox); } if(collapsed){ for(i = 0, len = collapsed.length; i < len; i++){ collapsed[i].collapse(false); } } if(Ext.isIE && Ext.isStrict){ target.repaint(); } if (i = target.getStyle('overflow') && i != 'hidden' && !this.adjustmentPass) { var ts = this.getLayoutTargetSize(); if (ts.width != size.width || ts.height != size.height){ this.adjustmentPass = true; this.onLayout(ct, target); } } delete this.adjustmentPass; }, destroy: function() { var r = ['north', 'south', 'east', 'west'], i, region; for (i = 0; i < r.length; i++) { region = this[r[i]]; if(region){ if(region.destroy){ region.destroy(); }else if (region.split){ region.split.destroy(true); } } } Ext.layout.BorderLayout.superclass.destroy.call(this); } }); Ext.layout.BorderLayout.Region = function(layout, config, pos){ Ext.apply(this, config); this.layout = layout; this.position = pos; this.state = {}; if(typeof this.margins == 'string'){ this.margins = this.layout.parseMargins(this.margins); } this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins); if(this.collapsible){ if(typeof this.cmargins == 'string'){ this.cmargins = this.layout.parseMargins(this.cmargins); } if(this.collapseMode == 'mini' && !this.cmargins){ this.cmargins = {left:0,top:0,right:0,bottom:0}; }else{ this.cmargins = Ext.applyIf(this.cmargins || {}, pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins); } } }; Ext.layout.BorderLayout.Region.prototype = { collapsible : false, split:false, floatable: true, minWidth:50, minHeight:50, defaultMargins : {left:0,top:0,right:0,bottom:0}, defaultNSCMargins : {left:5,top:5,right:5,bottom:5}, defaultEWCMargins : {left:5,top:0,right:5,bottom:0}, floatingZIndex: 100, isCollapsed : false, render : function(ct, p){ this.panel = p; p.el.enableDisplayMode(); this.targetEl = ct; this.el = p.el; var gs = p.getState, ps = this.position; p.getState = function(){ return Ext.apply(gs.call(p) || {}, this.state); }.createDelegate(this); if(ps != 'center'){ p.allowQueuedExpand = false; p.on({ beforecollapse: this.beforeCollapse, collapse: this.onCollapse, beforeexpand: this.beforeExpand, expand: this.onExpand, hide: this.onHide, show: this.onShow, scope: this }); if(this.collapsible || this.floatable){ p.collapseEl = 'el'; p.slideAnchor = this.getSlideAnchor(); } if(p.tools && p.tools.toggle){ p.tools.toggle.addClass('x-tool-collapse-'+ps); p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over'); } } }, getCollapsedEl : function(){ if(!this.collapsedEl){ if(!this.toolTemplate){ var tt = new Ext.Template( '
 
' ); tt.disableFormats = true; tt.compile(); Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt; } this.collapsedEl = this.targetEl.createChild({ cls: "x-layout-collapsed x-layout-collapsed-"+this.position, id: this.panel.id + '-xcollapsed' }); this.collapsedEl.enableDisplayMode('block'); if(this.collapseMode == 'mini'){ this.collapsedEl.addClass('x-layout-cmini-'+this.position); this.miniCollapsedEl = this.collapsedEl.createChild({ cls: "x-layout-mini x-layout-mini-"+this.position, html: " " }); this.miniCollapsedEl.addClassOnOver('x-layout-mini-over'); this.collapsedEl.addClassOnOver("x-layout-collapsed-over"); this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true}); }else { if(this.collapsible !== false && !this.hideCollapseTool) { var t = this.expandToolEl = this.toolTemplate.append( this.collapsedEl.dom, {id:'expand-'+this.position}, true); t.addClassOnOver('x-tool-expand-'+this.position+'-over'); t.on('click', this.onExpandClick, this, {stopEvent:true}); } if(this.floatable !== false || this.titleCollapse){ this.collapsedEl.addClassOnOver("x-layout-collapsed-over"); this.collapsedEl.on("click", this[this.floatable ? 'collapseClick' : 'onExpandClick'], this); } } } return this.collapsedEl; }, onExpandClick : function(e){ if(this.isSlid){ this.panel.expand(false); }else{ this.panel.expand(); } }, onCollapseClick : function(e){ this.panel.collapse(); }, beforeCollapse : function(p, animate){ this.lastAnim = animate; if(this.splitEl){ this.splitEl.hide(); } this.getCollapsedEl().show(); var el = this.panel.getEl(); this.originalZIndex = el.getStyle('z-index'); el.setStyle('z-index', 100); this.isCollapsed = true; this.layout.layout(); }, onCollapse : function(animate){ this.panel.el.setStyle('z-index', 1); if(this.lastAnim === false || this.panel.animCollapse === false){ this.getCollapsedEl().dom.style.visibility = 'visible'; }else{ this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2}); } this.state.collapsed = true; this.panel.saveState(); }, beforeExpand : function(animate){ if(this.isSlid){ this.afterSlideIn(); } var c = this.getCollapsedEl(); this.el.show(); if(this.position == 'east' || this.position == 'west'){ this.panel.setSize(undefined, c.getHeight()); }else{ this.panel.setSize(c.getWidth(), undefined); } c.hide(); c.dom.style.visibility = 'hidden'; this.panel.el.setStyle('z-index', this.floatingZIndex); }, onExpand : function(){ this.isCollapsed = false; if(this.splitEl){ this.splitEl.show(); } this.layout.layout(); this.panel.el.setStyle('z-index', this.originalZIndex); this.state.collapsed = false; this.panel.saveState(); }, collapseClick : function(e){ if(this.isSlid){ e.stopPropagation(); this.slideIn(); }else{ e.stopPropagation(); this.slideOut(); } }, onHide : function(){ if(this.isCollapsed){ this.getCollapsedEl().hide(); }else if(this.splitEl){ this.splitEl.hide(); } }, onShow : function(){ if(this.isCollapsed){ this.getCollapsedEl().show(); }else if(this.splitEl){ this.splitEl.show(); } }, isVisible : function(){ return !this.panel.hidden; }, getMargins : function(){ return this.isCollapsed && this.cmargins ? this.cmargins : this.margins; }, getSize : function(){ return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize(); }, setPanel : function(panel){ this.panel = panel; }, getMinWidth: function(){ return this.minWidth; }, getMinHeight: function(){ return this.minHeight; }, applyLayoutCollapsed : function(box){ var ce = this.getCollapsedEl(); ce.setLeftTop(box.x, box.y); ce.setSize(box.width, box.height); }, applyLayout : function(box){ if(this.isCollapsed){ this.applyLayoutCollapsed(box); }else{ this.panel.setPosition(box.x, box.y); this.panel.setSize(box.width, box.height); } }, beforeSlide: function(){ this.panel.beforeEffect(); }, afterSlide : function(){ this.panel.afterEffect(); }, initAutoHide : function(){ if(this.autoHide !== false){ if(!this.autoHideHd){ this.autoHideSlideTask = new Ext.util.DelayedTask(this.slideIn, this); this.autoHideHd = { "mouseout": function(e){ if(!e.within(this.el, true)){ this.autoHideSlideTask.delay(500); } }, "mouseover" : function(e){ this.autoHideSlideTask.cancel(); }, scope : this }; } this.el.on(this.autoHideHd); this.collapsedEl.on(this.autoHideHd); } }, clearAutoHide : function(){ if(this.autoHide !== false){ this.el.un("mouseout", this.autoHideHd.mouseout); this.el.un("mouseover", this.autoHideHd.mouseover); this.collapsedEl.un("mouseout", this.autoHideHd.mouseout); this.collapsedEl.un("mouseover", this.autoHideHd.mouseover); } }, clearMonitor : function(){ Ext.getDoc().un("click", this.slideInIf, this); }, slideOut : function(){ if(this.isSlid || this.el.hasActiveFx()){ return; } this.isSlid = true; var ts = this.panel.tools, dh, pc; if(ts && ts.toggle){ ts.toggle.hide(); } this.el.show(); pc = this.panel.collapsed; this.panel.collapsed = false; if(this.position == 'east' || this.position == 'west'){ dh = this.panel.deferHeight; this.panel.deferHeight = false; this.panel.setSize(undefined, this.collapsedEl.getHeight()); this.panel.deferHeight = dh; }else{ this.panel.setSize(this.collapsedEl.getWidth(), undefined); } this.panel.collapsed = pc; this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top]; this.el.alignTo(this.collapsedEl, this.getCollapseAnchor()); this.el.setStyle("z-index", this.floatingZIndex+2); this.panel.el.replaceClass('x-panel-collapsed', 'x-panel-floating'); if(this.animFloat !== false){ this.beforeSlide(); this.el.slideIn(this.getSlideAnchor(), { callback: function(){ this.afterSlide(); this.initAutoHide(); Ext.getDoc().on("click", this.slideInIf, this); }, scope: this, block: true }); }else{ this.initAutoHide(); Ext.getDoc().on("click", this.slideInIf, this); } }, afterSlideIn : function(){ this.clearAutoHide(); this.isSlid = false; this.clearMonitor(); this.el.setStyle("z-index", ""); this.panel.el.replaceClass('x-panel-floating', 'x-panel-collapsed'); this.el.dom.style.left = this.restoreLT[0]; this.el.dom.style.top = this.restoreLT[1]; var ts = this.panel.tools; if(ts && ts.toggle){ ts.toggle.show(); } }, slideIn : function(cb){ if(!this.isSlid || this.el.hasActiveFx()){ Ext.callback(cb); return; } this.isSlid = false; if(this.animFloat !== false){ this.beforeSlide(); this.el.slideOut(this.getSlideAnchor(), { callback: function(){ this.el.hide(); this.afterSlide(); this.afterSlideIn(); Ext.callback(cb); }, scope: this, block: true }); }else{ this.el.hide(); this.afterSlideIn(); } }, slideInIf : function(e){ if(!e.within(this.el)){ this.slideIn(); } }, anchors : { "west" : "left", "east" : "right", "north" : "top", "south" : "bottom" }, sanchors : { "west" : "l", "east" : "r", "north" : "t", "south" : "b" }, canchors : { "west" : "tl-tr", "east" : "tr-tl", "north" : "tl-bl", "south" : "bl-tl" }, getAnchor : function(){ return this.anchors[this.position]; }, getCollapseAnchor : function(){ return this.canchors[this.position]; }, getSlideAnchor : function(){ return this.sanchors[this.position]; }, getAlignAdj : function(){ var cm = this.cmargins; switch(this.position){ case "west": return [0, 0]; break; case "east": return [0, 0]; break; case "north": return [0, 0]; break; case "south": return [0, 0]; break; } }, getExpandAdj : function(){ var c = this.collapsedEl, cm = this.cmargins; switch(this.position){ case "west": return [-(cm.right+c.getWidth()+cm.left), 0]; break; case "east": return [cm.right+c.getWidth()+cm.left, 0]; break; case "north": return [0, -(cm.top+cm.bottom+c.getHeight())]; break; case "south": return [0, cm.top+cm.bottom+c.getHeight()]; break; } }, destroy : function(){ if (this.autoHideSlideTask && this.autoHideSlideTask.cancel){ this.autoHideSlideTask.cancel(); } Ext.destroyMembers(this, 'miniCollapsedEl', 'collapsedEl', 'expandToolEl'); } }; Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){ Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos); this.applyLayout = this.applyFns[pos]; }; Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, { splitTip : "Drag to resize.", collapsibleSplitTip : "Drag to resize. Double click to hide.", useSplitTips : false, splitSettings : { north : { orientation: Ext.SplitBar.VERTICAL, placement: Ext.SplitBar.TOP, maxFn : 'getVMaxSize', minProp: 'minHeight', maxProp: 'maxHeight' }, south : { orientation: Ext.SplitBar.VERTICAL, placement: Ext.SplitBar.BOTTOM, maxFn : 'getVMaxSize', minProp: 'minHeight', maxProp: 'maxHeight' }, east : { orientation: Ext.SplitBar.HORIZONTAL, placement: Ext.SplitBar.RIGHT, maxFn : 'getHMaxSize', minProp: 'minWidth', maxProp: 'maxWidth' }, west : { orientation: Ext.SplitBar.HORIZONTAL, placement: Ext.SplitBar.LEFT, maxFn : 'getHMaxSize', minProp: 'minWidth', maxProp: 'maxWidth' } }, applyFns : { west : function(box){ if(this.isCollapsed){ return this.applyLayoutCollapsed(box); } var sd = this.splitEl.dom, s = sd.style; this.panel.setPosition(box.x, box.y); var sw = sd.offsetWidth; s.left = (box.x+box.width-sw)+'px'; s.top = (box.y)+'px'; s.height = Math.max(0, box.height)+'px'; this.panel.setSize(box.width-sw, box.height); }, east : function(box){ if(this.isCollapsed){ return this.applyLayoutCollapsed(box); } var sd = this.splitEl.dom, s = sd.style; var sw = sd.offsetWidth; this.panel.setPosition(box.x+sw, box.y); s.left = (box.x)+'px'; s.top = (box.y)+'px'; s.height = Math.max(0, box.height)+'px'; this.panel.setSize(box.width-sw, box.height); }, north : function(box){ if(this.isCollapsed){ return this.applyLayoutCollapsed(box); } var sd = this.splitEl.dom, s = sd.style; var sh = sd.offsetHeight; this.panel.setPosition(box.x, box.y); s.left = (box.x)+'px'; s.top = (box.y+box.height-sh)+'px'; s.width = Math.max(0, box.width)+'px'; this.panel.setSize(box.width, box.height-sh); }, south : function(box){ if(this.isCollapsed){ return this.applyLayoutCollapsed(box); } var sd = this.splitEl.dom, s = sd.style; var sh = sd.offsetHeight; this.panel.setPosition(box.x, box.y+sh); s.left = (box.x)+'px'; s.top = (box.y)+'px'; s.width = Math.max(0, box.width)+'px'; this.panel.setSize(box.width, box.height-sh); } }, render : function(ct, p){ Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p); var ps = this.position; this.splitEl = ct.createChild({ cls: "x-layout-split x-layout-split-"+ps, html: " ", id: this.panel.id + '-xsplit' }); if(this.collapseMode == 'mini'){ this.miniSplitEl = this.splitEl.createChild({ cls: "x-layout-mini x-layout-mini-"+ps, html: " " }); this.miniSplitEl.addClassOnOver('x-layout-mini-over'); this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true}); } var s = this.splitSettings[ps]; this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation); this.split.tickSize = this.tickSize; this.split.placement = s.placement; this.split.getMaximumSize = this[s.maxFn].createDelegate(this); this.split.minSize = this.minSize || this[s.minProp]; this.split.on("beforeapply", this.onSplitMove, this); this.split.useShim = this.useShim === true; this.maxSize = this.maxSize || this[s.maxProp]; if(p.hidden){ this.splitEl.hide(); } if(this.useSplitTips){ this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip; } if(this.collapsible){ this.splitEl.on("dblclick", this.onCollapseClick, this); } }, getSize : function(){ if(this.isCollapsed){ return this.collapsedEl.getSize(); } var s = this.panel.getSize(); if(this.position == 'north' || this.position == 'south'){ s.height += this.splitEl.dom.offsetHeight; }else{ s.width += this.splitEl.dom.offsetWidth; } return s; }, getHMaxSize : function(){ var cmax = this.maxSize || 10000; var center = this.layout.center; return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth()); }, getVMaxSize : function(){ var cmax = this.maxSize || 10000; var center = this.layout.center; return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight()); }, onSplitMove : function(split, newSize){ var s = this.panel.getSize(); this.lastSplitSize = newSize; if(this.position == 'north' || this.position == 'south'){ this.panel.setSize(s.width, newSize); this.state.height = newSize; }else{ this.panel.setSize(newSize, s.height); this.state.width = newSize; } this.layout.layout(); this.panel.saveState(); return false; }, getSplitBar : function(){ return this.split; }, destroy : function() { Ext.destroy(this.miniSplitEl, this.split, this.splitEl); Ext.layout.BorderLayout.SplitRegion.superclass.destroy.call(this); } }); Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout; Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, { labelSeparator : ':', trackLabels: true, type: 'form', onRemove: function(c){ Ext.layout.FormLayout.superclass.onRemove.call(this, c); if(this.trackLabels){ c.un('show', this.onFieldShow, this); c.un('hide', this.onFieldHide, this); } var el = c.getPositionEl(), ct = c.getItemCt && c.getItemCt(); if (c.rendered && ct) { if (el && el.dom) { el.insertAfter(ct); } Ext.destroy(ct); Ext.destroyMembers(c, 'label', 'itemCt'); if (c.customItemCt) { Ext.destroyMembers(c, 'getItemCt', 'customItemCt'); } } }, setContainer : function(ct){ Ext.layout.FormLayout.superclass.setContainer.call(this, ct); if(ct.labelAlign){ ct.addClass('x-form-label-'+ct.labelAlign); } if(ct.hideLabels){ Ext.apply(this, { labelStyle: 'display:none', elementStyle: 'padding-left:0;', labelAdjust: 0 }); }else{ this.labelSeparator = Ext.isDefined(ct.labelSeparator) ? ct.labelSeparator : this.labelSeparator; ct.labelWidth = ct.labelWidth || 100; if(Ext.isNumber(ct.labelWidth)){ var pad = Ext.isNumber(ct.labelPad) ? ct.labelPad : 5; Ext.apply(this, { labelAdjust: ct.labelWidth + pad, labelStyle: 'width:' + ct.labelWidth + 'px;', elementStyle: 'padding-left:' + (ct.labelWidth + pad) + 'px' }); } if(ct.labelAlign == 'top'){ Ext.apply(this, { labelStyle: 'width:auto;', labelAdjust: 0, elementStyle: 'padding-left:0;' }); } } }, isHide: function(c){ return c.hideLabel || this.container.hideLabels; }, onFieldShow: function(c){ c.getItemCt().removeClass('x-hide-' + c.hideMode); if (c.isComposite) { c.doLayout(); } }, onFieldHide: function(c){ c.getItemCt().addClass('x-hide-' + c.hideMode); }, getLabelStyle: function(s){ var ls = '', items = [this.labelStyle, s]; for (var i = 0, len = items.length; i < len; ++i){ if (items[i]){ ls += items[i]; if (ls.substr(-1, 1) != ';'){ ls += ';'; } } } return ls; }, renderItem : function(c, position, target){ if(c && (c.isFormField || c.fieldLabel) && c.inputType != 'hidden'){ var args = this.getTemplateArgs(c); if(Ext.isNumber(position)){ position = target.dom.childNodes[position] || null; } if(position){ c.itemCt = this.fieldTpl.insertBefore(position, args, true); }else{ c.itemCt = this.fieldTpl.append(target, args, true); } if(!c.getItemCt){ Ext.apply(c, { getItemCt: function(){ return c.itemCt; }, customItemCt: true }); } c.label = c.getItemCt().child('label.x-form-item-label'); if(!c.rendered){ c.render('x-form-el-' + c.id); }else if(!this.isValidParent(c, target)){ Ext.fly('x-form-el-' + c.id).appendChild(c.getPositionEl()); } if(this.trackLabels){ if(c.hidden){ this.onFieldHide(c); } c.on({ scope: this, show: this.onFieldShow, hide: this.onFieldHide }); } this.configureItem(c); }else { Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments); } }, getTemplateArgs: function(field) { var noLabelSep = !field.fieldLabel || field.hideLabel, itemCls = (field.itemCls || this.container.itemCls || '') + (field.hideLabel ? ' x-hide-label' : ''); if (Ext.isIE9 && Ext.isIEQuirks && field instanceof Ext.form.TextField) { itemCls += ' x-input-wrapper'; } return { id : field.id, label : field.fieldLabel, itemCls : itemCls, clearCls : field.clearCls || 'x-form-clear-left', labelStyle : this.getLabelStyle(field.labelStyle), elementStyle : this.elementStyle || '', labelSeparator: noLabelSep ? '' : (Ext.isDefined(field.labelSeparator) ? field.labelSeparator : this.labelSeparator) }; }, adjustWidthAnchor: function(value, c){ if(c.label && !this.isHide(c) && (this.container.labelAlign != 'top')){ var adjust = Ext.isIE6 || (Ext.isIE && !Ext.isStrict); return value - this.labelAdjust + (adjust ? -3 : 0); } return value; }, adjustHeightAnchor : function(value, c){ if(c.label && !this.isHide(c) && (this.container.labelAlign == 'top')){ return value - c.label.getHeight(); } return value; }, isValidParent : function(c, target){ return target && this.container.getEl().contains(c.getPositionEl()); } }); Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout; Ext.layout.AccordionLayout = Ext.extend(Ext.layout.FitLayout, { fill : true, autoWidth : true, titleCollapse : true, hideCollapseTool : false, collapseFirst : false, animate : false, sequence : false, activeOnTop : false, type: 'accordion', renderItem : function(c){ if(this.animate === false){ c.animCollapse = false; } c.collapsible = true; if(this.autoWidth){ c.autoWidth = true; } if(this.titleCollapse){ c.titleCollapse = true; } if(this.hideCollapseTool){ c.hideCollapseTool = true; } if(this.collapseFirst !== undefined){ c.collapseFirst = this.collapseFirst; } if(!this.activeItem && !c.collapsed){ this.setActiveItem(c, true); }else if(this.activeItem && this.activeItem != c){ c.collapsed = true; } Ext.layout.AccordionLayout.superclass.renderItem.apply(this, arguments); c.header.addClass('x-accordion-hd'); c.on('beforeexpand', this.beforeExpand, this); }, onRemove: function(c){ Ext.layout.AccordionLayout.superclass.onRemove.call(this, c); if(c.rendered){ c.header.removeClass('x-accordion-hd'); } c.un('beforeexpand', this.beforeExpand, this); }, beforeExpand : function(p, anim){ var ai = this.activeItem; if(ai){ if(this.sequence){ delete this.activeItem; if (!ai.collapsed){ ai.collapse({callback:function(){ p.expand(anim || true); }, scope: this}); return false; } }else{ ai.collapse(this.animate); } } this.setActive(p); if(this.activeOnTop){ p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild); } this.layout(); }, setItemSize : function(item, size){ if(this.fill && item){ var hh = 0, i, ct = this.getRenderedItems(this.container), len = ct.length, p; for (i = 0; i < len; i++) { if((p = ct[i]) != item && !p.hidden){ hh += p.header.getHeight(); } }; size.height -= hh; item.setSize(size); } }, setActiveItem : function(item){ this.setActive(item, true); }, setActive : function(item, expand){ var ai = this.activeItem; item = this.container.getComponent(item); if(ai != item){ if(item.rendered && item.collapsed && expand){ item.expand(); }else{ if(ai){ ai.fireEvent('deactivate', ai); } this.activeItem = item; item.fireEvent('activate', item); } } } }); Ext.Container.LAYOUTS.accordion = Ext.layout.AccordionLayout; Ext.layout.Accordion = Ext.layout.AccordionLayout; Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, { monitorResize:false, type: 'table', targetCls: 'x-table-layout-ct', tableAttrs:null, setContainer : function(ct){ Ext.layout.TableLayout.superclass.setContainer.call(this, ct); this.currentRow = 0; this.currentColumn = 0; this.cells = []; }, onLayout : function(ct, target){ var cs = ct.items.items, len = cs.length, c, i; if(!this.table){ target.addClass('x-table-layout-ct'); this.table = target.createChild( Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true); } this.renderAll(ct, target); }, getRow : function(index){ var row = this.table.tBodies[0].childNodes[index]; if(!row){ row = document.createElement('tr'); this.table.tBodies[0].appendChild(row); } return row; }, getNextCell : function(c){ var cell = this.getNextNonSpan(this.currentColumn, this.currentRow); var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1]; for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){ if(!this.cells[rowIndex]){ this.cells[rowIndex] = []; } for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){ this.cells[rowIndex][colIndex] = true; } } var td = document.createElement('td'); if(c.cellId){ td.id = c.cellId; } var cls = 'x-table-layout-cell'; if(c.cellCls){ cls += ' ' + c.cellCls; } td.className = cls; if(c.colspan){ td.colSpan = c.colspan; } if(c.rowspan){ td.rowSpan = c.rowspan; } this.getRow(curRow).appendChild(td); return td; }, getNextNonSpan: function(colIndex, rowIndex){ var cols = this.columns; while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) { if(cols && colIndex >= cols){ rowIndex++; colIndex = 0; }else{ colIndex++; } } return [colIndex, rowIndex]; }, renderItem : function(c, position, target){ if(!this.table){ this.table = target.createChild( Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true); } if(c && !c.rendered){ c.render(this.getNextCell(c)); this.configureItem(c); }else if(c && !this.isValidParent(c, target)){ var container = this.getNextCell(c); container.insertBefore(c.getPositionEl().dom, null); c.container = Ext.get(container); this.configureItem(c); } }, isValidParent : function(c, target){ return c.getPositionEl().up('table', 5).dom.parentNode === (target.dom || target); }, destroy: function(){ delete this.table; Ext.layout.TableLayout.superclass.destroy.call(this); } }); Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout; Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, { extraCls: 'x-abs-layout-item', type: 'absolute', onLayout : function(ct, target){ target.position(); this.paddingLeft = target.getPadding('l'); this.paddingTop = target.getPadding('t'); Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target); }, adjustWidthAnchor : function(value, comp){ return value ? value - comp.getPosition(true)[0] + this.paddingLeft : value; }, adjustHeightAnchor : function(value, comp){ return value ? value - comp.getPosition(true)[1] + this.paddingTop : value; } }); Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout; Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, { defaultMargins : {left:0,top:0,right:0,bottom:0}, padding : '0', pack : 'start', monitorResize : true, type: 'box', scrollOffset : 0, extraCls : 'x-box-item', targetCls : 'x-box-layout-ct', innerCls : 'x-box-inner', constructor : function(config){ Ext.layout.BoxLayout.superclass.constructor.call(this, config); if (Ext.isString(this.defaultMargins)) { this.defaultMargins = this.parseMargins(this.defaultMargins); } var handler = this.overflowHandler; if (typeof handler == 'string') { handler = { type: handler }; } var handlerType = 'none'; if (handler && handler.type != undefined) { handlerType = handler.type; } var constructor = Ext.layout.boxOverflow[handlerType]; if (constructor[this.type]) { constructor = constructor[this.type]; } this.overflowHandler = new constructor(this, handler); }, onLayout: function(container, target) { Ext.layout.BoxLayout.superclass.onLayout.call(this, container, target); var tSize = this.getLayoutTargetSize(), items = this.getVisibleItems(container), calcs = this.calculateChildBoxes(items, tSize), boxes = calcs.boxes, meta = calcs.meta; if (tSize.width > 0) { var handler = this.overflowHandler, method = meta.tooNarrow ? 'handleOverflow' : 'clearOverflow'; var results = handler[method](calcs, tSize); if (results) { if (results.targetSize) { tSize = results.targetSize; } if (results.recalculate) { items = this.getVisibleItems(container); calcs = this.calculateChildBoxes(items, tSize); boxes = calcs.boxes; } } } this.layoutTargetLastSize = tSize; this.childBoxCache = calcs; this.updateInnerCtSize(tSize, calcs); this.updateChildBoxes(boxes); this.handleTargetOverflow(tSize, container, target); }, updateChildBoxes: function(boxes) { for (var i = 0, length = boxes.length; i < length; i++) { var box = boxes[i], comp = box.component; if (box.dirtySize) { comp.setSize(box.width, box.height); } if (isNaN(box.left) || isNaN(box.top)) { continue; } comp.setPosition(box.left, box.top); } }, updateInnerCtSize: function(tSize, calcs) { var align = this.align, padding = this.padding, width = tSize.width, height = tSize.height; if (this.type == 'hbox') { var innerCtWidth = width, innerCtHeight = calcs.meta.maxHeight + padding.top + padding.bottom; if (align == 'stretch') { innerCtHeight = height; } else if (align == 'middle') { innerCtHeight = Math.max(height, innerCtHeight); } } else { var innerCtHeight = height, innerCtWidth = calcs.meta.maxWidth + padding.left + padding.right; if (align == 'stretch') { innerCtWidth = width; } else if (align == 'center') { innerCtWidth = Math.max(width, innerCtWidth); } } this.innerCt.setSize(innerCtWidth || undefined, innerCtHeight || undefined); }, handleTargetOverflow: function(previousTargetSize, container, target) { var overflow = target.getStyle('overflow'); if (overflow && overflow != 'hidden' &&!this.adjustmentPass) { var newTargetSize = this.getLayoutTargetSize(); if (newTargetSize.width != previousTargetSize.width || newTargetSize.height != previousTargetSize.height){ this.adjustmentPass = true; this.onLayout(container, target); } } delete this.adjustmentPass; }, isValidParent : function(c, target) { return this.innerCt && c.getPositionEl().dom.parentNode == this.innerCt.dom; }, getVisibleItems: function(ct) { var ct = ct || this.container, t = ct.getLayoutTarget(), cti = ct.items.items, len = cti.length, i, c, items = []; for (i = 0; i < len; i++) { if((c = cti[i]).rendered && this.isValidParent(c, t) && c.hidden !== true && c.collapsed !== true && c.shouldLayout !== false){ items.push(c); } } return items; }, renderAll : function(ct, target) { if (!this.innerCt) { this.innerCt = target.createChild({cls:this.innerCls}); this.padding = this.parseMargins(this.padding); } Ext.layout.BoxLayout.superclass.renderAll.call(this, ct, this.innerCt); }, getLayoutTargetSize : function() { var target = this.container.getLayoutTarget(), ret; if (target) { ret = target.getViewSize(); if (Ext.isIE && Ext.isStrict && ret.width == 0){ ret = target.getStyleSize(); } ret.width -= target.getPadding('lr'); ret.height -= target.getPadding('tb'); } return ret; }, renderItem : function(c) { if(Ext.isString(c.margins)){ c.margins = this.parseMargins(c.margins); }else if(!c.margins){ c.margins = this.defaultMargins; } Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments); }, destroy: function() { Ext.destroy(this.overflowHandler); Ext.layout.BoxLayout.superclass.destroy.apply(this, arguments); } }); Ext.layout.boxOverflow.None = Ext.extend(Object, { constructor: function(layout, config) { this.layout = layout; Ext.apply(this, config || {}); }, handleOverflow: Ext.emptyFn, clearOverflow: Ext.emptyFn }); Ext.layout.boxOverflow.none = Ext.layout.boxOverflow.None; Ext.layout.boxOverflow.Menu = Ext.extend(Ext.layout.boxOverflow.None, { afterCls: 'x-strip-right', noItemsMenuText : '
(None)
', constructor: function(layout) { Ext.layout.boxOverflow.Menu.superclass.constructor.apply(this, arguments); this.menuItems = []; }, createInnerElements: function() { if (!this.afterCt) { this.afterCt = this.layout.innerCt.insertSibling({cls: this.afterCls}, 'before'); } }, clearOverflow: function(calculations, targetSize) { var newWidth = targetSize.width + (this.afterCt ? this.afterCt.getWidth() : 0), items = this.menuItems; this.hideTrigger(); for (var index = 0, length = items.length; index < length; index++) { items.pop().component.show(); } return { targetSize: { height: targetSize.height, width : newWidth } }; }, showTrigger: function() { this.createMenu(); this.menuTrigger.show(); }, hideTrigger: function() { if (this.menuTrigger != undefined) { this.menuTrigger.hide(); } }, beforeMenuShow: function(menu) { var items = this.menuItems, len = items.length, item, prev; var needsSep = function(group, item){ return group.isXType('buttongroup') && !(item instanceof Ext.Toolbar.Separator); }; this.clearMenu(); menu.removeAll(); for (var i = 0; i < len; i++) { item = items[i].component; if (prev && (needsSep(item, prev) || needsSep(prev, item))) { menu.add('-'); } this.addComponentToMenu(menu, item); prev = item; } if (menu.items.length < 1) { menu.add(this.noItemsMenuText); } }, createMenuConfig : function(component, hideOnClick){ var config = Ext.apply({}, component.initialConfig), group = component.toggleGroup; Ext.copyTo(config, component, [ 'iconCls', 'icon', 'itemId', 'disabled', 'handler', 'scope', 'menu' ]); Ext.apply(config, { text : component.overflowText || component.text, hideOnClick: hideOnClick }); if (group || component.enableToggle) { Ext.apply(config, { group : group, checked: component.pressed, listeners: { checkchange: function(item, checked){ component.toggle(checked); } } }); } delete config.ownerCt; delete config.xtype; delete config.id; return config; }, addComponentToMenu : function(menu, component) { if (component instanceof Ext.Toolbar.Separator) { menu.add('-'); } else if (Ext.isFunction(component.isXType)) { if (component.isXType('splitbutton')) { menu.add(this.createMenuConfig(component, true)); } else if (component.isXType('button')) { menu.add(this.createMenuConfig(component, !component.menu)); } else if (component.isXType('buttongroup')) { component.items.each(function(item){ this.addComponentToMenu(menu, item); }, this); } } }, clearMenu : function(){ var menu = this.moreMenu; if (menu && menu.items) { menu.items.each(function(item){ delete item.menu; }); } }, createMenu: function() { if (!this.menuTrigger) { this.createInnerElements(); this.menu = new Ext.menu.Menu({ ownerCt : this.layout.container, listeners: { scope: this, beforeshow: this.beforeMenuShow } }); this.menuTrigger = new Ext.Button({ iconCls : 'x-toolbar-more-icon', cls : 'x-toolbar-more', menu : this.menu, renderTo: this.afterCt }); } }, destroy: function() { Ext.destroy(this.menu, this.menuTrigger); } }); Ext.layout.boxOverflow.menu = Ext.layout.boxOverflow.Menu; Ext.layout.boxOverflow.HorizontalMenu = Ext.extend(Ext.layout.boxOverflow.Menu, { constructor: function() { Ext.layout.boxOverflow.HorizontalMenu.superclass.constructor.apply(this, arguments); var me = this, layout = me.layout, origFunction = layout.calculateChildBoxes; layout.calculateChildBoxes = function(visibleItems, targetSize) { var calcs = origFunction.apply(layout, arguments), meta = calcs.meta, items = me.menuItems; var hiddenWidth = 0; for (var index = 0, length = items.length; index < length; index++) { hiddenWidth += items[index].width; } meta.minimumWidth += hiddenWidth; meta.tooNarrow = meta.minimumWidth > targetSize.width; return calcs; }; }, handleOverflow: function(calculations, targetSize) { this.showTrigger(); var newWidth = targetSize.width - this.afterCt.getWidth(), boxes = calculations.boxes, usedWidth = 0, recalculate = false; for (var index = 0, length = boxes.length; index < length; index++) { usedWidth += boxes[index].width; } var spareWidth = newWidth - usedWidth, showCount = 0; for (var index = 0, length = this.menuItems.length; index < length; index++) { var hidden = this.menuItems[index], comp = hidden.component, width = hidden.width; if (width < spareWidth) { comp.show(); spareWidth -= width; showCount ++; recalculate = true; } else { break; } } if (recalculate) { this.menuItems = this.menuItems.slice(showCount); } else { for (var i = boxes.length - 1; i >= 0; i--) { var item = boxes[i].component, right = boxes[i].left + boxes[i].width; if (right >= newWidth) { this.menuItems.unshift({ component: item, width : boxes[i].width }); item.hide(); } else { break; } } } if (this.menuItems.length == 0) { this.hideTrigger(); } return { targetSize: { height: targetSize.height, width : newWidth }, recalculate: recalculate }; } }); Ext.layout.boxOverflow.menu.hbox = Ext.layout.boxOverflow.HorizontalMenu; Ext.layout.boxOverflow.Scroller = Ext.extend(Ext.layout.boxOverflow.None, { animateScroll: true, scrollIncrement: 100, wheelIncrement: 3, scrollRepeatInterval: 400, scrollDuration: 0.4, beforeCls: 'x-strip-left', afterCls: 'x-strip-right', scrollerCls: 'x-strip-scroller', beforeScrollerCls: 'x-strip-scroller-left', afterScrollerCls: 'x-strip-scroller-right', createWheelListener: function() { this.layout.innerCt.on({ scope : this, mousewheel: function(e) { e.stopEvent(); this.scrollBy(e.getWheelDelta() * this.wheelIncrement * -1, false); } }); }, handleOverflow: function(calculations, targetSize) { this.createInnerElements(); this.showScrollers(); }, clearOverflow: function() { this.hideScrollers(); }, showScrollers: function() { this.createScrollers(); this.beforeScroller.show(); this.afterScroller.show(); this.updateScrollButtons(); }, hideScrollers: function() { if (this.beforeScroller != undefined) { this.beforeScroller.hide(); this.afterScroller.hide(); } }, createScrollers: function() { if (!this.beforeScroller && !this.afterScroller) { var before = this.beforeCt.createChild({ cls: String.format("{0} {1} ", this.scrollerCls, this.beforeScrollerCls) }); var after = this.afterCt.createChild({ cls: String.format("{0} {1}", this.scrollerCls, this.afterScrollerCls) }); before.addClassOnOver(this.beforeScrollerCls + '-hover'); after.addClassOnOver(this.afterScrollerCls + '-hover'); before.setVisibilityMode(Ext.Element.DISPLAY); after.setVisibilityMode(Ext.Element.DISPLAY); this.beforeRepeater = new Ext.util.ClickRepeater(before, { interval: this.scrollRepeatInterval, handler : this.scrollLeft, scope : this }); this.afterRepeater = new Ext.util.ClickRepeater(after, { interval: this.scrollRepeatInterval, handler : this.scrollRight, scope : this }); this.beforeScroller = before; this.afterScroller = after; } }, destroy: function() { Ext.destroy(this.beforeScroller, this.afterScroller, this.beforeRepeater, this.afterRepeater, this.beforeCt, this.afterCt); }, scrollBy: function(delta, animate) { this.scrollTo(this.getScrollPosition() + delta, animate); }, getItem: function(item) { if (Ext.isString(item)) { item = Ext.getCmp(item); } else if (Ext.isNumber(item)) { item = this.items[item]; } return item; }, getScrollAnim: function() { return { duration: this.scrollDuration, callback: this.updateScrollButtons, scope : this }; }, updateScrollButtons: function() { if (this.beforeScroller == undefined || this.afterScroller == undefined) { return; } var beforeMeth = this.atExtremeBefore() ? 'addClass' : 'removeClass', afterMeth = this.atExtremeAfter() ? 'addClass' : 'removeClass', beforeCls = this.beforeScrollerCls + '-disabled', afterCls = this.afterScrollerCls + '-disabled'; this.beforeScroller[beforeMeth](beforeCls); this.afterScroller[afterMeth](afterCls); this.scrolling = false; }, atExtremeBefore: function() { return this.getScrollPosition() === 0; }, scrollLeft: function(animate) { this.scrollBy(-this.scrollIncrement, animate); }, scrollRight: function(animate) { this.scrollBy(this.scrollIncrement, animate); }, scrollToItem: function(item, animate) { item = this.getItem(item); if (item != undefined) { var visibility = this.getItemVisibility(item); if (!visibility.fullyVisible) { var box = item.getBox(true, true), newX = box.x; if (visibility.hiddenRight) { newX -= (this.layout.innerCt.getWidth() - box.width); } this.scrollTo(newX, animate); } } }, getItemVisibility: function(item) { var box = this.getItem(item).getBox(true, true), itemLeft = box.x, itemRight = box.x + box.width, scrollLeft = this.getScrollPosition(), scrollRight = this.layout.innerCt.getWidth() + scrollLeft; return { hiddenLeft : itemLeft < scrollLeft, hiddenRight : itemRight > scrollRight, fullyVisible: itemLeft > scrollLeft && itemRight < scrollRight }; } }); Ext.layout.boxOverflow.scroller = Ext.layout.boxOverflow.Scroller; Ext.layout.boxOverflow.VerticalScroller = Ext.extend(Ext.layout.boxOverflow.Scroller, { scrollIncrement: 75, wheelIncrement : 2, handleOverflow: function(calculations, targetSize) { Ext.layout.boxOverflow.VerticalScroller.superclass.handleOverflow.apply(this, arguments); return { targetSize: { height: targetSize.height - (this.beforeCt.getHeight() + this.afterCt.getHeight()), width : targetSize.width } }; }, createInnerElements: function() { var target = this.layout.innerCt; if (!this.beforeCt) { this.beforeCt = target.insertSibling({cls: this.beforeCls}, 'before'); this.afterCt = target.insertSibling({cls: this.afterCls}, 'after'); this.createWheelListener(); } }, scrollTo: function(position, animate) { var oldPosition = this.getScrollPosition(), newPosition = position.constrain(0, this.getMaxScrollBottom()); if (newPosition != oldPosition && !this.scrolling) { if (animate == undefined) { animate = this.animateScroll; } this.layout.innerCt.scrollTo('top', newPosition, animate ? this.getScrollAnim() : false); if (animate) { this.scrolling = true; } else { this.scrolling = false; this.updateScrollButtons(); } } }, getScrollPosition: function(){ return parseInt(this.layout.innerCt.dom.scrollTop, 10) || 0; }, getMaxScrollBottom: function() { return this.layout.innerCt.dom.scrollHeight - this.layout.innerCt.getHeight(); }, atExtremeAfter: function() { return this.getScrollPosition() >= this.getMaxScrollBottom(); } }); Ext.layout.boxOverflow.scroller.vbox = Ext.layout.boxOverflow.VerticalScroller; Ext.layout.boxOverflow.HorizontalScroller = Ext.extend(Ext.layout.boxOverflow.Scroller, { handleOverflow: function(calculations, targetSize) { Ext.layout.boxOverflow.HorizontalScroller.superclass.handleOverflow.apply(this, arguments); return { targetSize: { height: targetSize.height, width : targetSize.width - (this.beforeCt.getWidth() + this.afterCt.getWidth()) } }; }, createInnerElements: function() { var target = this.layout.innerCt; if (!this.beforeCt) { this.afterCt = target.insertSibling({cls: this.afterCls}, 'before'); this.beforeCt = target.insertSibling({cls: this.beforeCls}, 'before'); this.createWheelListener(); } }, scrollTo: function(position, animate) { var oldPosition = this.getScrollPosition(), newPosition = position.constrain(0, this.getMaxScrollRight()); if (newPosition != oldPosition && !this.scrolling) { if (animate == undefined) { animate = this.animateScroll; } this.layout.innerCt.scrollTo('left', newPosition, animate ? this.getScrollAnim() : false); if (animate) { this.scrolling = true; } else { this.scrolling = false; this.updateScrollButtons(); } } }, getScrollPosition: function(){ return parseInt(this.layout.innerCt.dom.scrollLeft, 10) || 0; }, getMaxScrollRight: function() { return this.layout.innerCt.dom.scrollWidth - this.layout.innerCt.getWidth(); }, atExtremeAfter: function() { return this.getScrollPosition() >= this.getMaxScrollRight(); } }); Ext.layout.boxOverflow.scroller.hbox = Ext.layout.boxOverflow.HorizontalScroller; Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, { align: 'top', type : 'hbox', calculateChildBoxes: function(visibleItems, targetSize) { var visibleCount = visibleItems.length, padding = this.padding, topOffset = padding.top, leftOffset = padding.left, paddingVert = topOffset + padding.bottom, paddingHoriz = leftOffset + padding.right, width = targetSize.width - this.scrollOffset, height = targetSize.height, availHeight = Math.max(0, height - paddingVert), isStart = this.pack == 'start', isCenter = this.pack == 'center', isEnd = this.pack == 'end', nonFlexWidth = 0, maxHeight = 0, totalFlex = 0, desiredWidth = 0, minimumWidth = 0, boxes = [], child, childWidth, childHeight, childSize, childMargins, canLayout, i, calcs, flexedWidth, horizMargins, vertMargins, stretchHeight; for (i = 0; i < visibleCount; i++) { child = visibleItems[i]; childHeight = child.height; childWidth = child.width; canLayout = !child.hasLayout && typeof child.doLayout == 'function'; if (typeof childWidth != 'number') { if (child.flex && !childWidth) { totalFlex += child.flex; } else { if (!childWidth && canLayout) { child.doLayout(); } childSize = child.getSize(); childWidth = childSize.width; childHeight = childSize.height; } } childMargins = child.margins; horizMargins = childMargins.left + childMargins.right; nonFlexWidth += horizMargins + (childWidth || 0); desiredWidth += horizMargins + (child.flex ? child.minWidth || 0 : childWidth); minimumWidth += horizMargins + (child.minWidth || childWidth || 0); if (typeof childHeight != 'number') { if (canLayout) { child.doLayout(); } childHeight = child.getHeight(); } maxHeight = Math.max(maxHeight, childHeight + childMargins.top + childMargins.bottom); boxes.push({ component: child, height : childHeight || undefined, width : childWidth || undefined }); } var shortfall = desiredWidth - width, tooNarrow = minimumWidth > width; var availableWidth = Math.max(0, width - nonFlexWidth - paddingHoriz); if (tooNarrow) { for (i = 0; i < visibleCount; i++) { boxes[i].width = visibleItems[i].minWidth || visibleItems[i].width || boxes[i].width; } } else { if (shortfall > 0) { var minWidths = []; for (var index = 0, length = visibleCount; index < length; index++) { var item = visibleItems[index], minWidth = item.minWidth || 0; if (item.flex) { boxes[index].width = minWidth; } else { minWidths.push({ minWidth : minWidth, available: boxes[index].width - minWidth, index : index }); } } minWidths.sort(function(a, b) { return a.available > b.available ? 1 : -1; }); for (var i = 0, length = minWidths.length; i < length; i++) { var itemIndex = minWidths[i].index; if (itemIndex == undefined) { continue; } var item = visibleItems[itemIndex], box = boxes[itemIndex], oldWidth = box.width, minWidth = item.minWidth, newWidth = Math.max(minWidth, oldWidth - Math.ceil(shortfall / (length - i))), reduction = oldWidth - newWidth; boxes[itemIndex].width = newWidth; shortfall -= reduction; } } else { var remainingWidth = availableWidth, remainingFlex = totalFlex; for (i = 0; i < visibleCount; i++) { child = visibleItems[i]; calcs = boxes[i]; childMargins = child.margins; vertMargins = childMargins.top + childMargins.bottom; if (isStart && child.flex && !child.width) { flexedWidth = Math.ceil((child.flex / remainingFlex) * remainingWidth); remainingWidth -= flexedWidth; remainingFlex -= child.flex; calcs.width = flexedWidth; calcs.dirtySize = true; } } } } if (isCenter) { leftOffset += availableWidth / 2; } else if (isEnd) { leftOffset += availableWidth; } for (i = 0; i < visibleCount; i++) { child = visibleItems[i]; calcs = boxes[i]; childMargins = child.margins; leftOffset += childMargins.left; vertMargins = childMargins.top + childMargins.bottom; calcs.left = leftOffset; calcs.top = topOffset + childMargins.top; switch (this.align) { case 'stretch': stretchHeight = availHeight - vertMargins; calcs.height = stretchHeight.constrain(child.minHeight || 0, child.maxHeight || 1000000); calcs.dirtySize = true; break; case 'stretchmax': stretchHeight = maxHeight - vertMargins; calcs.height = stretchHeight.constrain(child.minHeight || 0, child.maxHeight || 1000000); calcs.dirtySize = true; break; case 'middle': var diff = availHeight - calcs.height - vertMargins; if (diff > 0) { calcs.top = topOffset + vertMargins + (diff / 2); } } leftOffset += calcs.width + childMargins.right; } return { boxes: boxes, meta : { maxHeight : maxHeight, nonFlexWidth: nonFlexWidth, desiredWidth: desiredWidth, minimumWidth: minimumWidth, shortfall : desiredWidth - width, tooNarrow : tooNarrow } }; } }); Ext.Container.LAYOUTS.hbox = Ext.layout.HBoxLayout; Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, { align : 'left', type: 'vbox', calculateChildBoxes: function(visibleItems, targetSize) { var visibleCount = visibleItems.length, padding = this.padding, topOffset = padding.top, leftOffset = padding.left, paddingVert = topOffset + padding.bottom, paddingHoriz = leftOffset + padding.right, width = targetSize.width - this.scrollOffset, height = targetSize.height, availWidth = Math.max(0, width - paddingHoriz), isStart = this.pack == 'start', isCenter = this.pack == 'center', isEnd = this.pack == 'end', nonFlexHeight= 0, maxWidth = 0, totalFlex = 0, desiredHeight= 0, minimumHeight= 0, boxes = [], child, childWidth, childHeight, childSize, childMargins, canLayout, i, calcs, flexedHeight, horizMargins, vertMargins, stretchWidth, length; for (i = 0; i < visibleCount; i++) { child = visibleItems[i]; childHeight = child.height; childWidth = child.width; canLayout = !child.hasLayout && typeof child.doLayout == 'function'; if (typeof childHeight != 'number') { if (child.flex && !childHeight) { totalFlex += child.flex; } else { if (!childHeight && canLayout) { child.doLayout(); } childSize = child.getSize(); childWidth = childSize.width; childHeight = childSize.height; } } childMargins = child.margins; vertMargins = childMargins.top + childMargins.bottom; nonFlexHeight += vertMargins + (childHeight || 0); desiredHeight += vertMargins + (child.flex ? child.minHeight || 0 : childHeight); minimumHeight += vertMargins + (child.minHeight || childHeight || 0); if (typeof childWidth != 'number') { if (canLayout) { child.doLayout(); } childWidth = child.getWidth(); } maxWidth = Math.max(maxWidth, childWidth + childMargins.left + childMargins.right); boxes.push({ component: child, height : childHeight || undefined, width : childWidth || undefined }); } var shortfall = desiredHeight - height, tooNarrow = minimumHeight > height; var availableHeight = Math.max(0, (height - nonFlexHeight - paddingVert)); if (tooNarrow) { for (i = 0, length = visibleCount; i < length; i++) { boxes[i].height = visibleItems[i].minHeight || visibleItems[i].height || boxes[i].height; } } else { if (shortfall > 0) { var minHeights = []; for (var index = 0, length = visibleCount; index < length; index++) { var item = visibleItems[index], minHeight = item.minHeight || 0; if (item.flex) { boxes[index].height = minHeight; } else { minHeights.push({ minHeight: minHeight, available: boxes[index].height - minHeight, index : index }); } } minHeights.sort(function(a, b) { return a.available > b.available ? 1 : -1; }); for (var i = 0, length = minHeights.length; i < length; i++) { var itemIndex = minHeights[i].index; if (itemIndex == undefined) { continue; } var item = visibleItems[itemIndex], box = boxes[itemIndex], oldHeight = box.height, minHeight = item.minHeight, newHeight = Math.max(minHeight, oldHeight - Math.ceil(shortfall / (length - i))), reduction = oldHeight - newHeight; boxes[itemIndex].height = newHeight; shortfall -= reduction; } } else { var remainingHeight = availableHeight, remainingFlex = totalFlex; for (i = 0; i < visibleCount; i++) { child = visibleItems[i]; calcs = boxes[i]; childMargins = child.margins; horizMargins = childMargins.left + childMargins.right; if (isStart && child.flex && !child.height) { flexedHeight = Math.ceil((child.flex / remainingFlex) * remainingHeight); remainingHeight -= flexedHeight; remainingFlex -= child.flex; calcs.height = flexedHeight; calcs.dirtySize = true; } } } } if (isCenter) { topOffset += availableHeight / 2; } else if (isEnd) { topOffset += availableHeight; } for (i = 0; i < visibleCount; i++) { child = visibleItems[i]; calcs = boxes[i]; childMargins = child.margins; topOffset += childMargins.top; horizMargins = childMargins.left + childMargins.right; calcs.left = leftOffset + childMargins.left; calcs.top = topOffset; switch (this.align) { case 'stretch': stretchWidth = availWidth - horizMargins; calcs.width = stretchWidth.constrain(child.minWidth || 0, child.maxWidth || 1000000); calcs.dirtySize = true; break; case 'stretchmax': stretchWidth = maxWidth - horizMargins; calcs.width = stretchWidth.constrain(child.minWidth || 0, child.maxWidth || 1000000); calcs.dirtySize = true; break; case 'center': var diff = availWidth - calcs.width - horizMargins; if (diff > 0) { calcs.left = leftOffset + horizMargins + (diff / 2); } } topOffset += calcs.height + childMargins.bottom; } return { boxes: boxes, meta : { maxWidth : maxWidth, nonFlexHeight: nonFlexHeight, desiredHeight: desiredHeight, minimumHeight: minimumHeight, shortfall : desiredHeight - height, tooNarrow : tooNarrow } }; } }); Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout; Ext.layout.ToolbarLayout = Ext.extend(Ext.layout.ContainerLayout, { monitorResize : true, type: 'toolbar', triggerWidth: 18, noItemsMenuText : '
(None)
', lastOverflow: false, tableHTML: [ '', '', '', '', '', '', '', '
', '', '', '', '', '
', '
', '', '', '', '', '', '', '', '
', '', '', '', '', '
', '
', '', '', '', '', '
', '
', '
' ].join(""), onLayout : function(ct, target) { if (!this.leftTr) { var align = ct.buttonAlign == 'center' ? 'center' : 'left'; target.addClass('x-toolbar-layout-ct'); target.insertHtml('beforeEnd', String.format(this.tableHTML, align)); this.leftTr = target.child('tr.x-toolbar-left-row', true); this.rightTr = target.child('tr.x-toolbar-right-row', true); this.extrasTr = target.child('tr.x-toolbar-extras-row', true); if (this.hiddenItem == undefined) { this.hiddenItems = []; } } var side = ct.buttonAlign == 'right' ? this.rightTr : this.leftTr, items = ct.items.items, position = 0; for (var i = 0, len = items.length, c; i < len; i++, position++) { c = items[i]; if (c.isFill) { side = this.rightTr; position = -1; } else if (!c.rendered) { c.render(this.insertCell(c, side, position)); this.configureItem(c); } else { if (!c.xtbHidden && !this.isValidParent(c, side.childNodes[position])) { var td = this.insertCell(c, side, position); td.appendChild(c.getPositionEl().dom); c.container = Ext.get(td); } } } this.cleanup(this.leftTr); this.cleanup(this.rightTr); this.cleanup(this.extrasTr); this.fitToSize(target); }, cleanup : function(el) { var cn = el.childNodes, i, c; for (i = cn.length-1; i >= 0 && (c = cn[i]); i--) { if (!c.firstChild) { el.removeChild(c); } } }, insertCell : function(c, target, position) { var td = document.createElement('td'); td.className = 'x-toolbar-cell'; target.insertBefore(td, target.childNodes[position] || null); return td; }, hideItem : function(item) { this.hiddenItems.push(item); item.xtbHidden = true; item.xtbWidth = item.getPositionEl().dom.parentNode.offsetWidth; item.hide(); }, unhideItem : function(item) { item.show(); item.xtbHidden = false; this.hiddenItems.remove(item); }, getItemWidth : function(c) { return c.hidden ? (c.xtbWidth || 0) : c.getPositionEl().dom.parentNode.offsetWidth; }, fitToSize : function(target) { if (this.container.enableOverflow === false) { return; } var width = target.dom.clientWidth, tableWidth = target.dom.firstChild.offsetWidth, clipWidth = width - this.triggerWidth, lastWidth = this.lastWidth || 0, hiddenItems = this.hiddenItems, hasHiddens = hiddenItems.length != 0, isLarger = width >= lastWidth; this.lastWidth = width; if (tableWidth > width || (hasHiddens && isLarger)) { var items = this.container.items.items, len = items.length, loopWidth = 0, item; for (var i = 0; i < len; i++) { item = items[i]; if (!item.isFill) { loopWidth += this.getItemWidth(item); if (loopWidth > clipWidth) { if (!(item.hidden || item.xtbHidden)) { this.hideItem(item); } } else if (item.xtbHidden) { this.unhideItem(item); } } } } hasHiddens = hiddenItems.length != 0; if (hasHiddens) { this.initMore(); if (!this.lastOverflow) { this.container.fireEvent('overflowchange', this.container, true); this.lastOverflow = true; } } else if (this.more) { this.clearMenu(); this.more.destroy(); delete this.more; if (this.lastOverflow) { this.container.fireEvent('overflowchange', this.container, false); this.lastOverflow = false; } } }, createMenuConfig : function(component, hideOnClick){ var config = Ext.apply({}, component.initialConfig), group = component.toggleGroup; Ext.copyTo(config, component, [ 'iconCls', 'icon', 'itemId', 'disabled', 'handler', 'scope', 'menu' ]); Ext.apply(config, { text : component.overflowText || component.text, hideOnClick: hideOnClick }); if (group || component.enableToggle) { Ext.apply(config, { group : group, checked: component.pressed, listeners: { checkchange: function(item, checked){ component.toggle(checked); } } }); } delete config.ownerCt; delete config.xtype; delete config.id; return config; }, addComponentToMenu : function(menu, component) { if (component instanceof Ext.Toolbar.Separator) { menu.add('-'); } else if (Ext.isFunction(component.isXType)) { if (component.isXType('splitbutton')) { menu.add(this.createMenuConfig(component, true)); } else if (component.isXType('button')) { menu.add(this.createMenuConfig(component, !component.menu)); } else if (component.isXType('buttongroup')) { component.items.each(function(item){ this.addComponentToMenu(menu, item); }, this); } } }, clearMenu : function(){ var menu = this.moreMenu; if (menu && menu.items) { menu.items.each(function(item){ delete item.menu; }); } }, beforeMoreShow : function(menu) { var items = this.container.items.items, len = items.length, item, prev; var needsSep = function(group, item){ return group.isXType('buttongroup') && !(item instanceof Ext.Toolbar.Separator); }; this.clearMenu(); menu.removeAll(); for (var i = 0; i < len; i++) { item = items[i]; if (item.xtbHidden) { if (prev && (needsSep(item, prev) || needsSep(prev, item))) { menu.add('-'); } this.addComponentToMenu(menu, item); prev = item; } } if (menu.items.length < 1) { menu.add(this.noItemsMenuText); } }, initMore : function(){ if (!this.more) { this.moreMenu = new Ext.menu.Menu({ ownerCt : this.container, listeners: { beforeshow: this.beforeMoreShow, scope: this } }); this.more = new Ext.Button({ iconCls: 'x-toolbar-more-icon', cls : 'x-toolbar-more', menu : this.moreMenu, ownerCt: this.container }); var td = this.insertCell(this.more, this.extrasTr, 100); this.more.render(td); } }, destroy : function(){ Ext.destroy(this.more, this.moreMenu); delete this.leftTr; delete this.rightTr; delete this.extrasTr; Ext.layout.ToolbarLayout.superclass.destroy.call(this); } }); Ext.Container.LAYOUTS.toolbar = Ext.layout.ToolbarLayout; Ext.layout.MenuLayout = Ext.extend(Ext.layout.ContainerLayout, { monitorResize : true, type: 'menu', setContainer : function(ct){ this.monitorResize = !ct.floating; ct.on('autosize', this.doAutoSize, this); Ext.layout.MenuLayout.superclass.setContainer.call(this, ct); }, renderItem : function(c, position, target){ if (!this.itemTpl) { this.itemTpl = Ext.layout.MenuLayout.prototype.itemTpl = new Ext.XTemplate( '
  • ', '', '{altText}', '', '
  • ' ); } if(c && !c.rendered){ if(Ext.isNumber(position)){ position = target.dom.childNodes[position]; } var a = this.getItemArgs(c); c.render(c.positionEl = position ? this.itemTpl.insertBefore(position, a, true) : this.itemTpl.append(target, a, true)); c.positionEl.menuItemId = c.getItemId(); if (!a.isMenuItem && a.needsIcon) { c.positionEl.addClass('x-menu-list-item-indent'); } this.configureItem(c); }else if(c && !this.isValidParent(c, target)){ if(Ext.isNumber(position)){ position = target.dom.childNodes[position]; } target.dom.insertBefore(c.getActionEl().dom, position || null); } }, getItemArgs : function(c) { var isMenuItem = c instanceof Ext.menu.Item, canHaveIcon = !(isMenuItem || c instanceof Ext.menu.Separator); return { isMenuItem: isMenuItem, needsIcon: canHaveIcon && (c.icon || c.iconCls), icon: c.icon || Ext.BLANK_IMAGE_URL, iconCls: 'x-menu-item-icon ' + (c.iconCls || ''), itemId: 'x-menu-el-' + c.id, itemCls: 'x-menu-list-item ', altText: c.altText || '' }; }, isValidParent : function(c, target) { return c.el.up('li.x-menu-list-item', 5).dom.parentNode === (target.dom || target); }, onLayout : function(ct, target){ Ext.layout.MenuLayout.superclass.onLayout.call(this, ct, target); this.doAutoSize(); }, doAutoSize : function(){ var ct = this.container, w = ct.width; if(ct.floating){ if(w){ ct.setWidth(w); }else if(Ext.isIE){ ct.setWidth(Ext.isStrict && (Ext.isIE7 || Ext.isIE8 || Ext.isIE9) ? 'auto' : ct.minWidth); var el = ct.getEl(), t = el.dom.offsetWidth; ct.setWidth(ct.getLayoutTarget().getWidth() + el.getFrameWidth('lr')); } } } }); Ext.Container.LAYOUTS['menu'] = Ext.layout.MenuLayout; Ext.Viewport = Ext.extend(Ext.Container, { initComponent : function() { Ext.Viewport.superclass.initComponent.call(this); document.getElementsByTagName('html')[0].className += ' x-viewport'; this.el = Ext.getBody(); this.el.setHeight = Ext.emptyFn; this.el.setWidth = Ext.emptyFn; this.el.setSize = Ext.emptyFn; this.el.dom.scroll = 'no'; this.allowDomMove = false; this.autoWidth = true; this.autoHeight = true; Ext.EventManager.onWindowResize(this.fireResize, this); this.renderTo = this.el; }, fireResize : function(w, h){ this.fireEvent('resize', this, w, h, w, h); } }); Ext.reg('viewport', Ext.Viewport); Ext.Panel = Ext.extend(Ext.Container, { baseCls : 'x-panel', collapsedCls : 'x-panel-collapsed', maskDisabled : true, animCollapse : Ext.enableFx, headerAsText : true, buttonAlign : 'right', collapsed : false, collapseFirst : true, minButtonWidth : 75, elements : 'body', preventBodyReset : false, padding: undefined, resizeEvent: 'bodyresize', toolTarget : 'header', collapseEl : 'bwrap', slideAnchor : 't', disabledClass : '', deferHeight : true, expandDefaults: { duration : 0.25 }, collapseDefaults : { duration : 0.25 }, initComponent : function(){ Ext.Panel.superclass.initComponent.call(this); this.addEvents( 'bodyresize', 'titlechange', 'iconchange', 'collapse', 'expand', 'beforecollapse', 'beforeexpand', 'beforeclose', 'close', 'activate', 'deactivate' ); if(this.unstyled){ this.baseCls = 'x-plain'; } this.toolbars = []; if(this.tbar){ this.elements += ',tbar'; this.topToolbar = this.createToolbar(this.tbar); this.tbar = null; } if(this.bbar){ this.elements += ',bbar'; this.bottomToolbar = this.createToolbar(this.bbar); this.bbar = null; } if(this.header === true){ this.elements += ',header'; this.header = null; }else if(this.headerCfg || (this.title && this.header !== false)){ this.elements += ',header'; } if(this.footerCfg || this.footer === true){ this.elements += ',footer'; this.footer = null; } if(this.buttons){ this.fbar = this.buttons; this.buttons = null; } if(this.fbar){ this.createFbar(this.fbar); } if(this.autoLoad){ this.on('render', this.doAutoLoad, this, {delay:10}); } }, createFbar : function(fbar){ var min = this.minButtonWidth; this.elements += ',footer'; this.fbar = this.createToolbar(fbar, { buttonAlign: this.buttonAlign, toolbarCls: 'x-panel-fbar', enableOverflow: false, defaults: function(c){ return { minWidth: c.minWidth || min }; } }); this.fbar.items.each(function(c){ c.minWidth = c.minWidth || this.minButtonWidth; }, this); this.buttons = this.fbar.items.items; }, createToolbar: function(tb, options){ var result; if(Ext.isArray(tb)){ tb = { items: tb }; } result = tb.events ? Ext.apply(tb, options) : this.createComponent(Ext.apply({}, tb, options), 'toolbar'); this.toolbars.push(result); return result; }, createElement : function(name, pnode){ if(this[name]){ pnode.appendChild(this[name].dom); return; } if(name === 'bwrap' || this.elements.indexOf(name) != -1){ if(this[name+'Cfg']){ this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']); }else{ var el = document.createElement('div'); el.className = this[name+'Cls']; this[name] = Ext.get(pnode.appendChild(el)); } if(this[name+'CssClass']){ this[name].addClass(this[name+'CssClass']); } if(this[name+'Style']){ this[name].applyStyles(this[name+'Style']); } } }, onRender : function(ct, position){ Ext.Panel.superclass.onRender.call(this, ct, position); this.createClasses(); var el = this.el, d = el.dom, bw, ts; if(this.collapsible && !this.hideCollapseTool){ this.tools = this.tools ? this.tools.slice(0) : []; this.tools[this.collapseFirst?'unshift':'push']({ id: 'toggle', handler : this.toggleCollapse, scope: this }); } if(this.tools){ ts = this.tools; this.elements += (this.header !== false) ? ',header' : ''; } this.tools = {}; el.addClass(this.baseCls); if(d.firstChild){ this.header = el.down('.'+this.headerCls); this.bwrap = el.down('.'+this.bwrapCls); var cp = this.bwrap ? this.bwrap : el; this.tbar = cp.down('.'+this.tbarCls); this.body = cp.down('.'+this.bodyCls); this.bbar = cp.down('.'+this.bbarCls); this.footer = cp.down('.'+this.footerCls); this.fromMarkup = true; } if (this.preventBodyReset === true) { el.addClass('x-panel-reset'); } if(this.cls){ el.addClass(this.cls); } if(this.buttons){ this.elements += ',footer'; } if(this.frame){ el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls)); this.createElement('header', d.firstChild.firstChild.firstChild); this.createElement('bwrap', d); bw = this.bwrap.dom; var ml = d.childNodes[1], bl = d.childNodes[2]; bw.appendChild(ml); bw.appendChild(bl); var mc = bw.firstChild.firstChild.firstChild; this.createElement('tbar', mc); this.createElement('body', mc); this.createElement('bbar', mc); this.createElement('footer', bw.lastChild.firstChild.firstChild); if(!this.footer){ this.bwrap.dom.lastChild.className += ' x-panel-nofooter'; } this.ft = Ext.get(this.bwrap.dom.lastChild); this.mc = Ext.get(mc); }else{ this.createElement('header', d); this.createElement('bwrap', d); bw = this.bwrap.dom; this.createElement('tbar', bw); this.createElement('body', bw); this.createElement('bbar', bw); this.createElement('footer', bw); if(!this.header){ this.body.addClass(this.bodyCls + '-noheader'); if(this.tbar){ this.tbar.addClass(this.tbarCls + '-noheader'); } } } if(Ext.isDefined(this.padding)){ this.body.setStyle('padding', this.body.addUnits(this.padding)); } if(this.border === false){ this.el.addClass(this.baseCls + '-noborder'); this.body.addClass(this.bodyCls + '-noborder'); if(this.header){ this.header.addClass(this.headerCls + '-noborder'); } if(this.footer){ this.footer.addClass(this.footerCls + '-noborder'); } if(this.tbar){ this.tbar.addClass(this.tbarCls + '-noborder'); } if(this.bbar){ this.bbar.addClass(this.bbarCls + '-noborder'); } } if(this.bodyBorder === false){ this.body.addClass(this.bodyCls + '-noborder'); } this.bwrap.enableDisplayMode('block'); if(this.header){ this.header.unselectable(); if(this.headerAsText){ this.header.dom.innerHTML = ''+this.header.dom.innerHTML+''; if(this.iconCls){ this.setIconClass(this.iconCls); } } } if(this.floating){ this.makeFloating(this.floating); } if(this.collapsible && this.titleCollapse && this.header){ this.mon(this.header, 'click', this.toggleCollapse, this); this.header.setStyle('cursor', 'pointer'); } if(ts){ this.addTool.apply(this, ts); } if(this.fbar){ this.footer.addClass('x-panel-btns'); this.fbar.ownerCt = this; this.fbar.render(this.footer); this.footer.createChild({cls:'x-clear'}); } if(this.tbar && this.topToolbar){ this.topToolbar.ownerCt = this; this.topToolbar.render(this.tbar); } if(this.bbar && this.bottomToolbar){ this.bottomToolbar.ownerCt = this; this.bottomToolbar.render(this.bbar); } }, setIconClass : function(cls){ var old = this.iconCls; this.iconCls = cls; if(this.rendered && this.header){ if(this.frame){ this.header.addClass('x-panel-icon'); this.header.replaceClass(old, this.iconCls); }else{ var hd = this.header, img = hd.child('img.x-panel-inline-icon'); if(img){ Ext.fly(img).replaceClass(old, this.iconCls); }else{ var hdspan = hd.child('span.' + this.headerTextCls); if (hdspan) { Ext.DomHelper.insertBefore(hdspan.dom, { tag:'img', alt: '', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls }); } } } } this.fireEvent('iconchange', this, cls, old); }, makeFloating : function(cfg){ this.floating = true; this.el = new Ext.Layer(Ext.apply({}, cfg, { shadow: Ext.isDefined(this.shadow) ? this.shadow : 'sides', shadowOffset: this.shadowOffset, constrain:false, shim: this.shim === false ? false : undefined }), this.el); }, getTopToolbar : function(){ return this.topToolbar; }, getBottomToolbar : function(){ return this.bottomToolbar; }, getFooterToolbar : function() { return this.fbar; }, addButton : function(config, handler, scope){ if(!this.fbar){ this.createFbar([]); } if(handler){ if(Ext.isString(config)){ config = {text: config}; } config = Ext.apply({ handler: handler, scope: scope }, config); } return this.fbar.add(config); }, addTool : function(){ if(!this.rendered){ if(!this.tools){ this.tools = []; } Ext.each(arguments, function(arg){ this.tools.push(arg); }, this); return; } if(!this[this.toolTarget]){ return; } if(!this.toolTemplate){ var tt = new Ext.Template( '
     
    ' ); tt.disableFormats = true; tt.compile(); Ext.Panel.prototype.toolTemplate = tt; } for(var i = 0, a = arguments, len = a.length; i < len; i++) { var tc = a[i]; if(!this.tools[tc.id]){ var overCls = 'x-tool-'+tc.id+'-over'; var t = this.toolTemplate.insertFirst(this[this.toolTarget], tc, true); this.tools[tc.id] = t; t.enableDisplayMode('block'); this.mon(t, 'click', this.createToolHandler(t, tc, overCls, this)); if(tc.on){ this.mon(t, tc.on); } if(tc.hidden){ t.hide(); } if(tc.qtip){ if(Ext.isObject(tc.qtip)){ Ext.QuickTips.register(Ext.apply({ target: t.id }, tc.qtip)); } else { t.dom.qtip = tc.qtip; } } t.addClassOnOver(overCls); } } }, onLayout : function(shallow, force){ Ext.Panel.superclass.onLayout.apply(this, arguments); if(this.hasLayout && this.toolbars.length > 0){ Ext.each(this.toolbars, function(tb){ tb.doLayout(undefined, force); }); this.syncHeight(); } }, syncHeight : function(){ var h = this.toolbarHeight, bd = this.body, lsh = this.lastSize.height, sz; if(this.autoHeight || !Ext.isDefined(lsh) || lsh == 'auto'){ return; } if(h != this.getToolbarHeight()){ h = Math.max(0, lsh - this.getFrameHeight()); bd.setHeight(h); sz = bd.getSize(); this.toolbarHeight = this.getToolbarHeight(); this.onBodyResize(sz.width, sz.height); } }, onShow : function(){ if(this.floating){ return this.el.show(); } Ext.Panel.superclass.onShow.call(this); }, onHide : function(){ if(this.floating){ return this.el.hide(); } Ext.Panel.superclass.onHide.call(this); }, createToolHandler : function(t, tc, overCls, panel){ return function(e){ t.removeClass(overCls); if(tc.stopEvent !== false){ e.stopEvent(); } if(tc.handler){ tc.handler.call(tc.scope || t, e, t, panel, tc); } }; }, afterRender : function(){ if(this.floating && !this.hidden){ this.el.show(); } if(this.title){ this.setTitle(this.title); } Ext.Panel.superclass.afterRender.call(this); if (this.collapsed) { this.collapsed = false; this.collapse(false); } this.initEvents(); }, getKeyMap : function(){ if(!this.keyMap){ this.keyMap = new Ext.KeyMap(this.el, this.keys); } return this.keyMap; }, initEvents : function(){ if(this.keys){ this.getKeyMap(); } if(this.draggable){ this.initDraggable(); } if(this.toolbars.length > 0){ Ext.each(this.toolbars, function(tb){ tb.doLayout(); tb.on({ scope: this, afterlayout: this.syncHeight, remove: this.syncHeight }); }, this); this.syncHeight(); } }, initDraggable : function(){ this.dd = new Ext.Panel.DD(this, Ext.isBoolean(this.draggable) ? null : this.draggable); }, beforeEffect : function(anim){ if(this.floating){ this.el.beforeAction(); } if(anim !== false){ this.el.addClass('x-panel-animated'); } }, afterEffect : function(anim){ this.syncShadow(); this.el.removeClass('x-panel-animated'); }, createEffect : function(a, cb, scope){ var o = { scope:scope, block:true }; if(a === true){ o.callback = cb; return o; }else if(!a.callback){ o.callback = cb; }else { o.callback = function(){ cb.call(scope); Ext.callback(a.callback, a.scope); }; } return Ext.applyIf(o, a); }, collapse : function(animate){ if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){ return; } var doAnim = animate === true || (animate !== false && this.animCollapse); this.beforeEffect(doAnim); this.onCollapse(doAnim, animate); return this; }, onCollapse : function(doAnim, animArg){ if(doAnim){ this[this.collapseEl].slideOut(this.slideAnchor, Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this), this.collapseDefaults)); }else{ this[this.collapseEl].hide(this.hideMode); this.afterCollapse(false); } }, afterCollapse : function(anim){ this.collapsed = true; this.el.addClass(this.collapsedCls); if(anim !== false){ this[this.collapseEl].hide(this.hideMode); } this.afterEffect(anim); this.cascade(function(c) { if (c.lastSize) { c.lastSize = { width: undefined, height: undefined }; } }); this.fireEvent('collapse', this); }, expand : function(animate){ if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){ return; } var doAnim = animate === true || (animate !== false && this.animCollapse); this.el.removeClass(this.collapsedCls); this.beforeEffect(doAnim); this.onExpand(doAnim, animate); return this; }, onExpand : function(doAnim, animArg){ if(doAnim){ this[this.collapseEl].slideIn(this.slideAnchor, Ext.apply(this.createEffect(animArg||true, this.afterExpand, this), this.expandDefaults)); }else{ this[this.collapseEl].show(this.hideMode); this.afterExpand(false); } }, afterExpand : function(anim){ this.collapsed = false; if(anim !== false){ this[this.collapseEl].show(this.hideMode); } this.afterEffect(anim); if (this.deferLayout) { delete this.deferLayout; this.doLayout(true); } this.fireEvent('expand', this); }, toggleCollapse : function(animate){ this[this.collapsed ? 'expand' : 'collapse'](animate); return this; }, onDisable : function(){ if(this.rendered && this.maskDisabled){ this.el.mask(); } Ext.Panel.superclass.onDisable.call(this); }, onEnable : function(){ if(this.rendered && this.maskDisabled){ this.el.unmask(); } Ext.Panel.superclass.onEnable.call(this); }, onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){ var w = adjWidth, h = adjHeight; if(Ext.isDefined(w) || Ext.isDefined(h)){ if(!this.collapsed){ if(Ext.isNumber(w)){ this.body.setWidth(w = this.adjustBodyWidth(w - this.getFrameWidth())); } else if (w == 'auto') { w = this.body.setWidth('auto').dom.offsetWidth; } else { w = this.body.dom.offsetWidth; } if(this.tbar){ this.tbar.setWidth(w); if(this.topToolbar){ this.topToolbar.setSize(w); } } if(this.bbar){ this.bbar.setWidth(w); if(this.bottomToolbar){ this.bottomToolbar.setSize(w); if (Ext.isIE) { this.bbar.setStyle('position', 'static'); this.bbar.setStyle('position', ''); } } } if(this.footer){ this.footer.setWidth(w); if(this.fbar){ this.fbar.setSize(Ext.isIE ? (w - this.footer.getFrameWidth('lr')) : 'auto'); } } if(Ext.isNumber(h)){ h = Math.max(0, h - this.getFrameHeight()); this.body.setHeight(h); }else if(h == 'auto'){ this.body.setHeight(h); } if(this.disabled && this.el._mask){ this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight()); } }else{ this.queuedBodySize = {width: w, height: h}; if(!this.queuedExpand && this.allowQueuedExpand !== false){ this.queuedExpand = true; this.on('expand', function(){ delete this.queuedExpand; this.onResize(this.queuedBodySize.width, this.queuedBodySize.height); }, this, {single:true}); } } this.onBodyResize(w, h); } this.syncShadow(); Ext.Panel.superclass.onResize.call(this, adjWidth, adjHeight, rawWidth, rawHeight); }, onBodyResize: function(w, h){ this.fireEvent('bodyresize', this, w, h); }, getToolbarHeight: function(){ var h = 0; if(this.rendered){ Ext.each(this.toolbars, function(tb){ h += tb.getHeight(); }, this); } return h; }, adjustBodyHeight : function(h){ return h; }, adjustBodyWidth : function(w){ return w; }, onPosition : function(){ this.syncShadow(); }, getFrameWidth : function(){ var w = this.el.getFrameWidth('lr') + this.bwrap.getFrameWidth('lr'); if(this.frame){ var l = this.bwrap.dom.firstChild; w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r')); w += this.mc.getFrameWidth('lr'); } return w; }, getFrameHeight : function() { var h = this.el.getFrameWidth('tb') + this.bwrap.getFrameWidth('tb'); h += (this.tbar ? this.tbar.getHeight() : 0) + (this.bbar ? this.bbar.getHeight() : 0); if(this.frame){ h += this.el.dom.firstChild.offsetHeight + this.ft.dom.offsetHeight + this.mc.getFrameWidth('tb'); }else{ h += (this.header ? this.header.getHeight() : 0) + (this.footer ? this.footer.getHeight() : 0); } return h; }, getInnerWidth : function(){ return this.getSize().width - this.getFrameWidth(); }, getInnerHeight : function(){ return this.body.getHeight(); }, syncShadow : function(){ if(this.floating){ this.el.sync(true); } }, getLayoutTarget : function(){ return this.body; }, getContentTarget : function(){ return this.body; }, setTitle : function(title, iconCls){ this.title = title; if(this.header && this.headerAsText){ this.header.child('span').update(title); } if(iconCls){ this.setIconClass(iconCls); } this.fireEvent('titlechange', this, title); return this; }, getUpdater : function(){ return this.body.getUpdater(); }, load : function(){ var um = this.body.getUpdater(); um.update.apply(um, arguments); return this; }, beforeDestroy : function(){ Ext.Panel.superclass.beforeDestroy.call(this); if(this.header){ this.header.removeAllListeners(); } if(this.tools){ for(var k in this.tools){ Ext.destroy(this.tools[k]); } } if(this.toolbars.length > 0){ Ext.each(this.toolbars, function(tb){ tb.un('afterlayout', this.syncHeight, this); tb.un('remove', this.syncHeight, this); }, this); } if(Ext.isArray(this.buttons)){ while(this.buttons.length) { Ext.destroy(this.buttons[0]); } } if(this.rendered){ Ext.destroy( this.ft, this.header, this.footer, this.tbar, this.bbar, this.body, this.mc, this.bwrap, this.dd ); if (this.fbar) { Ext.destroy( this.fbar, this.fbar.el ); } } Ext.destroy(this.toolbars); }, createClasses : function(){ this.headerCls = this.baseCls + '-header'; this.headerTextCls = this.baseCls + '-header-text'; this.bwrapCls = this.baseCls + '-bwrap'; this.tbarCls = this.baseCls + '-tbar'; this.bodyCls = this.baseCls + '-body'; this.bbarCls = this.baseCls + '-bbar'; this.footerCls = this.baseCls + '-footer'; }, createGhost : function(cls, useShim, appendTo){ var el = document.createElement('div'); el.className = 'x-panel-ghost ' + (cls ? cls : ''); if(this.header){ el.appendChild(this.el.dom.firstChild.cloneNode(true)); } Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight()); el.style.width = this.el.dom.offsetWidth + 'px';; if(!appendTo){ this.container.dom.appendChild(el); }else{ Ext.getDom(appendTo).appendChild(el); } if(useShim !== false && this.el.useShim !== false){ var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el); layer.show(); return layer; }else{ return new Ext.Element(el); } }, doAutoLoad : function(){ var u = this.body.getUpdater(); if(this.renderer){ u.setRenderer(this.renderer); } u.update(Ext.isObject(this.autoLoad) ? this.autoLoad : {url: this.autoLoad}); }, getTool : function(id) { return this.tools[id]; } }); Ext.reg('panel', Ext.Panel); Ext.Editor = function(field, config){ if(field.field){ this.field = Ext.create(field.field, 'textfield'); config = Ext.apply({}, field); delete config.field; }else{ this.field = field; } Ext.Editor.superclass.constructor.call(this, config); }; Ext.extend(Ext.Editor, Ext.Component, { allowBlur: true, value : "", alignment: "c-c?", offsets: [0, 0], shadow : "frame", constrain : false, swallowKeys : true, completeOnEnter : true, cancelOnEsc : true, updateEl : false, initComponent : function(){ Ext.Editor.superclass.initComponent.call(this); this.addEvents( "beforestartedit", "startedit", "beforecomplete", "complete", "canceledit", "specialkey" ); }, onRender : function(ct, position){ this.el = new Ext.Layer({ shadow: this.shadow, cls: "x-editor", parentEl : ct, shim : this.shim, shadowOffset: this.shadowOffset || 4, id: this.id, constrain: this.constrain }); if(this.zIndex){ this.el.setZIndex(this.zIndex); } this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden"); if(this.field.msgTarget != 'title'){ this.field.msgTarget = 'qtip'; } this.field.inEditor = true; this.mon(this.field, { scope: this, blur: this.onBlur, specialkey: this.onSpecialKey }); if(this.field.grow){ this.mon(this.field, "autosize", this.el.sync, this.el, {delay:1}); } this.field.render(this.el).show(); this.field.getEl().dom.name = ''; if(this.swallowKeys){ this.field.el.swallowEvent([ 'keypress', 'keydown' ]); } }, onSpecialKey : function(field, e){ var key = e.getKey(), complete = this.completeOnEnter && key == e.ENTER, cancel = this.cancelOnEsc && key == e.ESC; if(complete || cancel){ e.stopEvent(); if(complete){ this.completeEdit(); }else{ this.cancelEdit(); } if(field.triggerBlur){ field.triggerBlur(); } } this.fireEvent('specialkey', field, e); }, startEdit : function(el, value){ if(this.editing){ this.completeEdit(); } this.boundEl = Ext.get(el); var v = value !== undefined ? value : this.boundEl.dom.innerHTML; if(!this.rendered){ this.render(this.parentEl || document.body); } if(this.fireEvent("beforestartedit", this, this.boundEl, v) !== false){ this.startValue = v; this.field.reset(); this.field.setValue(v); this.realign(true); this.editing = true; this.show(); } }, doAutoSize : function(){ if(this.autoSize){ var sz = this.boundEl.getSize(), fs = this.field.getSize(); switch(this.autoSize){ case "width": this.setSize(sz.width, fs.height); break; case "height": this.setSize(fs.width, sz.height); break; case "none": this.setSize(fs.width, fs.height); break; default: this.setSize(sz.width, sz.height); } } }, setSize : function(w, h){ delete this.field.lastSize; this.field.setSize(w, h); if(this.el){ if(Ext.isGecko2 || Ext.isOpera || (Ext.isIE7 && Ext.isStrict)){ this.el.setSize(w, h); } this.el.sync(); } }, realign : function(autoSize){ if(autoSize === true){ this.doAutoSize(); } this.el.alignTo(this.boundEl, this.alignment, this.offsets); }, completeEdit : function(remainVisible){ if(!this.editing){ return; } if (this.field.assertValue) { this.field.assertValue(); } var v = this.getValue(); if(!this.field.isValid()){ if(this.revertInvalid !== false){ this.cancelEdit(remainVisible); } return; } if(String(v) === String(this.startValue) && this.ignoreNoChange){ this.hideEdit(remainVisible); return; } if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){ v = this.getValue(); if(this.updateEl && this.boundEl){ this.boundEl.update(v); } this.hideEdit(remainVisible); this.fireEvent("complete", this, v, this.startValue); } }, onShow : function(){ this.el.show(); if(this.hideEl !== false){ this.boundEl.hide(); } this.field.show().focus(false, true); this.fireEvent("startedit", this.boundEl, this.startValue); }, cancelEdit : function(remainVisible){ if(this.editing){ var v = this.getValue(); this.setValue(this.startValue); this.hideEdit(remainVisible); this.fireEvent("canceledit", this, v, this.startValue); } }, hideEdit: function(remainVisible){ if(remainVisible !== true){ this.editing = false; this.hide(); } }, onBlur : function(){ if(this.allowBlur === true && this.editing && this.selectSameEditor !== true){ this.completeEdit(); } }, onHide : function(){ if(this.editing){ this.completeEdit(); return; } this.field.blur(); if(this.field.collapse){ this.field.collapse(); } this.el.hide(); if(this.hideEl !== false){ this.boundEl.show(); } }, setValue : function(v){ this.field.setValue(v); }, getValue : function(){ return this.field.getValue(); }, beforeDestroy : function(){ Ext.destroyMembers(this, 'field'); delete this.parentEl; delete this.boundEl; } }); Ext.reg('editor', Ext.Editor); Ext.ColorPalette = Ext.extend(Ext.Component, { itemCls : 'x-color-palette', value : null, clickEvent :'click', ctype : 'Ext.ColorPalette', allowReselect : false, colors : [ '000000', '993300', '333300', '003300', '003366', '000080', '333399', '333333', '800000', 'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080', 'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', '969696', 'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', '993366', 'C0C0C0', 'FF99CC', 'FFCC99', 'FFFF99', 'CCFFCC', 'CCFFFF', '99CCFF', 'CC99FF', 'FFFFFF' ], initComponent : function(){ Ext.ColorPalette.superclass.initComponent.call(this); this.addEvents( 'select' ); if(this.handler){ this.on('select', this.handler, this.scope, true); } }, onRender : function(container, position){ this.autoEl = { tag: 'div', cls: this.itemCls }; Ext.ColorPalette.superclass.onRender.call(this, container, position); var t = this.tpl || new Ext.XTemplate( ' ' ); t.overwrite(this.el, this.colors); this.mon(this.el, this.clickEvent, this.handleClick, this, {delegate: 'a'}); if(this.clickEvent != 'click'){ this.mon(this.el, 'click', Ext.emptyFn, this, {delegate: 'a', preventDefault: true}); } }, afterRender : function(){ Ext.ColorPalette.superclass.afterRender.call(this); if(this.value){ var s = this.value; this.value = null; this.select(s, true); } }, handleClick : function(e, t){ e.preventDefault(); if(!this.disabled){ var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1]; this.select(c.toUpperCase()); } }, select : function(color, suppressEvent){ color = color.replace('#', ''); if(color != this.value || this.allowReselect){ var el = this.el; if(this.value){ el.child('a.color-'+this.value).removeClass('x-color-palette-sel'); } el.child('a.color-'+color).addClass('x-color-palette-sel'); this.value = color; if(suppressEvent !== true){ this.fireEvent('select', this, color); } } } }); Ext.reg('colorpalette', Ext.ColorPalette); Ext.DatePicker = Ext.extend(Ext.BoxComponent, { todayText : 'Today', okText : ' OK ', cancelText : 'Cancel', todayTip : '{0} (Spacebar)', minText : 'This date is before the minimum date', maxText : 'This date is after the maximum date', format : 'm/d/y', disabledDaysText : 'Disabled', disabledDatesText : 'Disabled', monthNames : Date.monthNames, dayNames : Date.dayNames, nextText : 'Next Month (Control+Right)', prevText : 'Previous Month (Control+Left)', monthYearText : 'Choose a month (Control+Up/Down to move years)', startDay : 0, showToday : true, focusOnSelect: true, initHour: 12, initComponent : function(){ Ext.DatePicker.superclass.initComponent.call(this); this.value = this.value ? this.value.clearTime(true) : new Date().clearTime(); this.addEvents( 'select' ); if(this.handler){ this.on('select', this.handler, this.scope || this); } this.initDisabledDays(); }, initDisabledDays : function(){ if(!this.disabledDatesRE && this.disabledDates){ var dd = this.disabledDates, len = dd.length - 1, re = '(?:'; Ext.each(dd, function(d, i){ re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i]; if(i != len){ re += '|'; } }, this); this.disabledDatesRE = new RegExp(re + ')'); } }, setDisabledDates : function(dd){ if(Ext.isArray(dd)){ this.disabledDates = dd; this.disabledDatesRE = null; }else{ this.disabledDatesRE = dd; } this.initDisabledDays(); this.update(this.value, true); }, setDisabledDays : function(dd){ this.disabledDays = dd; this.update(this.value, true); }, setMinDate : function(dt){ this.minDate = dt; this.update(this.value, true); }, setMaxDate : function(dt){ this.maxDate = dt; this.update(this.value, true); }, setValue : function(value){ this.value = value.clearTime(true); this.update(this.value); }, getValue : function(){ return this.value; }, focus : function(){ this.update(this.activeDate); }, onEnable: function(initial){ Ext.DatePicker.superclass.onEnable.call(this); this.doDisabled(false); this.update(initial ? this.value : this.activeDate); if(Ext.isIE){ this.el.repaint(); } }, onDisable : function(){ Ext.DatePicker.superclass.onDisable.call(this); this.doDisabled(true); if(Ext.isIE && !Ext.isIE8){ Ext.each([].concat(this.textNodes, this.el.query('th span')), function(el){ Ext.fly(el).repaint(); }); } }, doDisabled : function(disabled){ this.keyNav.setDisabled(disabled); this.prevRepeater.setDisabled(disabled); this.nextRepeater.setDisabled(disabled); if(this.showToday){ this.todayKeyListener.setDisabled(disabled); this.todayBtn.setDisabled(disabled); } }, onRender : function(container, position){ var m = [ '', '', '', this.showToday ? '' : '', '
      
    '], dn = this.dayNames, i; for(i = 0; i < 7; i++){ var d = this.startDay+i; if(d > 6){ d = d-7; } m.push(''); } m[m.length] = ''; for(i = 0; i < 42; i++) { if(i % 7 === 0 && i !== 0){ m[m.length] = ''; } m[m.length] = ''; } m.push('
    ', dn[d].substr(0,1), '
    '); var el = document.createElement('div'); el.className = 'x-date-picker'; el.innerHTML = m.join(''); container.dom.insertBefore(el, position); this.el = Ext.get(el); this.eventEl = Ext.get(el.firstChild); this.prevRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-left a'), { handler: this.showPrevMonth, scope: this, preventDefault:true, stopDefault:true }); this.nextRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-right a'), { handler: this.showNextMonth, scope: this, preventDefault:true, stopDefault:true }); this.monthPicker = this.el.down('div.x-date-mp'); this.monthPicker.enableDisplayMode('block'); this.keyNav = new Ext.KeyNav(this.eventEl, { 'left' : function(e){ if(e.ctrlKey){ this.showPrevMonth(); }else{ this.update(this.activeDate.add('d', -1)); } }, 'right' : function(e){ if(e.ctrlKey){ this.showNextMonth(); }else{ this.update(this.activeDate.add('d', 1)); } }, 'up' : function(e){ if(e.ctrlKey){ this.showNextYear(); }else{ this.update(this.activeDate.add('d', -7)); } }, 'down' : function(e){ if(e.ctrlKey){ this.showPrevYear(); }else{ this.update(this.activeDate.add('d', 7)); } }, 'pageUp' : function(e){ this.showNextMonth(); }, 'pageDown' : function(e){ this.showPrevMonth(); }, 'enter' : function(e){ e.stopPropagation(); return true; }, scope : this }); this.el.unselectable(); this.cells = this.el.select('table.x-date-inner tbody td'); this.textNodes = this.el.query('table.x-date-inner tbody span'); this.mbtn = new Ext.Button({ text: ' ', tooltip: this.monthYearText, renderTo: this.el.child('td.x-date-middle', true) }); this.mbtn.el.child('em').addClass('x-btn-arrow'); if(this.showToday){ this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday, this); var today = (new Date()).dateFormat(this.format); this.todayBtn = new Ext.Button({ renderTo: this.el.child('td.x-date-bottom', true), text: String.format(this.todayText, today), tooltip: String.format(this.todayTip, today), handler: this.selectToday, scope: this }); } this.mon(this.eventEl, 'mousewheel', this.handleMouseWheel, this); this.mon(this.eventEl, 'click', this.handleDateClick, this, {delegate: 'a.x-date-date'}); this.mon(this.mbtn, 'click', this.showMonthPicker, this); this.onEnable(true); }, createMonthPicker : function(){ if(!this.monthPicker.dom.firstChild){ var buf = ['']; for(var i = 0; i < 6; i++){ buf.push( '', '', i === 0 ? '' : '' ); } buf.push( '', '
    ', Date.getShortMonthName(i), '', Date.getShortMonthName(i + 6), '
    ' ); this.monthPicker.update(buf.join('')); this.mon(this.monthPicker, 'click', this.onMonthClick, this); this.mon(this.monthPicker, 'dblclick', this.onMonthDblClick, this); this.mpMonths = this.monthPicker.select('td.x-date-mp-month'); this.mpYears = this.monthPicker.select('td.x-date-mp-year'); this.mpMonths.each(function(m, a, i){ i += 1; if((i%2) === 0){ m.dom.xmonth = 5 + Math.round(i * 0.5); }else{ m.dom.xmonth = Math.round((i-1) * 0.5); } }); } }, showMonthPicker : function(){ if(!this.disabled){ this.createMonthPicker(); var size = this.el.getSize(); this.monthPicker.setSize(size); this.monthPicker.child('table').setSize(size); this.mpSelMonth = (this.activeDate || this.value).getMonth(); this.updateMPMonth(this.mpSelMonth); this.mpSelYear = (this.activeDate || this.value).getFullYear(); this.updateMPYear(this.mpSelYear); this.monthPicker.slideIn('t', {duration:0.2}); } }, updateMPYear : function(y){ this.mpyear = y; var ys = this.mpYears.elements; for(var i = 1; i <= 10; i++){ var td = ys[i-1], y2; if((i%2) === 0){ y2 = y + Math.round(i * 0.5); td.firstChild.innerHTML = y2; td.xyear = y2; }else{ y2 = y - (5-Math.round(i * 0.5)); td.firstChild.innerHTML = y2; td.xyear = y2; } this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel'); } }, updateMPMonth : function(sm){ this.mpMonths.each(function(m, a, i){ m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel'); }); }, selectMPMonth : function(m){ }, onMonthClick : function(e, t){ e.stopEvent(); var el = new Ext.Element(t), pn; if(el.is('button.x-date-mp-cancel')){ this.hideMonthPicker(); } else if(el.is('button.x-date-mp-ok')){ var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate()); if(d.getMonth() != this.mpSelMonth){ d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth(); } this.update(d); this.hideMonthPicker(); } else if((pn = el.up('td.x-date-mp-month', 2))){ this.mpMonths.removeClass('x-date-mp-sel'); pn.addClass('x-date-mp-sel'); this.mpSelMonth = pn.dom.xmonth; } else if((pn = el.up('td.x-date-mp-year', 2))){ this.mpYears.removeClass('x-date-mp-sel'); pn.addClass('x-date-mp-sel'); this.mpSelYear = pn.dom.xyear; } else if(el.is('a.x-date-mp-prev')){ this.updateMPYear(this.mpyear-10); } else if(el.is('a.x-date-mp-next')){ this.updateMPYear(this.mpyear+10); } }, onMonthDblClick : function(e, t){ e.stopEvent(); var el = new Ext.Element(t), pn; if((pn = el.up('td.x-date-mp-month', 2))){ this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate())); this.hideMonthPicker(); } else if((pn = el.up('td.x-date-mp-year', 2))){ this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate())); this.hideMonthPicker(); } }, hideMonthPicker : function(disableAnim){ if(this.monthPicker){ if(disableAnim === true){ this.monthPicker.hide(); }else{ this.monthPicker.slideOut('t', {duration:0.2}); } } }, showPrevMonth : function(e){ this.update(this.activeDate.add('mo', -1)); }, showNextMonth : function(e){ this.update(this.activeDate.add('mo', 1)); }, showPrevYear : function(){ this.update(this.activeDate.add('y', -1)); }, showNextYear : function(){ this.update(this.activeDate.add('y', 1)); }, handleMouseWheel : function(e){ e.stopEvent(); if(!this.disabled){ var delta = e.getWheelDelta(); if(delta > 0){ this.showPrevMonth(); } else if(delta < 0){ this.showNextMonth(); } } }, handleDateClick : function(e, t){ e.stopEvent(); if(!this.disabled && t.dateValue && !Ext.fly(t.parentNode).hasClass('x-date-disabled')){ this.cancelFocus = this.focusOnSelect === false; this.setValue(new Date(t.dateValue)); delete this.cancelFocus; this.fireEvent('select', this, this.value); } }, selectToday : function(){ if(this.todayBtn && !this.todayBtn.disabled){ this.setValue(new Date().clearTime()); this.fireEvent('select', this, this.value); } }, update : function(date, forceRefresh){ if(this.rendered){ var vd = this.activeDate, vis = this.isVisible(); this.activeDate = date; if(!forceRefresh && vd && this.el){ var t = date.getTime(); if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){ this.cells.removeClass('x-date-selected'); this.cells.each(function(c){ if(c.dom.firstChild.dateValue == t){ c.addClass('x-date-selected'); if(vis && !this.cancelFocus){ Ext.fly(c.dom.firstChild).focus(50); } return false; } }, this); return; } } var days = date.getDaysInMonth(), firstOfMonth = date.getFirstDateOfMonth(), startingPos = firstOfMonth.getDay()-this.startDay; if(startingPos < 0){ startingPos += 7; } days += startingPos; var pm = date.add('mo', -1), prevStart = pm.getDaysInMonth()-startingPos, cells = this.cells.elements, textEls = this.textNodes, d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart, this.initHour)), today = new Date().clearTime().getTime(), sel = date.clearTime(true).getTime(), min = this.minDate ? this.minDate.clearTime(true) : Number.NEGATIVE_INFINITY, max = this.maxDate ? this.maxDate.clearTime(true) : Number.POSITIVE_INFINITY, ddMatch = this.disabledDatesRE, ddText = this.disabledDatesText, ddays = this.disabledDays ? this.disabledDays.join('') : false, ddaysText = this.disabledDaysText, format = this.format; if(this.showToday){ var td = new Date().clearTime(), disable = (td < min || td > max || (ddMatch && format && ddMatch.test(td.dateFormat(format))) || (ddays && ddays.indexOf(td.getDay()) != -1)); if(!this.disabled){ this.todayBtn.setDisabled(disable); this.todayKeyListener[disable ? 'disable' : 'enable'](); } } var setCellClass = function(cal, cell){ cell.title = ''; var t = d.clearTime(true).getTime(); cell.firstChild.dateValue = t; if(t == today){ cell.className += ' x-date-today'; cell.title = cal.todayText; } if(t == sel){ cell.className += ' x-date-selected'; if(vis){ Ext.fly(cell.firstChild).focus(50); } } if(t < min) { cell.className = ' x-date-disabled'; cell.title = cal.minText; return; } if(t > max) { cell.className = ' x-date-disabled'; cell.title = cal.maxText; return; } if(ddays){ if(ddays.indexOf(d.getDay()) != -1){ cell.title = ddaysText; cell.className = ' x-date-disabled'; } } if(ddMatch && format){ var fvalue = d.dateFormat(format); if(ddMatch.test(fvalue)){ cell.title = ddText.replace('%0', fvalue); cell.className = ' x-date-disabled'; } } }; var i = 0; for(; i < startingPos; i++) { textEls[i].innerHTML = (++prevStart); d.setDate(d.getDate()+1); cells[i].className = 'x-date-prevday'; setCellClass(this, cells[i]); } for(; i < days; i++){ var intDay = i - startingPos + 1; textEls[i].innerHTML = (intDay); d.setDate(d.getDate()+1); cells[i].className = 'x-date-active'; setCellClass(this, cells[i]); } var extraDays = 0; for(; i < 42; i++) { textEls[i].innerHTML = (++extraDays); d.setDate(d.getDate()+1); cells[i].className = 'x-date-nextday'; setCellClass(this, cells[i]); } this.mbtn.setText(this.monthNames[date.getMonth()] + ' ' + date.getFullYear()); if(!this.internalRender){ var main = this.el.dom.firstChild, w = main.offsetWidth; this.el.setWidth(w + this.el.getBorderWidth('lr')); Ext.fly(main).setWidth(w); this.internalRender = true; if(Ext.isOpera && !this.secondPass){ main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + 'px'; this.secondPass = true; this.update.defer(10, this, [date]); } } } }, beforeDestroy : function() { if(this.rendered){ Ext.destroy( this.keyNav, this.monthPicker, this.eventEl, this.mbtn, this.nextRepeater, this.prevRepeater, this.cells.el, this.todayBtn ); delete this.textNodes; delete this.cells.elements; } } }); Ext.reg('datepicker', Ext.DatePicker); Ext.LoadMask = function(el, config){ this.el = Ext.get(el); Ext.apply(this, config); if(this.store){ this.store.on({ scope: this, beforeload: this.onBeforeLoad, load: this.onLoad, exception: this.onLoad }); this.removeMask = Ext.value(this.removeMask, false); }else{ var um = this.el.getUpdater(); um.showLoadIndicator = false; um.on({ scope: this, beforeupdate: this.onBeforeLoad, update: this.onLoad, failure: this.onLoad }); this.removeMask = Ext.value(this.removeMask, true); } }; Ext.LoadMask.prototype = { msg : 'Loading...', msgCls : 'x-mask-loading', disabled: false, disable : function(){ this.disabled = true; }, enable : function(){ this.disabled = false; }, onLoad : function(){ this.el.unmask(this.removeMask); }, onBeforeLoad : function(){ if(!this.disabled){ this.el.mask(this.msg, this.msgCls); } }, show: function(){ this.onBeforeLoad(); }, hide: function(){ this.onLoad(); }, destroy : function(){ if(this.store){ this.store.un('beforeload', this.onBeforeLoad, this); this.store.un('load', this.onLoad, this); this.store.un('exception', this.onLoad, this); }else{ var um = this.el.getUpdater(); um.un('beforeupdate', this.onBeforeLoad, this); um.un('update', this.onLoad, this); um.un('failure', this.onLoad, this); } } }; Ext.slider.Thumb = Ext.extend(Object, { dragging: false, constructor: function(config) { Ext.apply(this, config || {}, { cls: 'x-slider-thumb', constrain: false }); Ext.slider.Thumb.superclass.constructor.call(this, config); if (this.slider.vertical) { Ext.apply(this, Ext.slider.Thumb.Vertical); } }, render: function() { this.el = this.slider.innerEl.insertFirst({cls: this.cls}); this.initEvents(); }, enable: function() { this.disabled = false; this.el.removeClass(this.slider.disabledClass); }, disable: function() { this.disabled = true; this.el.addClass(this.slider.disabledClass); }, initEvents: function() { var el = this.el; el.addClassOnOver('x-slider-thumb-over'); this.tracker = new Ext.dd.DragTracker({ onBeforeStart: this.onBeforeDragStart.createDelegate(this), onStart : this.onDragStart.createDelegate(this), onDrag : this.onDrag.createDelegate(this), onEnd : this.onDragEnd.createDelegate(this), tolerance : 3, autoStart : 300 }); this.tracker.initEl(el); }, onBeforeDragStart : function(e) { if (this.disabled) { return false; } else { this.slider.promoteThumb(this); return true; } }, onDragStart: function(e){ this.el.addClass('x-slider-thumb-drag'); this.dragging = true; this.dragStartValue = this.value; this.slider.fireEvent('dragstart', this.slider, e, this); }, onDrag: function(e) { var slider = this.slider, index = this.index, newValue = this.getNewValue(); if (this.constrain) { var above = slider.thumbs[index + 1], below = slider.thumbs[index - 1]; if (below != undefined && newValue <= below.value) newValue = below.value; if (above != undefined && newValue >= above.value) newValue = above.value; } slider.setValue(index, newValue, false); slider.fireEvent('drag', slider, e, this); }, getNewValue: function() { var slider = this.slider, pos = slider.innerEl.translatePoints(this.tracker.getXY()); return Ext.util.Format.round(slider.reverseValue(pos.left), slider.decimalPrecision); }, onDragEnd: function(e) { var slider = this.slider, value = this.value; this.el.removeClass('x-slider-thumb-drag'); this.dragging = false; slider.fireEvent('dragend', slider, e); if (this.dragStartValue != value) { slider.fireEvent('changecomplete', slider, value, this); } }, destroy: function(){ Ext.destroyMembers(this, 'tracker', 'el'); } }); Ext.slider.MultiSlider = Ext.extend(Ext.BoxComponent, { vertical: false, minValue: 0, maxValue: 100, decimalPrecision: 0, keyIncrement: 1, increment: 0, clickRange: [5,15], clickToChange : true, animate: true, constrainThumbs: true, topThumbZIndex: 10000, initComponent : function(){ if(!Ext.isDefined(this.value)){ this.value = this.minValue; } this.thumbs = []; Ext.slider.MultiSlider.superclass.initComponent.call(this); this.keyIncrement = Math.max(this.increment, this.keyIncrement); this.addEvents( 'beforechange', 'change', 'changecomplete', 'dragstart', 'drag', 'dragend' ); if (this.values == undefined || Ext.isEmpty(this.values)) this.values = [0]; var values = this.values; for (var i=0; i < values.length; i++) { this.addThumb(values[i]); } if(this.vertical){ Ext.apply(this, Ext.slider.Vertical); } }, addThumb: function(value) { var thumb = new Ext.slider.Thumb({ value : value, slider : this, index : this.thumbs.length, constrain: this.constrainThumbs }); this.thumbs.push(thumb); if (this.rendered) thumb.render(); }, promoteThumb: function(topThumb) { var thumbs = this.thumbs, zIndex, thumb; for (var i = 0, j = thumbs.length; i < j; i++) { thumb = thumbs[i]; if (thumb == topThumb) { zIndex = this.topThumbZIndex; } else { zIndex = ''; } thumb.el.setStyle('zIndex', zIndex); } }, onRender : function() { this.autoEl = { cls: 'x-slider ' + (this.vertical ? 'x-slider-vert' : 'x-slider-horz'), cn : { cls: 'x-slider-end', cn : { cls:'x-slider-inner', cn : [{tag:'a', cls:'x-slider-focus', href:"#", tabIndex: '-1', hidefocus:'on'}] } } }; Ext.slider.MultiSlider.superclass.onRender.apply(this, arguments); this.endEl = this.el.first(); this.innerEl = this.endEl.first(); this.focusEl = this.innerEl.child('.x-slider-focus'); for (var i=0; i < this.thumbs.length; i++) { this.thumbs[i].render(); } var thumb = this.innerEl.child('.x-slider-thumb'); this.halfThumb = (this.vertical ? thumb.getHeight() : thumb.getWidth()) / 2; this.initEvents(); }, initEvents : function(){ this.mon(this.el, { scope : this, mousedown: this.onMouseDown, keydown : this.onKeyDown }); this.focusEl.swallowEvent("click", true); }, onMouseDown : function(e){ if(this.disabled){ return; } var thumbClicked = false; for (var i=0; i < this.thumbs.length; i++) { thumbClicked = thumbClicked || e.target == this.thumbs[i].el.dom; } if (this.clickToChange && !thumbClicked) { var local = this.innerEl.translatePoints(e.getXY()); this.onClickChange(local); } this.focus(); }, onClickChange : function(local) { if (local.top > this.clickRange[0] && local.top < this.clickRange[1]) { var thumb = this.getNearest(local, 'left'), index = thumb.index; this.setValue(index, Ext.util.Format.round(this.reverseValue(local.left), this.decimalPrecision), undefined, true); } }, getNearest: function(local, prop) { var localValue = prop == 'top' ? this.innerEl.getHeight() - local[prop] : local[prop], clickValue = this.reverseValue(localValue), nearestDistance = (this.maxValue - this.minValue) + 5, index = 0, nearest = null; for (var i=0; i < this.thumbs.length; i++) { var thumb = this.thumbs[i], value = thumb.value, dist = Math.abs(value - clickValue); if (Math.abs(dist <= nearestDistance)) { nearest = thumb; index = i; nearestDistance = dist; } } return nearest; }, onKeyDown : function(e){ if(this.disabled || this.thumbs.length !== 1){ e.preventDefault(); return; } var k = e.getKey(), val; switch(k){ case e.UP: case e.RIGHT: e.stopEvent(); val = e.ctrlKey ? this.maxValue : this.getValue(0) + this.keyIncrement; this.setValue(0, val, undefined, true); break; case e.DOWN: case e.LEFT: e.stopEvent(); val = e.ctrlKey ? this.minValue : this.getValue(0) - this.keyIncrement; this.setValue(0, val, undefined, true); break; default: e.preventDefault(); } }, doSnap : function(value){ if (!(this.increment && value)) { return value; } var newValue = value, inc = this.increment, m = value % inc; if (m != 0) { newValue -= m; if (m * 2 >= inc) { newValue += inc; } else if (m * 2 < -inc) { newValue -= inc; } } return newValue.constrain(this.minValue, this.maxValue); }, afterRender : function(){ Ext.slider.MultiSlider.superclass.afterRender.apply(this, arguments); for (var i=0; i < this.thumbs.length; i++) { var thumb = this.thumbs[i]; if (thumb.value !== undefined) { var v = this.normalizeValue(thumb.value); if (v !== thumb.value) { this.setValue(i, v, false); } else { this.moveThumb(i, this.translateValue(v), false); } } }; }, getRatio : function(){ var w = this.innerEl.getWidth(), v = this.maxValue - this.minValue; return v == 0 ? w : (w/v); }, normalizeValue : function(v){ v = this.doSnap(v); v = Ext.util.Format.round(v, this.decimalPrecision); v = v.constrain(this.minValue, this.maxValue); return v; }, setMinValue : function(val){ this.minValue = val; var i = 0, thumbs = this.thumbs, len = thumbs.length, t; for(; i < len; ++i){ t = thumbs[i]; t.value = t.value < val ? val : t.value; } this.syncThumb(); }, setMaxValue : function(val){ this.maxValue = val; var i = 0, thumbs = this.thumbs, len = thumbs.length, t; for(; i < len; ++i){ t = thumbs[i]; t.value = t.value > val ? val : t.value; } this.syncThumb(); }, setValue : function(index, v, animate, changeComplete) { var thumb = this.thumbs[index], el = thumb.el; v = this.normalizeValue(v); if (v !== thumb.value && this.fireEvent('beforechange', this, v, thumb.value, thumb) !== false) { thumb.value = v; if(this.rendered){ this.moveThumb(index, this.translateValue(v), animate !== false); this.fireEvent('change', this, v, thumb); if(changeComplete){ this.fireEvent('changecomplete', this, v, thumb); } } } }, translateValue : function(v) { var ratio = this.getRatio(); return (v * ratio) - (this.minValue * ratio) - this.halfThumb; }, reverseValue : function(pos){ var ratio = this.getRatio(); return (pos + (this.minValue * ratio)) / ratio; }, moveThumb: function(index, v, animate){ var thumb = this.thumbs[index].el; if(!animate || this.animate === false){ thumb.setLeft(v); }else{ thumb.shift({left: v, stopFx: true, duration:.35}); } }, focus : function(){ this.focusEl.focus(10); }, onResize : function(w, h){ var thumbs = this.thumbs, len = thumbs.length, i = 0; for(; i < len; ++i){ thumbs[i].el.stopFx(); } if(Ext.isNumber(w)){ this.innerEl.setWidth(w - (this.el.getPadding('l') + this.endEl.getPadding('r'))); } this.syncThumb(); Ext.slider.MultiSlider.superclass.onResize.apply(this, arguments); }, onDisable: function(){ Ext.slider.MultiSlider.superclass.onDisable.call(this); for (var i=0; i < this.thumbs.length; i++) { var thumb = this.thumbs[i], el = thumb.el; thumb.disable(); if(Ext.isIE){ var xy = el.getXY(); el.hide(); this.innerEl.addClass(this.disabledClass).dom.disabled = true; if (!this.thumbHolder) { this.thumbHolder = this.endEl.createChild({cls: 'x-slider-thumb ' + this.disabledClass}); } this.thumbHolder.show().setXY(xy); } } }, onEnable: function(){ Ext.slider.MultiSlider.superclass.onEnable.call(this); for (var i=0; i < this.thumbs.length; i++) { var thumb = this.thumbs[i], el = thumb.el; thumb.enable(); if (Ext.isIE) { this.innerEl.removeClass(this.disabledClass).dom.disabled = false; if (this.thumbHolder) this.thumbHolder.hide(); el.show(); this.syncThumb(); } } }, syncThumb : function() { if (this.rendered) { for (var i=0; i < this.thumbs.length; i++) { this.moveThumb(i, this.translateValue(this.thumbs[i].value)); } } }, getValue : function(index) { return this.thumbs[index].value; }, getValues: function() { var values = []; for (var i=0; i < this.thumbs.length; i++) { values.push(this.thumbs[i].value); } return values; }, beforeDestroy : function(){ var thumbs = this.thumbs; for(var i = 0, len = thumbs.length; i < len; ++i){ thumbs[i].destroy(); thumbs[i] = null; } Ext.destroyMembers(this, 'endEl', 'innerEl', 'focusEl', 'thumbHolder'); Ext.slider.MultiSlider.superclass.beforeDestroy.call(this); } }); Ext.reg('multislider', Ext.slider.MultiSlider); Ext.slider.SingleSlider = Ext.extend(Ext.slider.MultiSlider, { constructor: function(config) { config = config || {}; Ext.applyIf(config, { values: [config.value || 0] }); Ext.slider.SingleSlider.superclass.constructor.call(this, config); }, getValue: function() { return Ext.slider.SingleSlider.superclass.getValue.call(this, 0); }, setValue: function(value, animate) { var args = Ext.toArray(arguments), len = args.length; if (len == 1 || (len <= 3 && typeof arguments[1] != 'number')) { args.unshift(0); } return Ext.slider.SingleSlider.superclass.setValue.apply(this, args); }, syncThumb : function() { return Ext.slider.SingleSlider.superclass.syncThumb.apply(this, [0].concat(arguments)); }, getNearest : function(){ return this.thumbs[0]; } }); Ext.Slider = Ext.slider.SingleSlider; Ext.reg('slider', Ext.slider.SingleSlider); Ext.slider.Vertical = { onResize : function(w, h){ this.innerEl.setHeight(h - (this.el.getPadding('t') + this.endEl.getPadding('b'))); this.syncThumb(); }, getRatio : function(){ var h = this.innerEl.getHeight(), v = this.maxValue - this.minValue; return h/v; }, moveThumb: function(index, v, animate) { var thumb = this.thumbs[index], el = thumb.el; if (!animate || this.animate === false) { el.setBottom(v); } else { el.shift({bottom: v, stopFx: true, duration:.35}); } }, onClickChange : function(local) { if (local.left > this.clickRange[0] && local.left < this.clickRange[1]) { var thumb = this.getNearest(local, 'top'), index = thumb.index, value = this.minValue + this.reverseValue(this.innerEl.getHeight() - local.top); this.setValue(index, Ext.util.Format.round(value, this.decimalPrecision), undefined, true); } } }; Ext.slider.Thumb.Vertical = { getNewValue: function() { var slider = this.slider, innerEl = slider.innerEl, pos = innerEl.translatePoints(this.tracker.getXY()), bottom = innerEl.getHeight() - pos.top; return slider.minValue + Ext.util.Format.round(bottom / slider.getRatio(), slider.decimalPrecision); } }; Ext.ProgressBar = Ext.extend(Ext.BoxComponent, { baseCls : 'x-progress', animate : false, waitTimer : null, initComponent : function(){ Ext.ProgressBar.superclass.initComponent.call(this); this.addEvents( "update" ); }, onRender : function(ct, position){ var tpl = new Ext.Template( '
    ', '
    ', '
    ', '
    ', '
     
    ', '
    ', '
    ', '
    ', '
     
    ', '
    ', '
    ', '
    ' ); this.el = position ? tpl.insertBefore(position, {cls: this.baseCls}, true) : tpl.append(ct, {cls: this.baseCls}, true); if(this.id){ this.el.dom.id = this.id; } var inner = this.el.dom.firstChild; this.progressBar = Ext.get(inner.firstChild); if(this.textEl){ this.textEl = Ext.get(this.textEl); delete this.textTopEl; }else{ this.textTopEl = Ext.get(this.progressBar.dom.firstChild); var textBackEl = Ext.get(inner.childNodes[1]); this.textTopEl.setStyle("z-index", 99).addClass('x-hidden'); this.textEl = new Ext.CompositeElement([this.textTopEl.dom.firstChild, textBackEl.dom.firstChild]); this.textEl.setWidth(inner.offsetWidth); } this.progressBar.setHeight(inner.offsetHeight); }, afterRender : function(){ Ext.ProgressBar.superclass.afterRender.call(this); if(this.value){ this.updateProgress(this.value, this.text); }else{ this.updateText(this.text); } }, updateProgress : function(value, text, animate){ this.value = value || 0; if(text){ this.updateText(text); } if(this.rendered && !this.isDestroyed){ var w = Math.floor(value*this.el.dom.firstChild.offsetWidth); this.progressBar.setWidth(w, animate === true || (animate !== false && this.animate)); if(this.textTopEl){ this.textTopEl.removeClass('x-hidden').setWidth(w); } } this.fireEvent('update', this, value, text); return this; }, wait : function(o){ if(!this.waitTimer){ var scope = this; o = o || {}; this.updateText(o.text); this.waitTimer = Ext.TaskMgr.start({ run: function(i){ var inc = o.increment || 10; i -= 1; this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*0.01, null, o.animate); }, interval: o.interval || 1000, duration: o.duration, onStop: function(){ if(o.fn){ o.fn.apply(o.scope || this); } this.reset(); }, scope: scope }); } return this; }, isWaiting : function(){ return this.waitTimer !== null; }, updateText : function(text){ this.text = text || ' '; if(this.rendered){ this.textEl.update(this.text); } return this; }, syncProgressBar : function(){ if(this.value){ this.updateProgress(this.value, this.text); } return this; }, setSize : function(w, h){ Ext.ProgressBar.superclass.setSize.call(this, w, h); if(this.textTopEl){ var inner = this.el.dom.firstChild; this.textEl.setSize(inner.offsetWidth, inner.offsetHeight); } this.syncProgressBar(); return this; }, reset : function(hide){ this.updateProgress(0); if(this.textTopEl){ this.textTopEl.addClass('x-hidden'); } this.clearTimer(); if(hide === true){ this.hide(); } return this; }, clearTimer : function(){ if(this.waitTimer){ this.waitTimer.onStop = null; Ext.TaskMgr.stop(this.waitTimer); this.waitTimer = null; } }, onDestroy: function(){ this.clearTimer(); if(this.rendered){ if(this.textEl.isComposite){ this.textEl.clear(); } Ext.destroyMembers(this, 'textEl', 'progressBar', 'textTopEl'); } Ext.ProgressBar.superclass.onDestroy.call(this); } }); Ext.reg('progress', Ext.ProgressBar); (function() { var Event=Ext.EventManager; var Dom=Ext.lib.Dom; Ext.dd.DragDrop = function(id, sGroup, config) { if(id) { this.init(id, sGroup, config); } }; Ext.dd.DragDrop.prototype = { id: null, config: null, dragElId: null, handleElId: null, invalidHandleTypes: null, invalidHandleIds: null, invalidHandleClasses: null, startPageX: 0, startPageY: 0, groups: null, locked: false, lock: function() { this.locked = true; }, moveOnly: false, unlock: function() { this.locked = false; }, isTarget: true, padding: null, _domRef: null, __ygDragDrop: true, constrainX: false, constrainY: false, minX: 0, maxX: 0, minY: 0, maxY: 0, maintainOffset: false, xTicks: null, yTicks: null, primaryButtonOnly: true, available: false, hasOuterHandles: false, b4StartDrag: function(x, y) { }, startDrag: function(x, y) { }, b4Drag: function(e) { }, onDrag: function(e) { }, onDragEnter: function(e, id) { }, b4DragOver: function(e) { }, onDragOver: function(e, id) { }, b4DragOut: function(e) { }, onDragOut: function(e, id) { }, b4DragDrop: function(e) { }, onDragDrop: function(e, id) { }, onInvalidDrop: function(e) { }, b4EndDrag: function(e) { }, endDrag: function(e) { }, b4MouseDown: function(e) { }, onMouseDown: function(e) { }, onMouseUp: function(e) { }, onAvailable: function () { }, defaultPadding : {left:0, right:0, top:0, bottom:0}, constrainTo : function(constrainTo, pad, inContent){ if(Ext.isNumber(pad)){ pad = {left: pad, right:pad, top:pad, bottom:pad}; } pad = pad || this.defaultPadding; var b = Ext.get(this.getEl()).getBox(), ce = Ext.get(constrainTo), s = ce.getScroll(), c, cd = ce.dom; if(cd == document.body){ c = { x: s.left, y: s.top, width: Ext.lib.Dom.getViewWidth(), height: Ext.lib.Dom.getViewHeight()}; }else{ var xy = ce.getXY(); c = {x : xy[0], y: xy[1], width: cd.clientWidth, height: cd.clientHeight}; } var topSpace = b.y - c.y, leftSpace = b.x - c.x; this.resetConstraints(); this.setXConstraint(leftSpace - (pad.left||0), c.width - leftSpace - b.width - (pad.right||0), this.xTickSize ); this.setYConstraint(topSpace - (pad.top||0), c.height - topSpace - b.height - (pad.bottom||0), this.yTickSize ); }, getEl: function() { if (!this._domRef) { this._domRef = Ext.getDom(this.id); } return this._domRef; }, getDragEl: function() { return Ext.getDom(this.dragElId); }, init: function(id, sGroup, config) { this.initTarget(id, sGroup, config); Event.on(this.id, "mousedown", this.handleMouseDown, this); }, initTarget: function(id, sGroup, config) { this.config = config || {}; this.DDM = Ext.dd.DDM; this.groups = {}; if (typeof id !== "string") { id = Ext.id(id); } this.id = id; this.addToGroup((sGroup) ? sGroup : "default"); this.handleElId = id; this.setDragElId(id); this.invalidHandleTypes = { A: "A" }; this.invalidHandleIds = {}; this.invalidHandleClasses = []; this.applyConfig(); this.handleOnAvailable(); }, applyConfig: function() { this.padding = this.config.padding || [0, 0, 0, 0]; this.isTarget = (this.config.isTarget !== false); this.maintainOffset = (this.config.maintainOffset); this.primaryButtonOnly = (this.config.primaryButtonOnly !== false); }, handleOnAvailable: function() { this.available = true; this.resetConstraints(); this.onAvailable(); }, setPadding: function(iTop, iRight, iBot, iLeft) { if (!iRight && 0 !== iRight) { this.padding = [iTop, iTop, iTop, iTop]; } else if (!iBot && 0 !== iBot) { this.padding = [iTop, iRight, iTop, iRight]; } else { this.padding = [iTop, iRight, iBot, iLeft]; } }, setInitPosition: function(diffX, diffY) { var el = this.getEl(); if (!this.DDM.verifyEl(el)) { return; } var dx = diffX || 0; var dy = diffY || 0; var p = Dom.getXY( el ); this.initPageX = p[0] - dx; this.initPageY = p[1] - dy; this.lastPageX = p[0]; this.lastPageY = p[1]; this.setStartPosition(p); }, setStartPosition: function(pos) { var p = pos || Dom.getXY( this.getEl() ); this.deltaSetXY = null; this.startPageX = p[0]; this.startPageY = p[1]; }, addToGroup: function(sGroup) { this.groups[sGroup] = true; this.DDM.regDragDrop(this, sGroup); }, removeFromGroup: function(sGroup) { if (this.groups[sGroup]) { delete this.groups[sGroup]; } this.DDM.removeDDFromGroup(this, sGroup); }, setDragElId: function(id) { this.dragElId = id; }, setHandleElId: function(id) { if (typeof id !== "string") { id = Ext.id(id); } this.handleElId = id; this.DDM.regHandle(this.id, id); }, setOuterHandleElId: function(id) { if (typeof id !== "string") { id = Ext.id(id); } Event.on(id, "mousedown", this.handleMouseDown, this); this.setHandleElId(id); this.hasOuterHandles = true; }, unreg: function() { Event.un(this.id, "mousedown", this.handleMouseDown); this._domRef = null; this.DDM._remove(this); }, destroy : function(){ this.unreg(); }, isLocked: function() { return (this.DDM.isLocked() || this.locked); }, handleMouseDown: function(e, oDD){ if (this.primaryButtonOnly && e.button != 0) { return; } if (this.isLocked()) { return; } this.DDM.refreshCache(this.groups); var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e)); if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) ) { } else { if (this.clickValidator(e)) { this.setStartPosition(); this.b4MouseDown(e); this.onMouseDown(e); this.DDM.handleMouseDown(e, this); this.DDM.stopEvent(e); } else { } } }, clickValidator: function(e) { var target = e.getTarget(); return ( this.isValidHandleChild(target) && (this.id == this.handleElId || this.DDM.handleWasClicked(target, this.id)) ); }, addInvalidHandleType: function(tagName) { var type = tagName.toUpperCase(); this.invalidHandleTypes[type] = type; }, addInvalidHandleId: function(id) { if (typeof id !== "string") { id = Ext.id(id); } this.invalidHandleIds[id] = id; }, addInvalidHandleClass: function(cssClass) { this.invalidHandleClasses.push(cssClass); }, removeInvalidHandleType: function(tagName) { var type = tagName.toUpperCase(); delete this.invalidHandleTypes[type]; }, removeInvalidHandleId: function(id) { if (typeof id !== "string") { id = Ext.id(id); } delete this.invalidHandleIds[id]; }, removeInvalidHandleClass: function(cssClass) { for (var i=0, len=this.invalidHandleClasses.length; i= this.minX; i = i - iTickSize) { if (!tickMap[i]) { this.xTicks[this.xTicks.length] = i; tickMap[i] = true; } } for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) { if (!tickMap[i]) { this.xTicks[this.xTicks.length] = i; tickMap[i] = true; } } this.xTicks.sort(this.DDM.numericSort) ; }, setYTicks: function(iStartY, iTickSize) { this.yTicks = []; this.yTickSize = iTickSize; var tickMap = {}; for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) { if (!tickMap[i]) { this.yTicks[this.yTicks.length] = i; tickMap[i] = true; } } for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) { if (!tickMap[i]) { this.yTicks[this.yTicks.length] = i; tickMap[i] = true; } } this.yTicks.sort(this.DDM.numericSort) ; }, setXConstraint: function(iLeft, iRight, iTickSize) { this.leftConstraint = iLeft; this.rightConstraint = iRight; this.minX = this.initPageX - iLeft; this.maxX = this.initPageX + iRight; if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); } this.constrainX = true; }, clearConstraints: function() { this.constrainX = false; this.constrainY = false; this.clearTicks(); }, clearTicks: function() { this.xTicks = null; this.yTicks = null; this.xTickSize = 0; this.yTickSize = 0; }, setYConstraint: function(iUp, iDown, iTickSize) { this.topConstraint = iUp; this.bottomConstraint = iDown; this.minY = this.initPageY - iUp; this.maxY = this.initPageY + iDown; if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); } this.constrainY = true; }, resetConstraints: function() { if (this.initPageX || this.initPageX === 0) { var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0; var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0; this.setInitPosition(dx, dy); } else { this.setInitPosition(); } if (this.constrainX) { this.setXConstraint( this.leftConstraint, this.rightConstraint, this.xTickSize ); } if (this.constrainY) { this.setYConstraint( this.topConstraint, this.bottomConstraint, this.yTickSize ); } }, getTick: function(val, tickArray) { if (!tickArray) { return val; } else if (tickArray[0] >= val) { return tickArray[0]; } else { for (var i=0, len=tickArray.length; i= val) { var diff1 = val - tickArray[i]; var diff2 = tickArray[next] - val; return (diff2 > diff1) ? tickArray[i] : tickArray[next]; } } return tickArray[tickArray.length - 1]; } }, toString: function() { return ("DragDrop " + this.id); } }; })(); if (!Ext.dd.DragDropMgr) { Ext.dd.DragDropMgr = function() { var Event = Ext.EventManager; return { ids: {}, handleIds: {}, dragCurrent: null, dragOvers: {}, deltaX: 0, deltaY: 0, preventDefault: true, stopPropagation: true, initialized: false, locked: false, init: function() { this.initialized = true; }, POINT: 0, INTERSECT: 1, mode: 0, _execOnAll: function(sMethod, args) { for (var i in this.ids) { for (var j in this.ids[i]) { var oDD = this.ids[i][j]; if (! this.isTypeOfDD(oDD)) { continue; } oDD[sMethod].apply(oDD, args); } } }, _onLoad: function() { this.init(); Event.on(document, "mouseup", this.handleMouseUp, this, true); Event.on(document, "mousemove", this.handleMouseMove, this, true); Event.on(window, "unload", this._onUnload, this, true); Event.on(window, "resize", this._onResize, this, true); }, _onResize: function(e) { this._execOnAll("resetConstraints", []); }, lock: function() { this.locked = true; }, unlock: function() { this.locked = false; }, isLocked: function() { return this.locked; }, locationCache: {}, useCache: true, clickPixelThresh: 3, clickTimeThresh: 350, dragThreshMet: false, clickTimeout: null, startX: 0, startY: 0, regDragDrop: function(oDD, sGroup) { if (!this.initialized) { this.init(); } if (!this.ids[sGroup]) { this.ids[sGroup] = {}; } this.ids[sGroup][oDD.id] = oDD; }, removeDDFromGroup: function(oDD, sGroup) { if (!this.ids[sGroup]) { this.ids[sGroup] = {}; } var obj = this.ids[sGroup]; if (obj && obj[oDD.id]) { delete obj[oDD.id]; } }, _remove: function(oDD) { for (var g in oDD.groups) { if (g && this.ids[g] && this.ids[g][oDD.id]) { delete this.ids[g][oDD.id]; } } delete this.handleIds[oDD.id]; }, regHandle: function(sDDId, sHandleId) { if (!this.handleIds[sDDId]) { this.handleIds[sDDId] = {}; } this.handleIds[sDDId][sHandleId] = sHandleId; }, isDragDrop: function(id) { return ( this.getDDById(id) ) ? true : false; }, getRelated: function(p_oDD, bTargetsOnly) { var oDDs = []; for (var i in p_oDD.groups) { for (var j in this.ids[i]) { var dd = this.ids[i][j]; if (! this.isTypeOfDD(dd)) { continue; } if (!bTargetsOnly || dd.isTarget) { oDDs[oDDs.length] = dd; } } } return oDDs; }, isLegalTarget: function (oDD, oTargetDD) { var targets = this.getRelated(oDD, true); for (var i=0, len=targets.length;i this.clickPixelThresh || diffY > this.clickPixelThresh) { this.startDrag(this.startX, this.startY); } } if (this.dragThreshMet) { this.dragCurrent.b4Drag(e); this.dragCurrent.onDrag(e); if(!this.dragCurrent.moveOnly){ this.fireEvents(e, false); } } this.stopEvent(e); return true; }, fireEvents: function(e, isDrop) { var dc = this.dragCurrent; if (!dc || dc.isLocked()) { return; } var pt = e.getPoint(); var oldOvers = []; var outEvts = []; var overEvts = []; var dropEvts = []; var enterEvts = []; for (var i in this.dragOvers) { var ddo = this.dragOvers[i]; if (! this.isTypeOfDD(ddo)) { continue; } if (! this.isOverTarget(pt, ddo, this.mode)) { outEvts.push( ddo ); } oldOvers[i] = true; delete this.dragOvers[i]; } for (var sGroup in dc.groups) { if ("string" != typeof sGroup) { continue; } for (i in this.ids[sGroup]) { var oDD = this.ids[sGroup][i]; if (! this.isTypeOfDD(oDD)) { continue; } if (oDD.isTarget && !oDD.isLocked() && ((oDD != dc) || (dc.ignoreSelf === false))) { if (this.isOverTarget(pt, oDD, this.mode)) { if (isDrop) { dropEvts.push( oDD ); } else { if (!oldOvers[oDD.id]) { enterEvts.push( oDD ); } else { overEvts.push( oDD ); } this.dragOvers[oDD.id] = oDD; } } } } } if (this.mode) { if (outEvts.length) { dc.b4DragOut(e, outEvts); dc.onDragOut(e, outEvts); } if (enterEvts.length) { dc.onDragEnter(e, enterEvts); } if (overEvts.length) { dc.b4DragOver(e, overEvts); dc.onDragOver(e, overEvts); } if (dropEvts.length) { dc.b4DragDrop(e, dropEvts); dc.onDragDrop(e, dropEvts); } } else { var len = 0; for (i=0, len=outEvts.length; i 2000) { } else { setTimeout(DDM._addListeners, 10); if (document && document.body) { DDM._timeoutCount += 1; } } } }, handleWasClicked: function(node, id) { if (this.isHandle(id, node.id)) { return true; } else { var p = node.parentNode; while (p) { if (this.isHandle(id, p.id)) { return true; } else { p = p.parentNode; } } } return false; } }; }(); Ext.dd.DDM = Ext.dd.DragDropMgr; Ext.dd.DDM._addListeners(); } Ext.dd.DD = function(id, sGroup, config) { if (id) { this.init(id, sGroup, config); } }; Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, { scroll: true, autoOffset: function(iPageX, iPageY) { var x = iPageX - this.startPageX; var y = iPageY - this.startPageY; this.setDelta(x, y); }, setDelta: function(iDeltaX, iDeltaY) { this.deltaX = iDeltaX; this.deltaY = iDeltaY; }, setDragElPos: function(iPageX, iPageY) { var el = this.getDragEl(); this.alignElWithMouse(el, iPageX, iPageY); }, alignElWithMouse: function(el, iPageX, iPageY) { var oCoord = this.getTargetCoord(iPageX, iPageY); var fly = el.dom ? el : Ext.fly(el, '_dd'); if (!this.deltaSetXY) { var aCoord = [oCoord.x, oCoord.y]; fly.setXY(aCoord); var newLeft = fly.getLeft(true); var newTop = fly.getTop(true); this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ]; } else { fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]); } this.cachePosition(oCoord.x, oCoord.y); this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth); return oCoord; }, cachePosition: function(iPageX, iPageY) { if (iPageX) { this.lastPageX = iPageX; this.lastPageY = iPageY; } else { var aCoord = Ext.lib.Dom.getXY(this.getEl()); this.lastPageX = aCoord[0]; this.lastPageY = aCoord[1]; } }, autoScroll: function(x, y, h, w) { if (this.scroll) { var clientH = Ext.lib.Dom.getViewHeight(); var clientW = Ext.lib.Dom.getViewWidth(); var st = this.DDM.getScrollTop(); var sl = this.DDM.getScrollLeft(); var bot = h + y; var right = w + x; var toBot = (clientH + st - y - this.deltaY); var toRight = (clientW + sl - x - this.deltaX); var thresh = 40; var scrAmt = (document.all) ? 80 : 30; if ( bot > clientH && toBot < thresh ) { window.scrollTo(sl, st + scrAmt); } if ( y < st && st > 0 && y - st < thresh ) { window.scrollTo(sl, st - scrAmt); } if ( right > clientW && toRight < thresh ) { window.scrollTo(sl + scrAmt, st); } if ( x < sl && sl > 0 && x - sl < thresh ) { window.scrollTo(sl - scrAmt, st); } } }, getTargetCoord: function(iPageX, iPageY) { var x = iPageX - this.deltaX; var y = iPageY - this.deltaY; if (this.constrainX) { if (x < this.minX) { x = this.minX; } if (x > this.maxX) { x = this.maxX; } } if (this.constrainY) { if (y < this.minY) { y = this.minY; } if (y > this.maxY) { y = this.maxY; } } x = this.getTick(x, this.xTicks); y = this.getTick(y, this.yTicks); return {x:x, y:y}; }, applyConfig: function() { Ext.dd.DD.superclass.applyConfig.call(this); this.scroll = (this.config.scroll !== false); }, b4MouseDown: function(e) { this.autoOffset(e.getPageX(), e.getPageY()); }, b4Drag: function(e) { this.setDragElPos(e.getPageX(), e.getPageY()); }, toString: function() { return ("DD " + this.id); } }); Ext.dd.DDProxy = function(id, sGroup, config) { if (id) { this.init(id, sGroup, config); this.initFrame(); } }; Ext.dd.DDProxy.dragElId = "ygddfdiv"; Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, { resizeFrame: true, centerFrame: false, createFrame: function() { var self = this; var body = document.body; if (!body || !body.firstChild) { setTimeout( function() { self.createFrame(); }, 50 ); return; } var div = this.getDragEl(); if (!div) { div = document.createElement("div"); div.id = this.dragElId; var s = div.style; s.position = "absolute"; s.visibility = "hidden"; s.cursor = "move"; s.border = "2px solid #aaa"; s.zIndex = 999; body.insertBefore(div, body.firstChild); } }, initFrame: function() { this.createFrame(); }, applyConfig: function() { Ext.dd.DDProxy.superclass.applyConfig.call(this); this.resizeFrame = (this.config.resizeFrame !== false); this.centerFrame = (this.config.centerFrame); this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId); }, showFrame: function(iPageX, iPageY) { var el = this.getEl(); var dragEl = this.getDragEl(); var s = dragEl.style; this._resizeProxy(); if (this.centerFrame) { this.setDelta( Math.round(parseInt(s.width, 10)/2), Math.round(parseInt(s.height, 10)/2) ); } this.setDragElPos(iPageX, iPageY); Ext.fly(dragEl).show(); }, _resizeProxy: function() { if (this.resizeFrame) { var el = this.getEl(); Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight); } }, b4MouseDown: function(e) { var x = e.getPageX(); var y = e.getPageY(); this.autoOffset(x, y); this.setDragElPos(x, y); }, b4StartDrag: function(x, y) { this.showFrame(x, y); }, b4EndDrag: function(e) { Ext.fly(this.getDragEl()).hide(); }, endDrag: function(e) { var lel = this.getEl(); var del = this.getDragEl(); del.style.visibility = ""; this.beforeMove(); lel.style.visibility = "hidden"; Ext.dd.DDM.moveToEl(lel, del); del.style.visibility = "hidden"; lel.style.visibility = ""; this.afterDrag(); }, beforeMove : function(){ }, afterDrag : function(){ }, toString: function() { return ("DDProxy " + this.id); } }); Ext.dd.DDTarget = function(id, sGroup, config) { if (id) { this.initTarget(id, sGroup, config); } }; Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, { getDragEl: Ext.emptyFn, isValidHandleChild: Ext.emptyFn, startDrag: Ext.emptyFn, endDrag: Ext.emptyFn, onDrag: Ext.emptyFn, onDragDrop: Ext.emptyFn, onDragEnter: Ext.emptyFn, onDragOut: Ext.emptyFn, onDragOver: Ext.emptyFn, onInvalidDrop: Ext.emptyFn, onMouseDown: Ext.emptyFn, onMouseUp: Ext.emptyFn, setXConstraint: Ext.emptyFn, setYConstraint: Ext.emptyFn, resetConstraints: Ext.emptyFn, clearConstraints: Ext.emptyFn, clearTicks: Ext.emptyFn, setInitPosition: Ext.emptyFn, setDragElId: Ext.emptyFn, setHandleElId: Ext.emptyFn, setOuterHandleElId: Ext.emptyFn, addInvalidHandleClass: Ext.emptyFn, addInvalidHandleId: Ext.emptyFn, addInvalidHandleType: Ext.emptyFn, removeInvalidHandleClass: Ext.emptyFn, removeInvalidHandleId: Ext.emptyFn, removeInvalidHandleType: Ext.emptyFn, toString: function() { return ("DDTarget " + this.id); } }); Ext.dd.DragTracker = Ext.extend(Ext.util.Observable, { active: false, tolerance: 5, autoStart: false, constructor : function(config){ Ext.apply(this, config); this.addEvents( 'mousedown', 'mouseup', 'mousemove', 'dragstart', 'dragend', 'drag' ); this.dragRegion = new Ext.lib.Region(0,0,0,0); if(this.el){ this.initEl(this.el); } Ext.dd.DragTracker.superclass.constructor.call(this, config); }, initEl: function(el){ this.el = Ext.get(el); el.on('mousedown', this.onMouseDown, this, this.delegate ? {delegate: this.delegate} : undefined); }, destroy : function(){ this.el.un('mousedown', this.onMouseDown, this); delete this.el; }, onMouseDown: function(e, target){ if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){ this.startXY = this.lastXY = e.getXY(); this.dragTarget = this.delegate ? target : this.el.dom; if(this.preventDefault !== false){ e.preventDefault(); } Ext.getDoc().on({ scope: this, mouseup: this.onMouseUp, mousemove: this.onMouseMove, selectstart: this.stopSelect }); if(this.autoStart){ this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this, [e]); } } }, onMouseMove: function(e, target){ if(this.active && Ext.isIE && !e.browserEvent.button){ e.preventDefault(); this.onMouseUp(e); return; } e.preventDefault(); var xy = e.getXY(), s = this.startXY; this.lastXY = xy; if(!this.active){ if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){ this.triggerStart(e); }else{ return; } } this.fireEvent('mousemove', this, e); this.onDrag(e); this.fireEvent('drag', this, e); }, onMouseUp: function(e) { var doc = Ext.getDoc(), wasActive = this.active; doc.un('mousemove', this.onMouseMove, this); doc.un('mouseup', this.onMouseUp, this); doc.un('selectstart', this.stopSelect, this); e.preventDefault(); this.clearStart(); this.active = false; delete this.elRegion; this.fireEvent('mouseup', this, e); if(wasActive){ this.onEnd(e); this.fireEvent('dragend', this, e); } }, triggerStart: function(e) { this.clearStart(); this.active = true; this.onStart(e); this.fireEvent('dragstart', this, e); }, clearStart : function() { if(this.timer){ clearTimeout(this.timer); delete this.timer; } }, stopSelect : function(e) { e.stopEvent(); return false; }, onBeforeStart : function(e) { }, onStart : function(xy) { }, onDrag : function(e) { }, onEnd : function(e) { }, getDragTarget : function(){ return this.dragTarget; }, getDragCt : function(){ return this.el; }, getXY : function(constrain){ return constrain ? this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY; }, getOffset : function(constrain){ var xy = this.getXY(constrain), s = this.startXY; return [s[0]-xy[0], s[1]-xy[1]]; }, constrainModes: { 'point' : function(xy){ if(!this.elRegion){ this.elRegion = this.getDragCt().getRegion(); } var dr = this.dragRegion; dr.left = xy[0]; dr.top = xy[1]; dr.right = xy[0]; dr.bottom = xy[1]; dr.constrainTo(this.elRegion); return [dr.left, dr.top]; } } }); Ext.dd.ScrollManager = function(){ var ddm = Ext.dd.DragDropMgr; var els = {}; var dragEl = null; var proc = {}; var onStop = function(e){ dragEl = null; clearProc(); }; var triggerRefresh = function(){ if(ddm.dragCurrent){ ddm.refreshCache(ddm.dragCurrent.groups); } }; var doScroll = function(){ if(ddm.dragCurrent){ var dds = Ext.dd.ScrollManager; var inc = proc.el.ddScrollConfig ? proc.el.ddScrollConfig.increment : dds.increment; if(!dds.animate){ if(proc.el.scroll(proc.dir, inc)){ triggerRefresh(); } }else{ proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh); } } }; var clearProc = function(){ if(proc.id){ clearInterval(proc.id); } proc.id = 0; proc.el = null; proc.dir = ""; }; var startProc = function(el, dir){ clearProc(); proc.el = el; proc.dir = dir; var group = el.ddScrollConfig ? el.ddScrollConfig.ddGroup : undefined, freq = (el.ddScrollConfig && el.ddScrollConfig.frequency) ? el.ddScrollConfig.frequency : Ext.dd.ScrollManager.frequency; if (group === undefined || ddm.dragCurrent.ddGroup == group) { proc.id = setInterval(doScroll, freq); } }; var onFire = function(e, isDrop){ if(isDrop || !ddm.dragCurrent){ return; } var dds = Ext.dd.ScrollManager; if(!dragEl || dragEl != ddm.dragCurrent){ dragEl = ddm.dragCurrent; dds.refreshCache(); } var xy = Ext.lib.Event.getXY(e); var pt = new Ext.lib.Point(xy[0], xy[1]); for(var id in els){ var el = els[id], r = el._region; var c = el.ddScrollConfig ? el.ddScrollConfig : dds; if(r && r.contains(pt) && el.isScrollable()){ if(r.bottom - pt.y <= c.vthresh){ if(proc.el != el){ startProc(el, "down"); } return; }else if(r.right - pt.x <= c.hthresh){ if(proc.el != el){ startProc(el, "left"); } return; }else if(pt.y - r.top <= c.vthresh){ if(proc.el != el){ startProc(el, "up"); } return; }else if(pt.x - r.left <= c.hthresh){ if(proc.el != el){ startProc(el, "right"); } return; } } } clearProc(); }; ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm); ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm); return { register : function(el){ if(Ext.isArray(el)){ for(var i = 0, len = el.length; i < len; i++) { this.register(el[i]); } }else{ el = Ext.get(el); els[el.id] = el; } }, unregister : function(el){ if(Ext.isArray(el)){ for(var i = 0, len = el.length; i < len; i++) { this.unregister(el[i]); } }else{ el = Ext.get(el); delete els[el.id]; } }, vthresh : 25, hthresh : 25, increment : 100, frequency : 500, animate: true, animDuration: .4, ddGroup: undefined, refreshCache : function(){ for(var id in els){ if(typeof els[id] == 'object'){ els[id]._region = els[id].getRegion(); } } } }; }(); Ext.dd.Registry = function(){ var elements = {}; var handles = {}; var autoIdSeed = 0; var getId = function(el, autogen){ if(typeof el == "string"){ return el; } var id = el.id; if(!id && autogen !== false){ id = "extdd-" + (++autoIdSeed); el.id = id; } return id; }; return { register : function(el, data){ data = data || {}; if(typeof el == "string"){ el = document.getElementById(el); } data.ddel = el; elements[getId(el)] = data; if(data.isHandle !== false){ handles[data.ddel.id] = data; } if(data.handles){ var hs = data.handles; for(var i = 0, len = hs.length; i < len; i++){ handles[getId(hs[i])] = data; } } }, unregister : function(el){ var id = getId(el, false); var data = elements[id]; if(data){ delete elements[id]; if(data.handles){ var hs = data.handles; for(var i = 0, len = hs.length; i < len; i++){ delete handles[getId(hs[i], false)]; } } } }, getHandle : function(id){ if(typeof id != "string"){ id = id.id; } return handles[id]; }, getHandleFromEvent : function(e){ var t = Ext.lib.Event.getTarget(e); return t ? handles[t.id] : null; }, getTarget : function(id){ if(typeof id != "string"){ id = id.id; } return elements[id]; }, getTargetFromEvent : function(e){ var t = Ext.lib.Event.getTarget(e); return t ? elements[t.id] || handles[t.id] : null; } }; }(); Ext.dd.StatusProxy = function(config){ Ext.apply(this, config); this.id = this.id || Ext.id(); this.el = new Ext.Layer({ dh: { id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [ {tag: "div", cls: "x-dd-drop-icon"}, {tag: "div", cls: "x-dd-drag-ghost"} ] }, shadow: !config || config.shadow !== false }); this.ghost = Ext.get(this.el.dom.childNodes[1]); this.dropStatus = this.dropNotAllowed; }; Ext.dd.StatusProxy.prototype = { dropAllowed : "x-dd-drop-ok", dropNotAllowed : "x-dd-drop-nodrop", setStatus : function(cssClass){ cssClass = cssClass || this.dropNotAllowed; if(this.dropStatus != cssClass){ this.el.replaceClass(this.dropStatus, cssClass); this.dropStatus = cssClass; } }, reset : function(clearGhost){ this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed; this.dropStatus = this.dropNotAllowed; if(clearGhost){ this.ghost.update(""); } }, update : function(html){ if(typeof html == "string"){ this.ghost.update(html); }else{ this.ghost.update(""); html.style.margin = "0"; this.ghost.dom.appendChild(html); } var el = this.ghost.dom.firstChild; if(el){ Ext.fly(el).setStyle('float', 'none'); } }, getEl : function(){ return this.el; }, getGhost : function(){ return this.ghost; }, hide : function(clear){ this.el.hide(); if(clear){ this.reset(true); } }, stop : function(){ if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){ this.anim.stop(); } }, show : function(){ this.el.show(); }, sync : function(){ this.el.sync(); }, repair : function(xy, callback, scope){ this.callback = callback; this.scope = scope; if(xy && this.animRepair !== false){ this.el.addClass("x-dd-drag-repair"); this.el.hideUnders(true); this.anim = this.el.shift({ duration: this.repairDuration || .5, easing: 'easeOut', xy: xy, stopFx: true, callback: this.afterRepair, scope: this }); }else{ this.afterRepair(); } }, afterRepair : function(){ this.hide(true); if(typeof this.callback == "function"){ this.callback.call(this.scope || this); } this.callback = null; this.scope = null; }, destroy: function(){ Ext.destroy(this.ghost, this.el); } }; Ext.dd.DragSource = function(el, config){ this.el = Ext.get(el); if(!this.dragData){ this.dragData = {}; } Ext.apply(this, config); if(!this.proxy){ this.proxy = new Ext.dd.StatusProxy(); } Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true}); this.dragging = false; }; Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, { dropAllowed : "x-dd-drop-ok", dropNotAllowed : "x-dd-drop-nodrop", getDragData : function(e){ return this.dragData; }, onDragEnter : function(e, id){ var target = Ext.dd.DragDropMgr.getDDById(id); this.cachedTarget = target; if(this.beforeDragEnter(target, e, id) !== false){ if(target.isNotifyTarget){ var status = target.notifyEnter(this, e, this.dragData); this.proxy.setStatus(status); }else{ this.proxy.setStatus(this.dropAllowed); } if(this.afterDragEnter){ this.afterDragEnter(target, e, id); } } }, beforeDragEnter : function(target, e, id){ return true; }, alignElWithMouse: function() { Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments); this.proxy.sync(); }, onDragOver : function(e, id){ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); if(this.beforeDragOver(target, e, id) !== false){ if(target.isNotifyTarget){ var status = target.notifyOver(this, e, this.dragData); this.proxy.setStatus(status); } if(this.afterDragOver){ this.afterDragOver(target, e, id); } } }, beforeDragOver : function(target, e, id){ return true; }, onDragOut : function(e, id){ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); if(this.beforeDragOut(target, e, id) !== false){ if(target.isNotifyTarget){ target.notifyOut(this, e, this.dragData); } this.proxy.reset(); if(this.afterDragOut){ this.afterDragOut(target, e, id); } } this.cachedTarget = null; }, beforeDragOut : function(target, e, id){ return true; }, onDragDrop : function(e, id){ var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id); if(this.beforeDragDrop(target, e, id) !== false){ if(target.isNotifyTarget){ if(target.notifyDrop(this, e, this.dragData)){ this.onValidDrop(target, e, id); }else{ this.onInvalidDrop(target, e, id); } }else{ this.onValidDrop(target, e, id); } if(this.afterDragDrop){ this.afterDragDrop(target, e, id); } } delete this.cachedTarget; }, beforeDragDrop : function(target, e, id){ return true; }, onValidDrop : function(target, e, id){ this.hideProxy(); if(this.afterValidDrop){ this.afterValidDrop(target, e, id); } }, getRepairXY : function(e, data){ return this.el.getXY(); }, onInvalidDrop : function(target, e, id){ this.beforeInvalidDrop(target, e, id); if(this.cachedTarget){ if(this.cachedTarget.isNotifyTarget){ this.cachedTarget.notifyOut(this, e, this.dragData); } this.cacheTarget = null; } this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this); if(this.afterInvalidDrop){ this.afterInvalidDrop(e, id); } }, afterRepair : function(){ if(Ext.enableFx){ this.el.highlight(this.hlColor || "c3daf9"); } this.dragging = false; }, beforeInvalidDrop : function(target, e, id){ return true; }, handleMouseDown : function(e){ if(this.dragging) { return; } var data = this.getDragData(e); if(data && this.onBeforeDrag(data, e) !== false){ this.dragData = data; this.proxy.stop(); Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments); } }, onBeforeDrag : function(data, e){ return true; }, onStartDrag : Ext.emptyFn, startDrag : function(x, y){ this.proxy.reset(); this.dragging = true; this.proxy.update(""); this.onInitDrag(x, y); this.proxy.show(); }, onInitDrag : function(x, y){ var clone = this.el.dom.cloneNode(true); clone.id = Ext.id(); this.proxy.update(clone); this.onStartDrag(x, y); return true; }, getProxy : function(){ return this.proxy; }, hideProxy : function(){ this.proxy.hide(); this.proxy.reset(true); this.dragging = false; }, triggerCacheRefresh : function(){ Ext.dd.DDM.refreshCache(this.groups); }, b4EndDrag: function(e) { }, endDrag : function(e){ this.onEndDrag(this.dragData, e); }, onEndDrag : function(data, e){ }, autoOffset : function(x, y) { this.setDelta(-12, -20); }, destroy: function(){ Ext.dd.DragSource.superclass.destroy.call(this); Ext.destroy(this.proxy); } }); Ext.dd.DropTarget = Ext.extend(Ext.dd.DDTarget, { constructor : function(el, config){ this.el = Ext.get(el); Ext.apply(this, config); if(this.containerScroll){ Ext.dd.ScrollManager.register(this.el); } Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, {isTarget: true}); }, dropAllowed : "x-dd-drop-ok", dropNotAllowed : "x-dd-drop-nodrop", isTarget : true, isNotifyTarget : true, notifyEnter : function(dd, e, data){ if(this.overClass){ this.el.addClass(this.overClass); } return this.dropAllowed; }, notifyOver : function(dd, e, data){ return this.dropAllowed; }, notifyOut : function(dd, e, data){ if(this.overClass){ this.el.removeClass(this.overClass); } }, notifyDrop : function(dd, e, data){ return false; }, destroy : function(){ Ext.dd.DropTarget.superclass.destroy.call(this); if(this.containerScroll){ Ext.dd.ScrollManager.unregister(this.el); } } }); Ext.dd.DragZone = Ext.extend(Ext.dd.DragSource, { constructor : function(el, config){ Ext.dd.DragZone.superclass.constructor.call(this, el, config); if(this.containerScroll){ Ext.dd.ScrollManager.register(this.el); } }, getDragData : function(e){ return Ext.dd.Registry.getHandleFromEvent(e); }, onInitDrag : function(x, y){ this.proxy.update(this.dragData.ddel.cloneNode(true)); this.onStartDrag(x, y); return true; }, afterRepair : function(){ if(Ext.enableFx){ Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9"); } this.dragging = false; }, getRepairXY : function(e){ return Ext.Element.fly(this.dragData.ddel).getXY(); }, destroy : function(){ Ext.dd.DragZone.superclass.destroy.call(this); if(this.containerScroll){ Ext.dd.ScrollManager.unregister(this.el); } } }); Ext.dd.DropZone = function(el, config){ Ext.dd.DropZone.superclass.constructor.call(this, el, config); }; Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, { getTargetFromEvent : function(e){ return Ext.dd.Registry.getTargetFromEvent(e); }, onNodeEnter : function(n, dd, e, data){ }, onNodeOver : function(n, dd, e, data){ return this.dropAllowed; }, onNodeOut : function(n, dd, e, data){ }, onNodeDrop : function(n, dd, e, data){ return false; }, onContainerOver : function(dd, e, data){ return this.dropNotAllowed; }, onContainerDrop : function(dd, e, data){ return false; }, notifyEnter : function(dd, e, data){ return this.dropNotAllowed; }, notifyOver : function(dd, e, data){ var n = this.getTargetFromEvent(e); if(!n){ if(this.lastOverNode){ this.onNodeOut(this.lastOverNode, dd, e, data); this.lastOverNode = null; } return this.onContainerOver(dd, e, data); } if(this.lastOverNode != n){ if(this.lastOverNode){ this.onNodeOut(this.lastOverNode, dd, e, data); } this.onNodeEnter(n, dd, e, data); this.lastOverNode = n; } return this.onNodeOver(n, dd, e, data); }, notifyOut : function(dd, e, data){ if(this.lastOverNode){ this.onNodeOut(this.lastOverNode, dd, e, data); this.lastOverNode = null; } }, notifyDrop : function(dd, e, data){ if(this.lastOverNode){ this.onNodeOut(this.lastOverNode, dd, e, data); this.lastOverNode = null; } var n = this.getTargetFromEvent(e); return n ? this.onNodeDrop(n, dd, e, data) : this.onContainerDrop(dd, e, data); }, triggerCacheRefresh : function(){ Ext.dd.DDM.refreshCache(this.groups); } }); Ext.Element.addMethods({ initDD : function(group, config, overrides){ var dd = new Ext.dd.DD(Ext.id(this.dom), group, config); return Ext.apply(dd, overrides); }, initDDProxy : function(group, config, overrides){ var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config); return Ext.apply(dd, overrides); }, initDDTarget : function(group, config, overrides){ var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config); return Ext.apply(dd, overrides); } }); Ext.data.Api = (function() { var validActions = {}; return { actions : { create : 'create', read : 'read', update : 'update', destroy : 'destroy' }, restActions : { create : 'POST', read : 'GET', update : 'PUT', destroy : 'DELETE' }, isAction : function(action) { return (Ext.data.Api.actions[action]) ? true : false; }, getVerb : function(name) { if (validActions[name]) { return validActions[name]; } for (var verb in this.actions) { if (this.actions[verb] === name) { validActions[name] = verb; break; } } return (validActions[name] !== undefined) ? validActions[name] : null; }, isValid : function(api){ var invalid = []; var crud = this.actions; for (var action in api) { if (!(action in crud)) { invalid.push(action); } } return (!invalid.length) ? true : invalid; }, hasUniqueUrl : function(proxy, verb) { var url = (proxy.api[verb]) ? proxy.api[verb].url : null; var unique = true; for (var action in proxy.api) { if ((unique = (action === verb) ? true : (proxy.api[action].url != url) ? true : false) === false) { break; } } return unique; }, prepare : function(proxy) { if (!proxy.api) { proxy.api = {}; } for (var verb in this.actions) { var action = this.actions[verb]; proxy.api[action] = proxy.api[action] || proxy.url || proxy.directFn; if (typeof(proxy.api[action]) == 'string') { proxy.api[action] = { url: proxy.api[action], method: (proxy.restful === true) ? Ext.data.Api.restActions[action] : undefined }; } } }, restify : function(proxy) { proxy.restful = true; for (var verb in this.restActions) { proxy.api[this.actions[verb]].method || (proxy.api[this.actions[verb]].method = this.restActions[verb]); } proxy.onWrite = proxy.onWrite.createInterceptor(function(action, o, response, rs) { var reader = o.reader; var res = new Ext.data.Response({ action: action, raw: response }); switch (response.status) { case 200: return true; break; case 201: if (Ext.isEmpty(res.raw.responseText)) { res.success = true; } else { return true; } break; case 204: res.success = true; res.data = null; break; default: return true; break; } if (res.success === true) { this.fireEvent("write", this, action, res.data, res, rs, o.request.arg); } else { this.fireEvent('exception', this, 'remote', action, o, res, rs); } o.request.callback.call(o.request.scope, res.data, res, res.success); return false; }, proxy); } }; })(); Ext.data.Response = function(params, response) { Ext.apply(this, params, { raw: response }); }; Ext.data.Response.prototype = { message : null, success : false, status : null, root : null, raw : null, getMessage : function() { return this.message; }, getSuccess : function() { return this.success; }, getStatus : function() { return this.status; }, getRoot : function() { return this.root; }, getRawResponse : function() { return this.raw; } }; Ext.data.Api.Error = Ext.extend(Ext.Error, { constructor : function(message, arg) { this.arg = arg; Ext.Error.call(this, message); }, name: 'Ext.data.Api' }); Ext.apply(Ext.data.Api.Error.prototype, { lang: { 'action-url-undefined': 'No fallback url defined for this action. When defining a DataProxy api, please be sure to define an url for each CRUD action in Ext.data.Api.actions or define a default url in addition to your api-configuration.', 'invalid': 'received an invalid API-configuration. Please ensure your proxy API-configuration contains only the actions defined in Ext.data.Api.actions', 'invalid-url': 'Invalid url. Please review your proxy configuration.', 'execute': 'Attempted to execute an unknown action. Valid API actions are defined in Ext.data.Api.actions"' } }); Ext.data.SortTypes = { none : function(s){ return s; }, stripTagsRE : /<\/?[^>]+>/gi, asText : function(s){ return String(s).replace(this.stripTagsRE, ""); }, asUCText : function(s){ return String(s).toUpperCase().replace(this.stripTagsRE, ""); }, asUCString : function(s) { return String(s).toUpperCase(); }, asDate : function(s) { if(!s){ return 0; } if(Ext.isDate(s)){ return s.getTime(); } return Date.parse(String(s)); }, asFloat : function(s) { var val = parseFloat(String(s).replace(/,/g, "")); return isNaN(val) ? 0 : val; }, asInt : function(s) { var val = parseInt(String(s).replace(/,/g, ""), 10); return isNaN(val) ? 0 : val; } }; Ext.data.Record = function(data, id){ this.id = (id || id === 0) ? id : Ext.data.Record.id(this); this.data = data || {}; }; Ext.data.Record.create = function(o){ var f = Ext.extend(Ext.data.Record, {}); var p = f.prototype; p.fields = new Ext.util.MixedCollection(false, function(field){ return field.name; }); for(var i = 0, len = o.length; i < len; i++){ p.fields.add(new Ext.data.Field(o[i])); } f.getField = function(name){ return p.fields.get(name); }; return f; }; Ext.data.Record.PREFIX = 'ext-record'; Ext.data.Record.AUTO_ID = 1; Ext.data.Record.EDIT = 'edit'; Ext.data.Record.REJECT = 'reject'; Ext.data.Record.COMMIT = 'commit'; Ext.data.Record.id = function(rec) { rec.phantom = true; return [Ext.data.Record.PREFIX, '-', Ext.data.Record.AUTO_ID++].join(''); }; Ext.data.Record.prototype = { dirty : false, editing : false, error : null, modified : null, phantom : false, join : function(store){ this.store = store; }, set : function(name, value){ var encode = Ext.isPrimitive(value) ? String : Ext.encode; if(encode(this.data[name]) == encode(value)) { return; } this.dirty = true; if(!this.modified){ this.modified = {}; } if(this.modified[name] === undefined){ this.modified[name] = this.data[name]; } this.data[name] = value; if(!this.editing){ this.afterEdit(); } }, afterEdit : function(){ if (this.store != undefined && typeof this.store.afterEdit == "function") { this.store.afterEdit(this); } }, afterReject : function(){ if(this.store){ this.store.afterReject(this); } }, afterCommit : function(){ if(this.store){ this.store.afterCommit(this); } }, get : function(name){ return this.data[name]; }, beginEdit : function(){ this.editing = true; this.modified = this.modified || {}; }, cancelEdit : function(){ this.editing = false; delete this.modified; }, endEdit : function(){ this.editing = false; if(this.dirty){ this.afterEdit(); } }, reject : function(silent){ var m = this.modified; for(var n in m){ if(typeof m[n] != "function"){ this.data[n] = m[n]; } } this.dirty = false; delete this.modified; this.editing = false; if(silent !== true){ this.afterReject(); } }, commit : function(silent){ this.dirty = false; delete this.modified; this.editing = false; if(silent !== true){ this.afterCommit(); } }, getChanges : function(){ var m = this.modified, cs = {}; for(var n in m){ if(m.hasOwnProperty(n)){ cs[n] = this.data[n]; } } return cs; }, hasError : function(){ return this.error !== null; }, clearError : function(){ this.error = null; }, copy : function(newId) { return new this.constructor(Ext.apply({}, this.data), newId || this.id); }, isModified : function(fieldName){ return !!(this.modified && this.modified.hasOwnProperty(fieldName)); }, isValid : function() { return this.fields.find(function(f) { return (f.allowBlank === false && Ext.isEmpty(this.data[f.name])) ? true : false; },this) ? false : true; }, markDirty : function(){ this.dirty = true; if(!this.modified){ this.modified = {}; } this.fields.each(function(f) { this.modified[f.name] = this.data[f.name]; },this); } }; Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), { register : function(){ for(var i = 0, s; (s = arguments[i]); i++){ this.add(s); } }, unregister : function(){ for(var i = 0, s; (s = arguments[i]); i++){ this.remove(this.lookup(s)); } }, lookup : function(id){ if(Ext.isArray(id)){ var fields = ['field1'], expand = !Ext.isArray(id[0]); if(!expand){ for(var i = 2, len = id[0].length; i <= len; ++i){ fields.push('field' + i); } } return new Ext.data.ArrayStore({ fields: fields, data: id, expandData: expand, autoDestroy: true, autoCreated: true }); } return Ext.isObject(id) ? (id.events ? id : Ext.create(id, 'store')) : this.get(id); }, getKey : function(o){ return o.storeId; } }); Ext.data.Store = Ext.extend(Ext.util.Observable, { writer : undefined, remoteSort : false, autoDestroy : false, pruneModifiedRecords : false, lastOptions : null, autoSave : true, batch : true, restful: false, paramNames : undefined, defaultParamNames : { start : 'start', limit : 'limit', sort : 'sort', dir : 'dir' }, isDestroyed: false, hasMultiSort: false, batchKey : '_ext_batch_', constructor : function(config){ this.data = new Ext.util.MixedCollection(false); this.data.getKey = function(o){ return o.id; }; this.removed = []; if(config && config.data){ this.inlineData = config.data; delete config.data; } Ext.apply(this, config); this.baseParams = Ext.isObject(this.baseParams) ? this.baseParams : {}; this.paramNames = Ext.applyIf(this.paramNames || {}, this.defaultParamNames); if((this.url || this.api) && !this.proxy){ this.proxy = new Ext.data.HttpProxy({url: this.url, api: this.api}); } if (this.restful === true && this.proxy) { this.batch = false; Ext.data.Api.restify(this.proxy); } if(this.reader){ if(!this.recordType){ this.recordType = this.reader.recordType; } if(this.reader.onMetaChange){ this.reader.onMetaChange = this.reader.onMetaChange.createSequence(this.onMetaChange, this); } if (this.writer) { if (this.writer instanceof(Ext.data.DataWriter) === false) { this.writer = this.buildWriter(this.writer); } this.writer.meta = this.reader.meta; this.pruneModifiedRecords = true; } } if(this.recordType){ this.fields = this.recordType.prototype.fields; } this.modified = []; this.addEvents( 'datachanged', 'metachange', 'add', 'remove', 'update', 'clear', 'exception', 'beforeload', 'load', 'loadexception', 'beforewrite', 'write', 'beforesave', 'save' ); if(this.proxy){ this.relayEvents(this.proxy, ['loadexception', 'exception']); } if (this.writer) { this.on({ scope: this, add: this.createRecords, remove: this.destroyRecord, update: this.updateRecord, clear: this.onClear }); } this.sortToggle = {}; if(this.sortField){ this.setDefaultSort(this.sortField, this.sortDir); }else if(this.sortInfo){ this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction); } Ext.data.Store.superclass.constructor.call(this); if(this.id){ this.storeId = this.id; delete this.id; } if(this.storeId){ Ext.StoreMgr.register(this); } if(this.inlineData){ this.loadData(this.inlineData); delete this.inlineData; }else if(this.autoLoad){ this.load.defer(10, this, [ typeof this.autoLoad == 'object' ? this.autoLoad : undefined]); } this.batchCounter = 0; this.batches = {}; }, buildWriter : function(config) { var klass = undefined, type = (config.format || 'json').toLowerCase(); switch (type) { case 'json': klass = Ext.data.JsonWriter; break; case 'xml': klass = Ext.data.XmlWriter; break; default: klass = Ext.data.JsonWriter; } return new klass(config); }, destroy : function(){ if(!this.isDestroyed){ if(this.storeId){ Ext.StoreMgr.unregister(this); } this.clearData(); this.data = null; Ext.destroy(this.proxy); this.reader = this.writer = null; this.purgeListeners(); this.isDestroyed = true; } }, add : function(records) { var i, len, record, index; records = [].concat(records); if (records.length < 1) { return; } for (i = 0, len = records.length; i < len; i++) { record = records[i]; record.join(this); if (record.dirty || record.phantom) { this.modified.push(record); } } index = this.data.length; this.data.addAll(records); if (this.snapshot) { this.snapshot.addAll(records); } this.fireEvent('add', this, records, index); }, addSorted : function(record){ var index = this.findInsertIndex(record); this.insert(index, record); }, doUpdate: function(rec){ var id = rec.id; this.getById(id).join(null); this.data.replace(id, rec); if (this.snapshot) { this.snapshot.replace(id, rec); } rec.join(this); this.fireEvent('update', this, rec, Ext.data.Record.COMMIT); }, remove : function(record){ if(Ext.isArray(record)){ Ext.each(record, function(r){ this.remove(r); }, this); return; } var index = this.data.indexOf(record); if(index > -1){ record.join(null); this.data.removeAt(index); } if(this.pruneModifiedRecords){ this.modified.remove(record); } if(this.snapshot){ this.snapshot.remove(record); } if(index > -1){ this.fireEvent('remove', this, record, index); } }, removeAt : function(index){ this.remove(this.getAt(index)); }, removeAll : function(silent){ var items = []; this.each(function(rec){ items.push(rec); }); this.clearData(); if(this.snapshot){ this.snapshot.clear(); } if(this.pruneModifiedRecords){ this.modified = []; } if (silent !== true) { this.fireEvent('clear', this, items); } }, onClear: function(store, records){ Ext.each(records, function(rec, index){ this.destroyRecord(this, rec, index); }, this); }, insert : function(index, records) { var i, len, record; records = [].concat(records); for (i = 0, len = records.length; i < len; i++) { record = records[i]; this.data.insert(index + i, record); record.join(this); if (record.dirty || record.phantom) { this.modified.push(record); } } if (this.snapshot) { this.snapshot.addAll(records); } this.fireEvent('add', this, records, index); }, indexOf : function(record){ return this.data.indexOf(record); }, indexOfId : function(id){ return this.data.indexOfKey(id); }, getById : function(id){ return (this.snapshot || this.data).key(id); }, getAt : function(index){ return this.data.itemAt(index); }, getRange : function(start, end){ return this.data.getRange(start, end); }, storeOptions : function(o){ o = Ext.apply({}, o); delete o.callback; delete o.scope; this.lastOptions = o; }, clearData: function(){ this.data.each(function(rec) { rec.join(null); }); this.data.clear(); }, load : function(options) { options = Ext.apply({}, options); this.storeOptions(options); if(this.sortInfo && this.remoteSort){ var pn = this.paramNames; options.params = Ext.apply({}, options.params); options.params[pn.sort] = this.sortInfo.field; options.params[pn.dir] = this.sortInfo.direction; } try { return this.execute('read', null, options); } catch(e) { this.handleException(e); return false; } }, updateRecord : function(store, record, action) { if (action == Ext.data.Record.EDIT && this.autoSave === true && (!record.phantom || (record.phantom && record.isValid()))) { this.save(); } }, createRecords : function(store, records, index) { var modified = this.modified, length = records.length, record, i; for (i = 0; i < length; i++) { record = records[i]; if (record.phantom && record.isValid()) { record.markDirty(); if (modified.indexOf(record) == -1) { modified.push(record); } } } if (this.autoSave === true) { this.save(); } }, destroyRecord : function(store, record, index) { if (this.modified.indexOf(record) != -1) { this.modified.remove(record); } if (!record.phantom) { this.removed.push(record); record.lastIndex = index; if (this.autoSave === true) { this.save(); } } }, execute : function(action, rs, options, batch) { if (!Ext.data.Api.isAction(action)) { throw new Ext.data.Api.Error('execute', action); } options = Ext.applyIf(options||{}, { params: {} }); if(batch !== undefined){ this.addToBatch(batch); } var doRequest = true; if (action === 'read') { doRequest = this.fireEvent('beforeload', this, options); Ext.applyIf(options.params, this.baseParams); } else { if (this.writer.listful === true && this.restful !== true) { rs = (Ext.isArray(rs)) ? rs : [rs]; } else if (Ext.isArray(rs) && rs.length == 1) { rs = rs.shift(); } if ((doRequest = this.fireEvent('beforewrite', this, action, rs, options)) !== false) { this.writer.apply(options.params, this.baseParams, action, rs); } } if (doRequest !== false) { if (this.writer && this.proxy.url && !this.proxy.restful && !Ext.data.Api.hasUniqueUrl(this.proxy, action)) { options.params.xaction = action; } this.proxy.request(Ext.data.Api.actions[action], rs, options.params, this.reader, this.createCallback(action, rs, batch), this, options); } return doRequest; }, save : function() { if (!this.writer) { throw new Ext.data.Store.Error('writer-undefined'); } var queue = [], len, trans, batch, data = {}, i; if(this.removed.length){ queue.push(['destroy', this.removed]); } var rs = [].concat(this.getModifiedRecords()); if(rs.length){ var phantoms = []; for(i = rs.length-1; i >= 0; i--){ if(rs[i].phantom === true){ var rec = rs.splice(i, 1).shift(); if(rec.isValid()){ phantoms.push(rec); } }else if(!rs[i].isValid()){ rs.splice(i,1); } } if(phantoms.length){ queue.push(['create', phantoms]); } if(rs.length){ queue.push(['update', rs]); } } len = queue.length; if(len){ batch = ++this.batchCounter; for(i = 0; i < len; ++i){ trans = queue[i]; data[trans[0]] = trans[1]; } if(this.fireEvent('beforesave', this, data) !== false){ for(i = 0; i < len; ++i){ trans = queue[i]; this.doTransaction(trans[0], trans[1], batch); } return batch; } } return -1; }, doTransaction : function(action, rs, batch) { function transaction(records) { try{ this.execute(action, records, undefined, batch); }catch (e){ this.handleException(e); } } if(this.batch === false){ for(var i = 0, len = rs.length; i < len; i++){ transaction.call(this, rs[i]); } }else{ transaction.call(this, rs); } }, addToBatch : function(batch){ var b = this.batches, key = this.batchKey + batch, o = b[key]; if(!o){ b[key] = o = { id: batch, count: 0, data: {} }; } ++o.count; }, removeFromBatch : function(batch, action, data){ var b = this.batches, key = this.batchKey + batch, o = b[key], arr; if(o){ arr = o.data[action] || []; o.data[action] = arr.concat(data); if(o.count === 1){ data = o.data; delete b[key]; this.fireEvent('save', this, batch, data); }else{ --o.count; } } }, createCallback : function(action, rs, batch) { var actions = Ext.data.Api.actions; return (action == 'read') ? this.loadRecords : function(data, response, success) { this['on' + Ext.util.Format.capitalize(action) + 'Records'](success, rs, [].concat(data)); if (success === true) { this.fireEvent('write', this, action, data, response, rs); } this.removeFromBatch(batch, action, data); }; }, clearModified : function(rs) { if (Ext.isArray(rs)) { for (var n=rs.length-1;n>=0;n--) { this.modified.splice(this.modified.indexOf(rs[n]), 1); } } else { this.modified.splice(this.modified.indexOf(rs), 1); } }, reMap : function(record) { if (Ext.isArray(record)) { for (var i = 0, len = record.length; i < len; i++) { this.reMap(record[i]); } } else { delete this.data.map[record._phid]; this.data.map[record.id] = record; var index = this.data.keys.indexOf(record._phid); this.data.keys.splice(index, 1, record.id); delete record._phid; } }, onCreateRecords : function(success, rs, data) { if (success === true) { try { this.reader.realize(rs, data); } catch (e) { this.handleException(e); if (Ext.isArray(rs)) { this.onCreateRecords(success, rs, data); } } } }, onUpdateRecords : function(success, rs, data) { if (success === true) { try { this.reader.update(rs, data); } catch (e) { this.handleException(e); if (Ext.isArray(rs)) { this.onUpdateRecords(success, rs, data); } } } }, onDestroyRecords : function(success, rs, data) { rs = (rs instanceof Ext.data.Record) ? [rs] : [].concat(rs); for (var i=0,len=rs.length;i=0;i--) { this.insert(rs[i].lastIndex, rs[i]); } } }, handleException : function(e) { Ext.handleError(e); }, reload : function(options){ this.load(Ext.applyIf(options||{}, this.lastOptions)); }, loadRecords : function(o, options, success){ var i, len; if (this.isDestroyed === true) { return; } if(!o || success === false){ if(success !== false){ this.fireEvent('load', this, [], options); } if(options.callback){ options.callback.call(options.scope || this, [], options, false, o); } return; } var r = o.records, t = o.totalRecords || r.length; if(!options || options.add !== true){ if(this.pruneModifiedRecords){ this.modified = []; } for(i = 0, len = r.length; i < len; i++){ r[i].join(this); } if(this.snapshot){ this.data = this.snapshot; delete this.snapshot; } this.clearData(); this.data.addAll(r); this.totalLength = t; this.applySort(); this.fireEvent('datachanged', this); }else{ var toAdd = [], rec, cnt = 0; for(i = 0, len = r.length; i < len; ++i){ rec = r[i]; if(this.indexOfId(rec.id) > -1){ this.doUpdate(rec); }else{ toAdd.push(rec); ++cnt; } } this.totalLength = Math.max(t, this.data.length + cnt); this.add(toAdd); } this.fireEvent('load', this, r, options); if(options.callback){ options.callback.call(options.scope || this, r, options, true); } }, loadData : function(o, append){ var r = this.reader.readRecords(o); this.loadRecords(r, {add: append}, true); }, getCount : function(){ return this.data.length || 0; }, getTotalCount : function(){ return this.totalLength || 0; }, getSortState : function(){ return this.sortInfo; }, applySort : function(){ if ((this.sortInfo || this.multiSortInfo) && !this.remoteSort) { this.sortData(); } }, sortData : function() { var sortInfo = this.hasMultiSort ? this.multiSortInfo : this.sortInfo, direction = sortInfo.direction || "ASC", sorters = sortInfo.sorters, sortFns = []; if (!this.hasMultiSort) { sorters = [{direction: direction, field: sortInfo.field}]; } for (var i=0, j = sorters.length; i < j; i++) { sortFns.push(this.createSortFunction(sorters[i].field, sorters[i].direction)); } if (sortFns.length == 0) { return; } var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1; var fn = function(r1, r2) { var result = sortFns[0].call(this, r1, r2); if (sortFns.length > 1) { for (var i=1, j = sortFns.length; i < j; i++) { result = result || sortFns[i].call(this, r1, r2); } } return directionModifier * result; }; this.data.sort(direction, fn); if (this.snapshot && this.snapshot != this.data) { this.snapshot.sort(direction, fn); } }, createSortFunction: function(field, direction) { direction = direction || "ASC"; var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1; var sortType = this.fields.get(field).sortType; return function(r1, r2) { var v1 = sortType(r1.data[field]), v2 = sortType(r2.data[field]); return directionModifier * (v1 > v2 ? 1 : (v1 < v2 ? -1 : 0)); }; }, setDefaultSort : function(field, dir) { dir = dir ? dir.toUpperCase() : 'ASC'; this.sortInfo = {field: field, direction: dir}; this.sortToggle[field] = dir; }, sort : function(fieldName, dir) { if (Ext.isArray(arguments[0])) { return this.multiSort.call(this, fieldName, dir); } else { return this.singleSort(fieldName, dir); } }, singleSort: function(fieldName, dir) { var field = this.fields.get(fieldName); if (!field) { return false; } var name = field.name, sortInfo = this.sortInfo || null, sortToggle = this.sortToggle ? this.sortToggle[name] : null; if (!dir) { if (sortInfo && sortInfo.field == name) { dir = (this.sortToggle[name] || 'ASC').toggle('ASC', 'DESC'); } else { dir = field.sortDir; } } this.sortToggle[name] = dir; this.sortInfo = {field: name, direction: dir}; this.hasMultiSort = false; if (this.remoteSort) { if (!this.load(this.lastOptions)) { if (sortToggle) { this.sortToggle[name] = sortToggle; } if (sortInfo) { this.sortInfo = sortInfo; } } } else { this.applySort(); this.fireEvent('datachanged', this); } return true; }, multiSort: function(sorters, direction) { this.hasMultiSort = true; direction = direction || "ASC"; if (this.multiSortInfo && direction == this.multiSortInfo.direction) { direction = direction.toggle("ASC", "DESC"); } this.multiSortInfo = { sorters : sorters, direction: direction }; if (this.remoteSort) { this.singleSort(sorters[0].field, sorters[0].direction); } else { this.applySort(); this.fireEvent('datachanged', this); } }, each : function(fn, scope){ this.data.each(fn, scope); }, getModifiedRecords : function(){ return this.modified; }, sum : function(property, start, end){ var rs = this.data.items, v = 0; start = start || 0; end = (end || end === 0) ? end : rs.length-1; for(var i = start; i <= end; i++){ v += (rs[i].data[property] || 0); } return v; }, createFilterFn : function(property, value, anyMatch, caseSensitive, exactMatch){ if(Ext.isEmpty(value, false)){ return false; } value = this.data.createValueMatcher(value, anyMatch, caseSensitive, exactMatch); return function(r) { return value.test(r.data[property]); }; }, createMultipleFilterFn: function(filters) { return function(record) { var isMatch = true; for (var i=0, j = filters.length; i < j; i++) { var filter = filters[i], fn = filter.fn, scope = filter.scope; isMatch = isMatch && fn.call(scope, record); } return isMatch; }; }, filter : function(property, value, anyMatch, caseSensitive, exactMatch){ var fn; if (Ext.isObject(property)) { property = [property]; } if (Ext.isArray(property)) { var filters = []; for (var i=0, j = property.length; i < j; i++) { var filter = property[i], func = filter.fn, scope = filter.scope || this; if (!Ext.isFunction(func)) { func = this.createFilterFn(filter.property, filter.value, filter.anyMatch, filter.caseSensitive, filter.exactMatch); } filters.push({fn: func, scope: scope}); } fn = this.createMultipleFilterFn(filters); } else { fn = this.createFilterFn(property, value, anyMatch, caseSensitive, exactMatch); } return fn ? this.filterBy(fn) : this.clearFilter(); }, filterBy : function(fn, scope){ this.snapshot = this.snapshot || this.data; this.data = this.queryBy(fn, scope || this); this.fireEvent('datachanged', this); }, clearFilter : function(suppressEvent){ if(this.isFiltered()){ this.data = this.snapshot; delete this.snapshot; if(suppressEvent !== true){ this.fireEvent('datachanged', this); } } }, isFiltered : function(){ return !!this.snapshot && this.snapshot != this.data; }, query : function(property, value, anyMatch, caseSensitive){ var fn = this.createFilterFn(property, value, anyMatch, caseSensitive); return fn ? this.queryBy(fn) : this.data.clone(); }, queryBy : function(fn, scope){ var data = this.snapshot || this.data; return data.filterBy(fn, scope||this); }, find : function(property, value, start, anyMatch, caseSensitive){ var fn = this.createFilterFn(property, value, anyMatch, caseSensitive); return fn ? this.data.findIndexBy(fn, null, start) : -1; }, findExact: function(property, value, start){ return this.data.findIndexBy(function(rec){ return rec.get(property) === value; }, this, start); }, findBy : function(fn, scope, start){ return this.data.findIndexBy(fn, scope, start); }, collect : function(dataIndex, allowNull, bypassFilter){ var d = (bypassFilter === true && this.snapshot) ? this.snapshot.items : this.data.items; var v, sv, r = [], l = {}; for(var i = 0, len = d.length; i < len; i++){ v = d[i].data[dataIndex]; sv = String(v); if((allowNull || !Ext.isEmpty(v)) && !l[sv]){ l[sv] = true; r[r.length] = v; } } return r; }, afterEdit : function(record){ if(this.modified.indexOf(record) == -1){ this.modified.push(record); } this.fireEvent('update', this, record, Ext.data.Record.EDIT); }, afterReject : function(record){ this.modified.remove(record); this.fireEvent('update', this, record, Ext.data.Record.REJECT); }, afterCommit : function(record){ this.modified.remove(record); this.fireEvent('update', this, record, Ext.data.Record.COMMIT); }, commitChanges : function(){ var modified = this.modified.slice(0), length = modified.length, i; for (i = 0; i < length; i++){ modified[i].commit(); } this.modified = []; this.removed = []; }, rejectChanges : function() { var modified = this.modified.slice(0), removed = this.removed.slice(0).reverse(), mLength = modified.length, rLength = removed.length, i; for (i = 0; i < mLength; i++) { modified[i].reject(); } for (i = 0; i < rLength; i++) { this.insert(removed[i].lastIndex || 0, removed[i]); removed[i].reject(); } this.modified = []; this.removed = []; }, onMetaChange : function(meta){ this.recordType = this.reader.recordType; this.fields = this.recordType.prototype.fields; delete this.snapshot; if(this.reader.meta.sortInfo){ this.sortInfo = this.reader.meta.sortInfo; }else if(this.sortInfo && !this.fields.get(this.sortInfo.field)){ delete this.sortInfo; } if(this.writer){ this.writer.meta = this.reader.meta; } this.modified = []; this.fireEvent('metachange', this, this.reader.meta); }, findInsertIndex : function(record){ this.suspendEvents(); var data = this.data.clone(); this.data.add(record); this.applySort(); var index = this.data.indexOf(record); this.data = data; this.resumeEvents(); return index; }, setBaseParam : function (name, value){ this.baseParams = this.baseParams || {}; this.baseParams[name] = value; } }); Ext.reg('store', Ext.data.Store); Ext.data.Store.Error = Ext.extend(Ext.Error, { name: 'Ext.data.Store' }); Ext.apply(Ext.data.Store.Error.prototype, { lang: { 'writer-undefined' : 'Attempted to execute a write-action without a DataWriter installed.' } }); Ext.data.Field = Ext.extend(Object, { constructor : function(config){ if(Ext.isString(config)){ config = {name: config}; } Ext.apply(this, config); var types = Ext.data.Types, st = this.sortType, t; if(this.type){ if(Ext.isString(this.type)){ this.type = Ext.data.Types[this.type.toUpperCase()] || types.AUTO; } }else{ this.type = types.AUTO; } if(Ext.isString(st)){ this.sortType = Ext.data.SortTypes[st]; }else if(Ext.isEmpty(st)){ this.sortType = this.type.sortType; } if(!this.convert){ this.convert = this.type.convert; } }, dateFormat: null, useNull: false, defaultValue: "", mapping: null, sortType : null, sortDir : "ASC", allowBlank : true }); Ext.data.DataReader = function(meta, recordType){ this.meta = meta; this.recordType = Ext.isArray(recordType) ? Ext.data.Record.create(recordType) : recordType; if (this.recordType){ this.buildExtractors(); } }; Ext.data.DataReader.prototype = { getTotal: Ext.emptyFn, getRoot: Ext.emptyFn, getMessage: Ext.emptyFn, getSuccess: Ext.emptyFn, getId: Ext.emptyFn, buildExtractors : Ext.emptyFn, extractValues : Ext.emptyFn, realize: function(rs, data){ if (Ext.isArray(rs)) { for (var i = rs.length - 1; i >= 0; i--) { if (Ext.isArray(data)) { this.realize(rs.splice(i,1).shift(), data.splice(i,1).shift()); } else { this.realize(rs.splice(i,1).shift(), data); } } } else { if (Ext.isArray(data) && data.length == 1) { data = data.shift(); } if (!this.isData(data)) { throw new Ext.data.DataReader.Error('realize', rs); } rs.phantom = false; rs._phid = rs.id; rs.id = this.getId(data); rs.data = data; rs.commit(); rs.store.reMap(rs); } }, update : function(rs, data) { if (Ext.isArray(rs)) { for (var i=rs.length-1; i >= 0; i--) { if (Ext.isArray(data)) { this.update(rs.splice(i,1).shift(), data.splice(i,1).shift()); } else { this.update(rs.splice(i,1).shift(), data); } } } else { if (Ext.isArray(data) && data.length == 1) { data = data.shift(); } if (this.isData(data)) { rs.data = Ext.apply(rs.data, data); } rs.commit(); } }, extractData : function(root, returnRecords) { var rawName = (this instanceof Ext.data.JsonReader) ? 'json' : 'node'; var rs = []; if (this.isData(root) && !(this instanceof Ext.data.XmlReader)) { root = [root]; } var f = this.recordType.prototype.fields, fi = f.items, fl = f.length, rs = []; if (returnRecords === true) { var Record = this.recordType; for (var i = 0; i < root.length; i++) { var n = root[i]; var record = new Record(this.extractValues(n, fi, fl), this.getId(n)); record[rawName] = n; rs.push(record); } } else { for (var i = 0; i < root.length; i++) { var data = this.extractValues(root[i], fi, fl); data[this.meta.idProperty] = this.getId(root[i]); rs.push(data); } } return rs; }, isData : function(data) { return (data && Ext.isObject(data) && !Ext.isEmpty(this.getId(data))) ? true : false; }, onMetaChange : function(meta){ delete this.ef; this.meta = meta; this.recordType = Ext.data.Record.create(meta.fields); this.buildExtractors(); } }; Ext.data.DataReader.Error = Ext.extend(Ext.Error, { constructor : function(message, arg) { this.arg = arg; Ext.Error.call(this, message); }, name: 'Ext.data.DataReader' }); Ext.apply(Ext.data.DataReader.Error.prototype, { lang : { 'update': "#update received invalid data from server. Please see docs for DataReader#update and review your DataReader configuration.", 'realize': "#realize was called with invalid remote-data. Please see the docs for DataReader#realize and review your DataReader configuration.", 'invalid-response': "#readResponse received an invalid response from the server." } }); Ext.data.DataWriter = function(config){ Ext.apply(this, config); }; Ext.data.DataWriter.prototype = { writeAllFields : false, listful : false, apply : function(params, baseParams, action, rs) { var data = [], renderer = action + 'Record'; if (Ext.isArray(rs)) { Ext.each(rs, function(rec){ data.push(this[renderer](rec)); }, this); } else if (rs instanceof Ext.data.Record) { data = this[renderer](rs); } this.render(params, baseParams, data); }, render : Ext.emptyFn, updateRecord : Ext.emptyFn, createRecord : Ext.emptyFn, destroyRecord : Ext.emptyFn, toHash : function(rec, config) { var map = rec.fields.map, data = {}, raw = (this.writeAllFields === false && rec.phantom === false) ? rec.getChanges() : rec.data, m; Ext.iterate(raw, function(prop, value){ if((m = map[prop])){ data[m.mapping ? m.mapping : m.name] = value; } }); if (rec.phantom) { if (rec.fields.containsKey(this.meta.idProperty) && Ext.isEmpty(rec.data[this.meta.idProperty])) { delete data[this.meta.idProperty]; } } else { data[this.meta.idProperty] = rec.id; } return data; }, toArray : function(data) { var fields = []; Ext.iterate(data, function(k, v) {fields.push({name: k, value: v});},this); return fields; } }; Ext.data.DataProxy = function(conn){ conn = conn || {}; this.api = conn.api; this.url = conn.url; this.restful = conn.restful; this.listeners = conn.listeners; this.prettyUrls = conn.prettyUrls; this.addEvents( 'exception', 'beforeload', 'load', 'loadexception', 'beforewrite', 'write' ); Ext.data.DataProxy.superclass.constructor.call(this); try { Ext.data.Api.prepare(this); } catch (e) { if (e instanceof Ext.data.Api.Error) { e.toConsole(); } } Ext.data.DataProxy.relayEvents(this, ['beforewrite', 'write', 'exception']); }; Ext.extend(Ext.data.DataProxy, Ext.util.Observable, { restful: false, setApi : function() { if (arguments.length == 1) { var valid = Ext.data.Api.isValid(arguments[0]); if (valid === true) { this.api = arguments[0]; } else { throw new Ext.data.Api.Error('invalid', valid); } } else if (arguments.length == 2) { if (!Ext.data.Api.isAction(arguments[0])) { throw new Ext.data.Api.Error('invalid', arguments[0]); } this.api[arguments[0]] = arguments[1]; } Ext.data.Api.prepare(this); }, isApiAction : function(action) { return (this.api[action]) ? true : false; }, request : function(action, rs, params, reader, callback, scope, options) { if (!this.api[action] && !this.load) { throw new Ext.data.DataProxy.Error('action-undefined', action); } params = params || {}; if ((action === Ext.data.Api.actions.read) ? this.fireEvent("beforeload", this, params) : this.fireEvent("beforewrite", this, action, rs, params) !== false) { this.doRequest.apply(this, arguments); } else { callback.call(scope || this, null, options, false); } }, load : null, doRequest : function(action, rs, params, reader, callback, scope, options) { this.load(params, reader, callback, scope, options); }, onRead : Ext.emptyFn, onWrite : Ext.emptyFn, buildUrl : function(action, record) { record = record || null; var url = (this.conn && this.conn.url) ? this.conn.url : (this.api[action]) ? this.api[action].url : this.url; if (!url) { throw new Ext.data.Api.Error('invalid-url', action); } var provides = null; var m = url.match(/(.*)(\.json|\.xml|\.html)$/); if (m) { provides = m[2]; url = m[1]; } if ((this.restful === true || this.prettyUrls === true) && record instanceof Ext.data.Record && !record.phantom) { url += '/' + record.id; } return (provides === null) ? url : url + provides; }, destroy: function(){ this.purgeListeners(); } }); Ext.apply(Ext.data.DataProxy, Ext.util.Observable.prototype); Ext.util.Observable.call(Ext.data.DataProxy); Ext.data.DataProxy.Error = Ext.extend(Ext.Error, { constructor : function(message, arg) { this.arg = arg; Ext.Error.call(this, message); }, name: 'Ext.data.DataProxy' }); Ext.apply(Ext.data.DataProxy.Error.prototype, { lang: { 'action-undefined': "DataProxy attempted to execute an API-action but found an undefined url / function. Please review your Proxy url/api-configuration.", 'api-invalid': 'Recieved an invalid API-configuration. Please ensure your proxy API-configuration contains only the actions from Ext.data.Api.actions.' } }); Ext.data.Request = function(params) { Ext.apply(this, params); }; Ext.data.Request.prototype = { action : undefined, rs : undefined, params: undefined, callback : Ext.emptyFn, scope : undefined, reader : undefined }; Ext.data.Response = function(params) { Ext.apply(this, params); }; Ext.data.Response.prototype = { action: undefined, success : undefined, message : undefined, data: undefined, raw: undefined, records: undefined }; Ext.data.ScriptTagProxy = function(config){ Ext.apply(this, config); Ext.data.ScriptTagProxy.superclass.constructor.call(this, config); this.head = document.getElementsByTagName("head")[0]; }; Ext.data.ScriptTagProxy.TRANS_ID = 1000; Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, { timeout : 30000, callbackParam : "callback", nocache : true, doRequest : function(action, rs, params, reader, callback, scope, arg) { var p = Ext.urlEncode(Ext.apply(params, this.extraParams)); var url = this.buildUrl(action, rs); if (!url) { throw new Ext.data.Api.Error('invalid-url', url); } url = Ext.urlAppend(url, p); if(this.nocache){ url = Ext.urlAppend(url, '_dc=' + (new Date().getTime())); } var transId = ++Ext.data.ScriptTagProxy.TRANS_ID; var trans = { id : transId, action: action, cb : "stcCallback"+transId, scriptId : "stcScript"+transId, params : params, arg : arg, url : url, callback : callback, scope : scope, reader : reader }; window[trans.cb] = this.createCallback(action, rs, trans); url += String.format("&{0}={1}", this.callbackParam, trans.cb); if(this.autoAbort !== false){ this.abort(); } trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]); var script = document.createElement("script"); script.setAttribute("src", url); script.setAttribute("type", "text/javascript"); script.setAttribute("id", trans.scriptId); this.head.appendChild(script); this.trans = trans; }, createCallback : function(action, rs, trans) { var self = this; return function(res) { self.trans = false; self.destroyTrans(trans, true); if (action === Ext.data.Api.actions.read) { self.onRead.call(self, action, trans, res); } else { self.onWrite.call(self, action, trans, res, rs); } }; }, onRead : function(action, trans, res) { var result; try { result = trans.reader.readRecords(res); }catch(e){ this.fireEvent("loadexception", this, trans, res, e); this.fireEvent('exception', this, 'response', action, trans, res, e); trans.callback.call(trans.scope||window, null, trans.arg, false); return; } if (result.success === false) { this.fireEvent('loadexception', this, trans, res); this.fireEvent('exception', this, 'remote', action, trans, res, null); } else { this.fireEvent("load", this, res, trans.arg); } trans.callback.call(trans.scope||window, result, trans.arg, result.success); }, onWrite : function(action, trans, response, rs) { var reader = trans.reader; try { var res = reader.readResponse(action, response); } catch (e) { this.fireEvent('exception', this, 'response', action, trans, res, e); trans.callback.call(trans.scope||window, null, res, false); return; } if(!res.success === true){ this.fireEvent('exception', this, 'remote', action, trans, res, rs); trans.callback.call(trans.scope||window, null, res, false); return; } this.fireEvent("write", this, action, res.data, res, rs, trans.arg ); trans.callback.call(trans.scope||window, res.data, res, true); }, isLoading : function(){ return this.trans ? true : false; }, abort : function(){ if(this.isLoading()){ this.destroyTrans(this.trans); } }, destroyTrans : function(trans, isLoaded){ this.head.removeChild(document.getElementById(trans.scriptId)); clearTimeout(trans.timeoutId); if(isLoaded){ window[trans.cb] = undefined; try{ delete window[trans.cb]; }catch(e){} }else{ window[trans.cb] = function(){ window[trans.cb] = undefined; try{ delete window[trans.cb]; }catch(e){} }; } }, handleFailure : function(trans){ this.trans = false; this.destroyTrans(trans, false); if (trans.action === Ext.data.Api.actions.read) { this.fireEvent("loadexception", this, null, trans.arg); } this.fireEvent('exception', this, 'response', trans.action, { response: null, options: trans.arg }); trans.callback.call(trans.scope||window, null, trans.arg, false); }, destroy: function(){ this.abort(); Ext.data.ScriptTagProxy.superclass.destroy.call(this); } }); Ext.data.HttpProxy = function(conn){ Ext.data.HttpProxy.superclass.constructor.call(this, conn); this.conn = conn; this.conn.url = null; this.useAjax = !conn || !conn.events; var actions = Ext.data.Api.actions; this.activeRequest = {}; for (var verb in actions) { this.activeRequest[actions[verb]] = undefined; } }; Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, { getConnection : function() { return this.useAjax ? Ext.Ajax : this.conn; }, setUrl : function(url, makePermanent) { this.conn.url = url; if (makePermanent === true) { this.url = url; this.api = null; Ext.data.Api.prepare(this); } }, doRequest : function(action, rs, params, reader, cb, scope, arg) { var o = { method: (this.api[action]) ? this.api[action]['method'] : undefined, request: { callback : cb, scope : scope, arg : arg }, reader: reader, callback : this.createCallback(action, rs), scope: this }; if (params.jsonData) { o.jsonData = params.jsonData; } else if (params.xmlData) { o.xmlData = params.xmlData; } else { o.params = params || {}; } this.conn.url = this.buildUrl(action, rs); if(this.useAjax){ Ext.applyIf(o, this.conn); if (this.activeRequest[action]) { } this.activeRequest[action] = Ext.Ajax.request(o); }else{ this.conn.request(o); } this.conn.url = null; }, createCallback : function(action, rs) { return function(o, success, response) { this.activeRequest[action] = undefined; if (!success) { if (action === Ext.data.Api.actions.read) { this.fireEvent('loadexception', this, o, response); } this.fireEvent('exception', this, 'response', action, o, response); o.request.callback.call(o.request.scope, null, o.request.arg, false); return; } if (action === Ext.data.Api.actions.read) { this.onRead(action, o, response); } else { this.onWrite(action, o, response, rs); } }; }, onRead : function(action, o, response) { var result; try { result = o.reader.read(response); }catch(e){ this.fireEvent('loadexception', this, o, response, e); this.fireEvent('exception', this, 'response', action, o, response, e); o.request.callback.call(o.request.scope, null, o.request.arg, false); return; } if (result.success === false) { this.fireEvent('loadexception', this, o, response); var res = o.reader.readResponse(action, response); this.fireEvent('exception', this, 'remote', action, o, res, null); } else { this.fireEvent('load', this, o, o.request.arg); } o.request.callback.call(o.request.scope, result, o.request.arg, result.success); }, onWrite : function(action, o, response, rs) { var reader = o.reader; var res; try { res = reader.readResponse(action, response); } catch (e) { this.fireEvent('exception', this, 'response', action, o, response, e); o.request.callback.call(o.request.scope, null, o.request.arg, false); return; } if (res.success === true) { this.fireEvent('write', this, action, res.data, res, rs, o.request.arg); } else { this.fireEvent('exception', this, 'remote', action, o, res, rs); } o.request.callback.call(o.request.scope, res.data, res, res.success); }, destroy: function(){ if(!this.useAjax){ this.conn.abort(); }else if(this.activeRequest){ var actions = Ext.data.Api.actions; for (var verb in actions) { if(this.activeRequest[actions[verb]]){ Ext.Ajax.abort(this.activeRequest[actions[verb]]); } } } Ext.data.HttpProxy.superclass.destroy.call(this); } }); Ext.data.MemoryProxy = function(data){ var api = {}; api[Ext.data.Api.actions.read] = true; Ext.data.MemoryProxy.superclass.constructor.call(this, { api: api }); this.data = data; }; Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, { doRequest : function(action, rs, params, reader, callback, scope, arg) { params = params || {}; var result; try { result = reader.readRecords(this.data); }catch(e){ this.fireEvent("loadexception", this, null, arg, e); this.fireEvent('exception', this, 'response', action, arg, null, e); callback.call(scope, null, arg, false); return; } callback.call(scope, result, arg, true); } }); Ext.data.Types = new function(){ var st = Ext.data.SortTypes; Ext.apply(this, { stripRe: /[\$,%]/g, AUTO: { convert: function(v){ return v; }, sortType: st.none, type: 'auto' }, STRING: { convert: function(v){ return (v === undefined || v === null) ? '' : String(v); }, sortType: st.asUCString, type: 'string' }, INT: { convert: function(v){ return v !== undefined && v !== null && v !== '' ? parseInt(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0); }, sortType: st.none, type: 'int' }, FLOAT: { convert: function(v){ return v !== undefined && v !== null && v !== '' ? parseFloat(String(v).replace(Ext.data.Types.stripRe, ''), 10) : (this.useNull ? null : 0); }, sortType: st.none, type: 'float' }, BOOL: { convert: function(v){ return v === true || v === 'true' || v == 1; }, sortType: st.none, type: 'bool' }, DATE: { convert: function(v){ var df = this.dateFormat; if(!v){ return null; } if(Ext.isDate(v)){ return v; } if(df){ if(df == 'timestamp'){ return new Date(v*1000); } if(df == 'time'){ return new Date(parseInt(v, 10)); } return Date.parseDate(v, df); } var parsed = Date.parse(v); return parsed ? new Date(parsed) : null; }, sortType: st.asDate, type: 'date' } }); Ext.apply(this, { BOOLEAN: this.BOOL, INTEGER: this.INT, NUMBER: this.FLOAT }); }; Ext.data.JsonWriter = Ext.extend(Ext.data.DataWriter, { encode : true, encodeDelete: false, constructor : function(config){ Ext.data.JsonWriter.superclass.constructor.call(this, config); }, render : function(params, baseParams, data) { if (this.encode === true) { Ext.apply(params, baseParams); params[this.meta.root] = Ext.encode(data); } else { var jdata = Ext.apply({}, baseParams); jdata[this.meta.root] = data; params.jsonData = jdata; } }, createRecord : function(rec) { return this.toHash(rec); }, updateRecord : function(rec) { return this.toHash(rec); }, destroyRecord : function(rec){ if(this.encodeDelete){ var data = {}; data[this.meta.idProperty] = rec.id; return data; }else{ return rec.id; } } }); Ext.data.JsonReader = function(meta, recordType){ meta = meta || {}; Ext.applyIf(meta, { idProperty: 'id', successProperty: 'success', totalProperty: 'total' }); Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields); }; Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, { read : function(response){ var json = response.responseText; var o = Ext.decode(json); if(!o) { throw {message: 'JsonReader.read: Json object not found'}; } return this.readRecords(o); }, readResponse : function(action, response) { var o = (response.responseText !== undefined) ? Ext.decode(response.responseText) : response; if(!o) { throw new Ext.data.JsonReader.Error('response'); } var root = this.getRoot(o), success = this.getSuccess(o); if (success && action === Ext.data.Api.actions.create) { var def = Ext.isDefined(root); if (def && Ext.isEmpty(root)) { throw new Ext.data.JsonReader.Error('root-empty', this.meta.root); } else if (!def) { throw new Ext.data.JsonReader.Error('root-undefined-response', this.meta.root); } } var res = new Ext.data.Response({ action: action, success: success, data: (root) ? this.extractData(root, false) : [], message: this.getMessage(o), raw: o }); if (Ext.isEmpty(res.success)) { throw new Ext.data.JsonReader.Error('successProperty-response', this.meta.successProperty); } return res; }, readRecords : function(o){ this.jsonData = o; if(o.metaData){ this.onMetaChange(o.metaData); } var s = this.meta, Record = this.recordType, f = Record.prototype.fields, fi = f.items, fl = f.length, v; var root = this.getRoot(o), c = root.length, totalRecords = c, success = true; if(s.totalProperty){ v = parseInt(this.getTotal(o), 10); if(!isNaN(v)){ totalRecords = v; } } if(s.successProperty){ v = this.getSuccess(o); if(v === false || v === 'false'){ success = false; } } return { success : success, records : this.extractData(root, true), totalRecords : totalRecords }; }, buildExtractors : function() { if(this.ef){ return; } var s = this.meta, Record = this.recordType, f = Record.prototype.fields, fi = f.items, fl = f.length; if(s.totalProperty) { this.getTotal = this.createAccessor(s.totalProperty); } if(s.successProperty) { this.getSuccess = this.createAccessor(s.successProperty); } if (s.messageProperty) { this.getMessage = this.createAccessor(s.messageProperty); } this.getRoot = s.root ? this.createAccessor(s.root) : function(p){return p;}; if (s.id || s.idProperty) { var g = this.createAccessor(s.id || s.idProperty); this.getId = function(rec) { var r = g(rec); return (r === undefined || r === '') ? null : r; }; } else { this.getId = function(){return null;}; } var ef = []; for(var i = 0; i < fl; i++){ f = fi[i]; var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name; ef.push(this.createAccessor(map)); } this.ef = ef; }, simpleAccess : function(obj, subsc) { return obj[subsc]; }, createAccessor : function(){ var re = /[\[\.]/; return function(expr) { if(Ext.isEmpty(expr)){ return Ext.emptyFn; } if(Ext.isFunction(expr)){ return expr; } var i = String(expr).search(re); if(i >= 0){ return new Function('obj', 'return obj' + (i > 0 ? '.' : '') + expr); } return function(obj){ return obj[expr]; }; }; }(), extractValues : function(data, items, len) { var f, values = {}; for(var j = 0; j < len; j++){ f = items[j]; var v = this.ef[j](data); values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, data); } return values; } }); Ext.data.JsonReader.Error = Ext.extend(Ext.Error, { constructor : function(message, arg) { this.arg = arg; Ext.Error.call(this, message); }, name : 'Ext.data.JsonReader' }); Ext.apply(Ext.data.JsonReader.Error.prototype, { lang: { 'response': 'An error occurred while json-decoding your server response', 'successProperty-response': 'Could not locate your "successProperty" in your server response. Please review your JsonReader config to ensure the config-property "successProperty" matches the property in your server-response. See the JsonReader docs.', 'root-undefined-config': 'Your JsonReader was configured without a "root" property. Please review your JsonReader config and make sure to define the root property. See the JsonReader docs.', 'idProperty-undefined' : 'Your JsonReader was configured without an "idProperty" Please review your JsonReader configuration and ensure the "idProperty" is set (e.g.: "id"). See the JsonReader docs.', 'root-empty': 'Data was expected to be returned by the server in the "root" property of the response. Please review your JsonReader configuration to ensure the "root" property matches that returned in the server-response. See JsonReader docs.' } }); Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, { readRecords : function(o){ this.arrayData = o; var s = this.meta, sid = s ? Ext.num(s.idIndex, s.id) : null, recordType = this.recordType, fields = recordType.prototype.fields, records = [], success = true, v; var root = this.getRoot(o); for(var i = 0, len = root.length; i < len; i++) { var n = root[i], values = {}, id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null); for(var j = 0, jlen = fields.length; j < jlen; j++) { var f = fields.items[j], k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j; v = n[k] !== undefined ? n[k] : f.defaultValue; v = f.convert(v, n); values[f.name] = v; } var record = new recordType(values, id); record.json = n; records[records.length] = record; } var totalRecords = records.length; if(s.totalProperty) { v = parseInt(this.getTotal(o), 10); if(!isNaN(v)) { totalRecords = v; } } if(s.successProperty){ v = this.getSuccess(o); if(v === false || v === 'false'){ success = false; } } return { success : success, records : records, totalRecords : totalRecords }; } }); Ext.data.ArrayStore = Ext.extend(Ext.data.Store, { constructor: function(config){ Ext.data.ArrayStore.superclass.constructor.call(this, Ext.apply(config, { reader: new Ext.data.ArrayReader(config) })); }, loadData : function(data, append){ if(this.expandData === true){ var r = []; for(var i = 0, len = data.length; i < len; i++){ r[r.length] = [data[i]]; } data = r; } Ext.data.ArrayStore.superclass.loadData.call(this, data, append); } }); Ext.reg('arraystore', Ext.data.ArrayStore); Ext.data.SimpleStore = Ext.data.ArrayStore; Ext.reg('simplestore', Ext.data.SimpleStore); Ext.data.JsonStore = Ext.extend(Ext.data.Store, { constructor: function(config){ Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(config, { reader: new Ext.data.JsonReader(config) })); } }); Ext.reg('jsonstore', Ext.data.JsonStore); Ext.data.XmlWriter = function(params) { Ext.data.XmlWriter.superclass.constructor.apply(this, arguments); this.tpl = (typeof(this.tpl) === 'string') ? new Ext.XTemplate(this.tpl).compile() : this.tpl.compile(); }; Ext.extend(Ext.data.XmlWriter, Ext.data.DataWriter, { documentRoot: 'xrequest', forceDocumentRoot: false, root: 'records', xmlVersion : '1.0', xmlEncoding: 'ISO-8859-15', tpl: '<\u003fxml version="{version}" encoding="{encoding}"\u003f><{documentRoot}><{name}>{value}<{root}><{parent.record}><{name}>{value}', render : function(params, baseParams, data) { baseParams = this.toArray(baseParams); params.xmlData = this.tpl.applyTemplate({ version: this.xmlVersion, encoding: this.xmlEncoding, documentRoot: (baseParams.length > 0 || this.forceDocumentRoot === true) ? this.documentRoot : false, record: this.meta.record, root: this.root, baseParams: baseParams, records: (Ext.isArray(data[0])) ? data : [data] }); }, createRecord : function(rec) { return this.toArray(this.toHash(rec)); }, updateRecord : function(rec) { return this.toArray(this.toHash(rec)); }, destroyRecord : function(rec) { var data = {}; data[this.meta.idProperty] = rec.id; return this.toArray(data); } }); Ext.data.XmlReader = function(meta, recordType){ meta = meta || {}; Ext.applyIf(meta, { idProperty: meta.idProperty || meta.idPath || meta.id, successProperty: meta.successProperty || meta.success }); Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields); }; Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, { read : function(response){ var doc = response.responseXML; if(!doc) { throw {message: "XmlReader.read: XML Document not available"}; } return this.readRecords(doc); }, readRecords : function(doc){ this.xmlData = doc; var root = doc.documentElement || doc, q = Ext.DomQuery, totalRecords = 0, success = true; if(this.meta.totalProperty){ totalRecords = this.getTotal(root, 0); } if(this.meta.successProperty){ success = this.getSuccess(root); } var records = this.extractData(q.select(this.meta.record, root), true); return { success : success, records : records, totalRecords : totalRecords || records.length }; }, readResponse : function(action, response) { var q = Ext.DomQuery, doc = response.responseXML, root = doc.documentElement || doc; var res = new Ext.data.Response({ action: action, success : this.getSuccess(root), message: this.getMessage(root), data: this.extractData(q.select(this.meta.record, root) || q.select(this.meta.root, root), false), raw: doc }); if (Ext.isEmpty(res.success)) { throw new Ext.data.DataReader.Error('successProperty-response', this.meta.successProperty); } if (action === Ext.data.Api.actions.create) { var def = Ext.isDefined(res.data); if (def && Ext.isEmpty(res.data)) { throw new Ext.data.JsonReader.Error('root-empty', this.meta.root); } else if (!def) { throw new Ext.data.JsonReader.Error('root-undefined-response', this.meta.root); } } return res; }, getSuccess : function() { return true; }, buildExtractors : function() { if(this.ef){ return; } var s = this.meta, Record = this.recordType, f = Record.prototype.fields, fi = f.items, fl = f.length; if(s.totalProperty) { this.getTotal = this.createAccessor(s.totalProperty); } if(s.successProperty) { this.getSuccess = this.createAccessor(s.successProperty); } if (s.messageProperty) { this.getMessage = this.createAccessor(s.messageProperty); } this.getRoot = function(res) { return (!Ext.isEmpty(res[this.meta.record])) ? res[this.meta.record] : res[this.meta.root]; }; if (s.idPath || s.idProperty) { var g = this.createAccessor(s.idPath || s.idProperty); this.getId = function(rec) { var id = g(rec) || rec.id; return (id === undefined || id === '') ? null : id; }; } else { this.getId = function(){return null;}; } var ef = []; for(var i = 0; i < fl; i++){ f = fi[i]; var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name; ef.push(this.createAccessor(map)); } this.ef = ef; }, createAccessor : function(){ var q = Ext.DomQuery; return function(key) { if (Ext.isFunction(key)) { return key; } switch(key) { case this.meta.totalProperty: return function(root, def){ return q.selectNumber(key, root, def); }; break; case this.meta.successProperty: return function(root, def) { var sv = q.selectValue(key, root, true); var success = sv !== false && sv !== 'false'; return success; }; break; default: return function(root, def) { return q.selectValue(key, root, def); }; break; } }; }(), extractValues : function(data, items, len) { var f, values = {}; for(var j = 0; j < len; j++){ f = items[j]; var v = this.ef[j](data); values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, data); } return values; } }); Ext.data.XmlStore = Ext.extend(Ext.data.Store, { constructor: function(config){ Ext.data.XmlStore.superclass.constructor.call(this, Ext.apply(config, { reader: new Ext.data.XmlReader(config) })); } }); Ext.reg('xmlstore', Ext.data.XmlStore); Ext.data.GroupingStore = Ext.extend(Ext.data.Store, { constructor: function(config) { config = config || {}; this.hasMultiSort = true; this.multiSortInfo = this.multiSortInfo || {sorters: []}; var sorters = this.multiSortInfo.sorters, groupField = config.groupField || this.groupField, sortInfo = config.sortInfo || this.sortInfo, groupDir = config.groupDir || this.groupDir; if(groupField){ sorters.push({ field : groupField, direction: groupDir }); } if (sortInfo) { sorters.push(sortInfo); } Ext.data.GroupingStore.superclass.constructor.call(this, config); this.addEvents( 'groupchange' ); this.applyGroupField(); }, remoteGroup : false, groupOnSort:false, groupDir : 'ASC', clearGrouping : function(){ this.groupField = false; if(this.remoteGroup){ if(this.baseParams){ delete this.baseParams.groupBy; delete this.baseParams.groupDir; } var lo = this.lastOptions; if(lo && lo.params){ delete lo.params.groupBy; delete lo.params.groupDir; } this.reload(); }else{ this.sort(); this.fireEvent('datachanged', this); } }, groupBy : function(field, forceRegroup, direction) { direction = direction ? (String(direction).toUpperCase() == 'DESC' ? 'DESC' : 'ASC') : this.groupDir; if (this.groupField == field && this.groupDir == direction && !forceRegroup) { return; } var sorters = this.multiSortInfo.sorters; if (sorters.length > 0 && sorters[0].field == this.groupField) { sorters.shift(); } this.groupField = field; this.groupDir = direction; this.applyGroupField(); var fireGroupEvent = function() { this.fireEvent('groupchange', this, this.getGroupState()); }; if (this.groupOnSort) { this.sort(field, direction); fireGroupEvent.call(this); return; } if (this.remoteGroup) { this.on('load', fireGroupEvent, this, {single: true}); this.reload(); } else { this.sort(sorters); fireGroupEvent.call(this); } }, sort : function(fieldName, dir) { if (this.remoteSort) { return Ext.data.GroupingStore.superclass.sort.call(this, fieldName, dir); } var sorters = []; if (Ext.isArray(arguments[0])) { sorters = arguments[0]; } else if (fieldName == undefined) { sorters = this.sortInfo ? [this.sortInfo] : []; } else { var field = this.fields.get(fieldName); if (!field) return false; var name = field.name, sortInfo = this.sortInfo || null, sortToggle = this.sortToggle ? this.sortToggle[name] : null; if (!dir) { if (sortInfo && sortInfo.field == name) { dir = (this.sortToggle[name] || 'ASC').toggle('ASC', 'DESC'); } else { dir = field.sortDir; } } this.sortToggle[name] = dir; this.sortInfo = {field: name, direction: dir}; sorters = [this.sortInfo]; } if (this.groupField) { sorters.unshift({direction: this.groupDir, field: this.groupField}); } return this.multiSort.call(this, sorters, dir); }, applyGroupField: function(){ if (this.remoteGroup) { if(!this.baseParams){ this.baseParams = {}; } Ext.apply(this.baseParams, { groupBy : this.groupField, groupDir: this.groupDir }); var lo = this.lastOptions; if (lo && lo.params) { lo.params.groupDir = this.groupDir; delete lo.params.groupBy; } } }, applyGrouping : function(alwaysFireChange){ if(this.groupField !== false){ this.groupBy(this.groupField, true, this.groupDir); return true; }else{ if(alwaysFireChange === true){ this.fireEvent('datachanged', this); } return false; } }, getGroupState : function(){ return this.groupOnSort && this.groupField !== false ? (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField; } }); Ext.reg('groupingstore', Ext.data.GroupingStore); Ext.data.DirectProxy = function(config){ Ext.apply(this, config); if(typeof this.paramOrder == 'string'){ this.paramOrder = this.paramOrder.split(/[\s,|]/); } Ext.data.DirectProxy.superclass.constructor.call(this, config); }; Ext.extend(Ext.data.DirectProxy, Ext.data.DataProxy, { paramOrder: undefined, paramsAsHash: true, directFn : undefined, doRequest : function(action, rs, params, reader, callback, scope, options) { var args = [], directFn = this.api[action] || this.directFn; switch (action) { case Ext.data.Api.actions.create: args.push(params.jsonData); break; case Ext.data.Api.actions.read: if(directFn.directCfg.method.len > 0){ if(this.paramOrder){ for(var i = 0, len = this.paramOrder.length; i < len; i++){ args.push(params[this.paramOrder[i]]); } }else if(this.paramsAsHash){ args.push(params); } } break; case Ext.data.Api.actions.update: args.push(params.jsonData); break; case Ext.data.Api.actions.destroy: args.push(params.jsonData); break; } var trans = { params : params || {}, request: { callback : callback, scope : scope, arg : options }, reader: reader }; args.push(this.createCallback(action, rs, trans), this); directFn.apply(window, args); }, createCallback : function(action, rs, trans) { var me = this; return function(result, res) { if (!res.status) { if (action === Ext.data.Api.actions.read) { me.fireEvent("loadexception", me, trans, res, null); } me.fireEvent('exception', me, 'remote', action, trans, res, null); trans.request.callback.call(trans.request.scope, null, trans.request.arg, false); return; } if (action === Ext.data.Api.actions.read) { me.onRead(action, trans, result, res); } else { me.onWrite(action, trans, result, res, rs); } }; }, onRead : function(action, trans, result, res) { var records; try { records = trans.reader.readRecords(result); } catch (ex) { this.fireEvent("loadexception", this, trans, res, ex); this.fireEvent('exception', this, 'response', action, trans, res, ex); trans.request.callback.call(trans.request.scope, null, trans.request.arg, false); return; } this.fireEvent("load", this, res, trans.request.arg); trans.request.callback.call(trans.request.scope, records, trans.request.arg, true); }, onWrite : function(action, trans, result, res, rs) { var data = trans.reader.extractData(trans.reader.getRoot(result), false); var success = trans.reader.getSuccess(result); success = (success !== false); if (success){ this.fireEvent("write", this, action, data, res, rs, trans.request.arg); }else{ this.fireEvent('exception', this, 'remote', action, trans, result, rs); } trans.request.callback.call(trans.request.scope, data, res, success); } }); Ext.data.DirectStore = Ext.extend(Ext.data.Store, { constructor : function(config){ var c = Ext.apply({}, { batchTransactions: false }, config); Ext.data.DirectStore.superclass.constructor.call(this, Ext.apply(c, { proxy: Ext.isDefined(c.proxy) ? c.proxy : new Ext.data.DirectProxy(Ext.copyTo({}, c, 'paramOrder,paramsAsHash,directFn,api')), reader: (!Ext.isDefined(c.reader) && c.fields) ? new Ext.data.JsonReader(Ext.copyTo({}, c, 'totalProperty,root,idProperty'), c.fields) : c.reader })); } }); Ext.reg('directstore', Ext.data.DirectStore); Ext.Direct = Ext.extend(Ext.util.Observable, { exceptions: { TRANSPORT: 'xhr', PARSE: 'parse', LOGIN: 'login', SERVER: 'exception' }, constructor: function(){ this.addEvents( 'event', 'exception' ); this.transactions = {}; this.providers = {}; }, addProvider : function(provider){ var a = arguments; if(a.length > 1){ for(var i = 0, len = a.length; i < len; i++){ this.addProvider(a[i]); } return; } if(!provider.events){ provider = new Ext.Direct.PROVIDERS[provider.type](provider); } provider.id = provider.id || Ext.id(); this.providers[provider.id] = provider; provider.on('data', this.onProviderData, this); provider.on('exception', this.onProviderException, this); if(!provider.isConnected()){ provider.connect(); } return provider; }, getProvider : function(id){ return this.providers[id]; }, removeProvider : function(id){ var provider = id.id ? id : this.providers[id]; provider.un('data', this.onProviderData, this); provider.un('exception', this.onProviderException, this); delete this.providers[provider.id]; return provider; }, addTransaction: function(t){ this.transactions[t.tid] = t; return t; }, removeTransaction: function(t){ delete this.transactions[t.tid || t]; return t; }, getTransaction: function(tid){ return this.transactions[tid.tid || tid]; }, onProviderData : function(provider, e){ if(Ext.isArray(e)){ for(var i = 0, len = e.length; i < len; i++){ this.onProviderData(provider, e[i]); } return; } if(e.name && e.name != 'event' && e.name != 'exception'){ this.fireEvent(e.name, e); }else if(e.type == 'exception'){ this.fireEvent('exception', e); } this.fireEvent('event', e, provider); }, createEvent : function(response, extraProps){ return new Ext.Direct.eventTypes[response.type](Ext.apply(response, extraProps)); } }); Ext.Direct = new Ext.Direct(); Ext.Direct.TID = 1; Ext.Direct.PROVIDERS = {}; Ext.Direct.Transaction = function(config){ Ext.apply(this, config); this.tid = ++Ext.Direct.TID; this.retryCount = 0; }; Ext.Direct.Transaction.prototype = { send: function(){ this.provider.queueTransaction(this); }, retry: function(){ this.retryCount++; this.send(); }, getProvider: function(){ return this.provider; } };Ext.Direct.Event = function(config){ Ext.apply(this, config); }; Ext.Direct.Event.prototype = { status: true, getData: function(){ return this.data; } }; Ext.Direct.RemotingEvent = Ext.extend(Ext.Direct.Event, { type: 'rpc', getTransaction: function(){ return this.transaction || Ext.Direct.getTransaction(this.tid); } }); Ext.Direct.ExceptionEvent = Ext.extend(Ext.Direct.RemotingEvent, { status: false, type: 'exception' }); Ext.Direct.eventTypes = { 'rpc': Ext.Direct.RemotingEvent, 'event': Ext.Direct.Event, 'exception': Ext.Direct.ExceptionEvent }; Ext.direct.Provider = Ext.extend(Ext.util.Observable, { priority: 1, constructor : function(config){ Ext.apply(this, config); this.addEvents( 'connect', 'disconnect', 'data', 'exception' ); Ext.direct.Provider.superclass.constructor.call(this, config); }, isConnected: function(){ return false; }, connect: Ext.emptyFn, disconnect: Ext.emptyFn }); Ext.direct.JsonProvider = Ext.extend(Ext.direct.Provider, { parseResponse: function(xhr){ if(!Ext.isEmpty(xhr.responseText)){ if(typeof xhr.responseText == 'object'){ return xhr.responseText; } return Ext.decode(xhr.responseText); } return null; }, getEvents: function(xhr){ var data = null; try{ data = this.parseResponse(xhr); }catch(e){ var event = new Ext.Direct.ExceptionEvent({ data: e, xhr: xhr, code: Ext.Direct.exceptions.PARSE, message: 'Error parsing json response: \n\n ' + data }); return [event]; } var events = []; if(Ext.isArray(data)){ for(var i = 0, len = data.length; i < len; i++){ events.push(Ext.Direct.createEvent(data[i])); } }else{ events.push(Ext.Direct.createEvent(data)); } return events; } }); Ext.direct.PollingProvider = Ext.extend(Ext.direct.JsonProvider, { priority: 3, interval: 3000, constructor : function(config){ Ext.direct.PollingProvider.superclass.constructor.call(this, config); this.addEvents( 'beforepoll', 'poll' ); }, isConnected: function(){ return !!this.pollTask; }, connect: function(){ if(this.url && !this.pollTask){ this.pollTask = Ext.TaskMgr.start({ run: function(){ if(this.fireEvent('beforepoll', this) !== false){ if(typeof this.url == 'function'){ this.url(this.baseParams); }else{ Ext.Ajax.request({ url: this.url, callback: this.onData, scope: this, params: this.baseParams }); } } }, interval: this.interval, scope: this }); this.fireEvent('connect', this); }else if(!this.url){ throw 'Error initializing PollingProvider, no url configured.'; } }, disconnect: function(){ if(this.pollTask){ Ext.TaskMgr.stop(this.pollTask); delete this.pollTask; this.fireEvent('disconnect', this); } }, onData: function(opt, success, xhr){ if(success){ var events = this.getEvents(xhr); for(var i = 0, len = events.length; i < len; i++){ var e = events[i]; this.fireEvent('data', this, e); } }else{ var e = new Ext.Direct.ExceptionEvent({ data: e, code: Ext.Direct.exceptions.TRANSPORT, message: 'Unable to connect to the server.', xhr: xhr }); this.fireEvent('data', this, e); } } }); Ext.Direct.PROVIDERS['polling'] = Ext.direct.PollingProvider; Ext.direct.RemotingProvider = Ext.extend(Ext.direct.JsonProvider, { enableBuffer: 10, maxRetries: 1, timeout: undefined, constructor : function(config){ Ext.direct.RemotingProvider.superclass.constructor.call(this, config); this.addEvents( 'beforecall', 'call' ); this.namespace = (Ext.isString(this.namespace)) ? Ext.ns(this.namespace) : this.namespace || window; this.transactions = {}; this.callBuffer = []; }, initAPI : function(){ var o = this.actions; for(var c in o){ var cls = this.namespace[c] || (this.namespace[c] = {}), ms = o[c]; for(var i = 0, len = ms.length; i < len; i++){ var m = ms[i]; cls[m.name] = this.createMethod(c, m); } } }, isConnected: function(){ return !!this.connected; }, connect: function(){ if(this.url){ this.initAPI(); this.connected = true; this.fireEvent('connect', this); }else if(!this.url){ throw 'Error initializing RemotingProvider, no url configured.'; } }, disconnect: function(){ if(this.connected){ this.connected = false; this.fireEvent('disconnect', this); } }, onData: function(opt, success, xhr){ if(success){ var events = this.getEvents(xhr); for(var i = 0, len = events.length; i < len; i++){ var e = events[i], t = this.getTransaction(e); this.fireEvent('data', this, e); if(t){ this.doCallback(t, e, true); Ext.Direct.removeTransaction(t); } } }else{ var ts = [].concat(opt.ts); for(var i = 0, len = ts.length; i < len; i++){ var t = this.getTransaction(ts[i]); if(t && t.retryCount < this.maxRetries){ t.retry(); }else{ var e = new Ext.Direct.ExceptionEvent({ data: e, transaction: t, code: Ext.Direct.exceptions.TRANSPORT, message: 'Unable to connect to the server.', xhr: xhr }); this.fireEvent('data', this, e); if(t){ this.doCallback(t, e, false); Ext.Direct.removeTransaction(t); } } } } }, getCallData: function(t){ return { action: t.action, method: t.method, data: t.data, type: 'rpc', tid: t.tid }; }, doSend : function(data){ var o = { url: this.url, callback: this.onData, scope: this, ts: data, timeout: this.timeout }, callData; if(Ext.isArray(data)){ callData = []; for(var i = 0, len = data.length; i < len; i++){ callData.push(this.getCallData(data[i])); } }else{ callData = this.getCallData(data); } if(this.enableUrlEncode){ var params = {}; params[Ext.isString(this.enableUrlEncode) ? this.enableUrlEncode : 'data'] = Ext.encode(callData); o.params = params; }else{ o.jsonData = callData; } Ext.Ajax.request(o); }, combineAndSend : function(){ var len = this.callBuffer.length; if(len > 0){ this.doSend(len == 1 ? this.callBuffer[0] : this.callBuffer); this.callBuffer = []; } }, queueTransaction: function(t){ if(t.form){ this.processForm(t); return; } this.callBuffer.push(t); if(this.enableBuffer){ if(!this.callTask){ this.callTask = new Ext.util.DelayedTask(this.combineAndSend, this); } this.callTask.delay(Ext.isNumber(this.enableBuffer) ? this.enableBuffer : 10); }else{ this.combineAndSend(); } }, doCall : function(c, m, args){ var data = null, hs = args[m.len], scope = args[m.len+1]; if(m.len !== 0){ data = args.slice(0, m.len); } var t = new Ext.Direct.Transaction({ provider: this, args: args, action: c, method: m.name, data: data, cb: scope && Ext.isFunction(hs) ? hs.createDelegate(scope) : hs }); if(this.fireEvent('beforecall', this, t, m) !== false){ Ext.Direct.addTransaction(t); this.queueTransaction(t); this.fireEvent('call', this, t, m); } }, doForm : function(c, m, form, callback, scope){ var t = new Ext.Direct.Transaction({ provider: this, action: c, method: m.name, args:[form, callback, scope], cb: scope && Ext.isFunction(callback) ? callback.createDelegate(scope) : callback, isForm: true }); if(this.fireEvent('beforecall', this, t, m) !== false){ Ext.Direct.addTransaction(t); var isUpload = String(form.getAttribute("enctype")).toLowerCase() == 'multipart/form-data', params = { extTID: t.tid, extAction: c, extMethod: m.name, extType: 'rpc', extUpload: String(isUpload) }; Ext.apply(t, { form: Ext.getDom(form), isUpload: isUpload, params: callback && Ext.isObject(callback.params) ? Ext.apply(params, callback.params) : params }); this.fireEvent('call', this, t, m); this.processForm(t); } }, processForm: function(t){ Ext.Ajax.request({ url: this.url, params: t.params, callback: this.onData, scope: this, form: t.form, isUpload: t.isUpload, ts: t }); }, createMethod : function(c, m){ var f; if(!m.formHandler){ f = function(){ this.doCall(c, m, Array.prototype.slice.call(arguments, 0)); }.createDelegate(this); }else{ f = function(form, callback, scope){ this.doForm(c, m, form, callback, scope); }.createDelegate(this); } f.directCfg = { action: c, method: m }; return f; }, getTransaction: function(opt){ return opt && opt.tid ? Ext.Direct.getTransaction(opt.tid) : null; }, doCallback: function(t, e){ var fn = e.status ? 'success' : 'failure'; if(t && t.cb){ var hs = t.cb, result = Ext.isDefined(e.result) ? e.result : e.data; if(Ext.isFunction(hs)){ hs(result, e); } else{ Ext.callback(hs[fn], hs.scope, [result, e]); Ext.callback(hs.callback, hs.scope, [result, e]); } } } }); Ext.Direct.PROVIDERS['remoting'] = Ext.direct.RemotingProvider; Ext.Resizable = Ext.extend(Ext.util.Observable, { constructor: function(el, config){ this.el = Ext.get(el); if(config && config.wrap){ config.resizeChild = this.el; this.el = this.el.wrap(typeof config.wrap == 'object' ? config.wrap : {cls:'xresizable-wrap'}); this.el.id = this.el.dom.id = config.resizeChild.id + '-rzwrap'; this.el.setStyle('overflow', 'hidden'); this.el.setPositioning(config.resizeChild.getPositioning()); config.resizeChild.clearPositioning(); if(!config.width || !config.height){ var csize = config.resizeChild.getSize(); this.el.setSize(csize.width, csize.height); } if(config.pinned && !config.adjustments){ config.adjustments = 'auto'; } } this.proxy = this.el.createProxy({tag: 'div', cls: 'x-resizable-proxy', id: this.el.id + '-rzproxy'}, Ext.getBody()); this.proxy.unselectable(); this.proxy.enableDisplayMode('block'); Ext.apply(this, config); if(this.pinned){ this.disableTrackOver = true; this.el.addClass('x-resizable-pinned'); } var position = this.el.getStyle('position'); if(position != 'absolute' && position != 'fixed'){ this.el.setStyle('position', 'relative'); } if(!this.handles){ this.handles = 's,e,se'; if(this.multiDirectional){ this.handles += ',n,w'; } } if(this.handles == 'all'){ this.handles = 'n s e w ne nw se sw'; } var hs = this.handles.split(/\s*?[,;]\s*?| /); var ps = Ext.Resizable.positions; for(var i = 0, len = hs.length; i < len; i++){ if(hs[i] && ps[hs[i]]){ var pos = ps[hs[i]]; this[pos] = new Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent, this.handleCls); } } this.corner = this.southeast; if(this.handles.indexOf('n') != -1 || this.handles.indexOf('w') != -1){ this.updateBox = true; } this.activeHandle = null; if(this.resizeChild){ if(typeof this.resizeChild == 'boolean'){ this.resizeChild = Ext.get(this.el.dom.firstChild, true); }else{ this.resizeChild = Ext.get(this.resizeChild, true); } } if(this.adjustments == 'auto'){ var rc = this.resizeChild; var hw = this.west, he = this.east, hn = this.north, hs = this.south; if(rc && (hw || hn)){ rc.position('relative'); rc.setLeft(hw ? hw.el.getWidth() : 0); rc.setTop(hn ? hn.el.getHeight() : 0); } this.adjustments = [ (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0), (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1 ]; } if(this.draggable){ this.dd = this.dynamic ? this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id}); this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id); if(this.constrainTo){ this.dd.constrainTo(this.constrainTo); } } this.addEvents( 'beforeresize', 'resize' ); if(this.width !== null && this.height !== null){ this.resizeTo(this.width, this.height); }else{ this.updateChildSize(); } if(Ext.isIE){ this.el.dom.style.zoom = 1; } Ext.Resizable.superclass.constructor.call(this); }, adjustments : [0, 0], animate : false, disableTrackOver : false, draggable: false, duration : 0.35, dynamic : false, easing : 'easeOutStrong', enabled : true, handles : false, multiDirectional : false, height : null, width : null, heightIncrement : 0, widthIncrement : 0, minHeight : 5, minWidth : 5, maxHeight : 10000, maxWidth : 10000, minX: 0, minY: 0, pinned : false, preserveRatio : false, resizeChild : false, transparent: false, resizeTo : function(width, height){ this.el.setSize(width, height); this.updateChildSize(); this.fireEvent('resize', this, width, height, null); }, startSizing : function(e, handle){ this.fireEvent('beforeresize', this, e); if(this.enabled){ if(!this.overlay){ this.overlay = this.el.createProxy({tag: 'div', cls: 'x-resizable-overlay', html: ' '}, Ext.getBody()); this.overlay.unselectable(); this.overlay.enableDisplayMode('block'); this.overlay.on({ scope: this, mousemove: this.onMouseMove, mouseup: this.onMouseUp }); } this.overlay.setStyle('cursor', handle.el.getStyle('cursor')); this.resizing = true; this.startBox = this.el.getBox(); this.startPoint = e.getXY(); this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0], (this.startBox.y + this.startBox.height) - this.startPoint[1]]; this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); this.overlay.show(); if(this.constrainTo) { var ct = Ext.get(this.constrainTo); this.resizeRegion = ct.getRegion().adjust( ct.getFrameWidth('t'), ct.getFrameWidth('l'), -ct.getFrameWidth('b'), -ct.getFrameWidth('r') ); } this.proxy.setStyle('visibility', 'hidden'); this.proxy.show(); this.proxy.setBox(this.startBox); if(!this.dynamic){ this.proxy.setStyle('visibility', 'visible'); } } }, onMouseDown : function(handle, e){ if(this.enabled){ e.stopEvent(); this.activeHandle = handle; this.startSizing(e, handle); } }, onMouseUp : function(e){ this.activeHandle = null; var size = this.resizeElement(); this.resizing = false; this.handleOut(); this.overlay.hide(); this.proxy.hide(); this.fireEvent('resize', this, size.width, size.height, e); }, updateChildSize : function(){ if(this.resizeChild){ var el = this.el; var child = this.resizeChild; var adj = this.adjustments; if(el.dom.offsetWidth){ var b = el.getSize(true); child.setSize(b.width+adj[0], b.height+adj[1]); } if(Ext.isIE){ setTimeout(function(){ if(el.dom.offsetWidth){ var b = el.getSize(true); child.setSize(b.width+adj[0], b.height+adj[1]); } }, 10); } } }, snap : function(value, inc, min){ if(!inc || !value){ return value; } var newValue = value; var m = value % inc; if(m > 0){ if(m > (inc/2)){ newValue = value + (inc-m); }else{ newValue = value - m; } } return Math.max(min, newValue); }, resizeElement : function(){ var box = this.proxy.getBox(); if(this.updateBox){ this.el.setBox(box, false, this.animate, this.duration, null, this.easing); }else{ this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing); } this.updateChildSize(); if(!this.dynamic){ this.proxy.hide(); } if(this.draggable && this.constrainTo){ this.dd.resetConstraints(); this.dd.constrainTo(this.constrainTo); } return box; }, constrain : function(v, diff, m, mx){ if(v - diff < m){ diff = v - m; }else if(v - diff > mx){ diff = v - mx; } return diff; }, onMouseMove : function(e){ if(this.enabled && this.activeHandle){ try{ if(this.resizeRegion && !this.resizeRegion.contains(e.getPoint())) { return; } var curSize = this.curSize || this.startBox, x = this.startBox.x, y = this.startBox.y, ox = x, oy = y, w = curSize.width, h = curSize.height, ow = w, oh = h, mw = this.minWidth, mh = this.minHeight, mxw = this.maxWidth, mxh = this.maxHeight, wi = this.widthIncrement, hi = this.heightIncrement, eventXY = e.getXY(), diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0])), diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1])), pos = this.activeHandle.position, tw, th; switch(pos){ case 'east': w += diffX; w = Math.min(Math.max(mw, w), mxw); break; case 'south': h += diffY; h = Math.min(Math.max(mh, h), mxh); break; case 'southeast': w += diffX; h += diffY; w = Math.min(Math.max(mw, w), mxw); h = Math.min(Math.max(mh, h), mxh); break; case 'north': diffY = this.constrain(h, diffY, mh, mxh); y += diffY; h -= diffY; break; case 'west': diffX = this.constrain(w, diffX, mw, mxw); x += diffX; w -= diffX; break; case 'northeast': w += diffX; w = Math.min(Math.max(mw, w), mxw); diffY = this.constrain(h, diffY, mh, mxh); y += diffY; h -= diffY; break; case 'northwest': diffX = this.constrain(w, diffX, mw, mxw); diffY = this.constrain(h, diffY, mh, mxh); y += diffY; h -= diffY; x += diffX; w -= diffX; break; case 'southwest': diffX = this.constrain(w, diffX, mw, mxw); h += diffY; h = Math.min(Math.max(mh, h), mxh); x += diffX; w -= diffX; break; } var sw = this.snap(w, wi, mw); var sh = this.snap(h, hi, mh); if(sw != w || sh != h){ switch(pos){ case 'northeast': y -= sh - h; break; case 'north': y -= sh - h; break; case 'southwest': x -= sw - w; break; case 'west': x -= sw - w; break; case 'northwest': x -= sw - w; y -= sh - h; break; } w = sw; h = sh; } if(this.preserveRatio){ switch(pos){ case 'southeast': case 'east': h = oh * (w/ow); h = Math.min(Math.max(mh, h), mxh); w = ow * (h/oh); break; case 'south': w = ow * (h/oh); w = Math.min(Math.max(mw, w), mxw); h = oh * (w/ow); break; case 'northeast': w = ow * (h/oh); w = Math.min(Math.max(mw, w), mxw); h = oh * (w/ow); break; case 'north': tw = w; w = ow * (h/oh); w = Math.min(Math.max(mw, w), mxw); h = oh * (w/ow); x += (tw - w) / 2; break; case 'southwest': h = oh * (w/ow); h = Math.min(Math.max(mh, h), mxh); tw = w; w = ow * (h/oh); x += tw - w; break; case 'west': th = h; h = oh * (w/ow); h = Math.min(Math.max(mh, h), mxh); y += (th - h) / 2; tw = w; w = ow * (h/oh); x += tw - w; break; case 'northwest': tw = w; th = h; h = oh * (w/ow); h = Math.min(Math.max(mh, h), mxh); w = ow * (h/oh); y += th - h; x += tw - w; break; } } this.proxy.setBounds(x, y, w, h); if(this.dynamic){ this.resizeElement(); } }catch(ex){} } }, handleOver : function(){ if(this.enabled){ this.el.addClass('x-resizable-over'); } }, handleOut : function(){ if(!this.resizing){ this.el.removeClass('x-resizable-over'); } }, getEl : function(){ return this.el; }, getResizeChild : function(){ return this.resizeChild; }, destroy : function(removeEl){ Ext.destroy(this.dd, this.overlay, this.proxy); this.overlay = null; this.proxy = null; var ps = Ext.Resizable.positions; for(var k in ps){ if(typeof ps[k] != 'function' && this[ps[k]]){ this[ps[k]].destroy(); } } if(removeEl){ this.el.update(''); Ext.destroy(this.el); this.el = null; } this.purgeListeners(); }, syncHandleHeight : function(){ var h = this.el.getHeight(true); if(this.west){ this.west.el.setHeight(h); } if(this.east){ this.east.el.setHeight(h); } } }); Ext.Resizable.positions = { n: 'north', s: 'south', e: 'east', w: 'west', se: 'southeast', sw: 'southwest', nw: 'northwest', ne: 'northeast' }; Ext.Resizable.Handle = Ext.extend(Object, { constructor : function(rz, pos, disableTrackOver, transparent, cls){ if(!this.tpl){ var tpl = Ext.DomHelper.createTemplate( {tag: 'div', cls: 'x-resizable-handle x-resizable-handle-{0}'} ); tpl.compile(); Ext.Resizable.Handle.prototype.tpl = tpl; } this.position = pos; this.rz = rz; this.el = this.tpl.append(rz.el.dom, [this.position], true); this.el.unselectable(); if(transparent){ this.el.setOpacity(0); } if(!Ext.isEmpty(cls)){ this.el.addClass(cls); } this.el.on('mousedown', this.onMouseDown, this); if(!disableTrackOver){ this.el.on({ scope: this, mouseover: this.onMouseOver, mouseout: this.onMouseOut }); } }, afterResize : function(rz){ }, onMouseDown : function(e){ this.rz.onMouseDown(this, e); }, onMouseOver : function(e){ this.rz.handleOver(this, e); }, onMouseOut : function(e){ this.rz.handleOut(this, e); }, destroy : function(){ Ext.destroy(this.el); this.el = null; } }); Ext.Window = Ext.extend(Ext.Panel, { baseCls : 'x-window', resizable : true, draggable : true, closable : true, closeAction : 'close', constrain : false, constrainHeader : false, plain : false, minimizable : false, maximizable : false, minHeight : 100, minWidth : 200, expandOnShow : true, showAnimDuration: 0.25, hideAnimDuration: 0.25, collapsible : false, initHidden : undefined, hidden : true, elements : 'header,body', frame : true, floating : true, initComponent : function(){ this.initTools(); Ext.Window.superclass.initComponent.call(this); this.addEvents( 'resize', 'maximize', 'minimize', 'restore' ); if(Ext.isDefined(this.initHidden)){ this.hidden = this.initHidden; } if(this.hidden === false){ this.hidden = true; this.show(); } }, getState : function(){ return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox(true)); }, onRender : function(ct, position){ Ext.Window.superclass.onRender.call(this, ct, position); if(this.plain){ this.el.addClass('x-window-plain'); } this.focusEl = this.el.createChild({ tag: 'a', href:'#', cls:'x-dlg-focus', tabIndex:'-1', html: ' '}); this.focusEl.swallowEvent('click', true); this.proxy = this.el.createProxy('x-window-proxy'); this.proxy.enableDisplayMode('block'); if(this.modal){ this.mask = this.container.createChild({cls:'ext-el-mask'}, this.el.dom); this.mask.enableDisplayMode('block'); this.mask.hide(); this.mon(this.mask, 'click', this.focus, this); } if(this.maximizable){ this.mon(this.header, 'dblclick', this.toggleMaximize, this); } }, initEvents : function(){ Ext.Window.superclass.initEvents.call(this); if(this.animateTarget){ this.setAnimateTarget(this.animateTarget); } if(this.resizable){ this.resizer = new Ext.Resizable(this.el, { minWidth: this.minWidth, minHeight:this.minHeight, handles: this.resizeHandles || 'all', pinned: true, resizeElement : this.resizerAction, handleCls: 'x-window-handle' }); this.resizer.window = this; this.mon(this.resizer, 'beforeresize', this.beforeResize, this); } if(this.draggable){ this.header.addClass('x-window-draggable'); } this.mon(this.el, 'mousedown', this.toFront, this); this.manager = this.manager || Ext.WindowMgr; this.manager.register(this); if(this.maximized){ this.maximized = false; this.maximize(); } if(this.closable){ var km = this.getKeyMap(); km.on(27, this.onEsc, this); km.disable(); } }, initDraggable : function(){ this.dd = new Ext.Window.DD(this); }, onEsc : function(k, e){ if (this.activeGhost) { this.unghost(); } e.stopEvent(); this[this.closeAction](); }, beforeDestroy : function(){ if(this.rendered){ this.hide(); this.clearAnchor(); Ext.destroy( this.focusEl, this.resizer, this.dd, this.proxy, this.mask ); } Ext.Window.superclass.beforeDestroy.call(this); }, onDestroy : function(){ if(this.manager){ this.manager.unregister(this); } Ext.Window.superclass.onDestroy.call(this); }, initTools : function(){ if(this.minimizable){ this.addTool({ id: 'minimize', handler: this.minimize.createDelegate(this, []) }); } if(this.maximizable){ this.addTool({ id: 'maximize', handler: this.maximize.createDelegate(this, []) }); this.addTool({ id: 'restore', handler: this.restore.createDelegate(this, []), hidden:true }); } if(this.closable){ this.addTool({ id: 'close', handler: this[this.closeAction].createDelegate(this, []) }); } }, resizerAction : function(){ var box = this.proxy.getBox(); this.proxy.hide(); this.window.handleResize(box); return box; }, beforeResize : function(){ this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40); this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40); this.resizeBox = this.el.getBox(); }, updateHandles : function(){ if(Ext.isIE && this.resizer){ this.resizer.syncHandleHeight(); this.el.repaint(); } }, handleResize : function(box){ var rz = this.resizeBox; if(rz.x != box.x || rz.y != box.y){ this.updateBox(box); }else{ this.setSize(box); if (Ext.isIE6 && Ext.isStrict) { this.doLayout(); } } this.focus(); this.updateHandles(); this.saveState(); }, focus : function(){ var f = this.focusEl, db = this.defaultButton, t = typeof db, el, ct; if(Ext.isDefined(db)){ if(Ext.isNumber(db) && this.fbar){ f = this.fbar.items.get(db); }else if(Ext.isString(db)){ f = Ext.getCmp(db); }else{ f = db; } el = f.getEl(); ct = Ext.getDom(this.container); if (el && ct) { if (ct != document.body && !Ext.lib.Region.getRegion(ct).contains(Ext.lib.Region.getRegion(el.dom))){ return; } } } f = f || this.focusEl; f.focus.defer(10, f); }, setAnimateTarget : function(el){ el = Ext.get(el); this.animateTarget = el; }, beforeShow : function(){ delete this.el.lastXY; delete this.el.lastLT; if(this.x === undefined || this.y === undefined){ var xy = this.el.getAlignToXY(this.container, 'c-c'); var pos = this.el.translatePoints(xy[0], xy[1]); this.x = this.x === undefined? pos.left : this.x; this.y = this.y === undefined? pos.top : this.y; } this.el.setLeftTop(this.x, this.y); if(this.expandOnShow){ this.expand(false); } if(this.modal){ Ext.getBody().addClass('x-body-masked'); this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); this.mask.show(); } }, show : function(animateTarget, cb, scope){ if(!this.rendered){ this.render(Ext.getBody()); } if(this.hidden === false){ this.toFront(); return this; } if(this.fireEvent('beforeshow', this) === false){ return this; } if(cb){ this.on('show', cb, scope, {single:true}); } this.hidden = false; if(Ext.isDefined(animateTarget)){ this.setAnimateTarget(animateTarget); } this.beforeShow(); if(this.animateTarget){ this.animShow(); }else{ this.afterShow(); } return this; }, afterShow : function(isAnim){ if (this.isDestroyed){ return false; } this.proxy.hide(); this.el.setStyle('display', 'block'); this.el.show(); if(this.maximized){ this.fitContainer(); } if(Ext.isMac && Ext.isGecko2){ this.cascade(this.setAutoScroll); } if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){ Ext.EventManager.onWindowResize(this.onWindowResize, this); } this.doConstrain(); this.doLayout(); if(this.keyMap){ this.keyMap.enable(); } this.toFront(); this.updateHandles(); if(isAnim && (Ext.isIE || Ext.isWebKit)){ var sz = this.getSize(); this.onResize(sz.width, sz.height); } this.onShow(); this.fireEvent('show', this); }, animShow : function(){ this.proxy.show(); this.proxy.setBox(this.animateTarget.getBox()); this.proxy.setOpacity(0); var b = this.getBox(); this.el.setStyle('display', 'none'); this.proxy.shift(Ext.apply(b, { callback: this.afterShow.createDelegate(this, [true], false), scope: this, easing: 'easeNone', duration: this.showAnimDuration, opacity: 0.5 })); }, hide : function(animateTarget, cb, scope){ if(this.hidden || this.fireEvent('beforehide', this) === false){ return this; } if(cb){ this.on('hide', cb, scope, {single:true}); } this.hidden = true; if(animateTarget !== undefined){ this.setAnimateTarget(animateTarget); } if(this.modal){ this.mask.hide(); Ext.getBody().removeClass('x-body-masked'); } if(this.animateTarget){ this.animHide(); }else{ this.el.hide(); this.afterHide(); } return this; }, afterHide : function(){ this.proxy.hide(); if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){ Ext.EventManager.removeResizeListener(this.onWindowResize, this); } if(this.keyMap){ this.keyMap.disable(); } this.onHide(); this.fireEvent('hide', this); }, animHide : function(){ this.proxy.setOpacity(0.5); this.proxy.show(); var tb = this.getBox(false); this.proxy.setBox(tb); this.el.hide(); this.proxy.shift(Ext.apply(this.animateTarget.getBox(), { callback: this.afterHide, scope: this, duration: this.hideAnimDuration, easing: 'easeNone', opacity: 0 })); }, onShow : Ext.emptyFn, onHide : Ext.emptyFn, onWindowResize : function(){ if(this.maximized){ this.fitContainer(); } if(this.modal){ this.mask.setSize('100%', '100%'); var force = this.mask.dom.offsetHeight; this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true)); } this.doConstrain(); }, doConstrain : function(){ if(this.constrain || this.constrainHeader){ var offsets; if(this.constrain){ offsets = { right:this.el.shadowOffset, left:this.el.shadowOffset, bottom:this.el.shadowOffset }; }else { var s = this.getSize(); offsets = { right:-(s.width - 100), bottom:-(s.height - 25 + this.el.getConstrainOffset()) }; } var xy = this.el.getConstrainToXY(this.container, true, offsets); if(xy){ this.setPosition(xy[0], xy[1]); } } }, ghost : function(cls){ var ghost = this.createGhost(cls); var box = this.getBox(true); ghost.setLeftTop(box.x, box.y); ghost.setWidth(box.width); this.el.hide(); this.activeGhost = ghost; return ghost; }, unghost : function(show, matchPosition){ if(!this.activeGhost) { return; } if(show !== false){ this.el.show(); this.focus.defer(10, this); if(Ext.isMac && Ext.isGecko2){ this.cascade(this.setAutoScroll); } } if(matchPosition !== false){ this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true)); } this.activeGhost.hide(); this.activeGhost.remove(); delete this.activeGhost; }, minimize : function(){ this.fireEvent('minimize', this); return this; }, close : function(){ if(this.fireEvent('beforeclose', this) !== false){ if(this.hidden){ this.doClose(); }else{ this.hide(null, this.doClose, this); } } }, doClose : function(){ this.fireEvent('close', this); this.destroy(); }, maximize : function(){ if(!this.maximized){ this.expand(false); this.restoreSize = this.getSize(); this.restorePos = this.getPosition(true); if (this.maximizable){ this.tools.maximize.hide(); this.tools.restore.show(); } this.maximized = true; this.el.disableShadow(); if(this.dd){ this.dd.lock(); } if(this.collapsible){ this.tools.toggle.hide(); } this.el.addClass('x-window-maximized'); this.container.addClass('x-window-maximized-ct'); this.setPosition(0, 0); this.fitContainer(); this.fireEvent('maximize', this); } return this; }, restore : function(){ if(this.maximized){ var t = this.tools; this.el.removeClass('x-window-maximized'); if(t.restore){ t.restore.hide(); } if(t.maximize){ t.maximize.show(); } this.setPosition(this.restorePos[0], this.restorePos[1]); this.setSize(this.restoreSize.width, this.restoreSize.height); delete this.restorePos; delete this.restoreSize; this.maximized = false; this.el.enableShadow(true); if(this.dd){ this.dd.unlock(); } if(this.collapsible && t.toggle){ t.toggle.show(); } this.container.removeClass('x-window-maximized-ct'); this.doConstrain(); this.fireEvent('restore', this); } return this; }, toggleMaximize : function(){ return this[this.maximized ? 'restore' : 'maximize'](); }, fitContainer : function(){ var vs = this.container.getViewSize(false); this.setSize(vs.width, vs.height); }, setZIndex : function(index){ if(this.modal){ this.mask.setStyle('z-index', index); } this.el.setZIndex(++index); index += 5; if(this.resizer){ this.resizer.proxy.setStyle('z-index', ++index); } this.lastZIndex = index; }, alignTo : function(element, position, offsets){ var xy = this.el.getAlignToXY(element, position, offsets); this.setPagePosition(xy[0], xy[1]); return this; }, anchorTo : function(el, alignment, offsets, monitorScroll){ this.clearAnchor(); this.anchorTarget = { el: el, alignment: alignment, offsets: offsets }; Ext.EventManager.onWindowResize(this.doAnchor, this); var tm = typeof monitorScroll; if(tm != 'undefined'){ Ext.EventManager.on(window, 'scroll', this.doAnchor, this, {buffer: tm == 'number' ? monitorScroll : 50}); } return this.doAnchor(); }, doAnchor : function(){ var o = this.anchorTarget; this.alignTo(o.el, o.alignment, o.offsets); return this; }, clearAnchor : function(){ if(this.anchorTarget){ Ext.EventManager.removeResizeListener(this.doAnchor, this); Ext.EventManager.un(window, 'scroll', this.doAnchor, this); delete this.anchorTarget; } return this; }, toFront : function(e){ if(this.manager.bringToFront(this)){ if(!e || !e.getTarget().focus){ this.focus(); } } return this; }, setActive : function(active){ if(active){ if(!this.maximized){ this.el.enableShadow(true); } this.fireEvent('activate', this); }else{ this.el.disableShadow(); this.fireEvent('deactivate', this); } }, toBack : function(){ this.manager.sendToBack(this); return this; }, center : function(){ var xy = this.el.getAlignToXY(this.container, 'c-c'); this.setPagePosition(xy[0], xy[1]); return this; } }); Ext.reg('window', Ext.Window); Ext.Window.DD = Ext.extend(Ext.dd.DD, { constructor : function(win){ this.win = win; Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id); this.setHandleElId(win.header.id); this.scroll = false; }, moveOnly:true, headerOffsets:[100, 25], startDrag : function(){ var w = this.win; this.proxy = w.ghost(w.initialConfig.cls); if(w.constrain !== false){ var so = w.el.shadowOffset; this.constrainTo(w.container, {right: so, left: so, bottom: so}); }else if(w.constrainHeader !== false){ var s = this.proxy.getSize(); this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])}); } }, b4Drag : Ext.emptyFn, onDrag : function(e){ this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY()); }, endDrag : function(e){ this.win.unghost(); this.win.saveState(); } }); Ext.WindowGroup = function(){ var list = {}; var accessList = []; var front = null; var sortWindows = function(d1, d2){ return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1; }; var orderWindows = function(){ var a = accessList, len = a.length; if(len > 0){ a.sort(sortWindows); var seed = a[0].manager.zseed; for(var i = 0; i < len; i++){ var win = a[i]; if(win && !win.hidden){ win.setZIndex(seed + (i*10)); } } } activateLast(); }; var setActiveWin = function(win){ if(win != front){ if(front){ front.setActive(false); } front = win; if(win){ win.setActive(true); } } }; var activateLast = function(){ for(var i = accessList.length-1; i >=0; --i) { if(!accessList[i].hidden){ setActiveWin(accessList[i]); return; } } setActiveWin(null); }; return { zseed : 9000, register : function(win){ if(win.manager){ win.manager.unregister(win); } win.manager = this; list[win.id] = win; accessList.push(win); win.on('hide', activateLast); }, unregister : function(win){ delete win.manager; delete list[win.id]; win.un('hide', activateLast); accessList.remove(win); }, get : function(id){ return typeof id == "object" ? id : list[id]; }, bringToFront : function(win){ win = this.get(win); if(win != front){ win._lastAccess = new Date().getTime(); orderWindows(); return true; } return false; }, sendToBack : function(win){ win = this.get(win); win._lastAccess = -(new Date().getTime()); orderWindows(); return win; }, hideAll : function(){ for(var id in list){ if(list[id] && typeof list[id] != "function" && list[id].isVisible()){ list[id].hide(); } } }, getActive : function(){ return front; }, getBy : function(fn, scope){ var r = []; for(var i = accessList.length-1; i >=0; --i) { var win = accessList[i]; if(fn.call(scope||win, win) !== false){ r.push(win); } } return r; }, each : function(fn, scope){ for(var id in list){ if(list[id] && typeof list[id] != "function"){ if(fn.call(scope || list[id], list[id]) === false){ return; } } } } }; }; Ext.WindowMgr = new Ext.WindowGroup(); Ext.MessageBox = function(){ var dlg, opt, mask, waitTimer, bodyEl, msgEl, textboxEl, textareaEl, progressBar, pp, iconEl, spacerEl, buttons, activeTextEl, bwidth, bufferIcon = '', iconCls = '', buttonNames = ['ok', 'yes', 'no', 'cancel']; var handleButton = function(button){ buttons[button].blur(); if(dlg.isVisible()){ dlg.hide(); handleHide(); Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value, opt], 1); } }; var handleHide = function(){ if(opt && opt.cls){ dlg.el.removeClass(opt.cls); } progressBar.reset(); }; var handleEsc = function(d, k, e){ if(opt && opt.closable !== false){ dlg.hide(); handleHide(); } if(e){ e.stopEvent(); } }; var updateButtons = function(b){ var width = 0, cfg; if(!b){ Ext.each(buttonNames, function(name){ buttons[name].hide(); }); return width; } dlg.footer.dom.style.display = ''; Ext.iterate(buttons, function(name, btn){ cfg = b[name]; if(cfg){ btn.show(); btn.setText(Ext.isString(cfg) ? cfg : Ext.MessageBox.buttonText[name]); width += btn.getEl().getWidth() + 15; }else{ btn.hide(); } }); return width; }; return { getDialog : function(titleText){ if(!dlg){ var btns = []; buttons = {}; Ext.each(buttonNames, function(name){ btns.push(buttons[name] = new Ext.Button({ text: this.buttonText[name], handler: handleButton.createCallback(name), hideMode: 'offsets' })); }, this); dlg = new Ext.Window({ autoCreate : true, title:titleText, resizable:false, constrain:true, constrainHeader:true, minimizable : false, maximizable : false, stateful: false, modal: true, shim:true, buttonAlign:"center", width:400, height:100, minHeight: 80, plain:true, footer:true, closable:true, close : function(){ if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){ handleButton("no"); }else{ handleButton("cancel"); } }, fbar: new Ext.Toolbar({ items: btns, enableOverflow: false }) }); dlg.render(document.body); dlg.getEl().addClass('x-window-dlg'); mask = dlg.mask; bodyEl = dlg.body.createChild({ html:'

    ' }); iconEl = Ext.get(bodyEl.dom.firstChild); var contentEl = bodyEl.dom.childNodes[1]; msgEl = Ext.get(contentEl.firstChild); textboxEl = Ext.get(contentEl.childNodes[2].firstChild); textboxEl.enableDisplayMode(); textboxEl.addKeyListener([10,13], function(){ if(dlg.isVisible() && opt && opt.buttons){ if(opt.buttons.ok){ handleButton("ok"); }else if(opt.buttons.yes){ handleButton("yes"); } } }); textareaEl = Ext.get(contentEl.childNodes[2].childNodes[1]); textareaEl.enableDisplayMode(); progressBar = new Ext.ProgressBar({ renderTo:bodyEl }); bodyEl.createChild({cls:'x-clear'}); } return dlg; }, updateText : function(text){ if(!dlg.isVisible() && !opt.width){ dlg.setSize(this.maxWidth, 100); } msgEl.update(text ? text + ' ' : ' '); var iw = iconCls != '' ? (iconEl.getWidth() + iconEl.getMargins('lr')) : 0, mw = msgEl.getWidth() + msgEl.getMargins('lr'), fw = dlg.getFrameWidth('lr'), bw = dlg.body.getFrameWidth('lr'), w; w = Math.max(Math.min(opt.width || iw+mw+fw+bw, opt.maxWidth || this.maxWidth), Math.max(opt.minWidth || this.minWidth, bwidth || 0)); if(opt.prompt === true){ activeTextEl.setWidth(w-iw-fw-bw); } if(opt.progress === true || opt.wait === true){ progressBar.setSize(w-iw-fw-bw); } if(Ext.isIE && w == bwidth){ w += 4; } msgEl.update(text || ' '); dlg.setSize(w, 'auto').center(); return this; }, updateProgress : function(value, progressText, msg){ progressBar.updateProgress(value, progressText); if(msg){ this.updateText(msg); } return this; }, isVisible : function(){ return dlg && dlg.isVisible(); }, hide : function(){ var proxy = dlg ? dlg.activeGhost : null; if(this.isVisible() || proxy){ dlg.hide(); handleHide(); if (proxy){ dlg.unghost(false, false); } } return this; }, show : function(options){ if(this.isVisible()){ this.hide(); } opt = options; var d = this.getDialog(opt.title || " "); d.setTitle(opt.title || " "); var allowClose = (opt.closable !== false && opt.progress !== true && opt.wait !== true); d.tools.close.setDisplayed(allowClose); activeTextEl = textboxEl; opt.prompt = opt.prompt || (opt.multiline ? true : false); if(opt.prompt){ if(opt.multiline){ textboxEl.hide(); textareaEl.show(); textareaEl.setHeight(Ext.isNumber(opt.multiline) ? opt.multiline : this.defaultTextHeight); activeTextEl = textareaEl; }else{ textboxEl.show(); textareaEl.hide(); } }else{ textboxEl.hide(); textareaEl.hide(); } activeTextEl.dom.value = opt.value || ""; if(opt.prompt){ d.focusEl = activeTextEl; }else{ var bs = opt.buttons; var db = null; if(bs && bs.ok){ db = buttons["ok"]; }else if(bs && bs.yes){ db = buttons["yes"]; } if (db){ d.focusEl = db; } } if(Ext.isDefined(opt.iconCls)){ d.setIconClass(opt.iconCls); } this.setIcon(Ext.isDefined(opt.icon) ? opt.icon : bufferIcon); bwidth = updateButtons(opt.buttons); progressBar.setVisible(opt.progress === true || opt.wait === true); this.updateProgress(0, opt.progressText); this.updateText(opt.msg); if(opt.cls){ d.el.addClass(opt.cls); } d.proxyDrag = opt.proxyDrag === true; d.modal = opt.modal !== false; d.mask = opt.modal !== false ? mask : false; if(!d.isVisible()){ document.body.appendChild(dlg.el.dom); d.setAnimateTarget(opt.animEl); d.on('show', function(){ if(allowClose === true){ d.keyMap.enable(); }else{ d.keyMap.disable(); } }, this, {single:true}); d.show(opt.animEl); } if(opt.wait === true){ progressBar.wait(opt.waitConfig); } return this; }, setIcon : function(icon){ if(!dlg){ bufferIcon = icon; return; } bufferIcon = undefined; if(icon && icon != ''){ iconEl.removeClass('x-hidden'); iconEl.replaceClass(iconCls, icon); bodyEl.addClass('x-dlg-icon'); iconCls = icon; }else{ iconEl.replaceClass(iconCls, 'x-hidden'); bodyEl.removeClass('x-dlg-icon'); iconCls = ''; } return this; }, progress : function(title, msg, progressText){ this.show({ title : title, msg : msg, buttons: false, progress:true, closable:false, minWidth: this.minProgressWidth, progressText: progressText }); return this; }, wait : function(msg, title, config){ this.show({ title : title, msg : msg, buttons: false, closable:false, wait:true, modal:true, minWidth: this.minProgressWidth, waitConfig: config }); return this; }, alert : function(title, msg, fn, scope){ this.show({ title : title, msg : msg, buttons: this.OK, fn: fn, scope : scope, minWidth: this.minWidth }); return this; }, confirm : function(title, msg, fn, scope){ this.show({ title : title, msg : msg, buttons: this.YESNO, fn: fn, scope : scope, icon: this.QUESTION, minWidth: this.minWidth }); return this; }, prompt : function(title, msg, fn, scope, multiline, value){ this.show({ title : title, msg : msg, buttons: this.OKCANCEL, fn: fn, minWidth: this.minPromptWidth, scope : scope, prompt:true, multiline: multiline, value: value }); return this; }, OK : {ok:true}, CANCEL : {cancel:true}, OKCANCEL : {ok:true, cancel:true}, YESNO : {yes:true, no:true}, YESNOCANCEL : {yes:true, no:true, cancel:true}, INFO : 'ext-mb-info', WARNING : 'ext-mb-warning', QUESTION : 'ext-mb-question', ERROR : 'ext-mb-error', defaultTextHeight : 75, maxWidth : 600, minWidth : 100, minProgressWidth : 250, minPromptWidth: 250, buttonText : { ok : "OK", cancel : "Cancel", yes : "Yes", no : "No" } }; }(); Ext.Msg = Ext.MessageBox; Ext.dd.PanelProxy = Ext.extend(Object, { constructor : function(panel, config){ this.panel = panel; this.id = this.panel.id +'-ddproxy'; Ext.apply(this, config); }, insertProxy : true, setStatus : Ext.emptyFn, reset : Ext.emptyFn, update : Ext.emptyFn, stop : Ext.emptyFn, sync: Ext.emptyFn, getEl : function(){ return this.ghost; }, getGhost : function(){ return this.ghost; }, getProxy : function(){ return this.proxy; }, hide : function(){ if(this.ghost){ if(this.proxy){ this.proxy.remove(); delete this.proxy; } this.panel.el.dom.style.display = ''; this.ghost.remove(); delete this.ghost; } }, show : function(){ if(!this.ghost){ this.ghost = this.panel.createGhost(this.panel.initialConfig.cls, undefined, Ext.getBody()); this.ghost.setXY(this.panel.el.getXY()); if(this.insertProxy){ this.proxy = this.panel.el.insertSibling({cls:'x-panel-dd-spacer'}); this.proxy.setSize(this.panel.getSize()); } this.panel.el.dom.style.display = 'none'; } }, repair : function(xy, callback, scope){ this.hide(); if(typeof callback == "function"){ callback.call(scope || this); } }, moveProxy : function(parentNode, before){ if(this.proxy){ parentNode.insertBefore(this.proxy.dom, before); } } }); Ext.Panel.DD = Ext.extend(Ext.dd.DragSource, { constructor : function(panel, cfg){ this.panel = panel; this.dragData = {panel: panel}; this.proxy = new Ext.dd.PanelProxy(panel, cfg); Ext.Panel.DD.superclass.constructor.call(this, panel.el, cfg); var h = panel.header, el = panel.body; if(h){ this.setHandleElId(h.id); el = panel.header; } el.setStyle('cursor', 'move'); this.scroll = false; }, showFrame: Ext.emptyFn, startDrag: Ext.emptyFn, b4StartDrag: function(x, y) { this.proxy.show(); }, b4MouseDown: function(e) { var x = e.getPageX(), y = e.getPageY(); this.autoOffset(x, y); }, onInitDrag : function(x, y){ this.onStartDrag(x, y); return true; }, createFrame : Ext.emptyFn, getDragEl : function(e){ return this.proxy.ghost.dom; }, endDrag : function(e){ this.proxy.hide(); this.panel.saveState(); }, autoOffset : function(x, y) { x -= this.startPageX; y -= this.startPageY; this.setDelta(x, y); } }); Ext.state.Provider = Ext.extend(Ext.util.Observable, { constructor : function(){ this.addEvents("statechange"); this.state = {}; Ext.state.Provider.superclass.constructor.call(this); }, get : function(name, defaultValue){ return typeof this.state[name] == "undefined" ? defaultValue : this.state[name]; }, clear : function(name){ delete this.state[name]; this.fireEvent("statechange", this, name, null); }, set : function(name, value){ this.state[name] = value; this.fireEvent("statechange", this, name, value); }, decodeValue : function(cookie){ var re = /^(a|n|d|b|s|o|e)\:(.*)$/, matches = re.exec(unescape(cookie)), all, type, v, kv; if(!matches || !matches[1]){ return; } type = matches[1]; v = matches[2]; switch(type){ case 'e': return null; case 'n': return parseFloat(v); case 'd': return new Date(Date.parse(v)); case 'b': return (v == '1'); case 'a': all = []; if(v != ''){ Ext.each(v.split('^'), function(val){ all.push(this.decodeValue(val)); }, this); } return all; case 'o': all = {}; if(v != ''){ Ext.each(v.split('^'), function(val){ kv = val.split('='); all[kv[0]] = this.decodeValue(kv[1]); }, this); } return all; default: return v; } }, encodeValue : function(v){ var enc, flat = '', i = 0, len, key; if(v == null){ return 'e:1'; }else if(typeof v == 'number'){ enc = 'n:' + v; }else if(typeof v == 'boolean'){ enc = 'b:' + (v ? '1' : '0'); }else if(Ext.isDate(v)){ enc = 'd:' + v.toGMTString(); }else if(Ext.isArray(v)){ for(len = v.length; i < len; i++){ flat += this.encodeValue(v[i]); if(i != len - 1){ flat += '^'; } } enc = 'a:' + flat; }else if(typeof v == 'object'){ for(key in v){ if(typeof v[key] != 'function' && v[key] !== undefined){ flat += key + '=' + this.encodeValue(v[key]) + '^'; } } enc = 'o:' + flat.substring(0, flat.length-1); }else{ enc = 's:' + v; } return escape(enc); } }); Ext.state.Manager = function(){ var provider = new Ext.state.Provider(); return { setProvider : function(stateProvider){ provider = stateProvider; }, get : function(key, defaultValue){ return provider.get(key, defaultValue); }, set : function(key, value){ provider.set(key, value); }, clear : function(key){ provider.clear(key); }, getProvider : function(){ return provider; } }; }(); Ext.state.CookieProvider = Ext.extend(Ext.state.Provider, { constructor : function(config){ Ext.state.CookieProvider.superclass.constructor.call(this); this.path = "/"; this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); this.domain = null; this.secure = false; Ext.apply(this, config); this.state = this.readCookies(); }, set : function(name, value){ if(typeof value == "undefined" || value === null){ this.clear(name); return; } this.setCookie(name, value); Ext.state.CookieProvider.superclass.set.call(this, name, value); }, clear : function(name){ this.clearCookie(name); Ext.state.CookieProvider.superclass.clear.call(this, name); }, readCookies : function(){ var cookies = {}, c = document.cookie + ";", re = /\s?(.*?)=(.*?);/g, matches, name, value; while((matches = re.exec(c)) != null){ name = matches[1]; value = matches[2]; if(name && name.substring(0,3) == "ys-"){ cookies[name.substr(3)] = this.decodeValue(value); } } return cookies; }, setCookie : function(name, value){ document.cookie = "ys-"+ name + "=" + this.encodeValue(value) + ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) + ((this.path == null) ? "" : ("; path=" + this.path)) + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + ((this.secure == true) ? "; secure" : ""); }, clearCookie : function(name){ document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" + ((this.path == null) ? "" : ("; path=" + this.path)) + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + ((this.secure == true) ? "; secure" : ""); } }); Ext.DataView = Ext.extend(Ext.BoxComponent, { selectedClass : "x-view-selected", emptyText : "", deferEmptyText: true, trackOver: false, blockRefresh: false, last: false, initComponent : function(){ Ext.DataView.superclass.initComponent.call(this); if(Ext.isString(this.tpl) || Ext.isArray(this.tpl)){ this.tpl = new Ext.XTemplate(this.tpl); } this.addEvents( "beforeclick", "click", "mouseenter", "mouseleave", "containerclick", "dblclick", "contextmenu", "containercontextmenu", "selectionchange", "beforeselect" ); this.store = Ext.StoreMgr.lookup(this.store); this.all = new Ext.CompositeElementLite(); this.selected = new Ext.CompositeElementLite(); }, afterRender : function(){ Ext.DataView.superclass.afterRender.call(this); this.mon(this.getTemplateTarget(), { "click": this.onClick, "dblclick": this.onDblClick, "contextmenu": this.onContextMenu, scope:this }); if(this.overClass || this.trackOver){ this.mon(this.getTemplateTarget(), { "mouseover": this.onMouseOver, "mouseout": this.onMouseOut, scope:this }); } if(this.store){ this.bindStore(this.store, true); } }, refresh : function() { this.clearSelections(false, true); var el = this.getTemplateTarget(), records = this.store.getRange(); el.update(''); if(records.length < 1){ if(!this.deferEmptyText || this.hasSkippedEmptyText){ el.update(this.emptyText); } this.all.clear(); }else{ this.tpl.overwrite(el, this.collectData(records, 0)); this.all.fill(Ext.query(this.itemSelector, el.dom)); this.updateIndexes(0); } this.hasSkippedEmptyText = true; }, getTemplateTarget: function(){ return this.el; }, prepareData : function(data){ return data; }, collectData : function(records, startIndex){ var r = [], i = 0, len = records.length; for(; i < len; i++){ r[r.length] = this.prepareData(records[i].data, startIndex + i, records[i]); } return r; }, bufferRender : function(records, index){ var div = document.createElement('div'); this.tpl.overwrite(div, this.collectData(records, index)); return Ext.query(this.itemSelector, div); }, onUpdate : function(ds, record){ var index = this.store.indexOf(record); if(index > -1){ var sel = this.isSelected(index), original = this.all.elements[index], node = this.bufferRender([record], index)[0]; this.all.replaceElement(index, node, true); if(sel){ this.selected.replaceElement(original, node); this.all.item(index).addClass(this.selectedClass); } this.updateIndexes(index, index); } }, onAdd : function(ds, records, index){ if(this.all.getCount() === 0){ this.refresh(); return; } var nodes = this.bufferRender(records, index), n, a = this.all.elements; if(index < this.all.getCount()){ n = this.all.item(index).insertSibling(nodes, 'before', true); a.splice.apply(a, [index, 0].concat(nodes)); }else{ n = this.all.last().insertSibling(nodes, 'after', true); a.push.apply(a, nodes); } this.updateIndexes(index); }, onRemove : function(ds, record, index){ this.deselect(index); this.all.removeElement(index, true); this.updateIndexes(index); if (this.store.getCount() === 0){ this.refresh(); } }, refreshNode : function(index){ this.onUpdate(this.store, this.store.getAt(index)); }, updateIndexes : function(startIndex, endIndex){ var ns = this.all.elements; startIndex = startIndex || 0; endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1)); for(var i = startIndex; i <= endIndex; i++){ ns[i].viewIndex = i; } }, getStore : function(){ return this.store; }, bindStore : function(store, initial){ if(!initial && this.store){ if(store !== this.store && this.store.autoDestroy){ this.store.destroy(); }else{ this.store.un("beforeload", this.onBeforeLoad, this); this.store.un("datachanged", this.onDataChanged, this); this.store.un("add", this.onAdd, this); this.store.un("remove", this.onRemove, this); this.store.un("update", this.onUpdate, this); this.store.un("clear", this.refresh, this); } if(!store){ this.store = null; } } if(store){ store = Ext.StoreMgr.lookup(store); store.on({ scope: this, beforeload: this.onBeforeLoad, datachanged: this.onDataChanged, add: this.onAdd, remove: this.onRemove, update: this.onUpdate, clear: this.refresh }); } this.store = store; if(store){ this.refresh(); } }, onDataChanged: function() { if (this.blockRefresh !== true) { this.refresh.apply(this, arguments); } }, findItemFromChild : function(node){ return Ext.fly(node).findParent(this.itemSelector, this.getTemplateTarget()); }, onClick : function(e){ var item = e.getTarget(this.itemSelector, this.getTemplateTarget()), index; if(item){ index = this.indexOf(item); if(this.onItemClick(item, index, e) !== false){ this.fireEvent("click", this, index, item, e); } }else{ if(this.fireEvent("containerclick", this, e) !== false){ this.onContainerClick(e); } } }, onContainerClick : function(e){ this.clearSelections(); }, onContextMenu : function(e){ var item = e.getTarget(this.itemSelector, this.getTemplateTarget()); if(item){ this.fireEvent("contextmenu", this, this.indexOf(item), item, e); }else{ this.fireEvent("containercontextmenu", this, e); } }, onDblClick : function(e){ var item = e.getTarget(this.itemSelector, this.getTemplateTarget()); if(item){ this.fireEvent("dblclick", this, this.indexOf(item), item, e); } }, onMouseOver : function(e){ var item = e.getTarget(this.itemSelector, this.getTemplateTarget()); if(item && item !== this.lastItem){ this.lastItem = item; Ext.fly(item).addClass(this.overClass); this.fireEvent("mouseenter", this, this.indexOf(item), item, e); } }, onMouseOut : function(e){ if(this.lastItem){ if(!e.within(this.lastItem, true, true)){ Ext.fly(this.lastItem).removeClass(this.overClass); this.fireEvent("mouseleave", this, this.indexOf(this.lastItem), this.lastItem, e); delete this.lastItem; } } }, onItemClick : function(item, index, e){ if(this.fireEvent("beforeclick", this, index, item, e) === false){ return false; } if(this.multiSelect){ this.doMultiSelection(item, index, e); e.preventDefault(); }else if(this.singleSelect){ this.doSingleSelection(item, index, e); e.preventDefault(); } return true; }, doSingleSelection : function(item, index, e){ if(e.ctrlKey && this.isSelected(index)){ this.deselect(index); }else{ this.select(index, false); } }, doMultiSelection : function(item, index, e){ if(e.shiftKey && this.last !== false){ var last = this.last; this.selectRange(last, index, e.ctrlKey); this.last = last; }else{ if((e.ctrlKey||this.simpleSelect) && this.isSelected(index)){ this.deselect(index); }else{ this.select(index, e.ctrlKey || e.shiftKey || this.simpleSelect); } } }, getSelectionCount : function(){ return this.selected.getCount(); }, getSelectedNodes : function(){ return this.selected.elements; }, getSelectedIndexes : function(){ var indexes = [], selected = this.selected.elements, i = 0, len = selected.length; for(; i < len; i++){ indexes.push(selected[i].viewIndex); } return indexes; }, getSelectedRecords : function(){ return this.getRecords(this.selected.elements); }, getRecords : function(nodes){ var records = [], i = 0, len = nodes.length; for(; i < len; i++){ records[records.length] = this.store.getAt(nodes[i].viewIndex); } return records; }, getRecord : function(node){ return this.store.getAt(node.viewIndex); }, clearSelections : function(suppressEvent, skipUpdate){ if((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0){ if(!skipUpdate){ this.selected.removeClass(this.selectedClass); } this.selected.clear(); this.last = false; if(!suppressEvent){ this.fireEvent("selectionchange", this, this.selected.elements); } } }, isSelected : function(node){ return this.selected.contains(this.getNode(node)); }, deselect : function(node){ if(this.isSelected(node)){ node = this.getNode(node); this.selected.removeElement(node); if(this.last == node.viewIndex){ this.last = false; } Ext.fly(node).removeClass(this.selectedClass); this.fireEvent("selectionchange", this, this.selected.elements); } }, select : function(nodeInfo, keepExisting, suppressEvent){ if(Ext.isArray(nodeInfo)){ if(!keepExisting){ this.clearSelections(true); } for(var i = 0, len = nodeInfo.length; i < len; i++){ this.select(nodeInfo[i], true, true); } if(!suppressEvent){ this.fireEvent("selectionchange", this, this.selected.elements); } } else{ var node = this.getNode(nodeInfo); if(!keepExisting){ this.clearSelections(true); } if(node && !this.isSelected(node)){ if(this.fireEvent("beforeselect", this, node, this.selected.elements) !== false){ Ext.fly(node).addClass(this.selectedClass); this.selected.add(node); this.last = node.viewIndex; if(!suppressEvent){ this.fireEvent("selectionchange", this, this.selected.elements); } } } } }, selectRange : function(start, end, keepExisting){ if(!keepExisting){ this.clearSelections(true); } this.select(this.getNodes(start, end), true); }, getNode : function(nodeInfo){ if(Ext.isString(nodeInfo)){ return document.getElementById(nodeInfo); }else if(Ext.isNumber(nodeInfo)){ return this.all.elements[nodeInfo]; }else if(nodeInfo instanceof Ext.data.Record){ var idx = this.store.indexOf(nodeInfo); return this.all.elements[idx]; } return nodeInfo; }, getNodes : function(start, end){ var ns = this.all.elements, nodes = [], i; start = start || 0; end = !Ext.isDefined(end) ? Math.max(ns.length - 1, 0) : end; if(start <= end){ for(i = start; i <= end && ns[i]; i++){ nodes.push(ns[i]); } } else{ for(i = start; i >= end && ns[i]; i--){ nodes.push(ns[i]); } } return nodes; }, indexOf : function(node){ node = this.getNode(node); if(Ext.isNumber(node.viewIndex)){ return node.viewIndex; } return this.all.indexOf(node); }, onBeforeLoad : function(){ if(this.loadingText){ this.clearSelections(false, true); this.getTemplateTarget().update('
    '+this.loadingText+'
    '); this.all.clear(); } }, onDestroy : function(){ this.all.clear(); this.selected.clear(); Ext.DataView.superclass.onDestroy.call(this); this.bindStore(null); } }); Ext.DataView.prototype.setStore = Ext.DataView.prototype.bindStore; Ext.reg('dataview', Ext.DataView); Ext.list.ListView = Ext.extend(Ext.DataView, { itemSelector: 'dl', selectedClass:'x-list-selected', overClass:'x-list-over', scrollOffset : undefined, columnResize: true, columnSort: true, maxColumnWidth: Ext.isIE ? 99 : 100, initComponent : function(){ if(this.columnResize){ this.colResizer = new Ext.list.ColumnResizer(this.colResizer); this.colResizer.init(this); } if(this.columnSort){ this.colSorter = new Ext.list.Sorter(this.columnSort); this.colSorter.init(this); } if(!this.internalTpl){ this.internalTpl = new Ext.XTemplate( '
    ', '', '
    ', '{header}', '
    ', '
    ', '
    ', '
    ', '
    ', '
    ' ); } if(!this.tpl){ this.tpl = new Ext.XTemplate( '', '
    ', '', '
    ', ' class="{cls}">', '{[values.tpl.apply(parent)]}', '
    ', '
    ', '
    ', '
    ', '
    ' ); }; var cs = this.columns, allocatedWidth = 0, colsWithWidth = 0, len = cs.length, columns = []; for(var i = 0; i < len; i++){ var c = cs[i]; if(!c.isColumn) { c.xtype = c.xtype ? (/^lv/.test(c.xtype) ? c.xtype : 'lv' + c.xtype) : 'lvcolumn'; c = Ext.create(c); } if(c.width) { allocatedWidth += c.width*100; if(allocatedWidth > this.maxColumnWidth){ c.width -= (allocatedWidth - this.maxColumnWidth) / 100; } colsWithWidth++; } columns.push(c); } cs = this.columns = columns; if(colsWithWidth < len){ var remaining = len - colsWithWidth; if(allocatedWidth < this.maxColumnWidth){ var perCol = ((this.maxColumnWidth-allocatedWidth) / remaining)/100; for(var j = 0; j < len; j++){ var c = cs[j]; if(!c.width){ c.width = perCol; } } } } Ext.list.ListView.superclass.initComponent.call(this); }, onRender : function(){ this.autoEl = { cls: 'x-list-wrap' }; Ext.list.ListView.superclass.onRender.apply(this, arguments); this.internalTpl.overwrite(this.el, {columns: this.columns}); this.innerBody = Ext.get(this.el.dom.childNodes[1].firstChild); this.innerHd = Ext.get(this.el.dom.firstChild.firstChild); if(this.hideHeaders){ this.el.dom.firstChild.style.display = 'none'; } }, getTemplateTarget : function(){ return this.innerBody; }, collectData : function(){ var rs = Ext.list.ListView.superclass.collectData.apply(this, arguments); return { columns: this.columns, rows: rs }; }, verifyInternalSize : function(){ if(this.lastSize){ this.onResize(this.lastSize.width, this.lastSize.height); } }, onResize : function(w, h){ var body = this.innerBody.dom, header = this.innerHd.dom, scrollWidth = w - Ext.num(this.scrollOffset, Ext.getScrollBarWidth()) + 'px', parentNode; if(!body){ return; } parentNode = body.parentNode; if(Ext.isNumber(w)){ if(this.reserveScrollOffset || ((parentNode.offsetWidth - parentNode.clientWidth) > 10)){ body.style.width = scrollWidth; header.style.width = scrollWidth; }else{ body.style.width = w + 'px'; header.style.width = w + 'px'; setTimeout(function(){ if((parentNode.offsetWidth - parentNode.clientWidth) > 10){ body.style.width = scrollWidth; header.style.width = scrollWidth; } }, 10); } } if(Ext.isNumber(h)){ parentNode.style.height = Math.max(0, h - header.parentNode.offsetHeight) + 'px'; } }, updateIndexes : function(){ Ext.list.ListView.superclass.updateIndexes.apply(this, arguments); this.verifyInternalSize(); }, findHeaderIndex : function(header){ header = header.dom || header; var parentNode = header.parentNode, children = parentNode.parentNode.childNodes, i = 0, c; for(; c = children[i]; i++){ if(c == parentNode){ return i; } } return -1; }, setHdWidths : function(){ var els = this.innerHd.dom.getElementsByTagName('div'), i = 0, columns = this.columns, len = columns.length; for(; i < len; i++){ els[i].style.width = (columns[i].width*100) + '%'; } } }); Ext.reg('listview', Ext.list.ListView); Ext.ListView = Ext.list.ListView; Ext.list.Column = Ext.extend(Object, { isColumn: true, align: 'left', header: '', width: null, cls: '', constructor : function(c){ if(!c.tpl){ c.tpl = new Ext.XTemplate('{' + c.dataIndex + '}'); } else if(Ext.isString(c.tpl)){ c.tpl = new Ext.XTemplate(c.tpl); } Ext.apply(this, c); } }); Ext.reg('lvcolumn', Ext.list.Column); Ext.list.NumberColumn = Ext.extend(Ext.list.Column, { format: '0,000.00', constructor : function(c) { c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':number("' + (c.format || this.format) + '")}'); Ext.list.NumberColumn.superclass.constructor.call(this, c); } }); Ext.reg('lvnumbercolumn', Ext.list.NumberColumn); Ext.list.DateColumn = Ext.extend(Ext.list.Column, { format: 'm/d/Y', constructor : function(c) { c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':date("' + (c.format || this.format) + '")}'); Ext.list.DateColumn.superclass.constructor.call(this, c); } }); Ext.reg('lvdatecolumn', Ext.list.DateColumn); Ext.list.BooleanColumn = Ext.extend(Ext.list.Column, { trueText: 'true', falseText: 'false', undefinedText: ' ', constructor : function(c) { c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':this.format}'); var t = this.trueText, f = this.falseText, u = this.undefinedText; c.tpl.format = function(v){ if(v === undefined){ return u; } if(!v || v === 'false'){ return f; } return t; }; Ext.list.DateColumn.superclass.constructor.call(this, c); } }); Ext.reg('lvbooleancolumn', Ext.list.BooleanColumn); Ext.list.ColumnResizer = Ext.extend(Ext.util.Observable, { minPct: .05, constructor: function(config){ Ext.apply(this, config); Ext.list.ColumnResizer.superclass.constructor.call(this); }, init : function(listView){ this.view = listView; listView.on('render', this.initEvents, this); }, initEvents : function(view){ view.mon(view.innerHd, 'mousemove', this.handleHdMove, this); this.tracker = new Ext.dd.DragTracker({ onBeforeStart: this.onBeforeStart.createDelegate(this), onStart: this.onStart.createDelegate(this), onDrag: this.onDrag.createDelegate(this), onEnd: this.onEnd.createDelegate(this), tolerance: 3, autoStart: 300 }); this.tracker.initEl(view.innerHd); view.on('beforedestroy', this.tracker.destroy, this.tracker); }, handleHdMove : function(e, t){ var handleWidth = 5, x = e.getPageX(), header = e.getTarget('em', 3, true); if(header){ var region = header.getRegion(), style = header.dom.style, parentNode = header.dom.parentNode; if(x - region.left <= handleWidth && parentNode != parentNode.parentNode.firstChild){ this.activeHd = Ext.get(parentNode.previousSibling.firstChild); style.cursor = Ext.isWebKit ? 'e-resize' : 'col-resize'; } else if(region.right - x <= handleWidth && parentNode != parentNode.parentNode.lastChild.previousSibling){ this.activeHd = header; style.cursor = Ext.isWebKit ? 'w-resize' : 'col-resize'; } else{ delete this.activeHd; style.cursor = ''; } } }, onBeforeStart : function(e){ this.dragHd = this.activeHd; return !!this.dragHd; }, onStart: function(e){ var me = this, view = me.view, dragHeader = me.dragHd, x = me.tracker.getXY()[0]; me.proxy = view.el.createChild({cls:'x-list-resizer'}); me.dragX = dragHeader.getX(); me.headerIndex = view.findHeaderIndex(dragHeader); me.headersDisabled = view.disableHeaders; view.disableHeaders = true; me.proxy.setHeight(view.el.getHeight()); me.proxy.setX(me.dragX); me.proxy.setWidth(x - me.dragX); this.setBoundaries(); }, setBoundaries: function(relativeX){ var view = this.view, headerIndex = this.headerIndex, width = view.innerHd.getWidth(), relativeX = view.innerHd.getX(), minWidth = Math.ceil(width * this.minPct), maxWidth = width - minWidth, numColumns = view.columns.length, headers = view.innerHd.select('em', true), minX = minWidth + relativeX, maxX = maxWidth + relativeX, header; if (numColumns == 2) { this.minX = minX; this.maxX = maxX; }else{ header = headers.item(headerIndex + 2); this.minX = headers.item(headerIndex).getX() + minWidth; this.maxX = header ? header.getX() - minWidth : maxX; if (headerIndex == 0) { this.minX = minX; } else if (headerIndex == numColumns - 2) { this.maxX = maxX; } } }, onDrag: function(e){ var me = this, cursorX = me.tracker.getXY()[0].constrain(me.minX, me.maxX); me.proxy.setWidth(cursorX - this.dragX); }, onEnd: function(e){ var newWidth = this.proxy.getWidth(), index = this.headerIndex, view = this.view, columns = view.columns, width = view.innerHd.getWidth(), newPercent = Math.ceil(newWidth * view.maxColumnWidth / width) / 100, disabled = this.headersDisabled, headerCol = columns[index], otherCol = columns[index + 1], totalPercent = headerCol.width + otherCol.width; this.proxy.remove(); headerCol.width = newPercent; otherCol.width = totalPercent - newPercent; delete this.dragHd; view.setHdWidths(); view.refresh(); setTimeout(function(){ view.disableHeaders = disabled; }, 100); } }); Ext.ListView.ColumnResizer = Ext.list.ColumnResizer; Ext.list.Sorter = Ext.extend(Ext.util.Observable, { sortClasses : ["sort-asc", "sort-desc"], constructor: function(config){ Ext.apply(this, config); Ext.list.Sorter.superclass.constructor.call(this); }, init : function(listView){ this.view = listView; listView.on('render', this.initEvents, this); }, initEvents : function(view){ view.mon(view.innerHd, 'click', this.onHdClick, this); view.innerHd.setStyle('cursor', 'pointer'); view.mon(view.store, 'datachanged', this.updateSortState, this); this.updateSortState.defer(10, this, [view.store]); }, updateSortState : function(store){ var state = store.getSortState(); if(!state){ return; } this.sortState = state; var cs = this.view.columns, sortColumn = -1; for(var i = 0, len = cs.length; i < len; i++){ if(cs[i].dataIndex == state.field){ sortColumn = i; break; } } if(sortColumn != -1){ var sortDir = state.direction; this.updateSortIcon(sortColumn, sortDir); } }, updateSortIcon : function(col, dir){ var sc = this.sortClasses; var hds = this.view.innerHd.select('em').removeClass(sc); hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]); }, onHdClick : function(e){ var hd = e.getTarget('em', 3); if(hd && !this.view.disableHeaders){ var index = this.view.findHeaderIndex(hd); this.view.store.sort(this.view.columns[index].dataIndex); } } }); Ext.ListView.Sorter = Ext.list.Sorter; Ext.TabPanel = Ext.extend(Ext.Panel, { deferredRender : true, tabWidth : 120, minTabWidth : 30, resizeTabs : false, enableTabScroll : false, scrollIncrement : 0, scrollRepeatInterval : 400, scrollDuration : 0.35, animScroll : true, tabPosition : 'top', baseCls : 'x-tab-panel', autoTabs : false, autoTabSelector : 'div.x-tab', activeTab : undefined, tabMargin : 2, plain : false, wheelIncrement : 20, idDelimiter : '__', itemCls : 'x-tab-item', elements : 'body', headerAsText : false, frame : false, hideBorders :true, initComponent : function(){ this.frame = false; Ext.TabPanel.superclass.initComponent.call(this); this.addEvents( 'beforetabchange', 'tabchange', 'contextmenu' ); this.setLayout(new Ext.layout.CardLayout(Ext.apply({ layoutOnCardChange: this.layoutOnTabChange, deferredRender: this.deferredRender }, this.layoutConfig))); if(this.tabPosition == 'top'){ this.elements += ',header'; this.stripTarget = 'header'; }else { this.elements += ',footer'; this.stripTarget = 'footer'; } if(!this.stack){ this.stack = Ext.TabPanel.AccessStack(); } this.initItems(); }, onRender : function(ct, position){ Ext.TabPanel.superclass.onRender.call(this, ct, position); if(this.plain){ var pos = this.tabPosition == 'top' ? 'header' : 'footer'; this[pos].addClass('x-tab-panel-'+pos+'-plain'); } var st = this[this.stripTarget]; this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{ tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}}); var beforeEl = (this.tabPosition=='bottom' ? this.stripWrap : null); st.createChild({cls:'x-tab-strip-spacer'}, beforeEl); this.strip = new Ext.Element(this.stripWrap.dom.firstChild); this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge', cn: [{tag: 'span', cls: 'x-tab-strip-text', cn: ' '}]}); this.strip.createChild({cls:'x-clear'}); this.body.addClass('x-tab-panel-body-'+this.tabPosition); if(!this.itemTpl){ var tt = new Ext.Template( '
  • ', '', '{text}', '
  • ' ); tt.disableFormats = true; tt.compile(); Ext.TabPanel.prototype.itemTpl = tt; } this.items.each(this.initTab, this); }, afterRender : function(){ Ext.TabPanel.superclass.afterRender.call(this); if(this.autoTabs){ this.readTabs(false); } if(this.activeTab !== undefined){ var item = Ext.isObject(this.activeTab) ? this.activeTab : this.items.get(this.activeTab); delete this.activeTab; this.setActiveTab(item); } }, initEvents : function(){ Ext.TabPanel.superclass.initEvents.call(this); this.mon(this.strip, { scope: this, mousedown: this.onStripMouseDown, contextmenu: this.onStripContextMenu }); if(this.enableTabScroll){ this.mon(this.strip, 'mousewheel', this.onWheel, this); } }, findTargets : function(e){ var item = null, itemEl = e.getTarget('li:not(.x-tab-edge)', this.strip); if(itemEl){ item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]); if(item.disabled){ return { close : null, item : null, el : null }; } } return { close : e.getTarget('.x-tab-strip-close', this.strip), item : item, el : itemEl }; }, onStripMouseDown : function(e){ if(e.button !== 0){ return; } e.preventDefault(); var t = this.findTargets(e); if(t.close){ if (t.item.fireEvent('beforeclose', t.item) !== false) { t.item.fireEvent('close', t.item); this.remove(t.item); } return; } if(t.item && t.item != this.activeTab){ this.setActiveTab(t.item); } }, onStripContextMenu : function(e){ e.preventDefault(); var t = this.findTargets(e); if(t.item){ this.fireEvent('contextmenu', this, t.item, e); } }, readTabs : function(removeExisting){ if(removeExisting === true){ this.items.each(function(item){ this.remove(item); }, this); } var tabs = this.el.query(this.autoTabSelector); for(var i = 0, len = tabs.length; i < len; i++){ var tab = tabs[i], title = tab.getAttribute('title'); tab.removeAttribute('title'); this.add({ title: title, contentEl: tab }); } }, initTab : function(item, index){ var before = this.strip.dom.childNodes[index], p = this.getTemplateArgs(item), el = before ? this.itemTpl.insertBefore(before, p) : this.itemTpl.append(this.strip, p), cls = 'x-tab-strip-over', tabEl = Ext.get(el); tabEl.hover(function(){ if(!item.disabled){ tabEl.addClass(cls); } }, function(){ tabEl.removeClass(cls); }); if(item.tabTip){ tabEl.child('span.x-tab-strip-text', true).qtip = item.tabTip; } item.tabEl = el; tabEl.select('a').on('click', function(e){ if(!e.getPageX()){ this.onStripMouseDown(e); } }, this, {preventDefault: true}); item.on({ scope: this, disable: this.onItemDisabled, enable: this.onItemEnabled, titlechange: this.onItemTitleChanged, iconchange: this.onItemIconChanged, beforeshow: this.onBeforeShowItem }); }, getTemplateArgs : function(item) { var cls = item.closable ? 'x-tab-strip-closable' : ''; if(item.disabled){ cls += ' x-item-disabled'; } if(item.iconCls){ cls += ' x-tab-with-icon'; } if(item.tabCls){ cls += ' ' + item.tabCls; } return { id: this.id + this.idDelimiter + item.getItemId(), text: item.title, cls: cls, iconCls: item.iconCls || '' }; }, onAdd : function(c){ Ext.TabPanel.superclass.onAdd.call(this, c); if(this.rendered){ var items = this.items; this.initTab(c, items.indexOf(c)); this.delegateUpdates(); } }, onBeforeAdd : function(item){ var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item); if(existing){ this.setActiveTab(item); return false; } Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments); var es = item.elements; item.elements = es ? es.replace(',header', '') : es; item.border = (item.border === true); }, onRemove : function(c){ var te = Ext.get(c.tabEl); if(te){ te.select('a').removeAllListeners(); Ext.destroy(te); } Ext.TabPanel.superclass.onRemove.call(this, c); this.stack.remove(c); delete c.tabEl; c.un('disable', this.onItemDisabled, this); c.un('enable', this.onItemEnabled, this); c.un('titlechange', this.onItemTitleChanged, this); c.un('iconchange', this.onItemIconChanged, this); c.un('beforeshow', this.onBeforeShowItem, this); if(c == this.activeTab){ var next = this.stack.next(); if(next){ this.setActiveTab(next); }else if(this.items.getCount() > 0){ this.setActiveTab(0); }else{ this.setActiveTab(null); } } if(!this.destroying){ this.delegateUpdates(); } }, onBeforeShowItem : function(item){ if(item != this.activeTab){ this.setActiveTab(item); return false; } }, onItemDisabled : function(item){ var el = this.getTabEl(item); if(el){ Ext.fly(el).addClass('x-item-disabled'); } this.stack.remove(item); }, onItemEnabled : function(item){ var el = this.getTabEl(item); if(el){ Ext.fly(el).removeClass('x-item-disabled'); } }, onItemTitleChanged : function(item){ var el = this.getTabEl(item); if(el){ Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title; } }, onItemIconChanged : function(item, iconCls, oldCls){ var el = this.getTabEl(item); if(el){ el = Ext.get(el); el.child('span.x-tab-strip-text').replaceClass(oldCls, iconCls); el[Ext.isEmpty(iconCls) ? 'removeClass' : 'addClass']('x-tab-with-icon'); } }, getTabEl : function(item){ var c = this.getComponent(item); return c ? c.tabEl : null; }, onResize : function(){ Ext.TabPanel.superclass.onResize.apply(this, arguments); this.delegateUpdates(); }, beginUpdate : function(){ this.suspendUpdates = true; }, endUpdate : function(){ this.suspendUpdates = false; this.delegateUpdates(); }, hideTabStripItem : function(item){ item = this.getComponent(item); var el = this.getTabEl(item); if(el){ el.style.display = 'none'; this.delegateUpdates(); } this.stack.remove(item); }, unhideTabStripItem : function(item){ item = this.getComponent(item); var el = this.getTabEl(item); if(el){ el.style.display = ''; this.delegateUpdates(); } }, delegateUpdates : function(){ var rendered = this.rendered; if(this.suspendUpdates){ return; } if(this.resizeTabs && rendered){ this.autoSizeTabs(); } if(this.enableTabScroll && rendered){ this.autoScrollTabs(); } }, autoSizeTabs : function(){ var count = this.items.length, ce = this.tabPosition != 'bottom' ? 'header' : 'footer', ow = this[ce].dom.offsetWidth, aw = this[ce].dom.clientWidth; if(!this.resizeTabs || count < 1 || !aw){ return; } var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth); this.lastTabWidth = each; var lis = this.strip.query('li:not(.x-tab-edge)'); for(var i = 0, len = lis.length; i < len; i++) { var li = lis[i], inner = Ext.fly(li).child('.x-tab-strip-inner', true), tw = li.offsetWidth, iw = inner.offsetWidth; inner.style.width = (each - (tw-iw)) + 'px'; } }, adjustBodyWidth : function(w){ if(this.header){ this.header.setWidth(w); } if(this.footer){ this.footer.setWidth(w); } return w; }, setActiveTab : function(item){ item = this.getComponent(item); if(this.fireEvent('beforetabchange', this, item, this.activeTab) === false){ return; } if(!this.rendered){ this.activeTab = item; return; } if(this.activeTab != item){ if(this.activeTab){ var oldEl = this.getTabEl(this.activeTab); if(oldEl){ Ext.fly(oldEl).removeClass('x-tab-strip-active'); } } this.activeTab = item; if(item){ var el = this.getTabEl(item); Ext.fly(el).addClass('x-tab-strip-active'); this.stack.add(item); this.layout.setActiveItem(item); this.delegateUpdates(); if(this.scrolling){ this.scrollToTab(item, this.animScroll); } } this.fireEvent('tabchange', this, item); } }, getActiveTab : function(){ return this.activeTab || null; }, getItem : function(item){ return this.getComponent(item); }, autoScrollTabs : function(){ this.pos = this.tabPosition=='bottom' ? this.footer : this.header; var count = this.items.length, ow = this.pos.dom.offsetWidth, tw = this.pos.dom.clientWidth, wrap = this.stripWrap, wd = wrap.dom, cw = wd.offsetWidth, pos = this.getScrollPos(), l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos; if(!this.enableTabScroll || cw < 20){ return; } if(count == 0 || l <= tw){ wd.scrollLeft = 0; wrap.setWidth(tw); if(this.scrolling){ this.scrolling = false; this.pos.removeClass('x-tab-scrolling'); this.scrollLeft.hide(); this.scrollRight.hide(); if(Ext.isAir || Ext.isWebKit){ wd.style.marginLeft = ''; wd.style.marginRight = ''; } } }else{ if(!this.scrolling){ this.pos.addClass('x-tab-scrolling'); if(Ext.isAir || Ext.isWebKit){ wd.style.marginLeft = '18px'; wd.style.marginRight = '18px'; } } tw -= wrap.getMargins('lr'); wrap.setWidth(tw > 20 ? tw : 20); if(!this.scrolling){ if(!this.scrollLeft){ this.createScrollers(); }else{ this.scrollLeft.show(); this.scrollRight.show(); } } this.scrolling = true; if(pos > (l-tw)){ wd.scrollLeft = l-tw; }else{ this.scrollToTab(this.activeTab, false); } this.updateScrollButtons(); } }, createScrollers : function(){ this.pos.addClass('x-tab-scrolling-' + this.tabPosition); var h = this.stripWrap.dom.offsetHeight; var sl = this.pos.insertFirst({ cls:'x-tab-scroller-left' }); sl.setHeight(h); sl.addClassOnOver('x-tab-scroller-left-over'); this.leftRepeater = new Ext.util.ClickRepeater(sl, { interval : this.scrollRepeatInterval, handler: this.onScrollLeft, scope: this }); this.scrollLeft = sl; var sr = this.pos.insertFirst({ cls:'x-tab-scroller-right' }); sr.setHeight(h); sr.addClassOnOver('x-tab-scroller-right-over'); this.rightRepeater = new Ext.util.ClickRepeater(sr, { interval : this.scrollRepeatInterval, handler: this.onScrollRight, scope: this }); this.scrollRight = sr; }, getScrollWidth : function(){ return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos(); }, getScrollPos : function(){ return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0; }, getScrollArea : function(){ return parseInt(this.stripWrap.dom.clientWidth, 10) || 0; }, getScrollAnim : function(){ return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this}; }, getScrollIncrement : function(){ return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100); }, scrollToTab : function(item, animate){ if(!item){ return; } var el = this.getTabEl(item), pos = this.getScrollPos(), area = this.getScrollArea(), left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos, right = left + el.offsetWidth; if(left < pos){ this.scrollTo(left, animate); }else if(right > (pos + area)){ this.scrollTo(right - area, animate); } }, scrollTo : function(pos, animate){ this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false); if(!animate){ this.updateScrollButtons(); } }, onWheel : function(e){ var d = e.getWheelDelta()*this.wheelIncrement*-1; e.stopEvent(); var pos = this.getScrollPos(), newpos = pos + d, sw = this.getScrollWidth()-this.getScrollArea(); var s = Math.max(0, Math.min(sw, newpos)); if(s != pos){ this.scrollTo(s, false); } }, onScrollRight : function(){ var sw = this.getScrollWidth()-this.getScrollArea(), pos = this.getScrollPos(), s = Math.min(sw, pos + this.getScrollIncrement()); if(s != pos){ this.scrollTo(s, this.animScroll); } }, onScrollLeft : function(){ var pos = this.getScrollPos(), s = Math.max(0, pos - this.getScrollIncrement()); if(s != pos){ this.scrollTo(s, this.animScroll); } }, updateScrollButtons : function(){ var pos = this.getScrollPos(); this.scrollLeft[pos === 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled'); this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled'); }, beforeDestroy : function() { Ext.destroy(this.leftRepeater, this.rightRepeater); this.deleteMembers('strip', 'edge', 'scrollLeft', 'scrollRight', 'stripWrap'); this.activeTab = null; Ext.TabPanel.superclass.beforeDestroy.apply(this); } }); Ext.reg('tabpanel', Ext.TabPanel); Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab; Ext.TabPanel.AccessStack = function(){ var items = []; return { add : function(item){ items.push(item); if(items.length > 10){ items.shift(); } }, remove : function(item){ var s = []; for(var i = 0, len = items.length; i < len; i++) { if(items[i] != item){ s.push(items[i]); } } items = s; }, next : function(){ return items.pop(); } }; }; Ext.Button = Ext.extend(Ext.BoxComponent, { hidden : false, disabled : false, pressed : false, enableToggle : false, menuAlign : 'tl-bl?', type : 'button', menuClassTarget : 'tr:nth(2)', clickEvent : 'click', handleMouseEvents : true, tooltipType : 'qtip', buttonSelector : 'button:first-child', scale : 'small', iconAlign : 'left', arrowAlign : 'right', initComponent : function(){ if(this.menu){ if (Ext.isArray(this.menu)){ this.menu = { items: this.menu }; } if (Ext.isObject(this.menu)){ this.menu.ownerCt = this; } this.menu = Ext.menu.MenuMgr.get(this.menu); this.menu.ownerCt = undefined; } Ext.Button.superclass.initComponent.call(this); this.addEvents( 'click', 'toggle', 'mouseover', 'mouseout', 'menushow', 'menuhide', 'menutriggerover', 'menutriggerout' ); if(Ext.isString(this.toggleGroup)){ this.enableToggle = true; } }, getTemplateArgs : function(){ return [this.type, 'x-btn-' + this.scale + ' x-btn-icon-' + this.scale + '-' + this.iconAlign, this.getMenuClass(), this.cls, this.id]; }, setButtonClass : function(){ if(this.useSetClass){ if(!Ext.isEmpty(this.oldCls)){ this.el.removeClass([this.oldCls, 'x-btn-pressed']); } this.oldCls = (this.iconCls || this.icon) ? (this.text ? 'x-btn-text-icon' : 'x-btn-icon') : 'x-btn-noicon'; this.el.addClass([this.oldCls, this.pressed ? 'x-btn-pressed' : null]); } }, getMenuClass : function(){ return this.menu ? (this.arrowAlign != 'bottom' ? 'x-btn-arrow' : 'x-btn-arrow-bottom') : ''; }, onRender : function(ct, position){ if(!this.template){ if(!Ext.Button.buttonTemplate){ Ext.Button.buttonTemplate = new Ext.Template( '', '', '', '', '
      
      
      
    '); Ext.Button.buttonTemplate.compile(); } this.template = Ext.Button.buttonTemplate; } var btn, targs = this.getTemplateArgs(); if(position){ btn = this.template.insertBefore(position, targs, true); }else{ btn = this.template.append(ct, targs, true); } this.btnEl = btn.child(this.buttonSelector); this.mon(this.btnEl, { scope: this, focus: this.onFocus, blur: this.onBlur }); this.initButtonEl(btn, this.btnEl); Ext.ButtonToggleMgr.register(this); }, initButtonEl : function(btn, btnEl){ this.el = btn; this.setIcon(this.icon); this.setText(this.text); this.setIconClass(this.iconCls); if(Ext.isDefined(this.tabIndex)){ btnEl.dom.tabIndex = this.tabIndex; } if(this.tooltip){ this.setTooltip(this.tooltip, true); } if(this.handleMouseEvents){ this.mon(btn, { scope: this, mouseover: this.onMouseOver, mousedown: this.onMouseDown }); } if(this.menu){ this.mon(this.menu, { scope: this, show: this.onMenuShow, hide: this.onMenuHide }); } if(this.repeat){ var repeater = new Ext.util.ClickRepeater(btn, Ext.isObject(this.repeat) ? this.repeat : {}); this.mon(repeater, 'click', this.onRepeatClick, this); }else{ this.mon(btn, this.clickEvent, this.onClick, this); } }, afterRender : function(){ Ext.Button.superclass.afterRender.call(this); this.useSetClass = true; this.setButtonClass(); this.doc = Ext.getDoc(); this.doAutoWidth(); }, setIconClass : function(cls){ this.iconCls = cls; if(this.el){ this.btnEl.dom.className = ''; this.btnEl.addClass(['x-btn-text', cls || '']); this.setButtonClass(); } return this; }, setTooltip : function(tooltip, initial){ if(this.rendered){ if(!initial){ this.clearTip(); } if(Ext.isObject(tooltip)){ Ext.QuickTips.register(Ext.apply({ target: this.btnEl.id }, tooltip)); this.tooltip = tooltip; }else{ this.btnEl.dom[this.tooltipType] = tooltip; } }else{ this.tooltip = tooltip; } return this; }, clearTip : function(){ if(Ext.isObject(this.tooltip)){ Ext.QuickTips.unregister(this.btnEl); } }, beforeDestroy : function(){ if(this.rendered){ this.clearTip(); } if(this.menu && this.destroyMenu !== false) { Ext.destroy(this.btnEl, this.menu); } Ext.destroy(this.repeater); }, onDestroy : function(){ if(this.rendered){ this.doc.un('mouseover', this.monitorMouseOver, this); this.doc.un('mouseup', this.onMouseUp, this); delete this.doc; delete this.btnEl; Ext.ButtonToggleMgr.unregister(this); } Ext.Button.superclass.onDestroy.call(this); }, doAutoWidth : function(){ if(this.autoWidth !== false && this.el && this.text && this.width === undefined){ this.el.setWidth('auto'); if(Ext.isIE7 && Ext.isStrict){ var ib = this.btnEl; if(ib && ib.getWidth() > 20){ ib.clip(); ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr')); } } if(this.minWidth){ if(this.el.getWidth() < this.minWidth){ this.el.setWidth(this.minWidth); } } } }, setHandler : function(handler, scope){ this.handler = handler; this.scope = scope; return this; }, setText : function(text){ this.text = text; if(this.el){ this.btnEl.update(text || ' '); this.setButtonClass(); } this.doAutoWidth(); return this; }, setIcon : function(icon){ this.icon = icon; if(this.el){ this.btnEl.setStyle('background-image', icon ? 'url(' + icon + ')' : ''); this.setButtonClass(); } return this; }, getText : function(){ return this.text; }, toggle : function(state, suppressEvent){ state = state === undefined ? !this.pressed : !!state; if(state != this.pressed){ if(this.rendered){ this.el[state ? 'addClass' : 'removeClass']('x-btn-pressed'); } this.pressed = state; if(!suppressEvent){ this.fireEvent('toggle', this, state); if(this.toggleHandler){ this.toggleHandler.call(this.scope || this, this, state); } } } return this; }, onDisable : function(){ this.onDisableChange(true); }, onEnable : function(){ this.onDisableChange(false); }, onDisableChange : function(disabled){ if(this.el){ if(!Ext.isIE6 || !this.text){ this.el[disabled ? 'addClass' : 'removeClass'](this.disabledClass); } this.el.dom.disabled = disabled; } this.disabled = disabled; }, showMenu : function(){ if(this.rendered && this.menu){ if(this.tooltip){ Ext.QuickTips.getQuickTip().cancelShow(this.btnEl); } if(this.menu.isVisible()){ this.menu.hide(); } this.menu.ownerCt = this; this.menu.show(this.el, this.menuAlign); } return this; }, hideMenu : function(){ if(this.hasVisibleMenu()){ this.menu.hide(); } return this; }, hasVisibleMenu : function(){ return this.menu && this.menu.ownerCt == this && this.menu.isVisible(); }, onRepeatClick : function(repeat, e){ this.onClick(e); }, onClick : function(e){ if(e){ e.preventDefault(); } if(e.button !== 0){ return; } if(!this.disabled){ this.doToggle(); if(this.menu && !this.hasVisibleMenu() && !this.ignoreNextClick){ this.showMenu(); } this.fireEvent('click', this, e); if(this.handler){ this.handler.call(this.scope || this, this, e); } } }, doToggle: function(){ if (this.enableToggle && (this.allowDepress !== false || !this.pressed)) { this.toggle(); } }, isMenuTriggerOver : function(e, internal){ return this.menu && !internal; }, isMenuTriggerOut : function(e, internal){ return this.menu && !internal; }, onMouseOver : function(e){ if(!this.disabled){ var internal = e.within(this.el, true); if(!internal){ this.el.addClass('x-btn-over'); if(!this.monitoringMouseOver){ this.doc.on('mouseover', this.monitorMouseOver, this); this.monitoringMouseOver = true; } this.fireEvent('mouseover', this, e); } if(this.isMenuTriggerOver(e, internal)){ this.fireEvent('menutriggerover', this, this.menu, e); } } }, monitorMouseOver : function(e){ if(e.target != this.el.dom && !e.within(this.el)){ if(this.monitoringMouseOver){ this.doc.un('mouseover', this.monitorMouseOver, this); this.monitoringMouseOver = false; } this.onMouseOut(e); } }, onMouseOut : function(e){ var internal = e.within(this.el) && e.target != this.el.dom; this.el.removeClass('x-btn-over'); this.fireEvent('mouseout', this, e); if(this.isMenuTriggerOut(e, internal)){ this.fireEvent('menutriggerout', this, this.menu, e); } }, focus : function() { this.btnEl.focus(); }, blur : function() { this.btnEl.blur(); }, onFocus : function(e){ if(!this.disabled){ this.el.addClass('x-btn-focus'); } }, onBlur : function(e){ this.el.removeClass('x-btn-focus'); }, getClickEl : function(e, isUp){ return this.el; }, onMouseDown : function(e){ if(!this.disabled && e.button === 0){ this.getClickEl(e).addClass('x-btn-click'); this.doc.on('mouseup', this.onMouseUp, this); } }, onMouseUp : function(e){ if(e.button === 0){ this.getClickEl(e, true).removeClass('x-btn-click'); this.doc.un('mouseup', this.onMouseUp, this); } }, onMenuShow : function(e){ if(this.menu.ownerCt == this){ this.menu.ownerCt = this; this.ignoreNextClick = 0; this.el.addClass('x-btn-menu-active'); this.fireEvent('menushow', this, this.menu); } }, onMenuHide : function(e){ if(this.menu.ownerCt == this){ this.el.removeClass('x-btn-menu-active'); this.ignoreNextClick = this.restoreClick.defer(250, this); this.fireEvent('menuhide', this, this.menu); delete this.menu.ownerCt; } }, restoreClick : function(){ this.ignoreNextClick = 0; } }); Ext.reg('button', Ext.Button); Ext.ButtonToggleMgr = function(){ var groups = {}; function toggleGroup(btn, state){ if(state){ var g = groups[btn.toggleGroup]; for(var i = 0, l = g.length; i < l; i++){ if(g[i] != btn){ g[i].toggle(false); } } } } return { register : function(btn){ if(!btn.toggleGroup){ return; } var g = groups[btn.toggleGroup]; if(!g){ g = groups[btn.toggleGroup] = []; } g.push(btn); btn.on('toggle', toggleGroup); }, unregister : function(btn){ if(!btn.toggleGroup){ return; } var g = groups[btn.toggleGroup]; if(g){ g.remove(btn); btn.un('toggle', toggleGroup); } }, getPressed : function(group){ var g = groups[group]; if(g){ for(var i = 0, len = g.length; i < len; i++){ if(g[i].pressed === true){ return g[i]; } } } return null; } }; }(); Ext.SplitButton = Ext.extend(Ext.Button, { arrowSelector : 'em', split: true, initComponent : function(){ Ext.SplitButton.superclass.initComponent.call(this); this.addEvents("arrowclick"); }, onRender : function(){ Ext.SplitButton.superclass.onRender.apply(this, arguments); if(this.arrowTooltip){ this.el.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip; } }, setArrowHandler : function(handler, scope){ this.arrowHandler = handler; this.scope = scope; }, getMenuClass : function(){ return 'x-btn-split' + (this.arrowAlign == 'bottom' ? '-bottom' : ''); }, isClickOnArrow : function(e){ if (this.arrowAlign != 'bottom') { var visBtn = this.el.child('em.x-btn-split'); var right = visBtn.getRegion().right - visBtn.getPadding('r'); return e.getPageX() > right; } else { return e.getPageY() > this.btnEl.getRegion().bottom; } }, onClick : function(e, t){ e.preventDefault(); if(!this.disabled){ if(this.isClickOnArrow(e)){ if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){ this.showMenu(); } this.fireEvent("arrowclick", this, e); if(this.arrowHandler){ this.arrowHandler.call(this.scope || this, this, e); } }else{ this.doToggle(); this.fireEvent("click", this, e); if(this.handler){ this.handler.call(this.scope || this, this, e); } } } }, isMenuTriggerOver : function(e){ return this.menu && e.target.tagName == this.arrowSelector; }, isMenuTriggerOut : function(e, internal){ return this.menu && e.target.tagName != this.arrowSelector; } }); Ext.reg('splitbutton', Ext.SplitButton); Ext.CycleButton = Ext.extend(Ext.SplitButton, { getItemText : function(item){ if(item && this.showText === true){ var text = ''; if(this.prependText){ text += this.prependText; } text += item.text; return text; } return undefined; }, setActiveItem : function(item, suppressEvent){ if(!Ext.isObject(item)){ item = this.menu.getComponent(item); } if(item){ if(!this.rendered){ this.text = this.getItemText(item); this.iconCls = item.iconCls; }else{ var t = this.getItemText(item); if(t){ this.setText(t); } this.setIconClass(item.iconCls); } this.activeItem = item; if(!item.checked){ item.setChecked(true, suppressEvent); } if(this.forceIcon){ this.setIconClass(this.forceIcon); } if(!suppressEvent){ this.fireEvent('change', this, item); } } }, getActiveItem : function(){ return this.activeItem; }, initComponent : function(){ this.addEvents( "change" ); if(this.changeHandler){ this.on('change', this.changeHandler, this.scope||this); delete this.changeHandler; } this.itemCount = this.items.length; this.menu = {cls:'x-cycle-menu', items:[]}; var checked = 0; Ext.each(this.items, function(item, i){ Ext.apply(item, { group: item.group || this.id, itemIndex: i, checkHandler: this.checkHandler, scope: this, checked: item.checked || false }); this.menu.items.push(item); if(item.checked){ checked = i; } }, this); Ext.CycleButton.superclass.initComponent.call(this); this.on('click', this.toggleSelected, this); this.setActiveItem(checked, true); }, checkHandler : function(item, pressed){ if(pressed){ this.setActiveItem(item); } }, toggleSelected : function(){ var m = this.menu; m.render(); if(!m.hasLayout){ m.doLayout(); } var nextIdx, checkItem; for (var i = 1; i < this.itemCount; i++) { nextIdx = (this.activeItem.itemIndex + i) % this.itemCount; checkItem = m.items.itemAt(nextIdx); if (!checkItem.disabled) { checkItem.setChecked(true); break; } } } }); Ext.reg('cycle', Ext.CycleButton); Ext.Toolbar = function(config){ if(Ext.isArray(config)){ config = {items: config, layout: 'toolbar'}; } else { config = Ext.apply({ layout: 'toolbar' }, config); if(config.buttons) { config.items = config.buttons; } } Ext.Toolbar.superclass.constructor.call(this, config); }; (function(){ var T = Ext.Toolbar; Ext.extend(T, Ext.Container, { defaultType: 'button', enableOverflow : false, trackMenus : true, internalDefaults: {removeMode: 'container', hideParent: true}, toolbarCls: 'x-toolbar', initComponent : function(){ T.superclass.initComponent.call(this); this.addEvents('overflowchange'); }, onRender : function(ct, position){ if(!this.el){ if(!this.autoCreate){ this.autoCreate = { cls: this.toolbarCls + ' x-small-editor' }; } this.el = ct.createChild(Ext.apply({ id: this.id },this.autoCreate), position); Ext.Toolbar.superclass.onRender.apply(this, arguments); } }, lookupComponent : function(c){ if(Ext.isString(c)){ if(c == '-'){ c = new T.Separator(); }else if(c == ' '){ c = new T.Spacer(); }else if(c == '->'){ c = new T.Fill(); }else{ c = new T.TextItem(c); } this.applyDefaults(c); }else{ if(c.isFormField || c.render){ c = this.createComponent(c); }else if(c.tag){ c = new T.Item({autoEl: c}); }else if(c.tagName){ c = new T.Item({el:c}); }else if(Ext.isObject(c)){ c = c.xtype ? this.createComponent(c) : this.constructButton(c); } } return c; }, applyDefaults : function(c){ if(!Ext.isString(c)){ c = Ext.Toolbar.superclass.applyDefaults.call(this, c); var d = this.internalDefaults; if(c.events){ Ext.applyIf(c.initialConfig, d); Ext.apply(c, d); }else{ Ext.applyIf(c, d); } } return c; }, addSeparator : function(){ return this.add(new T.Separator()); }, addSpacer : function(){ return this.add(new T.Spacer()); }, addFill : function(){ this.add(new T.Fill()); }, addElement : function(el){ return this.addItem(new T.Item({el:el})); }, addItem : function(item){ return this.add.apply(this, arguments); }, addButton : function(config){ if(Ext.isArray(config)){ var buttons = []; for(var i = 0, len = config.length; i < len; i++) { buttons.push(this.addButton(config[i])); } return buttons; } return this.add(this.constructButton(config)); }, addText : function(text){ return this.addItem(new T.TextItem(text)); }, addDom : function(config){ return this.add(new T.Item({autoEl: config})); }, addField : function(field){ return this.add(field); }, insertButton : function(index, item){ if(Ext.isArray(item)){ var buttons = []; for(var i = 0, len = item.length; i < len; i++) { buttons.push(this.insertButton(index + i, item[i])); } return buttons; } return Ext.Toolbar.superclass.insert.call(this, index, item); }, trackMenu : function(item, remove){ if(this.trackMenus && item.menu){ var method = remove ? 'mun' : 'mon'; this[method](item, 'menutriggerover', this.onButtonTriggerOver, this); this[method](item, 'menushow', this.onButtonMenuShow, this); this[method](item, 'menuhide', this.onButtonMenuHide, this); } }, constructButton : function(item){ var b = item.events ? item : this.createComponent(item, item.split ? 'splitbutton' : this.defaultType); return b; }, onAdd : function(c){ Ext.Toolbar.superclass.onAdd.call(this); this.trackMenu(c); if(this.disabled){ c.disable(); } }, onRemove : function(c){ Ext.Toolbar.superclass.onRemove.call(this); if (c == this.activeMenuBtn) { delete this.activeMenuBtn; } this.trackMenu(c, true); }, onDisable : function(){ this.items.each(function(item){ if(item.disable){ item.disable(); } }); }, onEnable : function(){ this.items.each(function(item){ if(item.enable){ item.enable(); } }); }, onButtonTriggerOver : function(btn){ if(this.activeMenuBtn && this.activeMenuBtn != btn){ this.activeMenuBtn.hideMenu(); btn.showMenu(); this.activeMenuBtn = btn; } }, onButtonMenuShow : function(btn){ this.activeMenuBtn = btn; }, onButtonMenuHide : function(btn){ delete this.activeMenuBtn; } }); Ext.reg('toolbar', Ext.Toolbar); T.Item = Ext.extend(Ext.BoxComponent, { hideParent: true, enable:Ext.emptyFn, disable:Ext.emptyFn, focus:Ext.emptyFn }); Ext.reg('tbitem', T.Item); T.Separator = Ext.extend(T.Item, { onRender : function(ct, position){ this.el = ct.createChild({tag:'span', cls:'xtb-sep'}, position); } }); Ext.reg('tbseparator', T.Separator); T.Spacer = Ext.extend(T.Item, { onRender : function(ct, position){ this.el = ct.createChild({tag:'div', cls:'xtb-spacer', style: this.width?'width:'+this.width+'px':''}, position); } }); Ext.reg('tbspacer', T.Spacer); T.Fill = Ext.extend(T.Item, { render : Ext.emptyFn, isFill : true }); Ext.reg('tbfill', T.Fill); T.TextItem = Ext.extend(T.Item, { constructor: function(config){ T.TextItem.superclass.constructor.call(this, Ext.isString(config) ? {text: config} : config); }, onRender : function(ct, position) { this.autoEl = {cls: 'xtb-text', html: this.text || ''}; T.TextItem.superclass.onRender.call(this, ct, position); }, setText : function(t) { if(this.rendered){ this.el.update(t); }else{ this.text = t; } } }); Ext.reg('tbtext', T.TextItem); T.Button = Ext.extend(Ext.Button, {}); T.SplitButton = Ext.extend(Ext.SplitButton, {}); Ext.reg('tbbutton', T.Button); Ext.reg('tbsplit', T.SplitButton); })(); Ext.ButtonGroup = Ext.extend(Ext.Panel, { baseCls: 'x-btn-group', layout:'table', defaultType: 'button', frame: true, internalDefaults: {removeMode: 'container', hideParent: true}, initComponent : function(){ this.layoutConfig = this.layoutConfig || {}; Ext.applyIf(this.layoutConfig, { columns : this.columns }); if(!this.title){ this.addClass('x-btn-group-notitle'); } this.on('afterlayout', this.onAfterLayout, this); Ext.ButtonGroup.superclass.initComponent.call(this); }, applyDefaults : function(c){ c = Ext.ButtonGroup.superclass.applyDefaults.call(this, c); var d = this.internalDefaults; if(c.events){ Ext.applyIf(c.initialConfig, d); Ext.apply(c, d); }else{ Ext.applyIf(c, d); } return c; }, onAfterLayout : function(){ var bodyWidth = this.body.getFrameWidth('lr') + this.body.dom.firstChild.offsetWidth; this.body.setWidth(bodyWidth); this.el.setWidth(bodyWidth + this.getFrameWidth()); } }); Ext.reg('buttongroup', Ext.ButtonGroup); (function() { var T = Ext.Toolbar; Ext.PagingToolbar = Ext.extend(Ext.Toolbar, { pageSize : 20, displayMsg : 'Displaying {0} - {1} of {2}', emptyMsg : 'No data to display', beforePageText : 'Page', afterPageText : 'of {0}', firstText : 'First Page', prevText : 'Previous Page', nextText : 'Next Page', lastText : 'Last Page', refreshText : 'Refresh', initComponent : function(){ var pagingItems = [this.first = new T.Button({ tooltip: this.firstText, overflowText: this.firstText, iconCls: 'x-tbar-page-first', disabled: true, handler: this.moveFirst, scope: this }), this.prev = new T.Button({ tooltip: this.prevText, overflowText: this.prevText, iconCls: 'x-tbar-page-prev', disabled: true, handler: this.movePrevious, scope: this }), '-', this.beforePageText, this.inputItem = new Ext.form.NumberField({ cls: 'x-tbar-page-number', allowDecimals: false, allowNegative: false, enableKeyEvents: true, selectOnFocus: true, submitValue: false, listeners: { scope: this, keydown: this.onPagingKeyDown, blur: this.onPagingBlur } }), this.afterTextItem = new T.TextItem({ text: String.format(this.afterPageText, 1) }), '-', this.next = new T.Button({ tooltip: this.nextText, overflowText: this.nextText, iconCls: 'x-tbar-page-next', disabled: true, handler: this.moveNext, scope: this }), this.last = new T.Button({ tooltip: this.lastText, overflowText: this.lastText, iconCls: 'x-tbar-page-last', disabled: true, handler: this.moveLast, scope: this }), '-', this.refresh = new T.Button({ tooltip: this.refreshText, overflowText: this.refreshText, iconCls: 'x-tbar-loading', handler: this.doRefresh, scope: this })]; var userItems = this.items || this.buttons || []; if (this.prependButtons) { this.items = userItems.concat(pagingItems); }else{ this.items = pagingItems.concat(userItems); } delete this.buttons; if(this.displayInfo){ this.items.push('->'); this.items.push(this.displayItem = new T.TextItem({})); } Ext.PagingToolbar.superclass.initComponent.call(this); this.addEvents( 'change', 'beforechange' ); this.on('afterlayout', this.onFirstLayout, this, {single: true}); this.cursor = 0; this.bindStore(this.store, true); }, onFirstLayout : function(){ if(this.dsLoaded){ this.onLoad.apply(this, this.dsLoaded); } }, updateInfo : function(){ if(this.displayItem){ var count = this.store.getCount(); var msg = count == 0 ? this.emptyMsg : String.format( this.displayMsg, this.cursor+1, this.cursor+count, this.store.getTotalCount() ); this.displayItem.setText(msg); } }, onLoad : function(store, r, o){ if(!this.rendered){ this.dsLoaded = [store, r, o]; return; } var p = this.getParams(); this.cursor = (o.params && o.params[p.start]) ? o.params[p.start] : 0; var d = this.getPageData(), ap = d.activePage, ps = d.pages; this.afterTextItem.setText(String.format(this.afterPageText, d.pages)); this.inputItem.setValue(ap); this.first.setDisabled(ap == 1); this.prev.setDisabled(ap == 1); this.next.setDisabled(ap == ps); this.last.setDisabled(ap == ps); this.refresh.enable(); this.updateInfo(); this.fireEvent('change', this, d); }, getPageData : function(){ var total = this.store.getTotalCount(); return { total : total, activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize), pages : total < this.pageSize ? 1 : Math.ceil(total/this.pageSize) }; }, changePage : function(page){ this.doLoad(((page-1) * this.pageSize).constrain(0, this.store.getTotalCount())); }, onLoadError : function(){ if(!this.rendered){ return; } this.refresh.enable(); }, readPage : function(d){ var v = this.inputItem.getValue(), pageNum; if (!v || isNaN(pageNum = parseInt(v, 10))) { this.inputItem.setValue(d.activePage); return false; } return pageNum; }, onPagingFocus : function(){ this.inputItem.select(); }, onPagingBlur : function(e){ this.inputItem.setValue(this.getPageData().activePage); }, onPagingKeyDown : function(field, e){ var k = e.getKey(), d = this.getPageData(), pageNum; if (k == e.RETURN) { e.stopEvent(); pageNum = this.readPage(d); if(pageNum !== false){ pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1; this.doLoad(pageNum * this.pageSize); } }else if (k == e.HOME || k == e.END){ e.stopEvent(); pageNum = k == e.HOME ? 1 : d.pages; field.setValue(pageNum); }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){ e.stopEvent(); if((pageNum = this.readPage(d))){ var increment = e.shiftKey ? 10 : 1; if(k == e.DOWN || k == e.PAGEDOWN){ increment *= -1; } pageNum += increment; if(pageNum >= 1 & pageNum <= d.pages){ field.setValue(pageNum); } } } }, getParams : function(){ return this.paramNames || this.store.paramNames; }, beforeLoad : function(){ if(this.rendered && this.refresh){ this.refresh.disable(); } }, doLoad : function(start){ var o = {}, pn = this.getParams(); o[pn.start] = start; o[pn.limit] = this.pageSize; if(this.fireEvent('beforechange', this, o) !== false){ this.store.load({params:o}); } }, moveFirst : function(){ this.doLoad(0); }, movePrevious : function(){ this.doLoad(Math.max(0, this.cursor-this.pageSize)); }, moveNext : function(){ this.doLoad(this.cursor+this.pageSize); }, moveLast : function(){ var total = this.store.getTotalCount(), extra = total % this.pageSize; this.doLoad(extra ? (total - extra) : total - this.pageSize); }, doRefresh : function(){ this.doLoad(this.cursor); }, bindStore : function(store, initial){ var doLoad; if(!initial && this.store){ if(store !== this.store && this.store.autoDestroy){ this.store.destroy(); }else{ this.store.un('beforeload', this.beforeLoad, this); this.store.un('load', this.onLoad, this); this.store.un('exception', this.onLoadError, this); } if(!store){ this.store = null; } } if(store){ store = Ext.StoreMgr.lookup(store); store.on({ scope: this, beforeload: this.beforeLoad, load: this.onLoad, exception: this.onLoadError }); doLoad = true; } this.store = store; if(doLoad){ this.onLoad(store, null, {}); } }, unbind : function(store){ this.bindStore(null); }, bind : function(store){ this.bindStore(store); }, onDestroy : function(){ this.bindStore(null); Ext.PagingToolbar.superclass.onDestroy.call(this); } }); })(); Ext.reg('paging', Ext.PagingToolbar); Ext.History = (function () { var iframe, hiddenField; var ready = false; var currentToken; function getHash() { var href = location.href, i = href.indexOf("#"), hash = i >= 0 ? href.substr(i + 1) : null; if (Ext.isGecko) { hash = decodeURIComponent(hash); } return hash; } function doSave() { hiddenField.value = currentToken; } function handleStateChange(token) { currentToken = token; Ext.History.fireEvent('change', token); } function updateIFrame (token) { var html = ['
    ',Ext.util.Format.htmlEncode(token),'
    '].join(''); try { var doc = iframe.contentWindow.document; doc.open(); doc.write(html); doc.close(); return true; } catch (e) { return false; } } function checkIFrame() { if (!iframe.contentWindow || !iframe.contentWindow.document) { setTimeout(checkIFrame, 10); return; } var doc = iframe.contentWindow.document; var elem = doc.getElementById("state"); var token = elem ? elem.innerText : null; var hash = getHash(); setInterval(function () { doc = iframe.contentWindow.document; elem = doc.getElementById("state"); var newtoken = elem ? elem.innerText : null; var newHash = getHash(); if (newtoken !== token) { token = newtoken; handleStateChange(token); location.hash = token; hash = token; doSave(); } else if (newHash !== hash) { hash = newHash; updateIFrame(newHash); } }, 50); ready = true; Ext.History.fireEvent('ready', Ext.History); } function startUp() { currentToken = hiddenField.value ? hiddenField.value : getHash(); if (Ext.isIE) { checkIFrame(); } else { var hash = getHash(); setInterval(function () { var newHash = getHash(); if (newHash !== hash) { hash = newHash; handleStateChange(hash); doSave(); } }, 50); ready = true; Ext.History.fireEvent('ready', Ext.History); } } return { fieldId: 'x-history-field', iframeId: 'x-history-frame', events:{}, init: function (onReady, scope) { if(ready) { Ext.callback(onReady, scope, [this]); return; } if(!Ext.isReady){ Ext.onReady(function(){ Ext.History.init(onReady, scope); }); return; } hiddenField = Ext.getDom(Ext.History.fieldId); if (Ext.isIE) { iframe = Ext.getDom(Ext.History.iframeId); } this.addEvents( 'ready', 'change' ); if(onReady){ this.on('ready', onReady, scope, {single:true}); } startUp(); }, add: function (token, preventDup) { if(preventDup !== false){ if(this.getToken() == token){ return true; } } if (Ext.isIE) { return updateIFrame(token); } else { location.hash = token; return true; } }, back: function(){ history.go(-1); }, forward: function(){ history.go(1); }, getToken: function() { return ready ? currentToken : getHash(); } }; })(); Ext.apply(Ext.History, new Ext.util.Observable()); Ext.Tip = Ext.extend(Ext.Panel, { minWidth : 40, maxWidth : 300, shadow : "sides", defaultAlign : "tl-bl?", autoRender: true, quickShowInterval : 250, frame:true, hidden:true, baseCls: 'x-tip', floating:{shadow:true,shim:true,useDisplay:true,constrain:false}, autoHeight:true, closeAction: 'hide', initComponent : function(){ Ext.Tip.superclass.initComponent.call(this); if(this.closable && !this.title){ this.elements += ',header'; } }, afterRender : function(){ Ext.Tip.superclass.afterRender.call(this); if(this.closable){ this.addTool({ id: 'close', handler: this[this.closeAction], scope: this }); } }, showAt : function(xy){ Ext.Tip.superclass.show.call(this); if(this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != 'number')){ this.doAutoWidth(); } if(this.constrainPosition){ xy = this.el.adjustForConstraints(xy); } this.setPagePosition(xy[0], xy[1]); }, doAutoWidth : function(adjust){ adjust = adjust || 0; var bw = this.body.getTextWidth(); if(this.title){ bw = Math.max(bw, this.header.child('span').getTextWidth(this.title)); } bw += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr") + adjust; this.setWidth(bw.constrain(this.minWidth, this.maxWidth)); if(Ext.isIE7 && !this.repainted){ this.el.repaint(); this.repainted = true; } }, showBy : function(el, pos){ if(!this.rendered){ this.render(Ext.getBody()); } this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign)); }, initDraggable : function(){ this.dd = new Ext.Tip.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable); this.header.addClass('x-tip-draggable'); } }); Ext.reg('tip', Ext.Tip); Ext.Tip.DD = function(tip, config){ Ext.apply(this, config); this.tip = tip; Ext.Tip.DD.superclass.constructor.call(this, tip.el.id, 'WindowDD-'+tip.id); this.setHandleElId(tip.header.id); this.scroll = false; }; Ext.extend(Ext.Tip.DD, Ext.dd.DD, { moveOnly:true, scroll:false, headerOffsets:[100, 25], startDrag : function(){ this.tip.el.disableShadow(); }, endDrag : function(e){ this.tip.el.enableShadow(true); } }); Ext.ToolTip = Ext.extend(Ext.Tip, { showDelay : 500, hideDelay : 200, dismissDelay : 5000, trackMouse : false, anchorToTarget : true, anchorOffset : 0, targetCounter : 0, constrainPosition : false, initComponent : function(){ Ext.ToolTip.superclass.initComponent.call(this); this.lastActive = new Date(); this.initTarget(this.target); this.origAnchor = this.anchor; }, onRender : function(ct, position){ Ext.ToolTip.superclass.onRender.call(this, ct, position); this.anchorCls = 'x-tip-anchor-' + this.getAnchorPosition(); this.anchorEl = this.el.createChild({ cls: 'x-tip-anchor ' + this.anchorCls }); }, afterRender : function(){ Ext.ToolTip.superclass.afterRender.call(this); this.anchorEl.setStyle('z-index', this.el.getZIndex() + 1).setVisibilityMode(Ext.Element.DISPLAY); }, initTarget : function(target){ var t; if((t = Ext.get(target))){ if(this.target){ var tg = Ext.get(this.target); this.mun(tg, 'mouseover', this.onTargetOver, this); this.mun(tg, 'mouseout', this.onTargetOut, this); this.mun(tg, 'mousemove', this.onMouseMove, this); } this.mon(t, { mouseover: this.onTargetOver, mouseout: this.onTargetOut, mousemove: this.onMouseMove, scope: this }); this.target = t; } if(this.anchor){ this.anchorTarget = this.target; } }, onMouseMove : function(e){ var t = this.delegate ? e.getTarget(this.delegate) : this.triggerElement = true; if (t) { this.targetXY = e.getXY(); if (t === this.triggerElement) { if(!this.hidden && this.trackMouse){ this.setPagePosition(this.getTargetXY()); } } else { this.hide(); this.lastActive = new Date(0); this.onTargetOver(e); } } else if (!this.closable && this.isVisible()) { this.hide(); } }, getTargetXY : function(){ if(this.delegate){ this.anchorTarget = this.triggerElement; } if(this.anchor){ this.targetCounter++; var offsets = this.getOffsets(), xy = (this.anchorToTarget && !this.trackMouse) ? this.el.getAlignToXY(this.anchorTarget, this.getAnchorAlign()) : this.targetXY, dw = Ext.lib.Dom.getViewWidth() - 5, dh = Ext.lib.Dom.getViewHeight() - 5, de = document.documentElement, bd = document.body, scrollX = (de.scrollLeft || bd.scrollLeft || 0) + 5, scrollY = (de.scrollTop || bd.scrollTop || 0) + 5, axy = [xy[0] + offsets[0], xy[1] + offsets[1]], sz = this.getSize(); this.anchorEl.removeClass(this.anchorCls); if(this.targetCounter < 2){ if(axy[0] < scrollX){ if(this.anchorToTarget){ this.defaultAlign = 'l-r'; if(this.mouseOffset){this.mouseOffset[0] *= -1;} } this.anchor = 'left'; return this.getTargetXY(); } if(axy[0]+sz.width > dw){ if(this.anchorToTarget){ this.defaultAlign = 'r-l'; if(this.mouseOffset){this.mouseOffset[0] *= -1;} } this.anchor = 'right'; return this.getTargetXY(); } if(axy[1] < scrollY){ if(this.anchorToTarget){ this.defaultAlign = 't-b'; if(this.mouseOffset){this.mouseOffset[1] *= -1;} } this.anchor = 'top'; return this.getTargetXY(); } if(axy[1]+sz.height > dh){ if(this.anchorToTarget){ this.defaultAlign = 'b-t'; if(this.mouseOffset){this.mouseOffset[1] *= -1;} } this.anchor = 'bottom'; return this.getTargetXY(); } } this.anchorCls = 'x-tip-anchor-'+this.getAnchorPosition(); this.anchorEl.addClass(this.anchorCls); this.targetCounter = 0; return axy; }else{ var mouseOffset = this.getMouseOffset(); return [this.targetXY[0]+mouseOffset[0], this.targetXY[1]+mouseOffset[1]]; } }, getMouseOffset : function(){ var offset = this.anchor ? [0,0] : [15,18]; if(this.mouseOffset){ offset[0] += this.mouseOffset[0]; offset[1] += this.mouseOffset[1]; } return offset; }, getAnchorPosition : function(){ if(this.anchor){ this.tipAnchor = this.anchor.charAt(0); }else{ var m = this.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/); if(!m){ throw 'AnchorTip.defaultAlign is invalid'; } this.tipAnchor = m[1].charAt(0); } switch(this.tipAnchor){ case 't': return 'top'; case 'b': return 'bottom'; case 'r': return 'right'; } return 'left'; }, getAnchorAlign : function(){ switch(this.anchor){ case 'top' : return 'tl-bl'; case 'left' : return 'tl-tr'; case 'right': return 'tr-tl'; default : return 'bl-tl'; } }, getOffsets : function(){ var offsets, ap = this.getAnchorPosition().charAt(0); if(this.anchorToTarget && !this.trackMouse){ switch(ap){ case 't': offsets = [0, 9]; break; case 'b': offsets = [0, -13]; break; case 'r': offsets = [-13, 0]; break; default: offsets = [9, 0]; break; } }else{ switch(ap){ case 't': offsets = [-15-this.anchorOffset, 30]; break; case 'b': offsets = [-19-this.anchorOffset, -13-this.el.dom.offsetHeight]; break; case 'r': offsets = [-15-this.el.dom.offsetWidth, -13-this.anchorOffset]; break; default: offsets = [25, -13-this.anchorOffset]; break; } } var mouseOffset = this.getMouseOffset(); offsets[0] += mouseOffset[0]; offsets[1] += mouseOffset[1]; return offsets; }, onTargetOver : function(e){ if(this.disabled || e.within(this.target.dom, true)){ return; } var t = e.getTarget(this.delegate); if (t) { this.triggerElement = t; this.clearTimer('hide'); this.targetXY = e.getXY(); this.delayShow(); } }, delayShow : function(){ if(this.hidden && !this.showTimer){ if(this.lastActive.getElapsed() < this.quickShowInterval){ this.show(); }else{ this.showTimer = this.show.defer(this.showDelay, this); } }else if(!this.hidden && this.autoHide !== false){ this.show(); } }, onTargetOut : function(e){ if(this.disabled || e.within(this.target.dom, true)){ return; } this.clearTimer('show'); if(this.autoHide !== false){ this.delayHide(); } }, delayHide : function(){ if(!this.hidden && !this.hideTimer){ this.hideTimer = this.hide.defer(this.hideDelay, this); } }, hide: function(){ this.clearTimer('dismiss'); this.lastActive = new Date(); if(this.anchorEl){ this.anchorEl.hide(); } Ext.ToolTip.superclass.hide.call(this); delete this.triggerElement; }, show : function(){ if(this.anchor){ this.showAt([-1000,-1000]); this.origConstrainPosition = this.constrainPosition; this.constrainPosition = false; this.anchor = this.origAnchor; } this.showAt(this.getTargetXY()); if(this.anchor){ this.anchorEl.show(); this.syncAnchor(); this.constrainPosition = this.origConstrainPosition; }else{ this.anchorEl.hide(); } }, showAt : function(xy){ this.lastActive = new Date(); this.clearTimers(); Ext.ToolTip.superclass.showAt.call(this, xy); if(this.dismissDelay && this.autoHide !== false){ this.dismissTimer = this.hide.defer(this.dismissDelay, this); } if(this.anchor && !this.anchorEl.isVisible()){ this.syncAnchor(); this.anchorEl.show(); }else{ this.anchorEl.hide(); } }, syncAnchor : function(){ var anchorPos, targetPos, offset; switch(this.tipAnchor.charAt(0)){ case 't': anchorPos = 'b'; targetPos = 'tl'; offset = [20+this.anchorOffset, 2]; break; case 'r': anchorPos = 'l'; targetPos = 'tr'; offset = [-2, 11+this.anchorOffset]; break; case 'b': anchorPos = 't'; targetPos = 'bl'; offset = [20+this.anchorOffset, -2]; break; default: anchorPos = 'r'; targetPos = 'tl'; offset = [2, 11+this.anchorOffset]; break; } this.anchorEl.alignTo(this.el, anchorPos+'-'+targetPos, offset); }, setPagePosition : function(x, y){ Ext.ToolTip.superclass.setPagePosition.call(this, x, y); if(this.anchor){ this.syncAnchor(); } }, clearTimer : function(name){ name = name + 'Timer'; clearTimeout(this[name]); delete this[name]; }, clearTimers : function(){ this.clearTimer('show'); this.clearTimer('dismiss'); this.clearTimer('hide'); }, onShow : function(){ Ext.ToolTip.superclass.onShow.call(this); Ext.getDoc().on('mousedown', this.onDocMouseDown, this); }, onHide : function(){ Ext.ToolTip.superclass.onHide.call(this); Ext.getDoc().un('mousedown', this.onDocMouseDown, this); }, onDocMouseDown : function(e){ if(this.autoHide !== true && !this.closable && !e.within(this.el.dom)){ this.disable(); this.doEnable.defer(100, this); } }, doEnable : function(){ if(!this.isDestroyed){ this.enable(); } }, onDisable : function(){ this.clearTimers(); this.hide(); }, adjustPosition : function(x, y){ if(this.constrainPosition){ var ay = this.targetXY[1], h = this.getSize().height; if(y <= ay && (y+h) >= ay){ y = ay-h-5; } } return {x : x, y: y}; }, beforeDestroy : function(){ this.clearTimers(); Ext.destroy(this.anchorEl); delete this.anchorEl; delete this.target; delete this.anchorTarget; delete this.triggerElement; Ext.ToolTip.superclass.beforeDestroy.call(this); }, onDestroy : function(){ Ext.getDoc().un('mousedown', this.onDocMouseDown, this); Ext.ToolTip.superclass.onDestroy.call(this); } }); Ext.reg('tooltip', Ext.ToolTip); Ext.QuickTip = Ext.extend(Ext.ToolTip, { interceptTitles : false, tagConfig : { namespace : "ext", attribute : "qtip", width : "qwidth", target : "target", title : "qtitle", hide : "hide", cls : "qclass", align : "qalign", anchor : "anchor" }, initComponent : function(){ this.target = this.target || Ext.getDoc(); this.targets = this.targets || {}; Ext.QuickTip.superclass.initComponent.call(this); }, register : function(config){ var cs = Ext.isArray(config) ? config : arguments; for(var i = 0, len = cs.length; i < len; i++){ var c = cs[i]; var target = c.target; if(target){ if(Ext.isArray(target)){ for(var j = 0, jlen = target.length; j < jlen; j++){ this.targets[Ext.id(target[j])] = c; } } else{ this.targets[Ext.id(target)] = c; } } } }, unregister : function(el){ delete this.targets[Ext.id(el)]; }, cancelShow: function(el){ var at = this.activeTarget; el = Ext.get(el).dom; if(this.isVisible()){ if(at && at.el == el){ this.hide(); } }else if(at && at.el == el){ this.clearTimer('show'); } }, getTipCfg: function(e) { var t = e.getTarget(), ttp, cfg; if(this.interceptTitles && t.title && Ext.isString(t.title)){ ttp = t.title; t.qtip = ttp; t.removeAttribute("title"); e.preventDefault(); }else{ cfg = this.tagConfig; ttp = t.qtip || Ext.fly(t).getAttribute(cfg.attribute, cfg.namespace); } return ttp; }, onTargetOver : function(e){ if(this.disabled){ return; } this.targetXY = e.getXY(); var t = e.getTarget(); if(!t || t.nodeType !== 1 || t == document || t == document.body){ return; } if(this.activeTarget && ((t == this.activeTarget.el) || Ext.fly(this.activeTarget.el).contains(t))){ this.clearTimer('hide'); this.show(); return; } if(t && this.targets[t.id]){ this.activeTarget = this.targets[t.id]; this.activeTarget.el = t; this.anchor = this.activeTarget.anchor; if(this.anchor){ this.anchorTarget = t; } this.delayShow(); return; } var ttp, et = Ext.fly(t), cfg = this.tagConfig, ns = cfg.namespace; if(ttp = this.getTipCfg(e)){ var autoHide = et.getAttribute(cfg.hide, ns); this.activeTarget = { el: t, text: ttp, width: et.getAttribute(cfg.width, ns), autoHide: autoHide != "user" && autoHide !== 'false', title: et.getAttribute(cfg.title, ns), cls: et.getAttribute(cfg.cls, ns), align: et.getAttribute(cfg.align, ns) }; this.anchor = et.getAttribute(cfg.anchor, ns); if(this.anchor){ this.anchorTarget = t; } this.delayShow(); } }, onTargetOut : function(e){ if (this.activeTarget && e.within(this.activeTarget.el) && !this.getTipCfg(e)) { return; } this.clearTimer('show'); if(this.autoHide !== false){ this.delayHide(); } }, showAt : function(xy){ var t = this.activeTarget; if(t){ if(!this.rendered){ this.render(Ext.getBody()); this.activeTarget = t; } if(t.width){ this.setWidth(t.width); this.body.setWidth(this.adjustBodyWidth(t.width - this.getFrameWidth())); this.measureWidth = false; } else{ this.measureWidth = true; } this.setTitle(t.title || ''); this.body.update(t.text); this.autoHide = t.autoHide; this.dismissDelay = t.dismissDelay || this.dismissDelay; if(this.lastCls){ this.el.removeClass(this.lastCls); delete this.lastCls; } if(t.cls){ this.el.addClass(t.cls); this.lastCls = t.cls; } if(this.anchor){ this.constrainPosition = false; }else if(t.align){ xy = this.el.getAlignToXY(t.el, t.align); this.constrainPosition = false; }else{ this.constrainPosition = true; } } Ext.QuickTip.superclass.showAt.call(this, xy); }, hide: function(){ delete this.activeTarget; Ext.QuickTip.superclass.hide.call(this); } }); Ext.reg('quicktip', Ext.QuickTip); Ext.QuickTips = function(){ var tip, disabled = false; return { init : function(autoRender){ if(!tip){ if(!Ext.isReady){ Ext.onReady(function(){ Ext.QuickTips.init(autoRender); }); return; } tip = new Ext.QuickTip({ elements:'header,body', disabled: disabled }); if(autoRender !== false){ tip.render(Ext.getBody()); } } }, ddDisable : function(){ if(tip && !disabled){ tip.disable(); } }, ddEnable : function(){ if(tip && !disabled){ tip.enable(); } }, enable : function(){ if(tip){ tip.enable(); } disabled = false; }, disable : function(){ if(tip){ tip.disable(); } disabled = true; }, isEnabled : function(){ return tip !== undefined && !tip.disabled; }, getQuickTip : function(){ return tip; }, register : function(){ tip.register.apply(tip, arguments); }, unregister : function(){ tip.unregister.apply(tip, arguments); }, tips : function(){ tip.register.apply(tip, arguments); } }; }(); Ext.slider.Tip = Ext.extend(Ext.Tip, { minWidth: 10, offsets : [0, -10], init: function(slider) { slider.on({ scope : this, dragstart: this.onSlide, drag : this.onSlide, dragend : this.hide, destroy : this.destroy }); }, onSlide : function(slider, e, thumb) { this.show(); this.body.update(this.getText(thumb)); this.doAutoWidth(); this.el.alignTo(thumb.el, 'b-t?', this.offsets); }, getText : function(thumb) { return String(thumb.value); } }); Ext.ux.SliderTip = Ext.slider.Tip; Ext.tree.TreePanel = Ext.extend(Ext.Panel, { rootVisible : true, animate : Ext.enableFx, lines : true, enableDD : false, hlDrop : Ext.enableFx, pathSeparator : '/', bubbleEvents : [], initComponent : function(){ Ext.tree.TreePanel.superclass.initComponent.call(this); if(!this.eventModel){ this.eventModel = new Ext.tree.TreeEventModel(this); } var l = this.loader; if(!l){ l = new Ext.tree.TreeLoader({ dataUrl: this.dataUrl, requestMethod: this.requestMethod }); }else if(Ext.isObject(l) && !l.load){ l = new Ext.tree.TreeLoader(l); } this.loader = l; this.nodeHash = {}; if(this.root){ var r = this.root; delete this.root; this.setRootNode(r); } this.addEvents( 'append', 'remove', 'movenode', 'insert', 'beforeappend', 'beforeremove', 'beforemovenode', 'beforeinsert', 'beforeload', 'load', 'textchange', 'beforeexpandnode', 'beforecollapsenode', 'expandnode', 'disabledchange', 'collapsenode', 'beforeclick', 'click', 'containerclick', 'checkchange', 'beforedblclick', 'dblclick', 'containerdblclick', 'contextmenu', 'containercontextmenu', 'beforechildrenrendered', 'startdrag', 'enddrag', 'dragdrop', 'beforenodedrop', 'nodedrop', 'nodedragover' ); if(this.singleExpand){ this.on('beforeexpandnode', this.restrictExpand, this); } }, proxyNodeEvent : function(ename, a1, a2, a3, a4, a5, a6){ if(ename == 'collapse' || ename == 'expand' || ename == 'beforecollapse' || ename == 'beforeexpand' || ename == 'move' || ename == 'beforemove'){ ename = ename+'node'; } return this.fireEvent(ename, a1, a2, a3, a4, a5, a6); }, getRootNode : function(){ return this.root; }, setRootNode : function(node){ this.destroyRoot(); if(!node.render){ node = this.loader.createNode(node); } this.root = node; node.ownerTree = this; node.isRoot = true; this.registerNode(node); if(!this.rootVisible){ var uiP = node.attributes.uiProvider; node.ui = uiP ? new uiP(node) : new Ext.tree.RootTreeNodeUI(node); } if(this.innerCt){ this.clearInnerCt(); this.renderRoot(); } return node; }, clearInnerCt : function(){ this.innerCt.update(''); }, renderRoot : function(){ this.root.render(); if(!this.rootVisible){ this.root.renderChildren(); } }, getNodeById : function(id){ return this.nodeHash[id]; }, registerNode : function(node){ this.nodeHash[node.id] = node; }, unregisterNode : function(node){ delete this.nodeHash[node.id]; }, toString : function(){ return '[Tree'+(this.id?' '+this.id:'')+']'; }, restrictExpand : function(node){ var p = node.parentNode; if(p){ if(p.expandedChild && p.expandedChild.parentNode == p){ p.expandedChild.collapse(); } p.expandedChild = node; } }, getChecked : function(a, startNode){ startNode = startNode || this.root; var r = []; var f = function(){ if(this.attributes.checked){ r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a])); } }; startNode.cascade(f); return r; }, getLoader : function(){ return this.loader; }, expandAll : function(){ this.root.expand(true); }, collapseAll : function(){ this.root.collapse(true); }, getSelectionModel : function(){ if(!this.selModel){ this.selModel = new Ext.tree.DefaultSelectionModel(); } return this.selModel; }, expandPath : function(path, attr, callback){ if(Ext.isEmpty(path)){ if(callback){ callback(false, undefined); } return; } attr = attr || 'id'; var keys = path.split(this.pathSeparator); var curNode = this.root; if(curNode.attributes[attr] != keys[1]){ if(callback){ callback(false, null); } return; } var index = 1; var f = function(){ if(++index == keys.length){ if(callback){ callback(true, curNode); } return; } var c = curNode.findChild(attr, keys[index]); if(!c){ if(callback){ callback(false, curNode); } return; } curNode = c; c.expand(false, false, f); }; curNode.expand(false, false, f); }, selectPath : function(path, attr, callback){ if(Ext.isEmpty(path)){ if(callback){ callback(false, undefined); } return; } attr = attr || 'id'; var keys = path.split(this.pathSeparator), v = keys.pop(); if(keys.length > 1){ var f = function(success, node){ if(success && node){ var n = node.findChild(attr, v); if(n){ n.select(); if(callback){ callback(true, n); } }else if(callback){ callback(false, n); } }else{ if(callback){ callback(false, n); } } }; this.expandPath(keys.join(this.pathSeparator), attr, f); }else{ this.root.select(); if(callback){ callback(true, this.root); } } }, getTreeEl : function(){ return this.body; }, onRender : function(ct, position){ Ext.tree.TreePanel.superclass.onRender.call(this, ct, position); this.el.addClass('x-tree'); this.innerCt = this.body.createChild({tag:'ul', cls:'x-tree-root-ct ' + (this.useArrows ? 'x-tree-arrows' : this.lines ? 'x-tree-lines' : 'x-tree-no-lines')}); }, initEvents : function(){ Ext.tree.TreePanel.superclass.initEvents.call(this); if(this.containerScroll){ Ext.dd.ScrollManager.register(this.body); } if((this.enableDD || this.enableDrop) && !this.dropZone){ this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || { ddGroup: this.ddGroup || 'TreeDD', appendOnly: this.ddAppendOnly === true }); } if((this.enableDD || this.enableDrag) && !this.dragZone){ this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || { ddGroup: this.ddGroup || 'TreeDD', scroll: this.ddScroll }); } this.getSelectionModel().init(this); }, afterRender : function(){ Ext.tree.TreePanel.superclass.afterRender.call(this); this.renderRoot(); }, beforeDestroy : function(){ if(this.rendered){ Ext.dd.ScrollManager.unregister(this.body); Ext.destroy(this.dropZone, this.dragZone); } this.destroyRoot(); Ext.destroy(this.loader); this.nodeHash = this.root = this.loader = null; Ext.tree.TreePanel.superclass.beforeDestroy.call(this); }, destroyRoot : function(){ if(this.root && this.root.destroy){ this.root.destroy(true); } } }); Ext.tree.TreePanel.nodeTypes = {}; Ext.reg('treepanel', Ext.tree.TreePanel);Ext.tree.TreeEventModel = function(tree){ this.tree = tree; this.tree.on('render', this.initEvents, this); }; Ext.tree.TreeEventModel.prototype = { initEvents : function(){ var t = this.tree; if(t.trackMouseOver !== false){ t.mon(t.innerCt, { scope: this, mouseover: this.delegateOver, mouseout: this.delegateOut }); } t.mon(t.getTreeEl(), { scope: this, click: this.delegateClick, dblclick: this.delegateDblClick, contextmenu: this.delegateContextMenu }); }, getNode : function(e){ var t; if(t = e.getTarget('.x-tree-node-el', 10)){ var id = Ext.fly(t, '_treeEvents').getAttribute('tree-node-id', 'ext'); if(id){ return this.tree.getNodeById(id); } } return null; }, getNodeTarget : function(e){ var t = e.getTarget('.x-tree-node-icon', 1); if(!t){ t = e.getTarget('.x-tree-node-el', 6); } return t; }, delegateOut : function(e, t){ if(!this.beforeEvent(e)){ return; } if(e.getTarget('.x-tree-ec-icon', 1)){ var n = this.getNode(e); this.onIconOut(e, n); if(n == this.lastEcOver){ delete this.lastEcOver; } } if((t = this.getNodeTarget(e)) && !e.within(t, true)){ this.onNodeOut(e, this.getNode(e)); } }, delegateOver : function(e, t){ if(!this.beforeEvent(e)){ return; } if(Ext.isGecko && !this.trackingDoc){ Ext.getBody().on('mouseover', this.trackExit, this); this.trackingDoc = true; } if(this.lastEcOver){ this.onIconOut(e, this.lastEcOver); delete this.lastEcOver; } if(e.getTarget('.x-tree-ec-icon', 1)){ this.lastEcOver = this.getNode(e); this.onIconOver(e, this.lastEcOver); } if(t = this.getNodeTarget(e)){ this.onNodeOver(e, this.getNode(e)); } }, trackExit : function(e){ if(this.lastOverNode){ if(this.lastOverNode.ui && !e.within(this.lastOverNode.ui.getEl())){ this.onNodeOut(e, this.lastOverNode); } delete this.lastOverNode; Ext.getBody().un('mouseover', this.trackExit, this); this.trackingDoc = false; } }, delegateClick : function(e, t){ if(this.beforeEvent(e)){ if(e.getTarget('input[type=checkbox]', 1)){ this.onCheckboxClick(e, this.getNode(e)); }else if(e.getTarget('.x-tree-ec-icon', 1)){ this.onIconClick(e, this.getNode(e)); }else if(this.getNodeTarget(e)){ this.onNodeClick(e, this.getNode(e)); } }else{ this.checkContainerEvent(e, 'click'); } }, delegateDblClick : function(e, t){ if(this.beforeEvent(e)){ if(this.getNodeTarget(e)){ this.onNodeDblClick(e, this.getNode(e)); } }else{ this.checkContainerEvent(e, 'dblclick'); } }, delegateContextMenu : function(e, t){ if(this.beforeEvent(e)){ if(this.getNodeTarget(e)){ this.onNodeContextMenu(e, this.getNode(e)); } }else{ this.checkContainerEvent(e, 'contextmenu'); } }, checkContainerEvent: function(e, type){ if(this.disabled){ e.stopEvent(); return false; } this.onContainerEvent(e, type); }, onContainerEvent: function(e, type){ this.tree.fireEvent('container' + type, this.tree, e); }, onNodeClick : function(e, node){ node.ui.onClick(e); }, onNodeOver : function(e, node){ this.lastOverNode = node; node.ui.onOver(e); }, onNodeOut : function(e, node){ node.ui.onOut(e); }, onIconOver : function(e, node){ node.ui.addClass('x-tree-ec-over'); }, onIconOut : function(e, node){ node.ui.removeClass('x-tree-ec-over'); }, onIconClick : function(e, node){ node.ui.ecClick(e); }, onCheckboxClick : function(e, node){ node.ui.onCheckChange(e); }, onNodeDblClick : function(e, node){ node.ui.onDblClick(e); }, onNodeContextMenu : function(e, node){ node.ui.onContextMenu(e); }, beforeEvent : function(e){ var node = this.getNode(e); if(this.disabled || !node || !node.ui){ e.stopEvent(); return false; } return true; }, disable: function(){ this.disabled = true; }, enable: function(){ this.disabled = false; } }; Ext.tree.DefaultSelectionModel = Ext.extend(Ext.util.Observable, { constructor : function(config){ this.selNode = null; this.addEvents( 'selectionchange', 'beforeselect' ); Ext.apply(this, config); Ext.tree.DefaultSelectionModel.superclass.constructor.call(this); }, init : function(tree){ this.tree = tree; tree.mon(tree.getTreeEl(), 'keydown', this.onKeyDown, this); tree.on('click', this.onNodeClick, this); }, onNodeClick : function(node, e){ this.select(node); }, select : function(node, selectNextNode){ if (!Ext.fly(node.ui.wrap).isVisible() && selectNextNode) { return selectNextNode.call(this, node); } var last = this.selNode; if(node == last){ node.ui.onSelectedChange(true); }else if(this.fireEvent('beforeselect', this, node, last) !== false){ if(last && last.ui){ last.ui.onSelectedChange(false); } this.selNode = node; node.ui.onSelectedChange(true); this.fireEvent('selectionchange', this, node, last); } return node; }, unselect : function(node, silent){ if(this.selNode == node){ this.clearSelections(silent); } }, clearSelections : function(silent){ var n = this.selNode; if(n){ n.ui.onSelectedChange(false); this.selNode = null; if(silent !== true){ this.fireEvent('selectionchange', this, null); } } return n; }, getSelectedNode : function(){ return this.selNode; }, isSelected : function(node){ return this.selNode == node; }, selectPrevious : function( s){ if(!(s = s || this.selNode || this.lastSelNode)){ return null; } var ps = s.previousSibling; if(ps){ if(!ps.isExpanded() || ps.childNodes.length < 1){ return this.select(ps, this.selectPrevious); } else{ var lc = ps.lastChild; while(lc && lc.isExpanded() && Ext.fly(lc.ui.wrap).isVisible() && lc.childNodes.length > 0){ lc = lc.lastChild; } return this.select(lc, this.selectPrevious); } } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){ return this.select(s.parentNode, this.selectPrevious); } return null; }, selectNext : function( s){ if(!(s = s || this.selNode || this.lastSelNode)){ return null; } if(s.firstChild && s.isExpanded() && Ext.fly(s.ui.wrap).isVisible()){ return this.select(s.firstChild, this.selectNext); }else if(s.nextSibling){ return this.select(s.nextSibling, this.selectNext); }else if(s.parentNode){ var newS = null; s.parentNode.bubble(function(){ if(this.nextSibling){ newS = this.getOwnerTree().selModel.select(this.nextSibling, this.selectNext); return false; } }); return newS; } return null; }, onKeyDown : function(e){ var s = this.selNode || this.lastSelNode; var sm = this; if(!s){ return; } var k = e.getKey(); switch(k){ case e.DOWN: e.stopEvent(); this.selectNext(); break; case e.UP: e.stopEvent(); this.selectPrevious(); break; case e.RIGHT: e.preventDefault(); if(s.hasChildNodes()){ if(!s.isExpanded()){ s.expand(); }else if(s.firstChild){ this.select(s.firstChild, e); } } break; case e.LEFT: e.preventDefault(); if(s.hasChildNodes() && s.isExpanded()){ s.collapse(); }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){ this.select(s.parentNode, e); } break; }; } }); Ext.tree.MultiSelectionModel = Ext.extend(Ext.util.Observable, { constructor : function(config){ this.selNodes = []; this.selMap = {}; this.addEvents( 'selectionchange' ); Ext.apply(this, config); Ext.tree.MultiSelectionModel.superclass.constructor.call(this); }, init : function(tree){ this.tree = tree; tree.mon(tree.getTreeEl(), 'keydown', this.onKeyDown, this); tree.on('click', this.onNodeClick, this); }, onNodeClick : function(node, e){ if(e.ctrlKey && this.isSelected(node)){ this.unselect(node); }else{ this.select(node, e, e.ctrlKey); } }, select : function(node, e, keepExisting){ if(keepExisting !== true){ this.clearSelections(true); } if(this.isSelected(node)){ this.lastSelNode = node; return node; } this.selNodes.push(node); this.selMap[node.id] = node; this.lastSelNode = node; node.ui.onSelectedChange(true); this.fireEvent('selectionchange', this, this.selNodes); return node; }, unselect : function(node){ if(this.selMap[node.id]){ node.ui.onSelectedChange(false); var sn = this.selNodes; var index = sn.indexOf(node); if(index != -1){ this.selNodes.splice(index, 1); } delete this.selMap[node.id]; this.fireEvent('selectionchange', this, this.selNodes); } }, clearSelections : function(suppressEvent){ var sn = this.selNodes; if(sn.length > 0){ for(var i = 0, len = sn.length; i < len; i++){ sn[i].ui.onSelectedChange(false); } this.selNodes = []; this.selMap = {}; if(suppressEvent !== true){ this.fireEvent('selectionchange', this, this.selNodes); } } }, isSelected : function(node){ return this.selMap[node.id] ? true : false; }, getSelectedNodes : function(){ return this.selNodes.concat([]); }, onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown, selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext, selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious }); Ext.data.Tree = Ext.extend(Ext.util.Observable, { constructor: function(root){ this.nodeHash = {}; this.root = null; if(root){ this.setRootNode(root); } this.addEvents( "append", "remove", "move", "insert", "beforeappend", "beforeremove", "beforemove", "beforeinsert" ); Ext.data.Tree.superclass.constructor.call(this); }, pathSeparator: "/", proxyNodeEvent : function(){ return this.fireEvent.apply(this, arguments); }, getRootNode : function(){ return this.root; }, setRootNode : function(node){ this.root = node; node.ownerTree = this; node.isRoot = true; this.registerNode(node); return node; }, getNodeById : function(id){ return this.nodeHash[id]; }, registerNode : function(node){ this.nodeHash[node.id] = node; }, unregisterNode : function(node){ delete this.nodeHash[node.id]; }, toString : function(){ return "[Tree"+(this.id?" "+this.id:"")+"]"; } }); Ext.data.Node = Ext.extend(Ext.util.Observable, { constructor: function(attributes){ this.attributes = attributes || {}; this.leaf = this.attributes.leaf; this.id = this.attributes.id; if(!this.id){ this.id = Ext.id(null, "xnode-"); this.attributes.id = this.id; } this.childNodes = []; this.parentNode = null; this.firstChild = null; this.lastChild = null; this.previousSibling = null; this.nextSibling = null; this.addEvents({ "append" : true, "remove" : true, "move" : true, "insert" : true, "beforeappend" : true, "beforeremove" : true, "beforemove" : true, "beforeinsert" : true }); this.listeners = this.attributes.listeners; Ext.data.Node.superclass.constructor.call(this); }, fireEvent : function(evtName){ if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){ return false; } var ot = this.getOwnerTree(); if(ot){ if(ot.proxyNodeEvent.apply(ot, arguments) === false){ return false; } } return true; }, isLeaf : function(){ return this.leaf === true; }, setFirstChild : function(node){ this.firstChild = node; }, setLastChild : function(node){ this.lastChild = node; }, isLast : function(){ return (!this.parentNode ? true : this.parentNode.lastChild == this); }, isFirst : function(){ return (!this.parentNode ? true : this.parentNode.firstChild == this); }, hasChildNodes : function(){ return !this.isLeaf() && this.childNodes.length > 0; }, isExpandable : function(){ return this.attributes.expandable || this.hasChildNodes(); }, appendChild : function(node){ var multi = false; if(Ext.isArray(node)){ multi = node; }else if(arguments.length > 1){ multi = arguments; } if(multi){ for(var i = 0, len = multi.length; i < len; i++) { this.appendChild(multi[i]); } }else{ if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){ return false; } var index = this.childNodes.length; var oldParent = node.parentNode; if(oldParent){ if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){ return false; } oldParent.removeChild(node); } index = this.childNodes.length; if(index === 0){ this.setFirstChild(node); } this.childNodes.push(node); node.parentNode = this; var ps = this.childNodes[index-1]; if(ps){ node.previousSibling = ps; ps.nextSibling = node; }else{ node.previousSibling = null; } node.nextSibling = null; this.setLastChild(node); node.setOwnerTree(this.getOwnerTree()); this.fireEvent("append", this.ownerTree, this, node, index); if(oldParent){ node.fireEvent("move", this.ownerTree, node, oldParent, this, index); } return node; } }, removeChild : function(node, destroy){ var index = this.childNodes.indexOf(node); if(index == -1){ return false; } if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){ return false; } this.childNodes.splice(index, 1); if(node.previousSibling){ node.previousSibling.nextSibling = node.nextSibling; } if(node.nextSibling){ node.nextSibling.previousSibling = node.previousSibling; } if(this.firstChild == node){ this.setFirstChild(node.nextSibling); } if(this.lastChild == node){ this.setLastChild(node.previousSibling); } this.fireEvent("remove", this.ownerTree, this, node); if(destroy){ node.destroy(true); }else{ node.clear(); } return node; }, clear : function(destroy){ this.setOwnerTree(null, destroy); this.parentNode = this.previousSibling = this.nextSibling = null; if(destroy){ this.firstChild = this.lastChild = null; } }, destroy : function( silent){ if(silent === true){ this.purgeListeners(); this.clear(true); Ext.each(this.childNodes, function(n){ n.destroy(true); }); this.childNodes = null; }else{ this.remove(true); } }, insertBefore : function(node, refNode){ if(!refNode){ return this.appendChild(node); } if(node == refNode){ return false; } if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){ return false; } var index = this.childNodes.indexOf(refNode); var oldParent = node.parentNode; var refIndex = index; if(oldParent == this && this.childNodes.indexOf(node) < index){ refIndex--; } if(oldParent){ if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){ return false; } oldParent.removeChild(node); } if(refIndex === 0){ this.setFirstChild(node); } this.childNodes.splice(refIndex, 0, node); node.parentNode = this; var ps = this.childNodes[refIndex-1]; if(ps){ node.previousSibling = ps; ps.nextSibling = node; }else{ node.previousSibling = null; } node.nextSibling = refNode; refNode.previousSibling = node; node.setOwnerTree(this.getOwnerTree()); this.fireEvent("insert", this.ownerTree, this, node, refNode); if(oldParent){ node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode); } return node; }, remove : function(destroy){ if (this.parentNode) { this.parentNode.removeChild(this, destroy); } return this; }, removeAll : function(destroy){ var cn = this.childNodes, n; while((n = cn[0])){ this.removeChild(n, destroy); } return this; }, item : function(index){ return this.childNodes[index]; }, replaceChild : function(newChild, oldChild){ var s = oldChild ? oldChild.nextSibling : null; this.removeChild(oldChild); this.insertBefore(newChild, s); return oldChild; }, indexOf : function(child){ return this.childNodes.indexOf(child); }, getOwnerTree : function(){ if(!this.ownerTree){ var p = this; while(p){ if(p.ownerTree){ this.ownerTree = p.ownerTree; break; } p = p.parentNode; } } return this.ownerTree; }, getDepth : function(){ var depth = 0; var p = this; while(p.parentNode){ ++depth; p = p.parentNode; } return depth; }, setOwnerTree : function(tree, destroy){ if(tree != this.ownerTree){ if(this.ownerTree){ this.ownerTree.unregisterNode(this); } this.ownerTree = tree; if(destroy !== true){ Ext.each(this.childNodes, function(n){ n.setOwnerTree(tree); }); } if(tree){ tree.registerNode(this); } } }, setId: function(id){ if(id !== this.id){ var t = this.ownerTree; if(t){ t.unregisterNode(this); } this.id = this.attributes.id = id; if(t){ t.registerNode(this); } this.onIdChange(id); } }, onIdChange: Ext.emptyFn, getPath : function(attr){ attr = attr || "id"; var p = this.parentNode; var b = [this.attributes[attr]]; while(p){ b.unshift(p.attributes[attr]); p = p.parentNode; } var sep = this.getOwnerTree().pathSeparator; return sep + b.join(sep); }, bubble : function(fn, scope, args){ var p = this; while(p){ if(fn.apply(scope || p, args || [p]) === false){ break; } p = p.parentNode; } }, cascade : function(fn, scope, args){ if(fn.apply(scope || this, args || [this]) !== false){ var cs = this.childNodes; for(var i = 0, len = cs.length; i < len; i++) { cs[i].cascade(fn, scope, args); } } }, eachChild : function(fn, scope, args){ var cs = this.childNodes; for(var i = 0, len = cs.length; i < len; i++) { if(fn.apply(scope || cs[i], args || [cs[i]]) === false){ break; } } }, findChild : function(attribute, value, deep){ return this.findChildBy(function(){ return this.attributes[attribute] == value; }, null, deep); }, findChildBy : function(fn, scope, deep){ var cs = this.childNodes, len = cs.length, i = 0, n, res; for(; i < len; i++){ n = cs[i]; if(fn.call(scope || n, n) === true){ return n; }else if (deep){ res = n.findChildBy(fn, scope, deep); if(res != null){ return res; } } } return null; }, sort : function(fn, scope){ var cs = this.childNodes; var len = cs.length; if(len > 0){ var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn; cs.sort(sortFn); for(var i = 0; i < len; i++){ var n = cs[i]; n.previousSibling = cs[i-1]; n.nextSibling = cs[i+1]; if(i === 0){ this.setFirstChild(n); } if(i == len-1){ this.setLastChild(n); } } } }, contains : function(node){ return node.isAncestor(this); }, isAncestor : function(node){ var p = this.parentNode; while(p){ if(p == node){ return true; } p = p.parentNode; } return false; }, toString : function(){ return "[Node"+(this.id?" "+this.id:"")+"]"; } }); Ext.tree.TreeNode = Ext.extend(Ext.data.Node, { constructor : function(attributes){ attributes = attributes || {}; if(Ext.isString(attributes)){ attributes = {text: attributes}; } this.childrenRendered = false; this.rendered = false; Ext.tree.TreeNode.superclass.constructor.call(this, attributes); this.expanded = attributes.expanded === true; this.isTarget = attributes.isTarget !== false; this.draggable = attributes.draggable !== false && attributes.allowDrag !== false; this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false; this.text = attributes.text; this.disabled = attributes.disabled === true; this.hidden = attributes.hidden === true; this.addEvents( 'textchange', 'beforeexpand', 'beforecollapse', 'expand', 'disabledchange', 'collapse', 'beforeclick', 'click', 'checkchange', 'beforedblclick', 'dblclick', 'contextmenu', 'beforechildrenrendered' ); var uiClass = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI; this.ui = new uiClass(this); }, preventHScroll : true, isExpanded : function(){ return this.expanded; }, getUI : function(){ return this.ui; }, getLoader : function(){ var owner; return this.loader || ((owner = this.getOwnerTree()) && owner.loader ? owner.loader : (this.loader = new Ext.tree.TreeLoader())); }, setFirstChild : function(node){ var of = this.firstChild; Ext.tree.TreeNode.superclass.setFirstChild.call(this, node); if(this.childrenRendered && of && node != of){ of.renderIndent(true, true); } if(this.rendered){ this.renderIndent(true, true); } }, setLastChild : function(node){ var ol = this.lastChild; Ext.tree.TreeNode.superclass.setLastChild.call(this, node); if(this.childrenRendered && ol && node != ol){ ol.renderIndent(true, true); } if(this.rendered){ this.renderIndent(true, true); } }, appendChild : function(n){ if(!n.render && !Ext.isArray(n)){ n = this.getLoader().createNode(n); } var node = Ext.tree.TreeNode.superclass.appendChild.call(this, n); if(node && this.childrenRendered){ node.render(); } this.ui.updateExpandIcon(); return node; }, removeChild : function(node, destroy){ this.ownerTree.getSelectionModel().unselect(node); Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments); if(!destroy){ var rendered = node.ui.rendered; if(rendered){ node.ui.remove(); } if(rendered && this.childNodes.length < 1){ this.collapse(false, false); }else{ this.ui.updateExpandIcon(); } if(!this.firstChild && !this.isHiddenRoot()){ this.childrenRendered = false; } } return node; }, insertBefore : function(node, refNode){ if(!node.render){ node = this.getLoader().createNode(node); } var newNode = Ext.tree.TreeNode.superclass.insertBefore.call(this, node, refNode); if(newNode && refNode && this.childrenRendered){ node.render(); } this.ui.updateExpandIcon(); return newNode; }, setText : function(text){ var oldText = this.text; this.text = this.attributes.text = text; if(this.rendered){ this.ui.onTextChange(this, text, oldText); } this.fireEvent('textchange', this, text, oldText); }, setIconCls : function(cls){ var old = this.attributes.iconCls; this.attributes.iconCls = cls; if(this.rendered){ this.ui.onIconClsChange(this, cls, old); } }, setTooltip : function(tip, title){ this.attributes.qtip = tip; this.attributes.qtipTitle = title; if(this.rendered){ this.ui.onTipChange(this, tip, title); } }, setIcon : function(icon){ this.attributes.icon = icon; if(this.rendered){ this.ui.onIconChange(this, icon); } }, setHref : function(href, target){ this.attributes.href = href; this.attributes.hrefTarget = target; if(this.rendered){ this.ui.onHrefChange(this, href, target); } }, setCls : function(cls){ var old = this.attributes.cls; this.attributes.cls = cls; if(this.rendered){ this.ui.onClsChange(this, cls, old); } }, select : function(){ var t = this.getOwnerTree(); if(t){ t.getSelectionModel().select(this); } }, unselect : function(silent){ var t = this.getOwnerTree(); if(t){ t.getSelectionModel().unselect(this, silent); } }, isSelected : function(){ var t = this.getOwnerTree(); return t ? t.getSelectionModel().isSelected(this) : false; }, expand : function(deep, anim, callback, scope){ if(!this.expanded){ if(this.fireEvent('beforeexpand', this, deep, anim) === false){ return; } if(!this.childrenRendered){ this.renderChildren(); } this.expanded = true; if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){ this.ui.animExpand(function(){ this.fireEvent('expand', this); this.runCallback(callback, scope || this, [this]); if(deep === true){ this.expandChildNodes(true, true); } }.createDelegate(this)); return; }else{ this.ui.expand(); this.fireEvent('expand', this); this.runCallback(callback, scope || this, [this]); } }else{ this.runCallback(callback, scope || this, [this]); } if(deep === true){ this.expandChildNodes(true); } }, runCallback : function(cb, scope, args){ if(Ext.isFunction(cb)){ cb.apply(scope, args); } }, isHiddenRoot : function(){ return this.isRoot && !this.getOwnerTree().rootVisible; }, collapse : function(deep, anim, callback, scope){ if(this.expanded && !this.isHiddenRoot()){ if(this.fireEvent('beforecollapse', this, deep, anim) === false){ return; } this.expanded = false; if((this.getOwnerTree().animate && anim !== false) || anim){ this.ui.animCollapse(function(){ this.fireEvent('collapse', this); this.runCallback(callback, scope || this, [this]); if(deep === true){ this.collapseChildNodes(true); } }.createDelegate(this)); return; }else{ this.ui.collapse(); this.fireEvent('collapse', this); this.runCallback(callback, scope || this, [this]); } }else if(!this.expanded){ this.runCallback(callback, scope || this, [this]); } if(deep === true){ var cs = this.childNodes; for(var i = 0, len = cs.length; i < len; i++) { cs[i].collapse(true, false); } } }, delayedExpand : function(delay){ if(!this.expandProcId){ this.expandProcId = this.expand.defer(delay, this); } }, cancelExpand : function(){ if(this.expandProcId){ clearTimeout(this.expandProcId); } this.expandProcId = false; }, toggle : function(){ if(this.expanded){ this.collapse(); }else{ this.expand(); } }, ensureVisible : function(callback, scope){ var tree = this.getOwnerTree(); tree.expandPath(this.parentNode ? this.parentNode.getPath() : this.getPath(), false, function(){ var node = tree.getNodeById(this.id); tree.getTreeEl().scrollChildIntoView(node.ui.anchor); this.runCallback(callback, scope || this, [this]); }.createDelegate(this)); }, expandChildNodes : function(deep, anim) { var cs = this.childNodes, i, len = cs.length; for (i = 0; i < len; i++) { cs[i].expand(deep, anim); } }, collapseChildNodes : function(deep){ var cs = this.childNodes; for(var i = 0, len = cs.length; i < len; i++) { cs[i].collapse(deep); } }, disable : function(){ this.disabled = true; this.unselect(); if(this.rendered && this.ui.onDisableChange){ this.ui.onDisableChange(this, true); } this.fireEvent('disabledchange', this, true); }, enable : function(){ this.disabled = false; if(this.rendered && this.ui.onDisableChange){ this.ui.onDisableChange(this, false); } this.fireEvent('disabledchange', this, false); }, renderChildren : function(suppressEvent){ if(suppressEvent !== false){ this.fireEvent('beforechildrenrendered', this); } var cs = this.childNodes; for(var i = 0, len = cs.length; i < len; i++){ cs[i].render(true); } this.childrenRendered = true; }, sort : function(fn, scope){ Ext.tree.TreeNode.superclass.sort.apply(this, arguments); if(this.childrenRendered){ var cs = this.childNodes; for(var i = 0, len = cs.length; i < len; i++){ cs[i].render(true); } } }, render : function(bulkRender){ this.ui.render(bulkRender); if(!this.rendered){ this.getOwnerTree().registerNode(this); this.rendered = true; if(this.expanded){ this.expanded = false; this.expand(false, false); } } }, renderIndent : function(deep, refresh){ if(refresh){ this.ui.childIndent = null; } this.ui.renderIndent(); if(deep === true && this.childrenRendered){ var cs = this.childNodes; for(var i = 0, len = cs.length; i < len; i++){ cs[i].renderIndent(true, refresh); } } }, beginUpdate : function(){ this.childrenRendered = false; }, endUpdate : function(){ if(this.expanded && this.rendered){ this.renderChildren(); } }, destroy : function(silent){ if(silent === true){ this.unselect(true); } Ext.tree.TreeNode.superclass.destroy.call(this, silent); Ext.destroy(this.ui, this.loader); this.ui = this.loader = null; }, onIdChange : function(id){ this.ui.onIdChange(id); } }); Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode; Ext.tree.AsyncTreeNode = function(config){ this.loaded = config && config.loaded === true; this.loading = false; Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments); this.addEvents('beforeload', 'load'); }; Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, { expand : function(deep, anim, callback, scope){ if(this.loading){ var timer; var f = function(){ if(!this.loading){ clearInterval(timer); this.expand(deep, anim, callback, scope); } }.createDelegate(this); timer = setInterval(f, 200); return; } if(!this.loaded){ if(this.fireEvent("beforeload", this) === false){ return; } this.loading = true; this.ui.beforeLoad(this); var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader(); if(loader){ loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback, scope]), this); return; } } Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback, scope); }, isLoading : function(){ return this.loading; }, loadComplete : function(deep, anim, callback, scope){ this.loading = false; this.loaded = true; this.ui.afterLoad(this); this.fireEvent("load", this); this.expand(deep, anim, callback, scope); }, isLoaded : function(){ return this.loaded; }, hasChildNodes : function(){ if(!this.isLeaf() && !this.loaded){ return true; }else{ return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this); } }, reload : function(callback, scope){ this.collapse(false, false); while(this.firstChild){ this.removeChild(this.firstChild).destroy(); } this.childrenRendered = false; this.loaded = false; if(this.isHiddenRoot()){ this.expanded = false; } this.expand(false, false, callback, scope); } }); Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode; Ext.tree.TreeNodeUI = Ext.extend(Object, { constructor : function(node){ Ext.apply(this, { node: node, rendered: false, animating: false, wasLeaf: true, ecc: 'x-tree-ec-icon x-tree-elbow', emptyIcon: Ext.BLANK_IMAGE_URL }); }, removeChild : function(node){ if(this.rendered){ this.ctNode.removeChild(node.ui.getEl()); } }, beforeLoad : function(){ this.addClass("x-tree-node-loading"); }, afterLoad : function(){ this.removeClass("x-tree-node-loading"); }, onTextChange : function(node, text, oldText){ if(this.rendered){ this.textNode.innerHTML = text; } }, onIconClsChange : function(node, cls, oldCls){ if(this.rendered){ Ext.fly(this.iconNode).replaceClass(oldCls, cls); } }, onIconChange : function(node, icon){ if(this.rendered){ var empty = Ext.isEmpty(icon); this.iconNode.src = empty ? this.emptyIcon : icon; Ext.fly(this.iconNode)[empty ? 'removeClass' : 'addClass']('x-tree-node-inline-icon'); } }, onTipChange : function(node, tip, title){ if(this.rendered){ var hasTitle = Ext.isDefined(title); if(this.textNode.setAttributeNS){ this.textNode.setAttributeNS("ext", "qtip", tip); if(hasTitle){ this.textNode.setAttributeNS("ext", "qtitle", title); } }else{ this.textNode.setAttribute("ext:qtip", tip); if(hasTitle){ this.textNode.setAttribute("ext:qtitle", title); } } } }, onHrefChange : function(node, href, target){ if(this.rendered){ this.anchor.href = this.getHref(href); if(Ext.isDefined(target)){ this.anchor.target = target; } } }, onClsChange : function(node, cls, oldCls){ if(this.rendered){ Ext.fly(this.elNode).replaceClass(oldCls, cls); } }, onDisableChange : function(node, state){ this.disabled = state; if (this.checkbox) { this.checkbox.disabled = state; } this[state ? 'addClass' : 'removeClass']('x-tree-node-disabled'); }, onSelectedChange : function(state){ if(state){ this.focus(); this.addClass("x-tree-selected"); }else{ this.removeClass("x-tree-selected"); } }, onMove : function(tree, node, oldParent, newParent, index, refNode){ this.childIndent = null; if(this.rendered){ var targetNode = newParent.ui.getContainer(); if(!targetNode){ this.holder = document.createElement("div"); this.holder.appendChild(this.wrap); return; } var insertBefore = refNode ? refNode.ui.getEl() : null; if(insertBefore){ targetNode.insertBefore(this.wrap, insertBefore); }else{ targetNode.appendChild(this.wrap); } this.node.renderIndent(true, oldParent != newParent); } }, addClass : function(cls){ if(this.elNode){ Ext.fly(this.elNode).addClass(cls); } }, removeClass : function(cls){ if(this.elNode){ Ext.fly(this.elNode).removeClass(cls); } }, remove : function(){ if(this.rendered){ this.holder = document.createElement("div"); this.holder.appendChild(this.wrap); } }, fireEvent : function(){ return this.node.fireEvent.apply(this.node, arguments); }, initEvents : function(){ this.node.on("move", this.onMove, this); if(this.node.disabled){ this.onDisableChange(this.node, true); } if(this.node.hidden){ this.hide(); } var ot = this.node.getOwnerTree(); var dd = ot.enableDD || ot.enableDrag || ot.enableDrop; if(dd && (!this.node.isRoot || ot.rootVisible)){ Ext.dd.Registry.register(this.elNode, { node: this.node, handles: this.getDDHandles(), isHandle: false }); } }, getDDHandles : function(){ return [this.iconNode, this.textNode, this.elNode]; }, hide : function(){ this.node.hidden = true; if(this.wrap){ this.wrap.style.display = "none"; } }, show : function(){ this.node.hidden = false; if(this.wrap){ this.wrap.style.display = ""; } }, onContextMenu : function(e){ if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) { e.preventDefault(); this.focus(); this.fireEvent("contextmenu", this.node, e); } }, onClick : function(e){ if(this.dropping){ e.stopEvent(); return; } if(this.fireEvent("beforeclick", this.node, e) !== false){ var a = e.getTarget('a'); if(!this.disabled && this.node.attributes.href && a){ this.fireEvent("click", this.node, e); return; }else if(a && e.ctrlKey){ e.stopEvent(); } e.preventDefault(); if(this.disabled){ return; } if(this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()){ this.node.toggle(); } this.fireEvent("click", this.node, e); }else{ e.stopEvent(); } }, onDblClick : function(e){ e.preventDefault(); if(this.disabled){ return; } if(this.fireEvent("beforedblclick", this.node, e) !== false){ if(this.checkbox){ this.toggleCheck(); } if(!this.animating && this.node.isExpandable()){ this.node.toggle(); } this.fireEvent("dblclick", this.node, e); } }, onOver : function(e){ this.addClass('x-tree-node-over'); }, onOut : function(e){ this.removeClass('x-tree-node-over'); }, onCheckChange : function(){ var checked = this.checkbox.checked; this.checkbox.defaultChecked = checked; this.node.attributes.checked = checked; this.fireEvent('checkchange', this.node, checked); }, ecClick : function(e){ if(!this.animating && this.node.isExpandable()){ this.node.toggle(); } }, startDrop : function(){ this.dropping = true; }, endDrop : function(){ setTimeout(function(){ this.dropping = false; }.createDelegate(this), 50); }, expand : function(){ this.updateExpandIcon(); this.ctNode.style.display = ""; }, focus : function(){ if(!this.node.preventHScroll){ try{this.anchor.focus(); }catch(e){} }else{ try{ var noscroll = this.node.getOwnerTree().getTreeEl().dom; var l = noscroll.scrollLeft; this.anchor.focus(); noscroll.scrollLeft = l; }catch(e){} } }, toggleCheck : function(value){ var cb = this.checkbox; if(cb){ cb.checked = (value === undefined ? !cb.checked : value); this.onCheckChange(); } }, blur : function(){ try{ this.anchor.blur(); }catch(e){} }, animExpand : function(callback){ var ct = Ext.get(this.ctNode); ct.stopFx(); if(!this.node.isExpandable()){ this.updateExpandIcon(); this.ctNode.style.display = ""; Ext.callback(callback); return; } this.animating = true; this.updateExpandIcon(); ct.slideIn('t', { callback : function(){ this.animating = false; Ext.callback(callback); }, scope: this, duration: this.node.ownerTree.duration || .25 }); }, highlight : function(){ var tree = this.node.getOwnerTree(); Ext.fly(this.wrap).highlight( tree.hlColor || "C3DAF9", {endColor: tree.hlBaseColor} ); }, collapse : function(){ this.updateExpandIcon(); this.ctNode.style.display = "none"; }, animCollapse : function(callback){ var ct = Ext.get(this.ctNode); ct.enableDisplayMode('block'); ct.stopFx(); this.animating = true; this.updateExpandIcon(); ct.slideOut('t', { callback : function(){ this.animating = false; Ext.callback(callback); }, scope: this, duration: this.node.ownerTree.duration || .25 }); }, getContainer : function(){ return this.ctNode; }, getEl : function(){ return this.wrap; }, appendDDGhost : function(ghostNode){ ghostNode.appendChild(this.elNode.cloneNode(true)); }, getDDRepairXY : function(){ return Ext.lib.Dom.getXY(this.iconNode); }, onRender : function(){ this.render(); }, render : function(bulkRender){ var n = this.node, a = n.attributes; var targetNode = n.parentNode ? n.parentNode.ui.getContainer() : n.ownerTree.innerCt.dom; if(!this.rendered){ this.rendered = true; this.renderElements(n, a, targetNode, bulkRender); if(a.qtip){ this.onTipChange(n, a.qtip, a.qtipTitle); }else if(a.qtipCfg){ a.qtipCfg.target = Ext.id(this.textNode); Ext.QuickTips.register(a.qtipCfg); } this.initEvents(); if(!this.node.expanded){ this.updateExpandIcon(true); } }else{ if(bulkRender === true) { targetNode.appendChild(this.wrap); } } }, renderElements : function(n, a, targetNode, bulkRender){ this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : ''; var cb = Ext.isBoolean(a.checked), nel, href = this.getHref(a.href), buf = ['
  • ', '',this.indentMarkup,"", '', '', cb ? ('' : '/>')) : '', '',n.text,"
    ", '', "
  • "].join(''); if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){ this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf); }else{ this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf); } this.elNode = this.wrap.childNodes[0]; this.ctNode = this.wrap.childNodes[1]; var cs = this.elNode.childNodes; this.indentNode = cs[0]; this.ecNode = cs[1]; this.iconNode = cs[2]; var index = 3; if(cb){ this.checkbox = cs[3]; this.checkbox.defaultChecked = this.checkbox.checked; index++; } this.anchor = cs[index]; this.textNode = cs[index].firstChild; }, getHref : function(href){ return Ext.isEmpty(href) ? (Ext.isGecko ? '' : '#') : href; }, getAnchor : function(){ return this.anchor; }, getTextEl : function(){ return this.textNode; }, getIconEl : function(){ return this.iconNode; }, isChecked : function(){ return this.checkbox ? this.checkbox.checked : false; }, updateExpandIcon : function(){ if(this.rendered){ var n = this.node, c1, c2, cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow", hasChild = n.hasChildNodes(); if(hasChild || n.attributes.expandable){ if(n.expanded){ cls += "-minus"; c1 = "x-tree-node-collapsed"; c2 = "x-tree-node-expanded"; }else{ cls += "-plus"; c1 = "x-tree-node-expanded"; c2 = "x-tree-node-collapsed"; } if(this.wasLeaf){ this.removeClass("x-tree-node-leaf"); this.wasLeaf = false; } if(this.c1 != c1 || this.c2 != c2){ Ext.fly(this.elNode).replaceClass(c1, c2); this.c1 = c1; this.c2 = c2; } }else{ if(!this.wasLeaf){ Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-collapsed"); delete this.c1; delete this.c2; this.wasLeaf = true; } } var ecc = "x-tree-ec-icon "+cls; if(this.ecc != ecc){ this.ecNode.className = ecc; this.ecc = ecc; } } }, onIdChange: function(id){ if(this.rendered){ this.elNode.setAttribute('ext:tree-node-id', id); } }, getChildIndent : function(){ if(!this.childIndent){ var buf = [], p = this.node; while(p){ if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){ if(!p.isLast()) { buf.unshift(''); } else { buf.unshift(''); } } p = p.parentNode; } this.childIndent = buf.join(""); } return this.childIndent; }, renderIndent : function(){ if(this.rendered){ var indent = "", p = this.node.parentNode; if(p){ indent = p.ui.getChildIndent(); } if(this.indentMarkup != indent){ this.indentNode.innerHTML = indent; this.indentMarkup = indent; } this.updateExpandIcon(); } }, destroy : function(){ if(this.elNode){ Ext.dd.Registry.unregister(this.elNode.id); } Ext.each(['textnode', 'anchor', 'checkbox', 'indentNode', 'ecNode', 'iconNode', 'elNode', 'ctNode', 'wrap', 'holder'], function(el){ if(this[el]){ Ext.fly(this[el]).remove(); delete this[el]; } }, this); delete this.node; } }); Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, { render : function(){ if(!this.rendered){ var targetNode = this.node.ownerTree.innerCt.dom; this.node.expanded = true; targetNode.innerHTML = '
    '; this.wrap = this.ctNode = targetNode.firstChild; } }, collapse : Ext.emptyFn, expand : Ext.emptyFn }); Ext.tree.TreeLoader = function(config){ this.baseParams = {}; Ext.apply(this, config); this.addEvents( "beforeload", "load", "loadexception" ); Ext.tree.TreeLoader.superclass.constructor.call(this); if(Ext.isString(this.paramOrder)){ this.paramOrder = this.paramOrder.split(/[\s,|]/); } }; Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, { uiProviders : {}, clearOnLoad : true, paramOrder: undefined, paramsAsHash: false, nodeParameter: 'node', directFn : undefined, load : function(node, callback, scope){ if(this.clearOnLoad){ while(node.firstChild){ node.removeChild(node.firstChild); } } if(this.doPreload(node)){ this.runCallback(callback, scope || node, [node]); }else if(this.directFn || this.dataUrl || this.url){ this.requestData(node, callback, scope || node); } }, doPreload : function(node){ if(node.attributes.children){ if(node.childNodes.length < 1){ var cs = node.attributes.children; node.beginUpdate(); for(var i = 0, len = cs.length; i < len; i++){ var cn = node.appendChild(this.createNode(cs[i])); if(this.preloadChildren){ this.doPreload(cn); } } node.endUpdate(); } return true; } return false; }, getParams: function(node){ var bp = Ext.apply({}, this.baseParams), np = this.nodeParameter, po = this.paramOrder; np && (bp[ np ] = node.id); if(this.directFn){ var buf = [node.id]; if(po){ if(np && po.indexOf(np) > -1){ buf = []; } for(var i = 0, len = po.length; i < len; i++){ buf.push(bp[ po[i] ]); } }else if(this.paramsAsHash){ buf = [bp]; } return buf; }else{ return bp; } }, requestData : function(node, callback, scope){ if(this.fireEvent("beforeload", this, node, callback) !== false){ if(this.directFn){ var args = this.getParams(node); args.push(this.processDirectResponse.createDelegate(this, [{callback: callback, node: node, scope: scope}], true)); this.directFn.apply(window, args); }else{ this.transId = Ext.Ajax.request({ method:this.requestMethod, url: this.dataUrl||this.url, success: this.handleResponse, failure: this.handleFailure, scope: this, argument: {callback: callback, node: node, scope: scope}, params: this.getParams(node) }); } }else{ this.runCallback(callback, scope || node, []); } }, processDirectResponse: function(result, response, args){ if(response.status){ this.handleResponse({ responseData: Ext.isArray(result) ? result : null, responseText: result, argument: args }); }else{ this.handleFailure({ argument: args }); } }, runCallback: function(cb, scope, args){ if(Ext.isFunction(cb)){ cb.apply(scope, args); } }, isLoading : function(){ return !!this.transId; }, abort : function(){ if(this.isLoading()){ Ext.Ajax.abort(this.transId); } }, createNode : function(attr){ if(this.baseAttrs){ Ext.applyIf(attr, this.baseAttrs); } if(this.applyLoader !== false && !attr.loader){ attr.loader = this; } if(Ext.isString(attr.uiProvider)){ attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider); } if(attr.nodeType){ return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr); }else{ return attr.leaf ? new Ext.tree.TreeNode(attr) : new Ext.tree.AsyncTreeNode(attr); } }, processResponse : function(response, node, callback, scope){ var json = response.responseText; try { var o = response.responseData || Ext.decode(json); node.beginUpdate(); for(var i = 0, len = o.length; i < len; i++){ var n = this.createNode(o[i]); if(n){ node.appendChild(n); } } node.endUpdate(); this.runCallback(callback, scope || node, [node]); }catch(e){ this.handleFailure(response); } }, handleResponse : function(response){ this.transId = false; var a = response.argument; this.processResponse(response, a.node, a.callback, a.scope); this.fireEvent("load", this, a.node, response); }, handleFailure : function(response){ this.transId = false; var a = response.argument; this.fireEvent("loadexception", this, a.node, response); this.runCallback(a.callback, a.scope || a.node, [a.node]); }, destroy : function(){ this.abort(); this.purgeListeners(); } }); Ext.tree.TreeFilter = function(tree, config){ this.tree = tree; this.filtered = {}; Ext.apply(this, config); }; Ext.tree.TreeFilter.prototype = { clearBlank:false, reverse:false, autoClear:false, remove:false, filter : function(value, attr, startNode){ attr = attr || "text"; var f; if(typeof value == "string"){ var vlen = value.length; if(vlen == 0 && this.clearBlank){ this.clear(); return; } value = value.toLowerCase(); f = function(n){ return n.attributes[attr].substr(0, vlen).toLowerCase() == value; }; }else if(value.exec){ f = function(n){ return value.test(n.attributes[attr]); }; }else{ throw 'Illegal filter type, must be string or regex'; } this.filterBy(f, null, startNode); }, filterBy : function(fn, scope, startNode){ startNode = startNode || this.tree.root; if(this.autoClear){ this.clear(); } var af = this.filtered, rv = this.reverse; var f = function(n){ if(n == startNode){ return true; } if(af[n.id]){ return false; } var m = fn.call(scope || n, n); if(!m || rv){ af[n.id] = n; n.ui.hide(); return false; } return true; }; startNode.cascade(f); if(this.remove){ for(var id in af){ if(typeof id != "function"){ var n = af[id]; if(n && n.parentNode){ n.parentNode.removeChild(n); } } } } }, clear : function(){ var t = this.tree; var af = this.filtered; for(var id in af){ if(typeof id != "function"){ var n = af[id]; if(n){ n.ui.show(); } } } this.filtered = {}; } }; Ext.tree.TreeSorter = Ext.extend(Object, { constructor: function(tree, config){ Ext.apply(this, config); tree.on({ scope: this, beforechildrenrendered: this.doSort, append: this.updateSort, insert: this.updateSort, textchange: this.updateSortParent }); var desc = this.dir && this.dir.toLowerCase() == 'desc', prop = this.property || 'text', sortType = this.sortType, folderSort = this.folderSort, caseSensitive = this.caseSensitive === true, leafAttr = this.leafAttr || 'leaf'; if(Ext.isString(sortType)){ sortType = Ext.data.SortTypes[sortType]; } this.sortFn = function(n1, n2){ var attr1 = n1.attributes, attr2 = n2.attributes; if(folderSort){ if(attr1[leafAttr] && !attr2[leafAttr]){ return 1; } if(!attr1[leafAttr] && attr2[leafAttr]){ return -1; } } var prop1 = attr1[prop], prop2 = attr2[prop], v1 = sortType ? sortType(prop1) : (caseSensitive ? prop1 : prop1.toUpperCase()), v2 = sortType ? sortType(prop2) : (caseSensitive ? prop2 : prop2.toUpperCase()); if(v1 < v2){ return desc ? 1 : -1; }else if(v1 > v2){ return desc ? -1 : 1; } return 0; }; }, doSort : function(node){ node.sort(this.sortFn); }, updateSort : function(tree, node){ if(node.childrenRendered){ this.doSort.defer(1, this, [node]); } }, updateSortParent : function(node){ var p = node.parentNode; if(p && p.childrenRendered){ this.doSort.defer(1, this, [p]); } } }); if(Ext.dd.DropZone){ Ext.tree.TreeDropZone = function(tree, config){ this.allowParentInsert = config.allowParentInsert || false; this.allowContainerDrop = config.allowContainerDrop || false; this.appendOnly = config.appendOnly || false; Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.getTreeEl(), config); this.tree = tree; this.dragOverData = {}; this.lastInsertClass = "x-tree-no-status"; }; Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, { ddGroup : "TreeDD", expandDelay : 1000, expandNode : function(node){ if(node.hasChildNodes() && !node.isExpanded()){ node.expand(false, null, this.triggerCacheRefresh.createDelegate(this)); } }, queueExpand : function(node){ this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]); }, cancelExpand : function(){ if(this.expandProcId){ clearTimeout(this.expandProcId); this.expandProcId = false; } }, isValidDropPoint : function(n, pt, dd, e, data){ if(!n || !data){ return false; } var targetNode = n.node; var dropNode = data.node; if(!(targetNode && targetNode.isTarget && pt)){ return false; } if(pt == "append" && targetNode.allowChildren === false){ return false; } if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){ return false; } if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){ return false; } var overEvent = this.dragOverData; overEvent.tree = this.tree; overEvent.target = targetNode; overEvent.data = data; overEvent.point = pt; overEvent.source = dd; overEvent.rawEvent = e; overEvent.dropNode = dropNode; overEvent.cancel = false; var result = this.tree.fireEvent("nodedragover", overEvent); return overEvent.cancel === false && result !== false; }, getDropPoint : function(e, n, dd){ var tn = n.node; if(tn.isRoot){ return tn.allowChildren !== false ? "append" : false; } var dragEl = n.ddel; var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight; var y = Ext.lib.Event.getPageY(e); var noAppend = tn.allowChildren === false || tn.isLeaf(); if(this.appendOnly || tn.parentNode.allowChildren === false){ return noAppend ? false : "append"; } var noBelow = false; if(!this.allowParentInsert){ noBelow = tn.hasChildNodes() && tn.isExpanded(); } var q = (b - t) / (noAppend ? 2 : 3); if(y >= t && y < (t + q)){ return "above"; }else if(!noBelow && (noAppend || y >= b-q && y <= b)){ return "below"; }else{ return "append"; } }, onNodeEnter : function(n, dd, e, data){ this.cancelExpand(); }, onContainerOver : function(dd, e, data) { if (this.allowContainerDrop && this.isValidDropPoint({ ddel: this.tree.getRootNode().ui.elNode, node: this.tree.getRootNode() }, "append", dd, e, data)) { return this.dropAllowed; } return this.dropNotAllowed; }, onNodeOver : function(n, dd, e, data){ var pt = this.getDropPoint(e, n, dd); var node = n.node; if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){ this.queueExpand(node); }else if(pt != "append"){ this.cancelExpand(); } var returnCls = this.dropNotAllowed; if(this.isValidDropPoint(n, pt, dd, e, data)){ if(pt){ var el = n.ddel; var cls; if(pt == "above"){ returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between"; cls = "x-tree-drag-insert-above"; }else if(pt == "below"){ returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between"; cls = "x-tree-drag-insert-below"; }else{ returnCls = "x-tree-drop-ok-append"; cls = "x-tree-drag-append"; } if(this.lastInsertClass != cls){ Ext.fly(el).replaceClass(this.lastInsertClass, cls); this.lastInsertClass = cls; } } } return returnCls; }, onNodeOut : function(n, dd, e, data){ this.cancelExpand(); this.removeDropIndicators(n); }, onNodeDrop : function(n, dd, e, data){ var point = this.getDropPoint(e, n, dd); var targetNode = n.node; targetNode.ui.startDrop(); if(!this.isValidDropPoint(n, point, dd, e, data)){ targetNode.ui.endDrop(); return false; } var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null); return this.processDrop(targetNode, data, point, dd, e, dropNode); }, onContainerDrop : function(dd, e, data){ if (this.allowContainerDrop && this.isValidDropPoint({ ddel: this.tree.getRootNode().ui.elNode, node: this.tree.getRootNode() }, "append", dd, e, data)) { var targetNode = this.tree.getRootNode(); targetNode.ui.startDrop(); var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, 'append', e) : null); return this.processDrop(targetNode, data, 'append', dd, e, dropNode); } return false; }, processDrop: function(target, data, point, dd, e, dropNode){ var dropEvent = { tree : this.tree, target: target, data: data, point: point, source: dd, rawEvent: e, dropNode: dropNode, cancel: !dropNode, dropStatus: false }; var retval = this.tree.fireEvent("beforenodedrop", dropEvent); if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){ target.ui.endDrop(); return dropEvent.dropStatus; } target = dropEvent.target; if(point == 'append' && !target.isExpanded()){ target.expand(false, null, function(){ this.completeDrop(dropEvent); }.createDelegate(this)); }else{ this.completeDrop(dropEvent); } return true; }, completeDrop : function(de){ var ns = de.dropNode, p = de.point, t = de.target; if(!Ext.isArray(ns)){ ns = [ns]; } var n; for(var i = 0, len = ns.length; i < len; i++){ n = ns[i]; if(p == "above"){ t.parentNode.insertBefore(n, t); }else if(p == "below"){ t.parentNode.insertBefore(n, t.nextSibling); }else{ t.appendChild(n); } } n.ui.focus(); if(Ext.enableFx && this.tree.hlDrop){ n.ui.highlight(); } t.ui.endDrop(); this.tree.fireEvent("nodedrop", de); }, afterNodeMoved : function(dd, data, e, targetNode, dropNode){ if(Ext.enableFx && this.tree.hlDrop){ dropNode.ui.focus(); dropNode.ui.highlight(); } this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e); }, getTree : function(){ return this.tree; }, removeDropIndicators : function(n){ if(n && n.ddel){ var el = n.ddel; Ext.fly(el).removeClass([ "x-tree-drag-insert-above", "x-tree-drag-insert-below", "x-tree-drag-append"]); this.lastInsertClass = "_noclass"; } }, beforeDragDrop : function(target, e, id){ this.cancelExpand(); return true; }, afterRepair : function(data){ if(data && Ext.enableFx){ data.node.ui.highlight(); } this.hideProxy(); } }); } if(Ext.dd.DragZone){ Ext.tree.TreeDragZone = function(tree, config){ Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.innerCt, config); this.tree = tree; }; Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, { ddGroup : "TreeDD", onBeforeDrag : function(data, e){ var n = data.node; return n && n.draggable && !n.disabled; }, onInitDrag : function(e){ var data = this.dragData; this.tree.getSelectionModel().select(data.node); this.tree.eventModel.disable(); this.proxy.update(""); data.node.ui.appendDDGhost(this.proxy.ghost.dom); this.tree.fireEvent("startdrag", this.tree, data.node, e); }, getRepairXY : function(e, data){ return data.node.ui.getDDRepairXY(); }, onEndDrag : function(data, e){ this.tree.eventModel.enable.defer(100, this.tree.eventModel); this.tree.fireEvent("enddrag", this.tree, data.node, e); }, onValidDrop : function(dd, e, id){ this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e); this.hideProxy(); }, beforeInvalidDrop : function(e, id){ var sm = this.tree.getSelectionModel(); sm.clearSelections(); sm.select(this.dragData.node); }, afterRepair : function(){ if (Ext.enableFx && this.tree.hlDrop) { Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9"); } this.dragging = false; } }); } Ext.tree.TreeEditor = function(tree, fc, config){ fc = fc || {}; var field = fc.events ? fc : new Ext.form.TextField(fc); Ext.tree.TreeEditor.superclass.constructor.call(this, field, config); this.tree = tree; if(!tree.rendered){ tree.on('render', this.initEditor, this); }else{ this.initEditor(tree); } }; Ext.extend(Ext.tree.TreeEditor, Ext.Editor, { alignment: "l-l", autoSize: false, hideEl : false, cls: "x-small-editor x-tree-editor", shim:false, shadow:"frame", maxWidth: 250, editDelay : 350, initEditor : function(tree){ tree.on({ scope : this, beforeclick: this.beforeNodeClick, dblclick : this.onNodeDblClick }); this.on({ scope : this, complete : this.updateNode, beforestartedit: this.fitToTree, specialkey : this.onSpecialKey }); this.on('startedit', this.bindScroll, this, {delay:10}); }, fitToTree : function(ed, el){ var td = this.tree.getTreeEl().dom, nd = el.dom; if(td.scrollLeft > nd.offsetLeft){ td.scrollLeft = nd.offsetLeft; } var w = Math.min( this.maxWidth, (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5); this.setSize(w, ''); }, triggerEdit : function(node, defer){ this.completeEdit(); if(node.attributes.editable !== false){ this.editNode = node; if(this.tree.autoScroll){ Ext.fly(node.ui.getEl()).scrollIntoView(this.tree.body); } var value = node.text || ''; if (!Ext.isGecko && Ext.isEmpty(node.text)){ node.setText(' '); } this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [node.ui.textNode, value]); return false; } }, bindScroll : function(){ this.tree.getTreeEl().on('scroll', this.cancelEdit, this); }, beforeNodeClick : function(node, e){ clearTimeout(this.autoEditTimer); if(this.tree.getSelectionModel().isSelected(node)){ e.stopEvent(); return this.triggerEdit(node); } }, onNodeDblClick : function(node, e){ clearTimeout(this.autoEditTimer); }, updateNode : function(ed, value){ this.tree.getTreeEl().un('scroll', this.cancelEdit, this); this.editNode.setText(value); }, onHide : function(){ Ext.tree.TreeEditor.superclass.onHide.call(this); if(this.editNode){ this.editNode.ui.focus.defer(50, this.editNode.ui); } }, onSpecialKey : function(field, e){ var k = e.getKey(); if(k == e.ESC){ e.stopEvent(); this.cancelEdit(); }else if(k == e.ENTER && !e.hasModifier()){ e.stopEvent(); this.completeEdit(); } }, onDestroy : function(){ clearTimeout(this.autoEditTimer); Ext.tree.TreeEditor.superclass.onDestroy.call(this); var tree = this.tree; tree.un('beforeclick', this.beforeNodeClick, this); tree.un('dblclick', this.onNodeDblClick, this); } }); var swfobject = function() { var UNDEF = "undefined", OBJECT = "object", SHOCKWAVE_FLASH = "Shockwave Flash", SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", FLASH_MIME_TYPE = "application/x-shockwave-flash", EXPRESS_INSTALL_ID = "SWFObjectExprInst", ON_READY_STATE_CHANGE = "onreadystatechange", win = window, doc = document, nav = navigator, plugin = false, domLoadFnArr = [main], regObjArr = [], objIdArr = [], listenersArr = [], storedAltContent, storedAltContentId, storedCallbackFn, storedCallbackObj, isDomLoaded = false, isExpressInstallActive = false, dynamicStylesheet, dynamicStylesheetMedia, autoHideShow = true, ua = function() { var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, u = nav.userAgent.toLowerCase(), p = nav.platform.toLowerCase(), windows = p ? (/win/).test(p) : /win/.test(u), mac = p ? (/mac/).test(p) : /mac/.test(u), webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, ie = !+"\v1", playerVersion = [0,0,0], d = null; if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { d = nav.plugins[SHOCKWAVE_FLASH].description; if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { plugin = true; ie = false; d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; } } else if (typeof win.ActiveXObject != UNDEF) { try { var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); if (a) { d = a.GetVariable("$version"); if (d) { ie = true; d = d.split(" ")[1].split(","); playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; } } } catch(e) {} } return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; }(), onDomLoad = function() { if (!ua.w3) { return; } if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { callDomLoadFunctions(); } if (!isDomLoaded) { if (typeof doc.addEventListener != UNDEF) { doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false); } if (ua.ie && ua.win) { doc.attachEvent(ON_READY_STATE_CHANGE, function() { if (doc.readyState == "complete") { doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee); callDomLoadFunctions(); } }); if (win == top) { (function(){ if (isDomLoaded) { return; } try { doc.documentElement.doScroll("left"); } catch(e) { setTimeout(arguments.callee, 0); return; } callDomLoadFunctions(); })(); } } if (ua.wk) { (function(){ if (isDomLoaded) { return; } if (!(/loaded|complete/).test(doc.readyState)) { setTimeout(arguments.callee, 0); return; } callDomLoadFunctions(); })(); } addLoadEvent(callDomLoadFunctions); } }(); function callDomLoadFunctions() { if (isDomLoaded) { return; } try { var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span")); t.parentNode.removeChild(t); } catch (e) { return; } isDomLoaded = true; var dl = domLoadFnArr.length; for (var i = 0; i < dl; i++) { domLoadFnArr[i](); } } function addDomLoadEvent(fn) { if (isDomLoaded) { fn(); } else { domLoadFnArr[domLoadFnArr.length] = fn; } } function addLoadEvent(fn) { if (typeof win.addEventListener != UNDEF) { win.addEventListener("load", fn, false); } else if (typeof doc.addEventListener != UNDEF) { doc.addEventListener("load", fn, false); } else if (typeof win.attachEvent != UNDEF) { addListener(win, "onload", fn); } else if (typeof win.onload == "function") { var fnOld = win.onload; win.onload = function() { fnOld(); fn(); }; } else { win.onload = fn; } } function main() { if (plugin) { testPlayerVersion(); } else { matchVersions(); } } function testPlayerVersion() { var b = doc.getElementsByTagName("body")[0]; var o = createElement(OBJECT); o.setAttribute("type", FLASH_MIME_TYPE); var t = b.appendChild(o); if (t) { var counter = 0; (function(){ if (typeof t.GetVariable != UNDEF) { var d = t.GetVariable("$version"); if (d) { d = d.split(" ")[1].split(","); ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; } } else if (counter < 10) { counter++; setTimeout(arguments.callee, 10); return; } b.removeChild(o); t = null; matchVersions(); })(); } else { matchVersions(); } } function matchVersions() { var rl = regObjArr.length; if (rl > 0) { for (var i = 0; i < rl; i++) { var id = regObjArr[i].id; var cb = regObjArr[i].callbackFn; var cbObj = {success:false, id:id}; if (ua.pv[0] > 0) { var obj = getElementById(id); if (obj) { if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { setVisibility(id, true); if (cb) { cbObj.success = true; cbObj.ref = getObjectById(id); cb(cbObj); } } else if (regObjArr[i].expressInstall && canExpressInstall()) { var att = {}; att.data = regObjArr[i].expressInstall; att.width = obj.getAttribute("width") || "0"; att.height = obj.getAttribute("height") || "0"; if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); } if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); } var par = {}; var p = obj.getElementsByTagName("param"); var pl = p.length; for (var j = 0; j < pl; j++) { if (p[j].getAttribute("name").toLowerCase() != "movie") { par[p[j].getAttribute("name")] = p[j].getAttribute("value"); } } showExpressInstall(att, par, id, cb); } else { displayAltContent(obj); if (cb) { cb(cbObj); } } } } else { setVisibility(id, true); if (cb) { var o = getObjectById(id); if (o && typeof o.SetVariable != UNDEF) { cbObj.success = true; cbObj.ref = o; } cb(cbObj); } } } } } function getObjectById(objectIdStr) { var r = null; var o = getElementById(objectIdStr); if (o && o.nodeName == "OBJECT") { if (typeof o.SetVariable != UNDEF) { r = o; } else { var n = o.getElementsByTagName(OBJECT)[0]; if (n) { r = n; } } } return r; } function canExpressInstall() { return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312); } function showExpressInstall(att, par, replaceElemIdStr, callbackFn) { isExpressInstallActive = true; storedCallbackFn = callbackFn || null; storedCallbackObj = {success:false, id:replaceElemIdStr}; var obj = getElementById(replaceElemIdStr); if (obj) { if (obj.nodeName == "OBJECT") { storedAltContent = abstractAltContent(obj); storedAltContentId = null; } else { storedAltContent = obj; storedAltContentId = replaceElemIdStr; } att.id = EXPRESS_INSTALL_ID; if (typeof att.width == UNDEF || (!(/%$/).test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; } if (typeof att.height == UNDEF || (!(/%$/).test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; } doc.title = doc.title.slice(0, 47) + " - Flash Player Installation"; var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title; if (typeof par.flashvars != UNDEF) { par.flashvars += "&" + fv; } else { par.flashvars = fv; } if (ua.ie && ua.win && obj.readyState != 4) { var newObj = createElement("div"); replaceElemIdStr += "SWFObjectNew"; newObj.setAttribute("id", replaceElemIdStr); obj.parentNode.insertBefore(newObj, obj); obj.style.display = "none"; (function(){ if (obj.readyState == 4) { obj.parentNode.removeChild(obj); } else { setTimeout(arguments.callee, 10); } })(); } createSWF(att, par, replaceElemIdStr); } } function displayAltContent(obj) { if (ua.ie && ua.win && obj.readyState != 4) { var el = createElement("div"); obj.parentNode.insertBefore(el, obj); el.parentNode.replaceChild(abstractAltContent(obj), el); obj.style.display = "none"; (function(){ if (obj.readyState == 4) { obj.parentNode.removeChild(obj); } else { setTimeout(arguments.callee, 10); } })(); } else { obj.parentNode.replaceChild(abstractAltContent(obj), obj); } } function abstractAltContent(obj) { var ac = createElement("div"); if (ua.win && ua.ie) { ac.innerHTML = obj.innerHTML; } else { var nestedObj = obj.getElementsByTagName(OBJECT)[0]; if (nestedObj) { var c = nestedObj.childNodes; if (c) { var cl = c.length; for (var i = 0; i < cl; i++) { if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) { ac.appendChild(c[i].cloneNode(true)); } } } } } return ac; } function createSWF(attObj, parObj, id) { var r, el = getElementById(id); if (ua.wk && ua.wk < 312) { return r; } if (el) { if (typeof attObj.id == UNDEF) { attObj.id = id; } if (ua.ie && ua.win) { var att = ""; for (var i in attObj) { if (attObj[i] != Object.prototype[i]) { if (i.toLowerCase() == "data") { parObj.movie = attObj[i]; } else if (i.toLowerCase() == "styleclass") { att += ' class="' + attObj[i] + '"'; } else if (i.toLowerCase() != "classid") { att += ' ' + i + '="' + attObj[i] + '"'; } } } var par = ""; for (var j in parObj) { if (parObj[j] != Object.prototype[j]) { par += ''; } } el.outerHTML = '' + par + ''; objIdArr[objIdArr.length] = attObj.id; r = getElementById(attObj.id); } else { var o = createElement(OBJECT); o.setAttribute("type", FLASH_MIME_TYPE); for (var m in attObj) { if (attObj[m] != Object.prototype[m]) { if (m.toLowerCase() == "styleclass") { o.setAttribute("class", attObj[m]); } else if (m.toLowerCase() != "classid") { o.setAttribute(m, attObj[m]); } } } for (var n in parObj) { if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { createObjParam(o, n, parObj[n]); } } el.parentNode.replaceChild(o, el); r = o; } } return r; } function createObjParam(el, pName, pValue) { var p = createElement("param"); p.setAttribute("name", pName); p.setAttribute("value", pValue); el.appendChild(p); } function removeSWF(id) { var obj = getElementById(id); if (obj && obj.nodeName == "OBJECT") { if (ua.ie && ua.win) { obj.style.display = "none"; (function(){ if (obj.readyState == 4) { removeObjectInIE(id); } else { setTimeout(arguments.callee, 10); } })(); } else { obj.parentNode.removeChild(obj); } } } function removeObjectInIE(id) { var obj = getElementById(id); if (obj) { for (var i in obj) { if (typeof obj[i] == "function") { obj[i] = null; } } obj.parentNode.removeChild(obj); } } function getElementById(id) { var el = null; try { el = doc.getElementById(id); } catch (e) {} return el; } function createElement(el) { return doc.createElement(el); } function addListener(target, eventType, fn) { target.attachEvent(eventType, fn); listenersArr[listenersArr.length] = [target, eventType, fn]; } function hasPlayerVersion(rv) { var pv = ua.pv, v = rv.split("."); v[0] = parseInt(v[0], 10); v[1] = parseInt(v[1], 10) || 0; v[2] = parseInt(v[2], 10) || 0; return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; } function createCSS(sel, decl, media, newStyle) { if (ua.ie && ua.mac) { return; } var h = doc.getElementsByTagName("head")[0]; if (!h) { return; } var m = (media && typeof media == "string") ? media : "screen"; if (newStyle) { dynamicStylesheet = null; dynamicStylesheetMedia = null; } if (!dynamicStylesheet || dynamicStylesheetMedia != m) { var s = createElement("style"); s.setAttribute("type", "text/css"); s.setAttribute("media", m); dynamicStylesheet = h.appendChild(s); if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) { dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1]; } dynamicStylesheetMedia = m; } if (ua.ie && ua.win) { if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) { dynamicStylesheet.addRule(sel, decl); } } else { if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) { dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}")); } } } function setVisibility(id, isVisible) { if (!autoHideShow) { return; } var v = isVisible ? "visible" : "hidden"; if (isDomLoaded && getElementById(id)) { getElementById(id).style.visibility = v; } else { createCSS("#" + id, "visibility:" + v); } } function urlEncodeIfNecessary(s) { var regex = /[\\\"<>\.;]/; var hasBadChars = regex.exec(s) != null; return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s; } var cleanup = function() { if (ua.ie && ua.win) { window.attachEvent("onunload", function() { var ll = listenersArr.length; for (var i = 0; i < ll; i++) { listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]); } var il = objIdArr.length; for (var j = 0; j < il; j++) { removeSWF(objIdArr[j]); } for (var k in ua) { ua[k] = null; } ua = null; for (var l in swfobject) { swfobject[l] = null; } swfobject = null; window.detachEvent('onunload', arguments.callee); }); } }(); return { registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) { if (ua.w3 && objectIdStr && swfVersionStr) { var regObj = {}; regObj.id = objectIdStr; regObj.swfVersion = swfVersionStr; regObj.expressInstall = xiSwfUrlStr; regObj.callbackFn = callbackFn; regObjArr[regObjArr.length] = regObj; setVisibility(objectIdStr, false); } else if (callbackFn) { callbackFn({success:false, id:objectIdStr}); } }, getObjectById: function(objectIdStr) { if (ua.w3) { return getObjectById(objectIdStr); } }, embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { var callbackObj = {success:false, id:replaceElemIdStr}; if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) { setVisibility(replaceElemIdStr, false); addDomLoadEvent(function() { widthStr += ""; heightStr += ""; var att = {}; if (attObj && typeof attObj === OBJECT) { for (var i in attObj) { att[i] = attObj[i]; } } att.data = swfUrlStr; att.width = widthStr; att.height = heightStr; var par = {}; if (parObj && typeof parObj === OBJECT) { for (var j in parObj) { par[j] = parObj[j]; } } if (flashvarsObj && typeof flashvarsObj === OBJECT) { for (var k in flashvarsObj) { if (typeof par.flashvars != UNDEF) { par.flashvars += "&" + k + "=" + flashvarsObj[k]; } else { par.flashvars = k + "=" + flashvarsObj[k]; } } } if (hasPlayerVersion(swfVersionStr)) { var obj = createSWF(att, par, replaceElemIdStr); if (att.id == replaceElemIdStr) { setVisibility(replaceElemIdStr, true); } callbackObj.success = true; callbackObj.ref = obj; } else if (xiSwfUrlStr && canExpressInstall()) { att.data = xiSwfUrlStr; showExpressInstall(att, par, replaceElemIdStr, callbackFn); return; } else { setVisibility(replaceElemIdStr, true); } if (callbackFn) { callbackFn(callbackObj); } }); } else if (callbackFn) { callbackFn(callbackObj); } }, switchOffAutoHideShow: function() { autoHideShow = false; }, ua: ua, getFlashPlayerVersion: function() { return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; }, hasFlashPlayerVersion: hasPlayerVersion, createSWF: function(attObj, parObj, replaceElemIdStr) { if (ua.w3) { return createSWF(attObj, parObj, replaceElemIdStr); } else { return undefined; } }, showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) { if (ua.w3 && canExpressInstall()) { showExpressInstall(att, par, replaceElemIdStr, callbackFn); } }, removeSWF: function(objElemIdStr) { if (ua.w3) { removeSWF(objElemIdStr); } }, createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) { if (ua.w3) { createCSS(selStr, declStr, mediaStr, newStyleBoolean); } }, addDomLoadEvent: addDomLoadEvent, addLoadEvent: addLoadEvent, getQueryParamValue: function(param) { var q = doc.location.search || doc.location.hash; if (q) { if (/\?/.test(q)) { q = q.split("?")[1]; } if (param == null) { return urlEncodeIfNecessary(q); } var pairs = q.split("&"); for (var i = 0; i < pairs.length; i++) { if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1))); } } } return ""; }, expressInstallCallback: function() { if (isExpressInstallActive) { var obj = getElementById(EXPRESS_INSTALL_ID); if (obj && storedAltContent) { obj.parentNode.replaceChild(storedAltContent, obj); if (storedAltContentId) { setVisibility(storedAltContentId, true); if (ua.ie && ua.win) { storedAltContent.style.display = "block"; } } if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); } } isExpressInstallActive = false; } } }; }(); Ext.FlashComponent = Ext.extend(Ext.BoxComponent, { flashVersion : '9.0.115', backgroundColor: '#ffffff', wmode: 'opaque', flashVars: undefined, flashParams: undefined, url: undefined, swfId : undefined, swfWidth: '100%', swfHeight: '100%', expressInstall: false, initComponent : function(){ Ext.FlashComponent.superclass.initComponent.call(this); this.addEvents( 'initialize' ); }, onRender : function(){ Ext.FlashComponent.superclass.onRender.apply(this, arguments); var params = Ext.apply({ allowScriptAccess: 'always', bgcolor: this.backgroundColor, wmode: this.wmode }, this.flashParams), vars = Ext.apply({ allowedDomain: document.location.hostname, YUISwfId: this.getId(), YUIBridgeCallback: 'Ext.FlashEventProxy.onEvent' }, this.flashVars); new swfobject.embedSWF(this.url, this.id, this.swfWidth, this.swfHeight, this.flashVersion, this.expressInstall ? Ext.FlashComponent.EXPRESS_INSTALL_URL : undefined, vars, params); this.swf = Ext.getDom(this.id); this.el = Ext.get(this.swf); }, getSwfId : function(){ return this.swfId || (this.swfId = "extswf" + (++Ext.Component.AUTO_ID)); }, getId : function(){ return this.id || (this.id = "extflashcmp" + (++Ext.Component.AUTO_ID)); }, onFlashEvent : function(e){ switch(e.type){ case "swfReady": this.initSwf(); return; case "log": return; } e.component = this; this.fireEvent(e.type.toLowerCase().replace(/event$/, ''), e); }, initSwf : function(){ this.onSwfReady(!!this.isInitialized); this.isInitialized = true; this.fireEvent('initialize', this); }, beforeDestroy: function(){ if(this.rendered){ swfobject.removeSWF(this.swf.id); } Ext.FlashComponent.superclass.beforeDestroy.call(this); }, onSwfReady : Ext.emptyFn }); Ext.FlashComponent.EXPRESS_INSTALL_URL = 'http:/' + '/swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf'; Ext.reg('flash', Ext.FlashComponent); Ext.FlashEventProxy = { onEvent : function(id, e){ var fp = Ext.getCmp(id); if(fp){ fp.onFlashEvent(e); }else{ arguments.callee.defer(10, this, [id, e]); } } }; Ext.chart.Chart = Ext.extend(Ext.FlashComponent, { refreshBuffer: 100, chartStyle: { padding: 10, animationEnabled: true, font: { name: 'Tahoma', color: 0x444444, size: 11 }, dataTip: { padding: 5, border: { color: 0x99bbe8, size:1 }, background: { color: 0xDAE7F6, alpha: .9 }, font: { name: 'Tahoma', color: 0x15428B, size: 10, bold: true } } }, extraStyle: null, seriesStyles: null, disableCaching: Ext.isIE || Ext.isOpera, disableCacheParam: '_dc', initComponent : function(){ Ext.chart.Chart.superclass.initComponent.call(this); if(!this.url){ this.url = Ext.chart.Chart.CHART_URL; } if(this.disableCaching){ this.url = Ext.urlAppend(this.url, String.format('{0}={1}', this.disableCacheParam, new Date().getTime())); } this.addEvents( 'itemmouseover', 'itemmouseout', 'itemclick', 'itemdoubleclick', 'itemdragstart', 'itemdrag', 'itemdragend', 'beforerefresh', 'refresh' ); this.store = Ext.StoreMgr.lookup(this.store); }, setStyle: function(name, value){ this.swf.setStyle(name, Ext.encode(value)); }, setStyles: function(styles){ this.swf.setStyles(Ext.encode(styles)); }, setSeriesStyles: function(styles){ this.seriesStyles = styles; var s = []; Ext.each(styles, function(style){ s.push(Ext.encode(style)); }); this.swf.setSeriesStyles(s); }, setCategoryNames : function(names){ this.swf.setCategoryNames(names); }, setLegendRenderer : function(fn, scope){ var chart = this; scope = scope || chart; chart.removeFnProxy(chart.legendFnName); chart.legendFnName = chart.createFnProxy(function(name){ return fn.call(scope, name); }); chart.swf.setLegendLabelFunction(chart.legendFnName); }, setTipRenderer : function(fn, scope){ var chart = this; scope = scope || chart; chart.removeFnProxy(chart.tipFnName); chart.tipFnName = chart.createFnProxy(function(item, index, series){ var record = chart.store.getAt(index); return fn.call(scope, chart, record, index, series); }); chart.swf.setDataTipFunction(chart.tipFnName); }, setSeries : function(series){ this.series = series; this.refresh(); }, bindStore : function(store, initial){ if(!initial && this.store){ if(store !== this.store && this.store.autoDestroy){ this.store.destroy(); }else{ this.store.un("datachanged", this.refresh, this); this.store.un("add", this.delayRefresh, this); this.store.un("remove", this.delayRefresh, this); this.store.un("update", this.delayRefresh, this); this.store.un("clear", this.refresh, this); } } if(store){ store = Ext.StoreMgr.lookup(store); store.on({ scope: this, datachanged: this.refresh, add: this.delayRefresh, remove: this.delayRefresh, update: this.delayRefresh, clear: this.refresh }); } this.store = store; if(store && !initial){ this.refresh(); } }, onSwfReady : function(isReset){ Ext.chart.Chart.superclass.onSwfReady.call(this, isReset); var ref; this.swf.setType(this.type); if(this.chartStyle){ this.setStyles(Ext.apply({}, this.extraStyle, this.chartStyle)); } if(this.categoryNames){ this.setCategoryNames(this.categoryNames); } if(this.tipRenderer){ ref = this.getFunctionRef(this.tipRenderer); this.setTipRenderer(ref.fn, ref.scope); } if(this.legendRenderer){ ref = this.getFunctionRef(this.legendRenderer); this.setLegendRenderer(ref.fn, ref.scope); } if(!isReset){ this.bindStore(this.store, true); } this.refresh.defer(10, this); }, delayRefresh : function(){ if(!this.refreshTask){ this.refreshTask = new Ext.util.DelayedTask(this.refresh, this); } this.refreshTask.delay(this.refreshBuffer); }, refresh : function(){ if(this.fireEvent('beforerefresh', this) !== false){ var styleChanged = false; var data = [], rs = this.store.data.items; for(var j = 0, len = rs.length; j < len; j++){ data[j] = rs[j].data; } var dataProvider = []; var seriesCount = 0; var currentSeries = null; var i = 0; if(this.series){ seriesCount = this.series.length; for(i = 0; i < seriesCount; i++){ currentSeries = this.series[i]; var clonedSeries = {}; for(var prop in currentSeries){ if(prop == "style" && currentSeries.style !== null){ clonedSeries.style = Ext.encode(currentSeries.style); styleChanged = true; } else{ clonedSeries[prop] = currentSeries[prop]; } } dataProvider.push(clonedSeries); } } if(seriesCount > 0){ for(i = 0; i < seriesCount; i++){ currentSeries = dataProvider[i]; if(!currentSeries.type){ currentSeries.type = this.type; } currentSeries.dataProvider = data; } } else{ dataProvider.push({type: this.type, dataProvider: data}); } this.swf.setDataProvider(dataProvider); if(this.seriesStyles){ this.setSeriesStyles(this.seriesStyles); } this.fireEvent('refresh', this); } }, createFnProxy : function(fn){ var fnName = 'extFnProxy' + (++Ext.chart.Chart.PROXY_FN_ID); Ext.chart.Chart.proxyFunction[fnName] = fn; return 'Ext.chart.Chart.proxyFunction.' + fnName; }, removeFnProxy : function(fn){ if(!Ext.isEmpty(fn)){ fn = fn.replace('Ext.chart.Chart.proxyFunction.', ''); delete Ext.chart.Chart.proxyFunction[fn]; } }, getFunctionRef : function(val){ if(Ext.isFunction(val)){ return { fn: val, scope: this }; }else{ return { fn: val.fn, scope: val.scope || this }; } }, onDestroy: function(){ if (this.refreshTask && this.refreshTask.cancel){ this.refreshTask.cancel(); } Ext.chart.Chart.superclass.onDestroy.call(this); this.bindStore(null); this.removeFnProxy(this.tipFnName); this.removeFnProxy(this.legendFnName); } }); Ext.reg('chart', Ext.chart.Chart); Ext.chart.Chart.PROXY_FN_ID = 0; Ext.chart.Chart.proxyFunction = {}; Ext.chart.Chart.CHART_URL = 'http:/' + '/yui.yahooapis.com/2.8.2/build/charts/assets/charts.swf'; Ext.chart.PieChart = Ext.extend(Ext.chart.Chart, { type: 'pie', onSwfReady : function(isReset){ Ext.chart.PieChart.superclass.onSwfReady.call(this, isReset); this.setDataField(this.dataField); this.setCategoryField(this.categoryField); }, setDataField : function(field){ this.dataField = field; this.swf.setDataField(field); }, setCategoryField : function(field){ this.categoryField = field; this.swf.setCategoryField(field); } }); Ext.reg('piechart', Ext.chart.PieChart); Ext.chart.CartesianChart = Ext.extend(Ext.chart.Chart, { onSwfReady : function(isReset){ Ext.chart.CartesianChart.superclass.onSwfReady.call(this, isReset); this.labelFn = []; if(this.xField){ this.setXField(this.xField); } if(this.yField){ this.setYField(this.yField); } if(this.xAxis){ this.setXAxis(this.xAxis); } if(this.xAxes){ this.setXAxes(this.xAxes); } if(this.yAxis){ this.setYAxis(this.yAxis); } if(this.yAxes){ this.setYAxes(this.yAxes); } if(Ext.isDefined(this.constrainViewport)){ this.swf.setConstrainViewport(this.constrainViewport); } }, setXField : function(value){ this.xField = value; this.swf.setHorizontalField(value); }, setYField : function(value){ this.yField = value; this.swf.setVerticalField(value); }, setXAxis : function(value){ this.xAxis = this.createAxis('xAxis', value); this.swf.setHorizontalAxis(this.xAxis); }, setXAxes : function(value){ var axis; for(var i = 0; i < value.length; i++) { axis = this.createAxis('xAxis' + i, value[i]); this.swf.setHorizontalAxis(axis); } }, setYAxis : function(value){ this.yAxis = this.createAxis('yAxis', value); this.swf.setVerticalAxis(this.yAxis); }, setYAxes : function(value){ var axis; for(var i = 0; i < value.length; i++) { axis = this.createAxis('yAxis' + i, value[i]); this.swf.setVerticalAxis(axis); } }, createAxis : function(axis, value){ var o = Ext.apply({}, value), ref, old; if(this[axis]){ old = this[axis].labelFunction; this.removeFnProxy(old); this.labelFn.remove(old); } if(o.labelRenderer){ ref = this.getFunctionRef(o.labelRenderer); o.labelFunction = this.createFnProxy(function(v){ return ref.fn.call(ref.scope, v); }); delete o.labelRenderer; this.labelFn.push(o.labelFunction); } if(axis.indexOf('xAxis') > -1 && o.position == 'left'){ o.position = 'bottom'; } return o; }, onDestroy : function(){ Ext.chart.CartesianChart.superclass.onDestroy.call(this); Ext.each(this.labelFn, function(fn){ this.removeFnProxy(fn); }, this); } }); Ext.reg('cartesianchart', Ext.chart.CartesianChart); Ext.chart.LineChart = Ext.extend(Ext.chart.CartesianChart, { type: 'line' }); Ext.reg('linechart', Ext.chart.LineChart); Ext.chart.ColumnChart = Ext.extend(Ext.chart.CartesianChart, { type: 'column' }); Ext.reg('columnchart', Ext.chart.ColumnChart); Ext.chart.StackedColumnChart = Ext.extend(Ext.chart.CartesianChart, { type: 'stackcolumn' }); Ext.reg('stackedcolumnchart', Ext.chart.StackedColumnChart); Ext.chart.BarChart = Ext.extend(Ext.chart.CartesianChart, { type: 'bar' }); Ext.reg('barchart', Ext.chart.BarChart); Ext.chart.StackedBarChart = Ext.extend(Ext.chart.CartesianChart, { type: 'stackbar' }); Ext.reg('stackedbarchart', Ext.chart.StackedBarChart); Ext.chart.Axis = function(config){ Ext.apply(this, config); }; Ext.chart.Axis.prototype = { type: null, orientation: "horizontal", reverse: false, labelFunction: null, hideOverlappingLabels: true, labelSpacing: 2 }; Ext.chart.NumericAxis = Ext.extend(Ext.chart.Axis, { type: "numeric", minimum: NaN, maximum: NaN, majorUnit: NaN, minorUnit: NaN, snapToUnits: true, alwaysShowZero: true, scale: "linear", roundMajorUnit: true, calculateByLabelSize: true, position: 'left', adjustMaximumByMajorUnit: true, adjustMinimumByMajorUnit: true }); Ext.chart.TimeAxis = Ext.extend(Ext.chart.Axis, { type: "time", minimum: null, maximum: null, majorUnit: NaN, majorTimeUnit: null, minorUnit: NaN, minorTimeUnit: null, snapToUnits: true, stackingEnabled: false, calculateByLabelSize: true }); Ext.chart.CategoryAxis = Ext.extend(Ext.chart.Axis, { type: "category", categoryNames: null, calculateCategoryCount: false }); Ext.chart.Series = function(config) { Ext.apply(this, config); }; Ext.chart.Series.prototype = { type: null, displayName: null }; Ext.chart.CartesianSeries = Ext.extend(Ext.chart.Series, { xField: null, yField: null, showInLegend: true, axis: 'primary' }); Ext.chart.ColumnSeries = Ext.extend(Ext.chart.CartesianSeries, { type: "column" }); Ext.chart.LineSeries = Ext.extend(Ext.chart.CartesianSeries, { type: "line" }); Ext.chart.BarSeries = Ext.extend(Ext.chart.CartesianSeries, { type: "bar" }); Ext.chart.PieSeries = Ext.extend(Ext.chart.Series, { type: "pie", dataField: null, categoryField: null }); Ext.menu.Menu = Ext.extend(Ext.Container, { minWidth : 120, shadow : 'sides', subMenuAlign : 'tl-tr?', defaultAlign : 'tl-bl?', allowOtherMenus : false, ignoreParentClicks : false, enableScrolling : true, maxHeight : null, scrollIncrement : 24, showSeparator : true, defaultOffsets : [0, 0], plain : false, floating : true, zIndex: 15000, hidden : true, layout : 'menu', hideMode : 'offsets', scrollerHeight : 8, autoLayout : true, defaultType : 'menuitem', bufferResize : false, initComponent : function(){ if(Ext.isArray(this.initialConfig)){ Ext.apply(this, {items:this.initialConfig}); } this.addEvents( 'click', 'mouseover', 'mouseout', 'itemclick' ); Ext.menu.MenuMgr.register(this); if(this.floating){ Ext.EventManager.onWindowResize(this.hide, this); }else{ if(this.initialConfig.hidden !== false){ this.hidden = false; } this.internalDefaults = {hideOnClick: false}; } Ext.menu.Menu.superclass.initComponent.call(this); if(this.autoLayout){ var fn = this.doLayout.createDelegate(this, []); this.on({ add: fn, remove: fn }); } }, getLayoutTarget : function() { return this.ul; }, onRender : function(ct, position){ if(!ct){ ct = Ext.getBody(); } var dh = { id: this.getId(), cls: 'x-menu ' + ((this.floating) ? 'x-menu-floating x-layer ' : '') + (this.cls || '') + (this.plain ? ' x-menu-plain' : '') + (this.showSeparator ? '' : ' x-menu-nosep'), style: this.style, cn: [ {tag: 'a', cls: 'x-menu-focus', href: '#', onclick: 'return false;', tabIndex: '-1'}, {tag: 'ul', cls: 'x-menu-list'} ] }; if(this.floating){ this.el = new Ext.Layer({ shadow: this.shadow, dh: dh, constrain: false, parentEl: ct, zindex: this.zIndex }); }else{ this.el = ct.createChild(dh); } Ext.menu.Menu.superclass.onRender.call(this, ct, position); if(!this.keyNav){ this.keyNav = new Ext.menu.MenuNav(this); } this.focusEl = this.el.child('a.x-menu-focus'); this.ul = this.el.child('ul.x-menu-list'); this.mon(this.ul, { scope: this, click: this.onClick, mouseover: this.onMouseOver, mouseout: this.onMouseOut }); if(this.enableScrolling){ this.mon(this.el, { scope: this, delegate: '.x-menu-scroller', click: this.onScroll, mouseover: this.deactivateActive }); } }, findTargetItem : function(e){ var t = e.getTarget('.x-menu-list-item', this.ul, true); if(t && t.menuItemId){ return this.items.get(t.menuItemId); } }, onClick : function(e){ var t = this.findTargetItem(e); if(t){ if(t.isFormField){ this.setActiveItem(t); }else if(t instanceof Ext.menu.BaseItem){ if(t.menu && this.ignoreParentClicks){ t.expandMenu(); e.preventDefault(); }else if(t.onClick){ t.onClick(e); this.fireEvent('click', this, t, e); } } } }, setActiveItem : function(item, autoExpand){ if(item != this.activeItem){ this.deactivateActive(); if((this.activeItem = item).isFormField){ item.focus(); }else{ item.activate(autoExpand); } }else if(autoExpand){ item.expandMenu(); } }, deactivateActive : function(){ var a = this.activeItem; if(a){ if(a.isFormField){ if(a.collapse){ a.collapse(); } }else{ a.deactivate(); } delete this.activeItem; } }, tryActivate : function(start, step){ var items = this.items; for(var i = start, len = items.length; i >= 0 && i < len; i+= step){ var item = items.get(i); if(item.isVisible() && !item.disabled && (item.canActivate || item.isFormField)){ this.setActiveItem(item, false); return item; } } return false; }, onMouseOver : function(e){ var t = this.findTargetItem(e); if(t){ if(t.canActivate && !t.disabled){ this.setActiveItem(t, true); } } this.over = true; this.fireEvent('mouseover', this, e, t); }, onMouseOut : function(e){ var t = this.findTargetItem(e); if(t){ if(t == this.activeItem && t.shouldDeactivate && t.shouldDeactivate(e)){ this.activeItem.deactivate(); delete this.activeItem; } } this.over = false; this.fireEvent('mouseout', this, e, t); }, onScroll : function(e, t){ if(e){ e.stopEvent(); } var ul = this.ul.dom, top = Ext.fly(t).is('.x-menu-scroller-top'); ul.scrollTop += this.scrollIncrement * (top ? -1 : 1); if(top ? ul.scrollTop <= 0 : ul.scrollTop + this.activeMax >= ul.scrollHeight){ this.onScrollerOut(null, t); } }, onScrollerIn : function(e, t){ var ul = this.ul.dom, top = Ext.fly(t).is('.x-menu-scroller-top'); if(top ? ul.scrollTop > 0 : ul.scrollTop + this.activeMax < ul.scrollHeight){ Ext.fly(t).addClass(['x-menu-item-active', 'x-menu-scroller-active']); } }, onScrollerOut : function(e, t){ Ext.fly(t).removeClass(['x-menu-item-active', 'x-menu-scroller-active']); }, show : function(el, pos, parentMenu){ if(this.floating){ this.parentMenu = parentMenu; if(!this.el){ this.render(); this.doLayout(false, true); } this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign, this.defaultOffsets), parentMenu); }else{ Ext.menu.Menu.superclass.show.call(this); } }, showAt : function(xy, parentMenu){ if(this.fireEvent('beforeshow', this) !== false){ this.parentMenu = parentMenu; if(!this.el){ this.render(); } if(this.enableScrolling){ this.el.setXY(xy); xy[1] = this.constrainScroll(xy[1]); xy = [this.el.adjustForConstraints(xy)[0], xy[1]]; }else{ xy = this.el.adjustForConstraints(xy); } this.el.setXY(xy); this.el.show(); Ext.menu.Menu.superclass.onShow.call(this); if(Ext.isIE){ this.fireEvent('autosize', this); if(!Ext.isIE8){ this.el.repaint(); } } this.hidden = false; this.focus(); this.fireEvent('show', this); } }, constrainScroll : function(y){ var max, full = this.ul.setHeight('auto').getHeight(), returnY = y, normalY, parentEl, scrollTop, viewHeight; if(this.floating){ parentEl = Ext.fly(this.el.dom.parentNode); scrollTop = parentEl.getScroll().top; viewHeight = parentEl.getViewSize().height; normalY = y - scrollTop; max = this.maxHeight ? this.maxHeight : viewHeight - normalY; if(full > viewHeight) { max = viewHeight; returnY = y - normalY; } else if(max < full) { returnY = y - (full - max); max = full; } }else{ max = this.getHeight(); } if (this.maxHeight){ max = Math.min(this.maxHeight, max); } if(full > max && max > 0){ this.activeMax = max - this.scrollerHeight * 2 - this.el.getFrameWidth('tb') - Ext.num(this.el.shadowOffset, 0); this.ul.setHeight(this.activeMax); this.createScrollers(); this.el.select('.x-menu-scroller').setDisplayed(''); }else{ this.ul.setHeight(full); this.el.select('.x-menu-scroller').setDisplayed('none'); } this.ul.dom.scrollTop = 0; return returnY; }, createScrollers : function(){ if(!this.scroller){ this.scroller = { pos: 0, top: this.el.insertFirst({ tag: 'div', cls: 'x-menu-scroller x-menu-scroller-top', html: ' ' }), bottom: this.el.createChild({ tag: 'div', cls: 'x-menu-scroller x-menu-scroller-bottom', html: ' ' }) }; this.scroller.top.hover(this.onScrollerIn, this.onScrollerOut, this); this.scroller.topRepeater = new Ext.util.ClickRepeater(this.scroller.top, { listeners: { click: this.onScroll.createDelegate(this, [null, this.scroller.top], false) } }); this.scroller.bottom.hover(this.onScrollerIn, this.onScrollerOut, this); this.scroller.bottomRepeater = new Ext.util.ClickRepeater(this.scroller.bottom, { listeners: { click: this.onScroll.createDelegate(this, [null, this.scroller.bottom], false) } }); } }, onLayout : function(){ if(this.isVisible()){ if(this.enableScrolling){ this.constrainScroll(this.el.getTop()); } if(this.floating){ this.el.sync(); } } }, focus : function(){ if(!this.hidden){ this.doFocus.defer(50, this); } }, doFocus : function(){ if(!this.hidden){ this.focusEl.focus(); } }, hide : function(deep){ if (!this.isDestroyed) { this.deepHide = deep; Ext.menu.Menu.superclass.hide.call(this); delete this.deepHide; } }, onHide : function(){ Ext.menu.Menu.superclass.onHide.call(this); this.deactivateActive(); if(this.el && this.floating){ this.el.hide(); } var pm = this.parentMenu; if(this.deepHide === true && pm){ if(pm.floating){ pm.hide(true); }else{ pm.deactivateActive(); } } }, lookupComponent : function(c){ if(Ext.isString(c)){ c = (c == 'separator' || c == '-') ? new Ext.menu.Separator() : new Ext.menu.TextItem(c); this.applyDefaults(c); }else{ if(Ext.isObject(c)){ c = this.getMenuItem(c); }else if(c.tagName || c.el){ c = new Ext.BoxComponent({ el: c }); } } return c; }, applyDefaults : function(c) { if (!Ext.isString(c)) { c = Ext.menu.Menu.superclass.applyDefaults.call(this, c); var d = this.internalDefaults; if(d){ if(c.events){ Ext.applyIf(c.initialConfig, d); Ext.apply(c, d); }else{ Ext.applyIf(c, d); } } } return c; }, getMenuItem : function(config) { config.ownerCt = this; if (!config.isXType) { if (!config.xtype && Ext.isBoolean(config.checked)) { return new Ext.menu.CheckItem(config); } return Ext.create(config, this.defaultType); } return config; }, addSeparator : function() { return this.add(new Ext.menu.Separator()); }, addElement : function(el) { return this.add(new Ext.menu.BaseItem({ el: el })); }, addItem : function(item) { return this.add(item); }, addMenuItem : function(config) { return this.add(this.getMenuItem(config)); }, addText : function(text){ return this.add(new Ext.menu.TextItem(text)); }, onDestroy : function(){ Ext.EventManager.removeResizeListener(this.hide, this); var pm = this.parentMenu; if(pm && pm.activeChild == this){ delete pm.activeChild; } delete this.parentMenu; Ext.menu.Menu.superclass.onDestroy.call(this); Ext.menu.MenuMgr.unregister(this); if(this.keyNav) { this.keyNav.disable(); } var s = this.scroller; if(s){ Ext.destroy(s.topRepeater, s.bottomRepeater, s.top, s.bottom); } Ext.destroy( this.el, this.focusEl, this.ul ); } }); Ext.reg('menu', Ext.menu.Menu); Ext.menu.MenuNav = Ext.extend(Ext.KeyNav, function(){ function up(e, m){ if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){ m.tryActivate(m.items.length-1, -1); } } function down(e, m){ if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){ m.tryActivate(0, 1); } } return { constructor : function(menu){ Ext.menu.MenuNav.superclass.constructor.call(this, menu.el); this.scope = this.menu = menu; }, doRelay : function(e, h){ var k = e.getKey(); if (this.menu.activeItem && this.menu.activeItem.isFormField && k != e.TAB) { return false; } if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){ this.menu.tryActivate(0, 1); return false; } return h.call(this.scope || this, e, this.menu); }, tab: function(e, m) { e.stopEvent(); if (e.shiftKey) { up(e, m); } else { down(e, m); } }, up : up, down : down, right : function(e, m){ if(m.activeItem){ m.activeItem.expandMenu(true); } }, left : function(e, m){ m.hide(); if(m.parentMenu && m.parentMenu.activeItem){ m.parentMenu.activeItem.activate(); } }, enter : function(e, m){ if(m.activeItem){ e.stopPropagation(); m.activeItem.onClick(e); m.fireEvent('click', this, m.activeItem); return true; } } }; }()); Ext.menu.MenuMgr = function(){ var menus, active, map, groups = {}, attached = false, lastShow = new Date(); function init(){ menus = {}; active = new Ext.util.MixedCollection(); map = Ext.getDoc().addKeyListener(27, hideAll); map.disable(); } function hideAll(){ if(active && active.length > 0){ var c = active.clone(); c.each(function(m){ m.hide(); }); return true; } return false; } function onHide(m){ active.remove(m); if(active.length < 1){ map.disable(); Ext.getDoc().un("mousedown", onMouseDown); attached = false; } } function onShow(m){ var last = active.last(); lastShow = new Date(); active.add(m); if(!attached){ map.enable(); Ext.getDoc().on("mousedown", onMouseDown); attached = true; } if(m.parentMenu){ m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3); m.parentMenu.activeChild = m; }else if(last && !last.isDestroyed && last.isVisible()){ m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3); } } function onBeforeHide(m){ if(m.activeChild){ m.activeChild.hide(); } if(m.autoHideTimer){ clearTimeout(m.autoHideTimer); delete m.autoHideTimer; } } function onBeforeShow(m){ var pm = m.parentMenu; if(!pm && !m.allowOtherMenus){ hideAll(); }else if(pm && pm.activeChild){ pm.activeChild.hide(); } } function onMouseDown(e){ if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){ hideAll(); } } return { hideAll : function(){ return hideAll(); }, register : function(menu){ if(!menus){ init(); } menus[menu.id] = menu; menu.on({ beforehide: onBeforeHide, hide: onHide, beforeshow: onBeforeShow, show: onShow }); }, get : function(menu){ if(typeof menu == "string"){ if(!menus){ return null; } return menus[menu]; }else if(menu.events){ return menu; }else if(typeof menu.length == 'number'){ return new Ext.menu.Menu({items:menu}); }else{ return Ext.create(menu, 'menu'); } }, unregister : function(menu){ delete menus[menu.id]; menu.un("beforehide", onBeforeHide); menu.un("hide", onHide); menu.un("beforeshow", onBeforeShow); menu.un("show", onShow); }, registerCheckable : function(menuItem){ var g = menuItem.group; if(g){ if(!groups[g]){ groups[g] = []; } groups[g].push(menuItem); } }, unregisterCheckable : function(menuItem){ var g = menuItem.group; if(g){ groups[g].remove(menuItem); } }, onCheckChange: function(item, state){ if(item.group && state){ var group = groups[item.group], i = 0, len = group.length, current; for(; i < len; i++){ current = group[i]; if(current != item){ current.setChecked(false); } } } }, getCheckedItem : function(groupId){ var g = groups[groupId]; if(g){ for(var i = 0, l = g.length; i < l; i++){ if(g[i].checked){ return g[i]; } } } return null; }, setCheckedItem : function(groupId, itemId){ var g = groups[groupId]; if(g){ for(var i = 0, l = g.length; i < l; i++){ if(g[i].id == itemId){ g[i].setChecked(true); } } } return null; } }; }(); Ext.menu.BaseItem = Ext.extend(Ext.Component, { canActivate : false, activeClass : "x-menu-item-active", hideOnClick : true, clickHideDelay : 1, ctype : "Ext.menu.BaseItem", actionMode : "container", initComponent : function(){ Ext.menu.BaseItem.superclass.initComponent.call(this); this.addEvents( 'click', 'activate', 'deactivate' ); if(this.handler){ this.on("click", this.handler, this.scope); } }, onRender : function(container, position){ Ext.menu.BaseItem.superclass.onRender.apply(this, arguments); if(this.ownerCt && this.ownerCt instanceof Ext.menu.Menu){ this.parentMenu = this.ownerCt; }else{ this.container.addClass('x-menu-list-item'); this.mon(this.el, { scope: this, click: this.onClick, mouseenter: this.activate, mouseleave: this.deactivate }); } }, setHandler : function(handler, scope){ if(this.handler){ this.un("click", this.handler, this.scope); } this.on("click", this.handler = handler, this.scope = scope); }, onClick : function(e){ if(!this.disabled && this.fireEvent("click", this, e) !== false && (this.parentMenu && this.parentMenu.fireEvent("itemclick", this, e) !== false)){ this.handleClick(e); }else{ e.stopEvent(); } }, activate : function(){ if(this.disabled){ return false; } var li = this.container; li.addClass(this.activeClass); this.region = li.getRegion().adjust(2, 2, -2, -2); this.fireEvent("activate", this); return true; }, deactivate : function(){ this.container.removeClass(this.activeClass); this.fireEvent("deactivate", this); }, shouldDeactivate : function(e){ return !this.region || !this.region.contains(e.getPoint()); }, handleClick : function(e){ var pm = this.parentMenu; if(this.hideOnClick){ if(pm.floating){ this.clickHideDelayTimer = pm.hide.defer(this.clickHideDelay, pm, [true]); }else{ pm.deactivateActive(); } } }, beforeDestroy: function(){ clearTimeout(this.clickHideDelayTimer); Ext.menu.BaseItem.superclass.beforeDestroy.call(this); }, expandMenu : Ext.emptyFn, hideMenu : Ext.emptyFn }); Ext.reg('menubaseitem', Ext.menu.BaseItem); Ext.menu.TextItem = Ext.extend(Ext.menu.BaseItem, { hideOnClick : false, itemCls : "x-menu-text", constructor : function(config) { if (typeof config == 'string') { config = { text: config }; } Ext.menu.TextItem.superclass.constructor.call(this, config); }, onRender : function() { var s = document.createElement("span"); s.className = this.itemCls; s.innerHTML = this.text; this.el = s; Ext.menu.TextItem.superclass.onRender.apply(this, arguments); } }); Ext.reg('menutextitem', Ext.menu.TextItem); Ext.menu.Separator = Ext.extend(Ext.menu.BaseItem, { itemCls : "x-menu-sep", hideOnClick : false, activeClass: '', onRender : function(li){ var s = document.createElement("span"); s.className = this.itemCls; s.innerHTML = " "; this.el = s; li.addClass("x-menu-sep-li"); Ext.menu.Separator.superclass.onRender.apply(this, arguments); } }); Ext.reg('menuseparator', Ext.menu.Separator); Ext.menu.Item = Ext.extend(Ext.menu.BaseItem, { itemCls : 'x-menu-item', canActivate : true, showDelay: 200, altText: '', hideDelay: 200, ctype: 'Ext.menu.Item', initComponent : function(){ Ext.menu.Item.superclass.initComponent.call(this); if(this.menu){ if (Ext.isArray(this.menu)){ this.menu = { items: this.menu }; } if (Ext.isObject(this.menu)){ this.menu.ownerCt = this; } this.menu = Ext.menu.MenuMgr.get(this.menu); this.menu.ownerCt = undefined; } }, onRender : function(container, position){ if (!this.itemTpl) { this.itemTpl = Ext.menu.Item.prototype.itemTpl = new Ext.XTemplate( '', ' target="{hrefTarget}"', '', '>', '{altText}', '{text}', '' ); } var a = this.getTemplateArgs(); this.el = position ? this.itemTpl.insertBefore(position, a, true) : this.itemTpl.append(container, a, true); this.iconEl = this.el.child('img.x-menu-item-icon'); this.textEl = this.el.child('.x-menu-item-text'); if(!this.href) { this.mon(this.el, 'click', Ext.emptyFn, null, { preventDefault: true }); } Ext.menu.Item.superclass.onRender.call(this, container, position); }, getTemplateArgs: function() { return { id: this.id, cls: this.itemCls + (this.menu ? ' x-menu-item-arrow' : '') + (this.cls ? ' ' + this.cls : ''), href: this.href || '#', hrefTarget: this.hrefTarget, icon: this.icon || Ext.BLANK_IMAGE_URL, iconCls: this.iconCls || '', text: this.itemText||this.text||' ', altText: this.altText || '' }; }, setText : function(text){ this.text = text||' '; if(this.rendered){ this.textEl.update(this.text); this.parentMenu.layout.doAutoSize(); } }, setIconClass : function(cls){ var oldCls = this.iconCls; this.iconCls = cls; if(this.rendered){ this.iconEl.replaceClass(oldCls, this.iconCls); } }, beforeDestroy: function(){ clearTimeout(this.showTimer); clearTimeout(this.hideTimer); if (this.menu){ delete this.menu.ownerCt; this.menu.destroy(); } Ext.menu.Item.superclass.beforeDestroy.call(this); }, handleClick : function(e){ if(!this.href){ e.stopEvent(); } Ext.menu.Item.superclass.handleClick.apply(this, arguments); }, activate : function(autoExpand){ if(Ext.menu.Item.superclass.activate.apply(this, arguments)){ this.focus(); if(autoExpand){ this.expandMenu(); } } return true; }, shouldDeactivate : function(e){ if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){ if(this.menu && this.menu.isVisible()){ return !this.menu.getEl().getRegion().contains(e.getPoint()); } return true; } return false; }, deactivate : function(){ Ext.menu.Item.superclass.deactivate.apply(this, arguments); this.hideMenu(); }, expandMenu : function(autoActivate){ if(!this.disabled && this.menu){ clearTimeout(this.hideTimer); delete this.hideTimer; if(!this.menu.isVisible() && !this.showTimer){ this.showTimer = this.deferExpand.defer(this.showDelay, this, [autoActivate]); }else if (this.menu.isVisible() && autoActivate){ this.menu.tryActivate(0, 1); } } }, deferExpand : function(autoActivate){ delete this.showTimer; this.menu.show(this.container, this.parentMenu.subMenuAlign || 'tl-tr?', this.parentMenu); if(autoActivate){ this.menu.tryActivate(0, 1); } }, hideMenu : function(){ clearTimeout(this.showTimer); delete this.showTimer; if(!this.hideTimer && this.menu && this.menu.isVisible()){ this.hideTimer = this.deferHide.defer(this.hideDelay, this); } }, deferHide : function(){ delete this.hideTimer; if(this.menu.over){ this.parentMenu.setActiveItem(this, false); }else{ this.menu.hide(); } } }); Ext.reg('menuitem', Ext.menu.Item); Ext.menu.CheckItem = Ext.extend(Ext.menu.Item, { itemCls : "x-menu-item x-menu-check-item", groupClass : "x-menu-group-item", checked: false, ctype: "Ext.menu.CheckItem", initComponent : function(){ Ext.menu.CheckItem.superclass.initComponent.call(this); this.addEvents( "beforecheckchange" , "checkchange" ); if(this.checkHandler){ this.on('checkchange', this.checkHandler, this.scope); } Ext.menu.MenuMgr.registerCheckable(this); }, onRender : function(c){ Ext.menu.CheckItem.superclass.onRender.apply(this, arguments); if(this.group){ this.el.addClass(this.groupClass); } if(this.checked){ this.checked = false; this.setChecked(true, true); } }, destroy : function(){ Ext.menu.MenuMgr.unregisterCheckable(this); Ext.menu.CheckItem.superclass.destroy.apply(this, arguments); }, setChecked : function(state, suppressEvent){ var suppress = suppressEvent === true; if(this.checked != state && (suppress || this.fireEvent("beforecheckchange", this, state) !== false)){ Ext.menu.MenuMgr.onCheckChange(this, state); if(this.container){ this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked"); } this.checked = state; if(!suppress){ this.fireEvent("checkchange", this, state); } } }, handleClick : function(e){ if(!this.disabled && !(this.checked && this.group)){ this.setChecked(!this.checked); } Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments); } }); Ext.reg('menucheckitem', Ext.menu.CheckItem); Ext.menu.DateMenu = Ext.extend(Ext.menu.Menu, { enableScrolling : false, hideOnClick : true, pickerId : null, cls : 'x-date-menu', initComponent : function(){ this.on('beforeshow', this.onBeforeShow, this); if(this.strict = (Ext.isIE7 && Ext.isStrict)){ this.on('show', this.onShow, this, {single: true, delay: 20}); } Ext.apply(this, { plain: true, showSeparator: false, items: this.picker = new Ext.DatePicker(Ext.applyIf({ internalRender: this.strict || !Ext.isIE, ctCls: 'x-menu-date-item', id: this.pickerId }, this.initialConfig)) }); this.picker.purgeListeners(); Ext.menu.DateMenu.superclass.initComponent.call(this); this.relayEvents(this.picker, ['select']); this.on('show', this.picker.focus, this.picker); this.on('select', this.menuHide, this); if(this.handler){ this.on('select', this.handler, this.scope || this); } }, menuHide : function() { if(this.hideOnClick){ this.hide(true); } }, onBeforeShow : function(){ if(this.picker){ this.picker.hideMonthPicker(true); } }, onShow : function(){ var el = this.picker.getEl(); el.setWidth(el.getWidth()); } }); Ext.reg('datemenu', Ext.menu.DateMenu); Ext.menu.ColorMenu = Ext.extend(Ext.menu.Menu, { enableScrolling : false, hideOnClick : true, cls : 'x-color-menu', paletteId : null, initComponent : function(){ Ext.apply(this, { plain: true, showSeparator: false, items: this.palette = new Ext.ColorPalette(Ext.applyIf({ id: this.paletteId }, this.initialConfig)) }); this.palette.purgeListeners(); Ext.menu.ColorMenu.superclass.initComponent.call(this); this.relayEvents(this.palette, ['select']); this.on('select', this.menuHide, this); if(this.handler){ this.on('select', this.handler, this.scope || this); } }, menuHide : function(){ if(this.hideOnClick){ this.hide(true); } } }); Ext.reg('colormenu', Ext.menu.ColorMenu); Ext.form.Field = Ext.extend(Ext.BoxComponent, { invalidClass : 'x-form-invalid', invalidText : 'The value in this field is invalid', focusClass : 'x-form-focus', validationEvent : 'keyup', validateOnBlur : true, validationDelay : 250, defaultAutoCreate : {tag: 'input', type: 'text', size: '20', autocomplete: 'off'}, fieldClass : 'x-form-field', msgTarget : 'qtip', msgFx : 'normal', readOnly : false, disabled : false, submitValue: true, isFormField : true, msgDisplay: '', hasFocus : false, initComponent : function(){ Ext.form.Field.superclass.initComponent.call(this); this.addEvents( 'focus', 'blur', 'specialkey', 'change', 'invalid', 'valid' ); }, getName : function(){ return this.rendered && this.el.dom.name ? this.el.dom.name : this.name || this.id || ''; }, onRender : function(ct, position){ if(!this.el){ var cfg = this.getAutoCreate(); if(!cfg.name){ cfg.name = this.name || this.id; } if(this.inputType){ cfg.type = this.inputType; } this.autoEl = cfg; } Ext.form.Field.superclass.onRender.call(this, ct, position); if(this.submitValue === false){ this.el.dom.removeAttribute('name'); } var type = this.el.dom.type; if(type){ if(type == 'password'){ type = 'text'; } this.el.addClass('x-form-'+type); } if(this.readOnly){ this.setReadOnly(true); } if(this.tabIndex !== undefined){ this.el.dom.setAttribute('tabIndex', this.tabIndex); } this.el.addClass([this.fieldClass, this.cls]); }, getItemCt : function(){ return this.itemCt; }, initValue : function(){ if(this.value !== undefined){ this.setValue(this.value); }else if(!Ext.isEmpty(this.el.dom.value) && this.el.dom.value != this.emptyText){ this.setValue(this.el.dom.value); } this.originalValue = this.getValue(); }, isDirty : function() { if(this.disabled || !this.rendered) { return false; } return String(this.getValue()) !== String(this.originalValue); }, setReadOnly : function(readOnly){ if(this.rendered){ this.el.dom.readOnly = readOnly; } this.readOnly = readOnly; }, afterRender : function(){ Ext.form.Field.superclass.afterRender.call(this); this.initEvents(); this.initValue(); }, fireKey : function(e){ if(e.isSpecialKey()){ this.fireEvent('specialkey', this, e); } }, reset : function(){ this.setValue(this.originalValue); this.clearInvalid(); }, initEvents : function(){ this.mon(this.el, Ext.EventManager.getKeyEvent(), this.fireKey, this); this.mon(this.el, 'focus', this.onFocus, this); this.mon(this.el, 'blur', this.onBlur, this, this.inEditor ? {buffer:10} : null); }, preFocus: Ext.emptyFn, onFocus : function(){ this.preFocus(); if(this.focusClass){ this.el.addClass(this.focusClass); } if(!this.hasFocus){ this.hasFocus = true; this.startValue = this.getValue(); this.fireEvent('focus', this); } }, beforeBlur : Ext.emptyFn, onBlur : function(){ this.beforeBlur(); if(this.focusClass){ this.el.removeClass(this.focusClass); } this.hasFocus = false; if(this.validationEvent !== false && (this.validateOnBlur || this.validationEvent == 'blur')){ this.validate(); } var v = this.getValue(); if(String(v) !== String(this.startValue)){ this.fireEvent('change', this, v, this.startValue); } this.fireEvent('blur', this); this.postBlur(); }, postBlur : Ext.emptyFn, isValid : function(preventMark){ if(this.disabled){ return true; } var restore = this.preventMark; this.preventMark = preventMark === true; var v = this.validateValue(this.processValue(this.getRawValue()), preventMark); this.preventMark = restore; return v; }, validate : function(){ if(this.disabled || this.validateValue(this.processValue(this.getRawValue()))){ this.clearInvalid(); return true; } return false; }, processValue : function(value){ return value; }, validateValue : function(value) { var error = this.getErrors(value)[0]; if (error == undefined) { return true; } else { this.markInvalid(error); return false; } }, getErrors: function() { return []; }, getActiveError : function(){ return this.activeError || ''; }, markInvalid : function(msg){ if (this.rendered && !this.preventMark) { msg = msg || this.invalidText; var mt = this.getMessageHandler(); if(mt){ mt.mark(this, msg); }else if(this.msgTarget){ this.el.addClass(this.invalidClass); var t = Ext.getDom(this.msgTarget); if(t){ t.innerHTML = msg; t.style.display = this.msgDisplay; } } } this.setActiveError(msg); }, clearInvalid : function(){ if (this.rendered && !this.preventMark) { this.el.removeClass(this.invalidClass); var mt = this.getMessageHandler(); if(mt){ mt.clear(this); }else if(this.msgTarget){ this.el.removeClass(this.invalidClass); var t = Ext.getDom(this.msgTarget); if(t){ t.innerHTML = ''; t.style.display = 'none'; } } } this.unsetActiveError(); }, setActiveError: function(msg, suppressEvent) { this.activeError = msg; if (suppressEvent !== true) this.fireEvent('invalid', this, msg); }, unsetActiveError: function(suppressEvent) { delete this.activeError; if (suppressEvent !== true) this.fireEvent('valid', this); }, getMessageHandler : function(){ return Ext.form.MessageTargets[this.msgTarget]; }, getErrorCt : function(){ return this.el.findParent('.x-form-element', 5, true) || this.el.findParent('.x-form-field-wrap', 5, true); }, alignErrorEl : function(){ this.errorEl.setWidth(this.getErrorCt().getWidth(true) - 20); }, alignErrorIcon : function(){ this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]); }, getRawValue : function(){ var v = this.rendered ? this.el.getValue() : Ext.value(this.value, ''); if(v === this.emptyText){ v = ''; } return v; }, getValue : function(){ if(!this.rendered) { return this.value; } var v = this.el.getValue(); if(v === this.emptyText || v === undefined){ v = ''; } return v; }, setRawValue : function(v){ return this.rendered ? (this.el.dom.value = (Ext.isEmpty(v) ? '' : v)) : ''; }, setValue : function(v){ this.value = v; if(this.rendered){ this.el.dom.value = (Ext.isEmpty(v) ? '' : v); this.validate(); } return this; }, append : function(v){ this.setValue([this.getValue(), v].join('')); } }); Ext.form.MessageTargets = { 'qtip' : { mark: function(field, msg){ field.el.addClass(field.invalidClass); field.el.dom.qtip = msg; field.el.dom.qclass = 'x-form-invalid-tip'; if(Ext.QuickTips){ Ext.QuickTips.enable(); } }, clear: function(field){ field.el.removeClass(field.invalidClass); field.el.dom.qtip = ''; } }, 'title' : { mark: function(field, msg){ field.el.addClass(field.invalidClass); field.el.dom.title = msg; }, clear: function(field){ field.el.dom.title = ''; } }, 'under' : { mark: function(field, msg){ field.el.addClass(field.invalidClass); if(!field.errorEl){ var elp = field.getErrorCt(); if(!elp){ field.el.dom.title = msg; return; } field.errorEl = elp.createChild({cls:'x-form-invalid-msg'}); field.on('resize', field.alignErrorEl, field); field.on('destroy', function(){ Ext.destroy(this.errorEl); }, field); } field.alignErrorEl(); field.errorEl.update(msg); Ext.form.Field.msgFx[field.msgFx].show(field.errorEl, field); }, clear: function(field){ field.el.removeClass(field.invalidClass); if(field.errorEl){ Ext.form.Field.msgFx[field.msgFx].hide(field.errorEl, field); }else{ field.el.dom.title = ''; } } }, 'side' : { mark: function(field, msg){ field.el.addClass(field.invalidClass); if(!field.errorIcon){ var elp = field.getErrorCt(); if(!elp){ field.el.dom.title = msg; return; } field.errorIcon = elp.createChild({cls:'x-form-invalid-icon'}); if (field.ownerCt) { field.ownerCt.on('afterlayout', field.alignErrorIcon, field); field.ownerCt.on('expand', field.alignErrorIcon, field); } field.on('resize', field.alignErrorIcon, field); field.on('destroy', function(){ Ext.destroy(this.errorIcon); }, field); } field.alignErrorIcon(); field.errorIcon.dom.qtip = msg; field.errorIcon.dom.qclass = 'x-form-invalid-tip'; field.errorIcon.show(); }, clear: function(field){ field.el.removeClass(field.invalidClass); if(field.errorIcon){ field.errorIcon.dom.qtip = ''; field.errorIcon.hide(); }else{ field.el.dom.title = ''; } } } }; Ext.form.Field.msgFx = { normal : { show: function(msgEl, f){ msgEl.setDisplayed('block'); }, hide : function(msgEl, f){ msgEl.setDisplayed(false).update(''); } }, slide : { show: function(msgEl, f){ msgEl.slideIn('t', {stopFx:true}); }, hide : function(msgEl, f){ msgEl.slideOut('t', {stopFx:true,useDisplay:true}); } }, slideRight : { show: function(msgEl, f){ msgEl.fixDisplay(); msgEl.alignTo(f.el, 'tl-tr'); msgEl.slideIn('l', {stopFx:true}); }, hide : function(msgEl, f){ msgEl.slideOut('l', {stopFx:true,useDisplay:true}); } } }; Ext.reg('field', Ext.form.Field); Ext.form.TextField = Ext.extend(Ext.form.Field, { grow : false, growMin : 30, growMax : 800, vtype : null, maskRe : null, disableKeyFilter : false, allowBlank : true, minLength : 0, maxLength : Number.MAX_VALUE, minLengthText : 'The minimum length for this field is {0}', maxLengthText : 'The maximum length for this field is {0}', selectOnFocus : false, blankText : 'This field is required', validator : null, regex : null, regexText : '', emptyText : null, emptyClass : 'x-form-empty-field', initComponent : function(){ Ext.form.TextField.superclass.initComponent.call(this); this.addEvents( 'autosize', 'keydown', 'keyup', 'keypress' ); }, initEvents : function(){ Ext.form.TextField.superclass.initEvents.call(this); if(this.validationEvent == 'keyup'){ this.validationTask = new Ext.util.DelayedTask(this.validate, this); this.mon(this.el, 'keyup', this.filterValidation, this); } else if(this.validationEvent !== false && this.validationEvent != 'blur'){ this.mon(this.el, this.validationEvent, this.validate, this, {buffer: this.validationDelay}); } if(this.selectOnFocus || this.emptyText){ this.mon(this.el, 'mousedown', this.onMouseDown, this); if(this.emptyText){ this.applyEmptyText(); } } if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){ this.mon(this.el, 'keypress', this.filterKeys, this); } if(this.grow){ this.mon(this.el, 'keyup', this.onKeyUpBuffered, this, {buffer: 50}); this.mon(this.el, 'click', this.autoSize, this); } if(this.enableKeyEvents){ this.mon(this.el, { scope: this, keyup: this.onKeyUp, keydown: this.onKeyDown, keypress: this.onKeyPress }); } }, onMouseDown: function(e){ if(!this.hasFocus){ this.mon(this.el, 'mouseup', Ext.emptyFn, this, { single: true, preventDefault: true }); } }, processValue : function(value){ if(this.stripCharsRe){ var newValue = value.replace(this.stripCharsRe, ''); if(newValue !== value){ this.setRawValue(newValue); return newValue; } } return value; }, filterValidation : function(e){ if(!e.isNavKeyPress()){ this.validationTask.delay(this.validationDelay); } }, onDisable: function(){ Ext.form.TextField.superclass.onDisable.call(this); if(Ext.isIE){ this.el.dom.unselectable = 'on'; } }, onEnable: function(){ Ext.form.TextField.superclass.onEnable.call(this); if(Ext.isIE){ this.el.dom.unselectable = ''; } }, onKeyUpBuffered : function(e){ if(this.doAutoSize(e)){ this.autoSize(); } }, doAutoSize : function(e){ return !e.isNavKeyPress(); }, onKeyUp : function(e){ this.fireEvent('keyup', this, e); }, onKeyDown : function(e){ this.fireEvent('keydown', this, e); }, onKeyPress : function(e){ this.fireEvent('keypress', this, e); }, reset : function(){ Ext.form.TextField.superclass.reset.call(this); this.applyEmptyText(); }, applyEmptyText : function(){ if(this.rendered && this.emptyText && this.getRawValue().length < 1 && !this.hasFocus){ this.setRawValue(this.emptyText); this.el.addClass(this.emptyClass); } }, preFocus : function(){ var el = this.el, isEmpty; if(this.emptyText){ if(el.dom.value == this.emptyText){ this.setRawValue(''); isEmpty = true; } el.removeClass(this.emptyClass); } if(this.selectOnFocus || isEmpty){ el.dom.select(); } }, postBlur : function(){ this.applyEmptyText(); }, filterKeys : function(e){ if(e.ctrlKey){ return; } var k = e.getKey(); if(Ext.isGecko && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){ return; } var cc = String.fromCharCode(e.getCharCode()); if(!Ext.isGecko && e.isSpecialKey() && !cc){ return; } if(!this.maskRe.test(cc)){ e.stopEvent(); } }, setValue : function(v){ if(this.emptyText && this.el && !Ext.isEmpty(v)){ this.el.removeClass(this.emptyClass); } Ext.form.TextField.superclass.setValue.apply(this, arguments); this.applyEmptyText(); this.autoSize(); return this; }, getErrors: function(value) { var errors = Ext.form.TextField.superclass.getErrors.apply(this, arguments); value = Ext.isDefined(value) ? value : this.processValue(this.getRawValue()); if (Ext.isFunction(this.validator)) { var msg = this.validator(value); if (msg !== true) { errors.push(msg); } } if (value.length < 1 || value === this.emptyText) { if (this.allowBlank) { return errors; } else { errors.push(this.blankText); } } if (!this.allowBlank && (value.length < 1 || value === this.emptyText)) { errors.push(this.blankText); } if (value.length < this.minLength) { errors.push(String.format(this.minLengthText, this.minLength)); } if (value.length > this.maxLength) { errors.push(String.format(this.maxLengthText, this.maxLength)); } if (this.vtype) { var vt = Ext.form.VTypes; if(!vt[this.vtype](value, this)){ errors.push(this.vtypeText || vt[this.vtype +'Text']); } } if (this.regex && !this.regex.test(value)) { errors.push(this.regexText); } return errors; }, selectText : function(start, end){ var v = this.getRawValue(); var doFocus = false; if(v.length > 0){ start = start === undefined ? 0 : start; end = end === undefined ? v.length : end; var d = this.el.dom; if(d.setSelectionRange){ d.setSelectionRange(start, end); }else if(d.createTextRange){ var range = d.createTextRange(); range.moveStart('character', start); range.moveEnd('character', end-v.length); range.select(); } doFocus = Ext.isGecko || Ext.isOpera; }else{ doFocus = true; } if(doFocus){ this.focus(); } }, autoSize : function(){ if(!this.grow || !this.rendered){ return; } if(!this.metrics){ this.metrics = Ext.util.TextMetrics.createInstance(this.el); } var el = this.el; var v = el.dom.value; var d = document.createElement('div'); d.appendChild(document.createTextNode(v)); v = d.innerHTML; Ext.removeNode(d); d = null; v += ' '; var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + 10, this.growMin)); this.el.setWidth(w); this.fireEvent('autosize', this, w); }, onDestroy: function(){ if(this.validationTask){ this.validationTask.cancel(); this.validationTask = null; } Ext.form.TextField.superclass.onDestroy.call(this); } }); Ext.reg('textfield', Ext.form.TextField); Ext.form.TriggerField = Ext.extend(Ext.form.TextField, { defaultAutoCreate : {tag: "input", type: "text", size: "16", autocomplete: "off"}, hideTrigger:false, editable: true, readOnly: false, wrapFocusClass: 'x-trigger-wrap-focus', autoSize: Ext.emptyFn, monitorTab : true, deferHeight : true, mimicing : false, actionMode: 'wrap', defaultTriggerWidth: 17, onResize : function(w, h){ Ext.form.TriggerField.superclass.onResize.call(this, w, h); var tw = this.getTriggerWidth(); if(Ext.isNumber(w)){ this.el.setWidth(w - tw); } this.wrap.setWidth(this.el.getWidth() + tw); }, getTriggerWidth: function(){ var tw = this.trigger.getWidth(); if(!this.hideTrigger && !this.readOnly && tw === 0){ tw = this.defaultTriggerWidth; } return tw; }, alignErrorIcon : function(){ if(this.wrap){ this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]); } }, onRender : function(ct, position){ this.doc = Ext.isIE ? Ext.getBody() : Ext.getDoc(); Ext.form.TriggerField.superclass.onRender.call(this, ct, position); this.wrap = this.el.wrap({cls: 'x-form-field-wrap x-form-field-trigger-wrap'}); this.trigger = this.wrap.createChild(this.triggerConfig || {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.triggerClass}); this.initTrigger(); if(!this.width){ this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth()); } this.resizeEl = this.positionEl = this.wrap; }, getWidth: function() { return(this.el.getWidth() + this.trigger.getWidth()); }, updateEditState: function(){ if(this.rendered){ if (this.readOnly) { this.el.dom.readOnly = true; this.el.addClass('x-trigger-noedit'); this.mun(this.el, 'click', this.onTriggerClick, this); this.trigger.setDisplayed(false); } else { if (!this.editable) { this.el.dom.readOnly = true; this.el.addClass('x-trigger-noedit'); this.mon(this.el, 'click', this.onTriggerClick, this); } else { this.el.dom.readOnly = false; this.el.removeClass('x-trigger-noedit'); this.mun(this.el, 'click', this.onTriggerClick, this); } this.trigger.setDisplayed(!this.hideTrigger); } this.onResize(this.width || this.wrap.getWidth()); } }, setHideTrigger: function(hideTrigger){ if(hideTrigger != this.hideTrigger){ this.hideTrigger = hideTrigger; this.updateEditState(); } }, setEditable: function(editable){ if(editable != this.editable){ this.editable = editable; this.updateEditState(); } }, setReadOnly: function(readOnly){ if(readOnly != this.readOnly){ this.readOnly = readOnly; this.updateEditState(); } }, afterRender : function(){ Ext.form.TriggerField.superclass.afterRender.call(this); this.updateEditState(); }, initTrigger : function(){ this.mon(this.trigger, 'click', this.onTriggerClick, this, {preventDefault:true}); this.trigger.addClassOnOver('x-form-trigger-over'); this.trigger.addClassOnClick('x-form-trigger-click'); }, onDestroy : function(){ Ext.destroy(this.trigger, this.wrap); if (this.mimicing){ this.doc.un('mousedown', this.mimicBlur, this); } delete this.doc; Ext.form.TriggerField.superclass.onDestroy.call(this); }, onFocus : function(){ Ext.form.TriggerField.superclass.onFocus.call(this); if(!this.mimicing){ this.wrap.addClass(this.wrapFocusClass); this.mimicing = true; this.doc.on('mousedown', this.mimicBlur, this, {delay: 10}); if(this.monitorTab){ this.on('specialkey', this.checkTab, this); } } }, checkTab : function(me, e){ if(e.getKey() == e.TAB){ this.triggerBlur(); } }, onBlur : Ext.emptyFn, mimicBlur : function(e){ if(!this.isDestroyed && !this.wrap.contains(e.target) && this.validateBlur(e)){ this.triggerBlur(); } }, triggerBlur : function(){ this.mimicing = false; this.doc.un('mousedown', this.mimicBlur, this); if(this.monitorTab && this.el){ this.un('specialkey', this.checkTab, this); } Ext.form.TriggerField.superclass.onBlur.call(this); if(this.wrap){ this.wrap.removeClass(this.wrapFocusClass); } }, beforeBlur : Ext.emptyFn, validateBlur : function(e){ return true; }, onTriggerClick : Ext.emptyFn }); Ext.form.TwinTriggerField = Ext.extend(Ext.form.TriggerField, { initComponent : function(){ Ext.form.TwinTriggerField.superclass.initComponent.call(this); this.triggerConfig = { tag:'span', cls:'x-form-twin-triggers', cn:[ {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.trigger1Class}, {tag: "img", src: Ext.BLANK_IMAGE_URL, alt: "", cls: "x-form-trigger " + this.trigger2Class} ]}; }, getTrigger : function(index){ return this.triggers[index]; }, afterRender: function(){ Ext.form.TwinTriggerField.superclass.afterRender.call(this); var triggers = this.triggers, i = 0, len = triggers.length; for(; i < len; ++i){ if(this['hideTrigger' + (i + 1)]){ triggers[i].hide(); } } }, initTrigger : function(){ var ts = this.trigger.select('.x-form-trigger', true), triggerField = this; ts.each(function(t, all, index){ var triggerIndex = 'Trigger'+(index+1); t.hide = function(){ var w = triggerField.wrap.getWidth(); this.dom.style.display = 'none'; triggerField.el.setWidth(w-triggerField.trigger.getWidth()); triggerField['hidden' + triggerIndex] = true; }; t.show = function(){ var w = triggerField.wrap.getWidth(); this.dom.style.display = ''; triggerField.el.setWidth(w-triggerField.trigger.getWidth()); triggerField['hidden' + triggerIndex] = false; }; this.mon(t, 'click', this['on'+triggerIndex+'Click'], this, {preventDefault:true}); t.addClassOnOver('x-form-trigger-over'); t.addClassOnClick('x-form-trigger-click'); }, this); this.triggers = ts.elements; }, getTriggerWidth: function(){ var tw = 0; Ext.each(this.triggers, function(t, index){ var triggerIndex = 'Trigger' + (index + 1), w = t.getWidth(); if(w === 0 && !this['hidden' + triggerIndex]){ tw += this.defaultTriggerWidth; }else{ tw += w; } }, this); return tw; }, onDestroy : function() { Ext.destroy(this.triggers); Ext.form.TwinTriggerField.superclass.onDestroy.call(this); }, onTrigger1Click : Ext.emptyFn, onTrigger2Click : Ext.emptyFn }); Ext.reg('trigger', Ext.form.TriggerField); Ext.form.TextArea = Ext.extend(Ext.form.TextField, { growMin : 60, growMax: 1000, growAppend : ' \n ', enterIsSpecial : false, preventScrollbars: false, onRender : function(ct, position){ if(!this.el){ this.defaultAutoCreate = { tag: "textarea", style:"width:100px;height:60px;", autocomplete: "off" }; } Ext.form.TextArea.superclass.onRender.call(this, ct, position); if(this.grow){ this.textSizeEl = Ext.DomHelper.append(document.body, { tag: "pre", cls: "x-form-grow-sizer" }); if(this.preventScrollbars){ this.el.setStyle("overflow", "hidden"); } this.el.setHeight(this.growMin); } }, onDestroy : function(){ Ext.removeNode(this.textSizeEl); Ext.form.TextArea.superclass.onDestroy.call(this); }, fireKey : function(e){ if(e.isSpecialKey() && (this.enterIsSpecial || (e.getKey() != e.ENTER || e.hasModifier()))){ this.fireEvent("specialkey", this, e); } }, doAutoSize : function(e){ return !e.isNavKeyPress() || e.getKey() == e.ENTER; }, filterValidation: function(e) { if(!e.isNavKeyPress() || (!this.enterIsSpecial && e.keyCode == e.ENTER)){ this.validationTask.delay(this.validationDelay); } }, autoSize: function(){ if(!this.grow || !this.textSizeEl){ return; } var el = this.el, v = Ext.util.Format.htmlEncode(el.dom.value), ts = this.textSizeEl, h; Ext.fly(ts).setWidth(this.el.getWidth()); if(v.length < 1){ v = "  "; }else{ v += this.growAppend; if(Ext.isIE){ v = v.replace(/\n/g, ' 
    '); } } ts.innerHTML = v; h = Math.min(this.growMax, Math.max(ts.offsetHeight, this.growMin)); if(h != this.lastHeight){ this.lastHeight = h; this.el.setHeight(h); this.fireEvent("autosize", this, h); } } }); Ext.reg('textarea', Ext.form.TextArea); Ext.form.NumberField = Ext.extend(Ext.form.TextField, { fieldClass: "x-form-field x-form-num-field", allowDecimals : true, decimalSeparator : ".", decimalPrecision : 2, allowNegative : true, minValue : Number.NEGATIVE_INFINITY, maxValue : Number.MAX_VALUE, minText : "The minimum value for this field is {0}", maxText : "The maximum value for this field is {0}", nanText : "{0} is not a valid number", baseChars : "0123456789", autoStripChars: false, initEvents : function() { var allowed = this.baseChars + ''; if (this.allowDecimals) { allowed += this.decimalSeparator; } if (this.allowNegative) { allowed += '-'; } allowed = Ext.escapeRe(allowed); this.maskRe = new RegExp('[' + allowed + ']'); if (this.autoStripChars) { this.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi'); } Ext.form.NumberField.superclass.initEvents.call(this); }, getErrors: function(value) { var errors = Ext.form.NumberField.superclass.getErrors.apply(this, arguments); value = Ext.isDefined(value) ? value : this.processValue(this.getRawValue()); if (value.length < 1) { return errors; } value = String(value).replace(this.decimalSeparator, "."); if(isNaN(value)){ errors.push(String.format(this.nanText, value)); } var num = this.parseValue(value); if (num < this.minValue) { errors.push(String.format(this.minText, this.minValue)); } if (num > this.maxValue) { errors.push(String.format(this.maxText, this.maxValue)); } return errors; }, getValue : function() { return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this))); }, setValue : function(v) { v = Ext.isNumber(v) ? v : parseFloat(String(v).replace(this.decimalSeparator, ".")); v = this.fixPrecision(v); v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator); return Ext.form.NumberField.superclass.setValue.call(this, v); }, setMinValue : function(value) { this.minValue = Ext.num(value, Number.NEGATIVE_INFINITY); }, setMaxValue : function(value) { this.maxValue = Ext.num(value, Number.MAX_VALUE); }, parseValue : function(value) { value = parseFloat(String(value).replace(this.decimalSeparator, ".")); return isNaN(value) ? '' : value; }, fixPrecision : function(value) { var nan = isNaN(value); if (!this.allowDecimals || this.decimalPrecision == -1 || nan || !value) { return nan ? '' : value; } return parseFloat(parseFloat(value).toFixed(this.decimalPrecision)); }, beforeBlur : function() { var v = this.parseValue(this.getRawValue()); if (!Ext.isEmpty(v)) { this.setValue(v); } } }); Ext.reg('numberfield', Ext.form.NumberField); Ext.form.DateField = Ext.extend(Ext.form.TriggerField, { format : "m/d/Y", altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j", disabledDaysText : "Disabled", disabledDatesText : "Disabled", minText : "The date in this field must be equal to or after {0}", maxText : "The date in this field must be equal to or before {0}", invalidText : "{0} is not a valid date - it must be in the format {1}", triggerClass : 'x-form-date-trigger', showToday : true, startDay : 0, defaultAutoCreate : {tag: "input", type: "text", size: "10", autocomplete: "off"}, initTime: '12', initTimeFormat: 'H', safeParse : function(value, format) { if (Date.formatContainsHourInfo(format)) { return Date.parseDate(value, format); } else { var parsedDate = Date.parseDate(value + ' ' + this.initTime, format + ' ' + this.initTimeFormat); if (parsedDate) { return parsedDate.clearTime(); } } }, initComponent : function(){ Ext.form.DateField.superclass.initComponent.call(this); this.addEvents( 'select' ); if(Ext.isString(this.minValue)){ this.minValue = this.parseDate(this.minValue); } if(Ext.isString(this.maxValue)){ this.maxValue = this.parseDate(this.maxValue); } this.disabledDatesRE = null; this.initDisabledDays(); }, initEvents: function() { Ext.form.DateField.superclass.initEvents.call(this); this.keyNav = new Ext.KeyNav(this.el, { "down": function(e) { this.onTriggerClick(); }, scope: this, forceKeyDown: true }); }, initDisabledDays : function(){ if(this.disabledDates){ var dd = this.disabledDates, len = dd.length - 1, re = "(?:"; Ext.each(dd, function(d, i){ re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i]; if(i != len){ re += '|'; } }, this); this.disabledDatesRE = new RegExp(re + ')'); } }, setDisabledDates : function(dd){ this.disabledDates = dd; this.initDisabledDays(); if(this.menu){ this.menu.picker.setDisabledDates(this.disabledDatesRE); } }, setDisabledDays : function(dd){ this.disabledDays = dd; if(this.menu){ this.menu.picker.setDisabledDays(dd); } }, setMinValue : function(dt){ this.minValue = (Ext.isString(dt) ? this.parseDate(dt) : dt); if(this.menu){ this.menu.picker.setMinDate(this.minValue); } }, setMaxValue : function(dt){ this.maxValue = (Ext.isString(dt) ? this.parseDate(dt) : dt); if(this.menu){ this.menu.picker.setMaxDate(this.maxValue); } }, getErrors: function(value) { var errors = Ext.form.DateField.superclass.getErrors.apply(this, arguments); value = this.formatDate(value || this.processValue(this.getRawValue())); if (value.length < 1) { return errors; } var svalue = value; value = this.parseDate(value); if (!value) { errors.push(String.format(this.invalidText, svalue, this.format)); return errors; } var time = value.getTime(); if (this.minValue && time < this.minValue.clearTime().getTime()) { errors.push(String.format(this.minText, this.formatDate(this.minValue))); } if (this.maxValue && time > this.maxValue.clearTime().getTime()) { errors.push(String.format(this.maxText, this.formatDate(this.maxValue))); } if (this.disabledDays) { var day = value.getDay(); for(var i = 0; i < this.disabledDays.length; i++) { if (day === this.disabledDays[i]) { errors.push(this.disabledDaysText); break; } } } var fvalue = this.formatDate(value); if (this.disabledDatesRE && this.disabledDatesRE.test(fvalue)) { errors.push(String.format(this.disabledDatesText, fvalue)); } return errors; }, validateBlur : function(){ return !this.menu || !this.menu.isVisible(); }, getValue : function(){ return this.parseDate(Ext.form.DateField.superclass.getValue.call(this)) || ""; }, setValue : function(date){ return Ext.form.DateField.superclass.setValue.call(this, this.formatDate(this.parseDate(date))); }, parseDate : function(value) { if(!value || Ext.isDate(value)){ return value; } var v = this.safeParse(value, this.format), af = this.altFormats, afa = this.altFormatsArray; if (!v && af) { afa = afa || af.split("|"); for (var i = 0, len = afa.length; i < len && !v; i++) { v = this.safeParse(value, afa[i]); } } return v; }, onDestroy : function(){ Ext.destroy(this.menu, this.keyNav); Ext.form.DateField.superclass.onDestroy.call(this); }, formatDate : function(date){ return Ext.isDate(date) ? date.dateFormat(this.format) : date; }, onTriggerClick : function(){ if(this.disabled){ return; } if(this.menu == null){ this.menu = new Ext.menu.DateMenu({ hideOnClick: false, focusOnSelect: false }); } this.onFocus(); Ext.apply(this.menu.picker, { minDate : this.minValue, maxDate : this.maxValue, disabledDatesRE : this.disabledDatesRE, disabledDatesText : this.disabledDatesText, disabledDays : this.disabledDays, disabledDaysText : this.disabledDaysText, format : this.format, showToday : this.showToday, startDay: this.startDay, minText : String.format(this.minText, this.formatDate(this.minValue)), maxText : String.format(this.maxText, this.formatDate(this.maxValue)) }); this.menu.picker.setValue(this.getValue() || new Date()); this.menu.show(this.el, "tl-bl?"); this.menuEvents('on'); }, menuEvents: function(method){ this.menu[method]('select', this.onSelect, this); this.menu[method]('hide', this.onMenuHide, this); this.menu[method]('show', this.onFocus, this); }, onSelect: function(m, d){ this.setValue(d); this.fireEvent('select', this, d); this.menu.hide(); }, onMenuHide: function(){ this.focus(false, 60); this.menuEvents('un'); }, beforeBlur : function(){ var v = this.parseDate(this.getRawValue()); if(v){ this.setValue(v); } } }); Ext.reg('datefield', Ext.form.DateField); Ext.form.DisplayField = Ext.extend(Ext.form.Field, { validationEvent : false, validateOnBlur : false, defaultAutoCreate : {tag: "div"}, fieldClass : "x-form-display-field", htmlEncode: false, initEvents : Ext.emptyFn, isValid : function(){ return true; }, validate : function(){ return true; }, getRawValue : function(){ var v = this.rendered ? this.el.dom.innerHTML : Ext.value(this.value, ''); if(v === this.emptyText){ v = ''; } if(this.htmlEncode){ v = Ext.util.Format.htmlDecode(v); } return v; }, getValue : function(){ return this.getRawValue(); }, getName: function() { return this.name; }, setRawValue : function(v){ if(this.htmlEncode){ v = Ext.util.Format.htmlEncode(v); } return this.rendered ? (this.el.dom.innerHTML = (Ext.isEmpty(v) ? '' : v)) : (this.value = v); }, setValue : function(v){ this.setRawValue(v); return this; } }); Ext.reg('displayfield', Ext.form.DisplayField); Ext.form.ComboBox = Ext.extend(Ext.form.TriggerField, { defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"}, listClass : '', selectedClass : 'x-combo-selected', listEmptyText: '', triggerClass : 'x-form-arrow-trigger', shadow : 'sides', listAlign : 'tl-bl?', maxHeight : 300, minHeight : 90, triggerAction : 'query', minChars : 4, autoSelect : true, typeAhead : false, queryDelay : 500, pageSize : 0, selectOnFocus : false, queryParam : 'query', loadingText : 'Loading...', resizable : false, handleHeight : 8, allQuery: '', mode: 'remote', minListWidth : 70, forceSelection : false, typeAheadDelay : 250, lazyInit : true, clearFilterOnReset : true, submitValue: undefined, initComponent : function(){ Ext.form.ComboBox.superclass.initComponent.call(this); this.addEvents( 'expand', 'collapse', 'beforeselect', 'select', 'beforequery' ); if(this.transform){ var s = Ext.getDom(this.transform); if(!this.hiddenName){ this.hiddenName = s.name; } if(!this.store){ this.mode = 'local'; var d = [], opts = s.options; for(var i = 0, len = opts.length;i < len; i++){ var o = opts[i], value = (o.hasAttribute ? o.hasAttribute('value') : o.getAttributeNode('value').specified) ? o.value : o.text; if(o.selected && Ext.isEmpty(this.value, true)) { this.value = value; } d.push([value, o.text]); } this.store = new Ext.data.ArrayStore({ idIndex: 0, fields: ['value', 'text'], data : d, autoDestroy: true }); this.valueField = 'value'; this.displayField = 'text'; } s.name = Ext.id(); if(!this.lazyRender){ this.target = true; this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate); this.render(this.el.parentNode, s); } Ext.removeNode(s); } else if(this.store){ this.store = Ext.StoreMgr.lookup(this.store); if(this.store.autoCreated){ this.displayField = this.valueField = 'field1'; if(!this.store.expandData){ this.displayField = 'field2'; } this.mode = 'local'; } } this.selectedIndex = -1; if(this.mode == 'local'){ if(!Ext.isDefined(this.initialConfig.queryDelay)){ this.queryDelay = 10; } if(!Ext.isDefined(this.initialConfig.minChars)){ this.minChars = 0; } } }, onRender : function(ct, position){ if(this.hiddenName && !Ext.isDefined(this.submitValue)){ this.submitValue = false; } Ext.form.ComboBox.superclass.onRender.call(this, ct, position); if(this.hiddenName){ this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: (this.hiddenId || Ext.id())}, 'before', true); } if(Ext.isGecko){ this.el.dom.setAttribute('autocomplete', 'off'); } if(!this.lazyInit){ this.initList(); }else{ this.on('focus', this.initList, this, {single: true}); } }, initValue : function(){ Ext.form.ComboBox.superclass.initValue.call(this); if(this.hiddenField){ this.hiddenField.value = Ext.value(Ext.isDefined(this.hiddenValue) ? this.hiddenValue : this.value, ''); } }, getParentZIndex : function(){ var zindex; if (this.ownerCt){ this.findParentBy(function(ct){ zindex = parseInt(ct.getPositionEl().getStyle('z-index'), 10); return !!zindex; }); } return zindex; }, getZIndex : function(listParent){ listParent = listParent || Ext.getDom(this.getListParent() || Ext.getBody()); var zindex = parseInt(Ext.fly(listParent).getStyle('z-index'), 10); if(!zindex){ zindex = this.getParentZIndex(); } return (zindex || 12000) + 5; }, initList : function(){ if(!this.list){ var cls = 'x-combo-list', listParent = Ext.getDom(this.getListParent() || Ext.getBody()); this.list = new Ext.Layer({ parentEl: listParent, shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false, zindex: this.getZIndex(listParent) }); var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth); this.list.setSize(lw, 0); this.list.swallowEvent('mousewheel'); this.assetHeight = 0; if(this.syncFont !== false){ this.list.setStyle('font-size', this.el.getStyle('font-size')); } if(this.title){ this.header = this.list.createChild({cls:cls+'-hd', html: this.title}); this.assetHeight += this.header.getHeight(); } this.innerList = this.list.createChild({cls:cls+'-inner'}); this.mon(this.innerList, 'mouseover', this.onViewOver, this); this.mon(this.innerList, 'mousemove', this.onViewMove, this); this.innerList.setWidth(lw - this.list.getFrameWidth('lr')); if(this.pageSize){ this.footer = this.list.createChild({cls:cls+'-ft'}); this.pageTb = new Ext.PagingToolbar({ store: this.store, pageSize: this.pageSize, renderTo:this.footer }); this.assetHeight += this.footer.getHeight(); } if(!this.tpl){ this.tpl = '
    {' + this.displayField + '}
    '; } this.view = new Ext.DataView({ applyTo: this.innerList, tpl: this.tpl, singleSelect: true, selectedClass: this.selectedClass, itemSelector: this.itemSelector || '.' + cls + '-item', emptyText: this.listEmptyText, deferEmptyText: false }); this.mon(this.view, { containerclick : this.onViewClick, click : this.onViewClick, scope :this }); this.bindStore(this.store, true); if(this.resizable){ this.resizer = new Ext.Resizable(this.list, { pinned:true, handles:'se' }); this.mon(this.resizer, 'resize', function(r, w, h){ this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight; this.listWidth = w; this.innerList.setWidth(w - this.list.getFrameWidth('lr')); this.restrictHeight(); }, this); this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px'); } } }, getListParent : function() { return document.body; }, getStore : function(){ return this.store; }, bindStore : function(store, initial){ if(this.store && !initial){ if(this.store !== store && this.store.autoDestroy){ this.store.destroy(); }else{ this.store.un('beforeload', this.onBeforeLoad, this); this.store.un('load', this.onLoad, this); this.store.un('exception', this.collapse, this); } if(!store){ this.store = null; if(this.view){ this.view.bindStore(null); } if(this.pageTb){ this.pageTb.bindStore(null); } } } if(store){ if(!initial) { this.lastQuery = null; if(this.pageTb) { this.pageTb.bindStore(store); } } this.store = Ext.StoreMgr.lookup(store); this.store.on({ scope: this, beforeload: this.onBeforeLoad, load: this.onLoad, exception: this.collapse }); if(this.view){ this.view.bindStore(store); } } }, reset : function(){ if(this.clearFilterOnReset && this.mode == 'local'){ this.store.clearFilter(); } Ext.form.ComboBox.superclass.reset.call(this); }, initEvents : function(){ Ext.form.ComboBox.superclass.initEvents.call(this); this.keyNav = new Ext.KeyNav(this.el, { "up" : function(e){ this.inKeyMode = true; this.selectPrev(); }, "down" : function(e){ if(!this.isExpanded()){ this.onTriggerClick(); }else{ this.inKeyMode = true; this.selectNext(); } }, "enter" : function(e){ this.onViewClick(); }, "esc" : function(e){ this.collapse(); }, "tab" : function(e){ if (this.forceSelection === true) { this.collapse(); } else { this.onViewClick(false); } return true; }, scope : this, doRelay : function(e, h, hname){ if(hname == 'down' || this.scope.isExpanded()){ var relay = Ext.KeyNav.prototype.doRelay.apply(this, arguments); if(!Ext.isIE && Ext.EventManager.useKeydown){ this.scope.fireKey(e); } return relay; } return true; }, forceKeyDown : true, defaultEventAction: 'stopEvent' }); this.queryDelay = Math.max(this.queryDelay || 10, this.mode == 'local' ? 10 : 250); this.dqTask = new Ext.util.DelayedTask(this.initQuery, this); if(this.typeAhead){ this.taTask = new Ext.util.DelayedTask(this.onTypeAhead, this); } if(!this.enableKeyEvents){ this.mon(this.el, 'keyup', this.onKeyUp, this); } }, onDestroy : function(){ if (this.dqTask){ this.dqTask.cancel(); this.dqTask = null; } this.bindStore(null); Ext.destroy( this.resizer, this.view, this.pageTb, this.list ); Ext.destroyMembers(this, 'hiddenField'); Ext.form.ComboBox.superclass.onDestroy.call(this); }, fireKey : function(e){ if (!this.isExpanded()) { Ext.form.ComboBox.superclass.fireKey.call(this, e); } }, onResize : function(w, h){ Ext.form.ComboBox.superclass.onResize.apply(this, arguments); if(!isNaN(w) && this.isVisible() && this.list){ this.doResize(w); }else{ this.bufferSize = w; } }, doResize: function(w){ if(!Ext.isDefined(this.listWidth)){ var lw = Math.max(w, this.minListWidth); this.list.setWidth(lw); this.innerList.setWidth(lw - this.list.getFrameWidth('lr')); } }, onEnable : function(){ Ext.form.ComboBox.superclass.onEnable.apply(this, arguments); if(this.hiddenField){ this.hiddenField.disabled = false; } }, onDisable : function(){ Ext.form.ComboBox.superclass.onDisable.apply(this, arguments); if(this.hiddenField){ this.hiddenField.disabled = true; } }, onBeforeLoad : function(){ if(!this.hasFocus){ return; } this.innerList.update(this.loadingText ? '
    '+this.loadingText+'
    ' : ''); this.restrictHeight(); this.selectedIndex = -1; }, onLoad : function(){ if(!this.hasFocus){ return; } if(this.store.getCount() > 0 || this.listEmptyText){ this.expand(); this.restrictHeight(); if(this.lastQuery == this.allQuery){ if(this.editable){ this.el.dom.select(); } if(this.autoSelect !== false && !this.selectByValue(this.value, true)){ this.select(0, true); } }else{ if(this.autoSelect !== false){ this.selectNext(); } if(this.typeAhead && this.lastKey != Ext.EventObject.BACKSPACE && this.lastKey != Ext.EventObject.DELETE){ this.taTask.delay(this.typeAheadDelay); } } }else{ this.collapse(); } }, onTypeAhead : function(){ if(this.store.getCount() > 0){ var r = this.store.getAt(0); var newValue = r.data[this.displayField]; var len = newValue.length; var selStart = this.getRawValue().length; if(selStart != len){ this.setRawValue(newValue); this.selectText(selStart, newValue.length); } } }, assertValue : function(){ var val = this.getRawValue(), rec; if(this.valueField && Ext.isDefined(this.value)){ rec = this.findRecord(this.valueField, this.value); } if(!rec || rec.get(this.displayField) != val){ rec = this.findRecord(this.displayField, val); } if(!rec && this.forceSelection){ if(val.length > 0 && val != this.emptyText){ this.el.dom.value = Ext.value(this.lastSelectionText, ''); this.applyEmptyText(); }else{ this.clearValue(); } }else{ if(rec && this.valueField){ if (this.value == val){ return; } val = rec.get(this.valueField || this.displayField); } this.setValue(val); } }, onSelect : function(record, index){ if(this.fireEvent('beforeselect', this, record, index) !== false){ this.setValue(record.data[this.valueField || this.displayField]); this.collapse(); this.fireEvent('select', this, record, index); } }, getName: function(){ var hf = this.hiddenField; return hf && hf.name ? hf.name : this.hiddenName || Ext.form.ComboBox.superclass.getName.call(this); }, getValue : function(){ if(this.valueField){ return Ext.isDefined(this.value) ? this.value : ''; }else{ return Ext.form.ComboBox.superclass.getValue.call(this); } }, clearValue : function(){ if(this.hiddenField){ this.hiddenField.value = ''; } this.setRawValue(''); this.lastSelectionText = ''; this.applyEmptyText(); this.value = ''; }, setValue : function(v){ var text = v; if(this.valueField){ var r = this.findRecord(this.valueField, v); if(r){ text = r.data[this.displayField]; }else if(Ext.isDefined(this.valueNotFoundText)){ text = this.valueNotFoundText; } } this.lastSelectionText = text; if(this.hiddenField){ this.hiddenField.value = Ext.value(v, ''); } Ext.form.ComboBox.superclass.setValue.call(this, text); this.value = v; return this; }, findRecord : function(prop, value){ var record; if(this.store.getCount() > 0){ this.store.each(function(r){ if(r.data[prop] == value){ record = r; return false; } }); } return record; }, onViewMove : function(e, t){ this.inKeyMode = false; }, onViewOver : function(e, t){ if(this.inKeyMode){ return; } var item = this.view.findItemFromChild(t); if(item){ var index = this.view.indexOf(item); this.select(index, false); } }, onViewClick : function(doFocus){ var index = this.view.getSelectedIndexes()[0], s = this.store, r = s.getAt(index); if(r){ this.onSelect(r, index); }else { this.collapse(); } if(doFocus !== false){ this.el.focus(); } }, restrictHeight : function(){ this.innerList.dom.style.height = ''; var inner = this.innerList.dom, pad = this.list.getFrameWidth('tb') + (this.resizable ? this.handleHeight : 0) + this.assetHeight, h = Math.max(inner.clientHeight, inner.offsetHeight, inner.scrollHeight), ha = this.getPosition()[1]-Ext.getBody().getScroll().top, hb = Ext.lib.Dom.getViewHeight()-ha-this.getSize().height, space = Math.max(ha, hb, this.minHeight || 0)-this.list.shadowOffset-pad-5; h = Math.min(h, space, this.maxHeight); this.innerList.setHeight(h); this.list.beginUpdate(); this.list.setHeight(h+pad); this.list.alignTo.apply(this.list, [this.el].concat(this.listAlign)); this.list.endUpdate(); }, isExpanded : function(){ return this.list && this.list.isVisible(); }, selectByValue : function(v, scrollIntoView){ if(!Ext.isEmpty(v, true)){ var r = this.findRecord(this.valueField || this.displayField, v); if(r){ this.select(this.store.indexOf(r), scrollIntoView); return true; } } return false; }, select : function(index, scrollIntoView){ this.selectedIndex = index; this.view.select(index); if(scrollIntoView !== false){ var el = this.view.getNode(index); if(el){ this.innerList.scrollChildIntoView(el, false); } } }, selectNext : function(){ var ct = this.store.getCount(); if(ct > 0){ if(this.selectedIndex == -1){ this.select(0); }else if(this.selectedIndex < ct-1){ this.select(this.selectedIndex+1); } } }, selectPrev : function(){ var ct = this.store.getCount(); if(ct > 0){ if(this.selectedIndex == -1){ this.select(0); }else if(this.selectedIndex !== 0){ this.select(this.selectedIndex-1); } } }, onKeyUp : function(e){ var k = e.getKey(); if(this.editable !== false && this.readOnly !== true && (k == e.BACKSPACE || !e.isSpecialKey())){ this.lastKey = k; this.dqTask.delay(this.queryDelay); } Ext.form.ComboBox.superclass.onKeyUp.call(this, e); }, validateBlur : function(){ return !this.list || !this.list.isVisible(); }, initQuery : function(){ this.doQuery(this.getRawValue()); }, beforeBlur : function(){ this.assertValue(); }, postBlur : function(){ Ext.form.ComboBox.superclass.postBlur.call(this); this.collapse(); this.inKeyMode = false; }, doQuery : function(q, forceAll){ q = Ext.isEmpty(q) ? '' : q; var qe = { query: q, forceAll: forceAll, combo: this, cancel:false }; if(this.fireEvent('beforequery', qe)===false || qe.cancel){ return false; } q = qe.query; forceAll = qe.forceAll; if(forceAll === true || (q.length >= this.minChars)){ if(this.lastQuery !== q){ this.lastQuery = q; if(this.mode == 'local'){ this.selectedIndex = -1; if(forceAll){ this.store.clearFilter(); }else{ this.store.filter(this.displayField, q); } this.onLoad(); }else{ this.store.baseParams[this.queryParam] = q; this.store.load({ params: this.getParams(q) }); this.expand(); } }else{ this.selectedIndex = -1; this.onLoad(); } } }, getParams : function(q){ var params = {}, paramNames = this.store.paramNames; if(this.pageSize){ params[paramNames.start] = 0; params[paramNames.limit] = this.pageSize; } return params; }, collapse : function(){ if(!this.isExpanded()){ return; } this.list.hide(); Ext.getDoc().un('mousewheel', this.collapseIf, this); Ext.getDoc().un('mousedown', this.collapseIf, this); this.fireEvent('collapse', this); }, collapseIf : function(e){ if(!this.isDestroyed && !e.within(this.wrap) && !e.within(this.list)){ this.collapse(); } }, expand : function(){ if(this.isExpanded() || !this.hasFocus){ return; } if(this.title || this.pageSize){ this.assetHeight = 0; if(this.title){ this.assetHeight += this.header.getHeight(); } if(this.pageSize){ this.assetHeight += this.footer.getHeight(); } } if(this.bufferSize){ this.doResize(this.bufferSize); delete this.bufferSize; } this.list.alignTo.apply(this.list, [this.el].concat(this.listAlign)); this.list.setZIndex(this.getZIndex()); this.list.show(); if(Ext.isGecko2){ this.innerList.setOverflow('auto'); } this.mon(Ext.getDoc(), { scope: this, mousewheel: this.collapseIf, mousedown: this.collapseIf }); this.fireEvent('expand', this); }, onTriggerClick : function(){ if(this.readOnly || this.disabled){ return; } if(this.isExpanded()){ this.collapse(); this.el.focus(); }else { this.onFocus({}); if(this.triggerAction == 'all') { this.doQuery(this.allQuery, true); } else { this.doQuery(this.getRawValue()); } this.el.focus(); } } }); Ext.reg('combo', Ext.form.ComboBox); Ext.form.Checkbox = Ext.extend(Ext.form.Field, { focusClass : undefined, fieldClass : 'x-form-field', checked : false, boxLabel: ' ', defaultAutoCreate : { tag: 'input', type: 'checkbox', autocomplete: 'off'}, actionMode : 'wrap', initComponent : function(){ Ext.form.Checkbox.superclass.initComponent.call(this); this.addEvents( 'check' ); }, onResize : function(){ Ext.form.Checkbox.superclass.onResize.apply(this, arguments); if(!this.boxLabel && !this.fieldLabel){ this.el.alignTo(this.wrap, 'c-c'); } }, initEvents : function(){ Ext.form.Checkbox.superclass.initEvents.call(this); this.mon(this.el, { scope: this, click: this.onClick, change: this.onClick }); }, markInvalid : Ext.emptyFn, clearInvalid : Ext.emptyFn, onRender : function(ct, position){ Ext.form.Checkbox.superclass.onRender.call(this, ct, position); if(this.inputValue !== undefined){ this.el.dom.value = this.inputValue; } this.wrap = this.el.wrap({cls: 'x-form-check-wrap'}); if(this.boxLabel){ this.wrap.createChild({tag: 'label', htmlFor: this.el.id, cls: 'x-form-cb-label', html: this.boxLabel}); } if(this.checked){ this.setValue(true); }else{ this.checked = this.el.dom.checked; } if (Ext.isIE && !Ext.isStrict) { this.wrap.repaint(); } this.resizeEl = this.positionEl = this.wrap; }, onDestroy : function(){ Ext.destroy(this.wrap); Ext.form.Checkbox.superclass.onDestroy.call(this); }, initValue : function() { this.originalValue = this.getValue(); }, getValue : function(){ if(this.rendered){ return this.el.dom.checked; } return this.checked; }, onClick : function(){ if(this.el.dom.checked != this.checked){ this.setValue(this.el.dom.checked); } }, setValue : function(v){ var checked = this.checked, inputVal = this.inputValue; if (v === false) { this.checked = false; } else { this.checked = (v === true || v === 'true' || v == '1' || (inputVal ? v == inputVal : String(v).toLowerCase() == 'on')); } if(this.rendered){ this.el.dom.checked = this.checked; this.el.dom.defaultChecked = this.checked; } if(checked != this.checked){ this.fireEvent('check', this, this.checked); if(this.handler){ this.handler.call(this.scope || this, this, this.checked); } } return this; } }); Ext.reg('checkbox', Ext.form.Checkbox); Ext.form.CheckboxGroup = Ext.extend(Ext.form.Field, { columns : 'auto', vertical : false, allowBlank : true, blankText : "You must select at least one item in this group", defaultType : 'checkbox', groupCls : 'x-form-check-group', initComponent: function(){ this.addEvents( 'change' ); this.on('change', this.validate, this); Ext.form.CheckboxGroup.superclass.initComponent.call(this); }, onRender : function(ct, position){ if(!this.el){ var panelCfg = { autoEl: { id: this.id }, cls: this.groupCls, layout: 'column', renderTo: ct, bufferResize: false }; var colCfg = { xtype: 'container', defaultType: this.defaultType, layout: 'form', defaults: { hideLabel: true, anchor: '100%' } }; if(this.items[0].items){ Ext.apply(panelCfg, { layoutConfig: {columns: this.items.length}, defaults: this.defaults, items: this.items }); for(var i=0, len=this.items.length; i0 && i%rows==0){ ri++; } if(this.items[i].fieldLabel){ this.items[i].hideLabel = false; } cols[ri].items.push(this.items[i]); }; }else{ for(var i=0, len=this.items.length; i -1){ item.setValue(true); } }); }, getBox : function(id){ var box = null; this.eachItem(function(f){ if(id == f || f.dataIndex == id || f.id == id || f.getName() == id){ box = f; return false; } }); return box; }, getValue : function(){ var out = []; this.eachItem(function(item){ if(item.checked){ out.push(item); } }); return out; }, eachItem: function(fn, scope) { if(this.items && this.items.each){ this.items.each(fn, scope || this); } }, getRawValue : Ext.emptyFn, setRawValue : Ext.emptyFn }); Ext.reg('checkboxgroup', Ext.form.CheckboxGroup); Ext.form.CompositeField = Ext.extend(Ext.form.Field, { defaultMargins: '0 5 0 0', skipLastItemMargin: true, isComposite: true, combineErrors: true, labelConnector: ', ', initComponent: function() { var labels = [], items = this.items, item; for (var i=0, j = items.length; i < j; i++) { item = items[i]; if (!Ext.isEmpty(item.ref)){ item.ref = '../' + item.ref; } labels.push(item.fieldLabel); Ext.applyIf(item, this.defaults); if (!(i == j - 1 && this.skipLastItemMargin)) { Ext.applyIf(item, {margins: this.defaultMargins}); } } this.fieldLabel = this.fieldLabel || this.buildLabel(labels); this.fieldErrors = new Ext.util.MixedCollection(true, function(item) { return item.field; }); this.fieldErrors.on({ scope : this, add : this.updateInvalidMark, remove : this.updateInvalidMark, replace: this.updateInvalidMark }); Ext.form.CompositeField.superclass.initComponent.apply(this, arguments); this.innerCt = new Ext.Container({ layout : 'hbox', items : this.items, cls : 'x-form-composite', defaultMargins: '0 3 0 0', ownerCt: this }); this.innerCt.ownerCt = undefined; var fields = this.innerCt.findBy(function(c) { return c.isFormField; }, this); this.items = new Ext.util.MixedCollection(); this.items.addAll(fields); }, onRender: function(ct, position) { if (!this.el) { var innerCt = this.innerCt; innerCt.render(ct); this.el = innerCt.getEl(); if (this.combineErrors) { this.eachItem(function(field) { Ext.apply(field, { markInvalid : this.onFieldMarkInvalid.createDelegate(this, [field], 0), clearInvalid: this.onFieldClearInvalid.createDelegate(this, [field], 0) }); }); } var l = this.el.parent().parent().child('label', true); if (l) { l.setAttribute('for', this.items.items[0].id); } } Ext.form.CompositeField.superclass.onRender.apply(this, arguments); }, onFieldMarkInvalid: function(field, message) { var name = field.getName(), error = { field: name, errorName: field.fieldLabel || name, error: message }; this.fieldErrors.replace(name, error); if (!field.preventMark) { field.el.addClass(field.invalidClass); } }, onFieldClearInvalid: function(field) { this.fieldErrors.removeKey(field.getName()); field.el.removeClass(field.invalidClass); }, updateInvalidMark: function() { var ieStrict = Ext.isIE6 && Ext.isStrict; if (this.fieldErrors.length == 0) { this.clearInvalid(); if (ieStrict) { this.clearInvalid.defer(50, this); } } else { var message = this.buildCombinedErrorMessage(this.fieldErrors.items); this.sortErrors(); this.markInvalid(message); if (ieStrict) { this.markInvalid(message); } } }, validateValue: function(value, preventMark) { var valid = true; this.eachItem(function(field) { if (!field.isValid(preventMark)) { valid = false; } }); return valid; }, buildCombinedErrorMessage: function(errors) { var combined = [], error; for (var i = 0, j = errors.length; i < j; i++) { error = errors[i]; combined.push(String.format("{0}: {1}", error.errorName, error.error)); } return combined.join("
    "); }, sortErrors: function() { var fields = this.items; this.fieldErrors.sort("ASC", function(a, b) { var findByName = function(key) { return function(field) { return field.getName() == key; }; }; var aIndex = fields.findIndexBy(findByName(a.field)), bIndex = fields.findIndexBy(findByName(b.field)); return aIndex < bIndex ? -1 : 1; }); }, reset: function() { this.eachItem(function(item) { item.reset(); }); (function() { this.clearInvalid(); }).defer(50, this); }, clearInvalidChildren: function() { this.eachItem(function(item) { item.clearInvalid(); }); }, buildLabel: function(segments) { return Ext.clean(segments).join(this.labelConnector); }, isDirty: function(){ if (this.disabled || !this.rendered) { return false; } var dirty = false; this.eachItem(function(item){ if(item.isDirty()){ dirty = true; return false; } }); return dirty; }, eachItem: function(fn, scope) { if(this.items && this.items.each){ this.items.each(fn, scope || this); } }, onResize: function(adjWidth, adjHeight, rawWidth, rawHeight) { var innerCt = this.innerCt; if (this.rendered && innerCt.rendered) { innerCt.setSize(adjWidth, adjHeight); } Ext.form.CompositeField.superclass.onResize.apply(this, arguments); }, doLayout: function(shallow, force) { if (this.rendered) { var innerCt = this.innerCt; innerCt.forceLayout = this.ownerCt.forceLayout; innerCt.doLayout(shallow, force); } }, beforeDestroy: function(){ Ext.destroy(this.innerCt); Ext.form.CompositeField.superclass.beforeDestroy.call(this); }, setReadOnly : function(readOnly) { if (readOnly == undefined) { readOnly = true; } readOnly = !!readOnly; if(this.rendered){ this.eachItem(function(item){ item.setReadOnly(readOnly); }); } this.readOnly = readOnly; }, onShow : function() { Ext.form.CompositeField.superclass.onShow.call(this); this.doLayout(); }, onDisable : function(){ this.eachItem(function(item){ item.disable(); }); }, onEnable : function(){ this.eachItem(function(item){ item.enable(); }); } }); Ext.reg('compositefield', Ext.form.CompositeField); Ext.form.Radio = Ext.extend(Ext.form.Checkbox, { inputType: 'radio', markInvalid : Ext.emptyFn, clearInvalid : Ext.emptyFn, getGroupValue : function(){ var p = this.el.up('form') || Ext.getBody(); var c = p.child('input[name="'+this.el.dom.name+'"]:checked', true); return c ? c.value : null; }, setValue : function(v){ var checkEl, els, radio; if (typeof v == 'boolean') { Ext.form.Radio.superclass.setValue.call(this, v); } else if (this.rendered) { checkEl = this.getCheckEl(); radio = checkEl.child('input[name="' + this.el.dom.name + '"][value="' + v + '"]', true); if(radio){ Ext.getCmp(radio.id).setValue(true); } } if(this.rendered && this.checked){ checkEl = checkEl || this.getCheckEl(); els = this.getCheckEl().select('input[name="' + this.el.dom.name + '"]'); els.each(function(el){ if(el.dom.id != this.id){ Ext.getCmp(el.dom.id).setValue(false); } }, this); } return this; }, getCheckEl: function(){ if(this.inGroup){ return this.el.up('.x-form-radio-group'); } return this.el.up('form') || Ext.getBody(); } }); Ext.reg('radio', Ext.form.Radio); Ext.form.RadioGroup = Ext.extend(Ext.form.CheckboxGroup, { allowBlank : true, blankText : 'You must select one item in this group', defaultType : 'radio', groupCls : 'x-form-radio-group', getValue : function(){ var out = null; this.eachItem(function(item){ if(item.checked){ out = item; return false; } }); return out; }, onSetValue : function(id, value){ if(arguments.length > 1){ var f = this.getBox(id); if(f){ f.setValue(value); if(f.checked){ this.eachItem(function(item){ if (item !== f){ item.setValue(false); } }); } } }else{ this.setValueForItem(id); } }, setValueForItem : function(val){ val = String(val).split(',')[0]; this.eachItem(function(item){ item.setValue(val == item.inputValue); }); }, fireChecked : function(){ if(!this.checkTask){ this.checkTask = new Ext.util.DelayedTask(this.bufferChecked, this); } this.checkTask.delay(10); }, bufferChecked : function(){ var out = null; this.eachItem(function(item){ if(item.checked){ out = item; return false; } }); this.fireEvent('change', this, out); }, onDestroy : function(){ if(this.checkTask){ this.checkTask.cancel(); this.checkTask = null; } Ext.form.RadioGroup.superclass.onDestroy.call(this); } }); Ext.reg('radiogroup', Ext.form.RadioGroup); Ext.form.Hidden = Ext.extend(Ext.form.Field, { inputType : 'hidden', shouldLayout: false, onRender : function(){ Ext.form.Hidden.superclass.onRender.apply(this, arguments); }, initEvents : function(){ this.originalValue = this.getValue(); }, setSize : Ext.emptyFn, setWidth : Ext.emptyFn, setHeight : Ext.emptyFn, setPosition : Ext.emptyFn, setPagePosition : Ext.emptyFn, markInvalid : Ext.emptyFn, clearInvalid : Ext.emptyFn }); Ext.reg('hidden', Ext.form.Hidden); Ext.form.BasicForm = Ext.extend(Ext.util.Observable, { constructor: function(el, config){ Ext.apply(this, config); if(Ext.isString(this.paramOrder)){ this.paramOrder = this.paramOrder.split(/[\s,|]/); } this.items = new Ext.util.MixedCollection(false, function(o){ return o.getItemId(); }); this.addEvents( 'beforeaction', 'actionfailed', 'actioncomplete' ); if(el){ this.initEl(el); } Ext.form.BasicForm.superclass.constructor.call(this); }, timeout: 30, paramOrder: undefined, paramsAsHash: false, waitTitle: 'Please Wait...', activeAction : null, trackResetOnLoad : false, initEl : function(el){ this.el = Ext.get(el); this.id = this.el.id || Ext.id(); if(!this.standardSubmit){ this.el.on('submit', this.onSubmit, this); } this.el.addClass('x-form'); }, getEl: function(){ return this.el; }, onSubmit : function(e){ e.stopEvent(); }, destroy: function(bound){ if(bound !== true){ this.items.each(function(f){ Ext.destroy(f); }); Ext.destroy(this.el); } this.items.clear(); this.purgeListeners(); }, isValid : function(){ var valid = true; this.items.each(function(f){ if(!f.validate()){ valid = false; } }); return valid; }, isDirty : function(){ var dirty = false; this.items.each(function(f){ if(f.isDirty()){ dirty = true; return false; } }); return dirty; }, doAction : function(action, options){ if(Ext.isString(action)){ action = new Ext.form.Action.ACTION_TYPES[action](this, options); } if(this.fireEvent('beforeaction', this, action) !== false){ this.beforeAction(action); action.run.defer(100, action); } return this; }, submit : function(options){ options = options || {}; if(this.standardSubmit){ var v = options.clientValidation === false || this.isValid(); if(v){ var el = this.el.dom; if(this.url && Ext.isEmpty(el.action)){ el.action = this.url; } el.submit(); } return v; } var submitAction = String.format('{0}submit', this.api ? 'direct' : ''); this.doAction(submitAction, options); return this; }, load : function(options){ var loadAction = String.format('{0}load', this.api ? 'direct' : ''); this.doAction(loadAction, options); return this; }, updateRecord : function(record){ record.beginEdit(); var fs = record.fields, field, value; fs.each(function(f){ field = this.findField(f.name); if(field){ value = field.getValue(); if (Ext.type(value) !== false && value.getGroupValue) { value = value.getGroupValue(); } else if ( field.eachItem ) { value = []; field.eachItem(function(item){ value.push(item.getValue()); }); } record.set(f.name, value); } }, this); record.endEdit(); return this; }, loadRecord : function(record){ this.setValues(record.data); return this; }, beforeAction : function(action){ this.items.each(function(f){ if(f.isFormField && f.syncValue){ f.syncValue(); } }); var o = action.options; if(o.waitMsg){ if(this.waitMsgTarget === true){ this.el.mask(o.waitMsg, 'x-mask-loading'); }else if(this.waitMsgTarget){ this.waitMsgTarget = Ext.get(this.waitMsgTarget); this.waitMsgTarget.mask(o.waitMsg, 'x-mask-loading'); }else{ Ext.MessageBox.wait(o.waitMsg, o.waitTitle || this.waitTitle); } } }, afterAction : function(action, success){ this.activeAction = null; var o = action.options; if(o.waitMsg){ if(this.waitMsgTarget === true){ this.el.unmask(); }else if(this.waitMsgTarget){ this.waitMsgTarget.unmask(); }else{ Ext.MessageBox.updateProgress(1); Ext.MessageBox.hide(); } } if(success){ if(o.reset){ this.reset(); } Ext.callback(o.success, o.scope, [this, action]); this.fireEvent('actioncomplete', this, action); }else{ Ext.callback(o.failure, o.scope, [this, action]); this.fireEvent('actionfailed', this, action); } }, findField : function(id) { var field = this.items.get(id); if (!Ext.isObject(field)) { var findMatchingField = function(f) { if (f.isFormField) { if (f.dataIndex == id || f.id == id || f.getName() == id) { field = f; return false; } else if (f.isComposite) { return f.items.each(findMatchingField); } else if (f instanceof Ext.form.CheckboxGroup && f.rendered) { return f.eachItem(findMatchingField); } } }; this.items.each(findMatchingField); } return field || null; }, markInvalid : function(errors){ if (Ext.isArray(errors)) { for(var i = 0, len = errors.length; i < len; i++){ var fieldError = errors[i]; var f = this.findField(fieldError.id); if(f){ f.markInvalid(fieldError.msg); } } } else { var field, id; for(id in errors){ if(!Ext.isFunction(errors[id]) && (field = this.findField(id))){ field.markInvalid(errors[id]); } } } return this; }, setValues : function(values){ if(Ext.isArray(values)){ for(var i = 0, len = values.length; i < len; i++){ var v = values[i]; var f = this.findField(v.id); if(f){ f.setValue(v.value); if(this.trackResetOnLoad){ f.originalValue = f.getValue(); } } } }else{ var field, id; for(id in values){ if(!Ext.isFunction(values[id]) && (field = this.findField(id))){ field.setValue(values[id]); if(this.trackResetOnLoad){ field.originalValue = field.getValue(); } } } } return this; }, getValues : function(asString){ var fs = Ext.lib.Ajax.serializeForm(this.el.dom); if(asString === true){ return fs; } return Ext.urlDecode(fs); }, getFieldValues : function(dirtyOnly){ var o = {}, n, key, val; this.items.each(function(f) { if (!f.disabled && (dirtyOnly !== true || f.isDirty())) { n = f.getName(); key = o[n]; val = f.getValue(); if(Ext.isDefined(key)){ if(Ext.isArray(key)){ o[n].push(val); }else{ o[n] = [key, val]; } }else{ o[n] = val; } } }); return o; }, clearInvalid : function(){ this.items.each(function(f){ f.clearInvalid(); }); return this; }, reset : function(){ this.items.each(function(f){ f.reset(); }); return this; }, add : function(){ this.items.addAll(Array.prototype.slice.call(arguments, 0)); return this; }, remove : function(field){ this.items.remove(field); return this; }, cleanDestroyed : function() { this.items.filterBy(function(o) { return !!o.isDestroyed; }).each(this.remove, this); }, render : function(){ this.items.each(function(f){ if(f.isFormField && !f.rendered && document.getElementById(f.id)){ f.applyToMarkup(f.id); } }); return this; }, applyToFields : function(o){ this.items.each(function(f){ Ext.apply(f, o); }); return this; }, applyIfToFields : function(o){ this.items.each(function(f){ Ext.applyIf(f, o); }); return this; }, callFieldMethod : function(fnName, args){ args = args || []; this.items.each(function(f){ if(Ext.isFunction(f[fnName])){ f[fnName].apply(f, args); } }); return this; } }); Ext.BasicForm = Ext.form.BasicForm; Ext.FormPanel = Ext.extend(Ext.Panel, { minButtonWidth : 75, labelAlign : 'left', monitorValid : false, monitorPoll : 200, layout : 'form', initComponent : function(){ this.form = this.createForm(); Ext.FormPanel.superclass.initComponent.call(this); this.bodyCfg = { tag: 'form', cls: this.baseCls + '-body', method : this.method || 'POST', id : this.formId || Ext.id() }; if(this.fileUpload) { this.bodyCfg.enctype = 'multipart/form-data'; } this.initItems(); this.addEvents( 'clientvalidation' ); this.relayEvents(this.form, ['beforeaction', 'actionfailed', 'actioncomplete']); }, createForm : function(){ var config = Ext.applyIf({listeners: {}}, this.initialConfig); return new Ext.form.BasicForm(null, config); }, initFields : function(){ var f = this.form; var formPanel = this; var fn = function(c){ if(formPanel.isField(c)){ f.add(c); }else if(c.findBy && c != formPanel){ formPanel.applySettings(c); if(c.items && c.items.each){ c.items.each(fn, this); } } }; this.items.each(fn, this); }, applySettings: function(c){ var ct = c.ownerCt; Ext.applyIf(c, { labelAlign: ct.labelAlign, labelWidth: ct.labelWidth, itemCls: ct.itemCls }); }, getLayoutTarget : function(){ return this.form.el; }, getForm : function(){ return this.form; }, onRender : function(ct, position){ this.initFields(); Ext.FormPanel.superclass.onRender.call(this, ct, position); this.form.initEl(this.body); }, beforeDestroy : function(){ this.stopMonitoring(); this.form.destroy(true); Ext.FormPanel.superclass.beforeDestroy.call(this); }, isField : function(c) { return !!c.setValue && !!c.getValue && !!c.markInvalid && !!c.clearInvalid; }, initEvents : function(){ Ext.FormPanel.superclass.initEvents.call(this); this.on({ scope: this, add: this.onAddEvent, remove: this.onRemoveEvent }); if(this.monitorValid){ this.startMonitoring(); } }, onAdd: function(c){ Ext.FormPanel.superclass.onAdd.call(this, c); this.processAdd(c); }, onAddEvent: function(ct, c){ if(ct !== this){ this.processAdd(c); } }, processAdd : function(c){ if(this.isField(c)){ this.form.add(c); }else if(c.findBy){ this.applySettings(c); this.form.add.apply(this.form, c.findBy(this.isField)); } }, onRemove: function(c){ Ext.FormPanel.superclass.onRemove.call(this, c); this.processRemove(c); }, onRemoveEvent: function(ct, c){ if(ct !== this){ this.processRemove(c); } }, processRemove: function(c){ if(!this.destroying){ if(this.isField(c)){ this.form.remove(c); }else if (c.findBy){ Ext.each(c.findBy(this.isField), this.form.remove, this.form); this.form.cleanDestroyed(); } } }, startMonitoring : function(){ if(!this.validTask){ this.validTask = new Ext.util.TaskRunner(); this.validTask.start({ run : this.bindHandler, interval : this.monitorPoll || 200, scope: this }); } }, stopMonitoring : function(){ if(this.validTask){ this.validTask.stopAll(); this.validTask = null; } }, load : function(){ this.form.load.apply(this.form, arguments); }, onDisable : function(){ Ext.FormPanel.superclass.onDisable.call(this); if(this.form){ this.form.items.each(function(){ this.disable(); }); } }, onEnable : function(){ Ext.FormPanel.superclass.onEnable.call(this); if(this.form){ this.form.items.each(function(){ this.enable(); }); } }, bindHandler : function(){ var valid = true; this.form.items.each(function(f){ if(!f.isValid(true)){ valid = false; return false; } }); if(this.fbar){ var fitems = this.fbar.items.items; for(var i = 0, len = fitems.length; i < len; i++){ var btn = fitems[i]; if(btn.formBind === true && btn.disabled === valid){ btn.setDisabled(!valid); } } } this.fireEvent('clientvalidation', this, valid); } }); Ext.reg('form', Ext.FormPanel); Ext.form.FormPanel = Ext.FormPanel; Ext.form.FieldSet = Ext.extend(Ext.Panel, { baseCls : 'x-fieldset', layout : 'form', animCollapse : false, onRender : function(ct, position){ if(!this.el){ this.el = document.createElement('fieldset'); this.el.id = this.id; if (this.title || this.header || this.checkboxToggle) { this.el.appendChild(document.createElement('legend')).className = this.baseCls + '-header'; } } Ext.form.FieldSet.superclass.onRender.call(this, ct, position); if(this.checkboxToggle){ var o = typeof this.checkboxToggle == 'object' ? this.checkboxToggle : {tag: 'input', type: 'checkbox', name: this.checkboxName || this.id+'-checkbox'}; this.checkbox = this.header.insertFirst(o); this.checkbox.dom.checked = !this.collapsed; this.mon(this.checkbox, 'click', this.onCheckClick, this); } }, onCollapse : function(doAnim, animArg){ if(this.checkbox){ this.checkbox.dom.checked = false; } Ext.form.FieldSet.superclass.onCollapse.call(this, doAnim, animArg); }, onExpand : function(doAnim, animArg){ if(this.checkbox){ this.checkbox.dom.checked = true; } Ext.form.FieldSet.superclass.onExpand.call(this, doAnim, animArg); }, onCheckClick : function(){ this[this.checkbox.dom.checked ? 'expand' : 'collapse'](); } }); Ext.reg('fieldset', Ext.form.FieldSet); Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, { enableFormat : true, enableFontSize : true, enableColors : true, enableAlignments : true, enableLists : true, enableSourceEdit : true, enableLinks : true, enableFont : true, createLinkText : 'Please enter the URL for the link:', defaultLinkValue : 'http:/'+'/', fontFamilies : [ 'Arial', 'Courier New', 'Tahoma', 'Times New Roman', 'Verdana' ], defaultFont: 'tahoma', defaultValue: (Ext.isOpera || Ext.isIE6) ? ' ' : '​', actionMode: 'wrap', validationEvent : false, deferHeight: true, initialized : false, activated : false, sourceEditMode : false, onFocus : Ext.emptyFn, iframePad:3, hideMode:'offsets', defaultAutoCreate : { tag: "textarea", style:"width:500px;height:300px;", autocomplete: "off" }, initComponent : function(){ this.addEvents( 'initialize', 'activate', 'beforesync', 'beforepush', 'sync', 'push', 'editmodechange' ); Ext.form.HtmlEditor.superclass.initComponent.call(this); }, createFontOptions : function(){ var buf = [], fs = this.fontFamilies, ff, lc; for(var i = 0, len = fs.length; i< len; i++){ ff = fs[i]; lc = ff.toLowerCase(); buf.push( '' ); } return buf.join(''); }, createToolbar : function(editor){ var items = []; var tipsEnabled = Ext.QuickTips && Ext.QuickTips.isEnabled(); function btn(id, toggle, handler){ return { itemId : id, cls : 'x-btn-icon', iconCls: 'x-edit-'+id, enableToggle:toggle !== false, scope: editor, handler:handler||editor.relayBtnCmd, clickEvent:'mousedown', tooltip: tipsEnabled ? editor.buttonTips[id] || undefined : undefined, overflowText: editor.buttonTips[id].title || undefined, tabIndex:-1 }; } if(this.enableFont && !Ext.isSafari2){ var fontSelectItem = new Ext.Toolbar.Item({ autoEl: { tag:'select', cls:'x-font-select', html: this.createFontOptions() } }); items.push( fontSelectItem, '-' ); } if(this.enableFormat){ items.push( btn('bold'), btn('italic'), btn('underline') ); } if(this.enableFontSize){ items.push( '-', btn('increasefontsize', false, this.adjustFont), btn('decreasefontsize', false, this.adjustFont) ); } if(this.enableColors){ items.push( '-', { itemId:'forecolor', cls:'x-btn-icon', iconCls: 'x-edit-forecolor', clickEvent:'mousedown', tooltip: tipsEnabled ? editor.buttonTips.forecolor || undefined : undefined, tabIndex:-1, menu : new Ext.menu.ColorMenu({ allowReselect: true, focus: Ext.emptyFn, value:'000000', plain:true, listeners: { scope: this, select: function(cp, color){ this.execCmd('forecolor', Ext.isWebKit || Ext.isIE ? '#'+color : color); this.deferFocus(); } }, clickEvent:'mousedown' }) }, { itemId:'backcolor', cls:'x-btn-icon', iconCls: 'x-edit-backcolor', clickEvent:'mousedown', tooltip: tipsEnabled ? editor.buttonTips.backcolor || undefined : undefined, tabIndex:-1, menu : new Ext.menu.ColorMenu({ focus: Ext.emptyFn, value:'FFFFFF', plain:true, allowReselect: true, listeners: { scope: this, select: function(cp, color){ if(Ext.isGecko){ this.execCmd('useCSS', false); this.execCmd('hilitecolor', color); this.execCmd('useCSS', true); this.deferFocus(); }else{ this.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isWebKit || Ext.isIE ? '#'+color : color); this.deferFocus(); } } }, clickEvent:'mousedown' }) } ); } if(this.enableAlignments){ items.push( '-', btn('justifyleft'), btn('justifycenter'), btn('justifyright') ); } if(!Ext.isSafari2){ if(this.enableLinks){ items.push( '-', btn('createlink', false, this.createLink) ); } if(this.enableLists){ items.push( '-', btn('insertorderedlist'), btn('insertunorderedlist') ); } if(this.enableSourceEdit){ items.push( '-', btn('sourceedit', true, function(btn){ this.toggleSourceEdit(!this.sourceEditMode); }) ); } } var tb = new Ext.Toolbar({ renderTo: this.wrap.dom.firstChild, items: items }); if (fontSelectItem) { this.fontSelect = fontSelectItem.el; this.mon(this.fontSelect, 'change', function(){ var font = this.fontSelect.dom.value; this.relayCmd('fontname', font); this.deferFocus(); }, this); } this.mon(tb.el, 'click', function(e){ e.preventDefault(); }); this.tb = tb; this.tb.doLayout(); }, onDisable: function(){ this.wrap.mask(); Ext.form.HtmlEditor.superclass.onDisable.call(this); }, onEnable: function(){ this.wrap.unmask(); Ext.form.HtmlEditor.superclass.onEnable.call(this); }, setReadOnly: function(readOnly){ Ext.form.HtmlEditor.superclass.setReadOnly.call(this, readOnly); if(this.initialized){ if(Ext.isIE){ this.getEditorBody().contentEditable = !readOnly; }else{ this.setDesignMode(!readOnly); } var bd = this.getEditorBody(); if(bd){ bd.style.cursor = this.readOnly ? 'default' : 'text'; } this.disableItems(readOnly); } }, getDocMarkup : function(){ var h = Ext.fly(this.iframe).getHeight() - this.iframePad * 2; return String.format('', this.iframePad, h); }, getEditorBody : function(){ var doc = this.getDoc(); return doc.body || doc.documentElement; }, getDoc : function(){ return Ext.isIE ? this.getWin().document : (this.iframe.contentDocument || this.getWin().document); }, getWin : function(){ return Ext.isIE ? this.iframe.contentWindow : window.frames[this.iframe.name]; }, onRender : function(ct, position){ Ext.form.HtmlEditor.superclass.onRender.call(this, ct, position); this.el.dom.style.border = '0 none'; this.el.dom.setAttribute('tabIndex', -1); this.el.addClass('x-hidden'); if(Ext.isIE){ this.el.applyStyles('margin-top:-1px;margin-bottom:-1px;'); } this.wrap = this.el.wrap({ cls:'x-html-editor-wrap', cn:{cls:'x-html-editor-tb'} }); this.createToolbar(this); this.disableItems(true); this.tb.doLayout(); this.createIFrame(); if(!this.width){ var sz = this.el.getSize(); this.setSize(sz.width, this.height || sz.height); } this.resizeEl = this.positionEl = this.wrap; }, createIFrame: function(){ var iframe = document.createElement('iframe'); iframe.name = Ext.id(); iframe.frameBorder = '0'; iframe.style.overflow = 'auto'; iframe.src = Ext.SSL_SECURE_URL; this.wrap.dom.appendChild(iframe); this.iframe = iframe; this.monitorTask = Ext.TaskMgr.start({ run: this.checkDesignMode, scope: this, interval:100 }); }, initFrame : function(){ Ext.TaskMgr.stop(this.monitorTask); var doc = this.getDoc(); this.win = this.getWin(); doc.open(); doc.write(this.getDocMarkup()); doc.close(); var task = { run : function(){ var doc = this.getDoc(); if(doc.body || doc.readyState == 'complete'){ Ext.TaskMgr.stop(task); this.setDesignMode(true); this.initEditor.defer(10, this); } }, interval : 10, duration:10000, scope: this }; Ext.TaskMgr.start(task); }, checkDesignMode : function(){ if(this.wrap && this.wrap.dom.offsetWidth){ var doc = this.getDoc(); if(!doc){ return; } if(!doc.editorInitialized || this.getDesignMode() != 'on'){ this.initFrame(); } } }, setDesignMode : function(mode){ var doc = this.getDoc(); if (doc) { if(this.readOnly){ mode = false; } doc.designMode = (/on|true/i).test(String(mode).toLowerCase()) ?'on':'off'; } }, getDesignMode : function(){ var doc = this.getDoc(); if(!doc){ return ''; } return String(doc.designMode).toLowerCase(); }, disableItems: function(disabled){ if(this.fontSelect){ this.fontSelect.dom.disabled = disabled; } this.tb.items.each(function(item){ if(item.getItemId() != 'sourceedit'){ item.setDisabled(disabled); } }); }, onResize : function(w, h){ Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments); if(this.el && this.iframe){ if(Ext.isNumber(w)){ var aw = w - this.wrap.getFrameWidth('lr'); this.el.setWidth(aw); this.tb.setWidth(aw); this.iframe.style.width = Math.max(aw, 0) + 'px'; } if(Ext.isNumber(h)){ var ah = h - this.wrap.getFrameWidth('tb') - this.tb.el.getHeight(); this.el.setHeight(ah); this.iframe.style.height = Math.max(ah, 0) + 'px'; var bd = this.getEditorBody(); if(bd){ bd.style.height = Math.max((ah - (this.iframePad*2)), 0) + 'px'; } } } }, toggleSourceEdit : function(sourceEditMode){ var iframeHeight, elHeight; if (sourceEditMode === undefined) { sourceEditMode = !this.sourceEditMode; } this.sourceEditMode = sourceEditMode === true; var btn = this.tb.getComponent('sourceedit'); if (btn.pressed !== this.sourceEditMode) { btn.toggle(this.sourceEditMode); if (!btn.xtbHidden) { return; } } if (this.sourceEditMode) { this.previousSize = this.getSize(); iframeHeight = Ext.get(this.iframe).getHeight(); this.disableItems(true); this.syncValue(); this.iframe.className = 'x-hidden'; this.el.removeClass('x-hidden'); this.el.dom.removeAttribute('tabIndex'); this.el.focus(); this.el.dom.style.height = iframeHeight + 'px'; } else { elHeight = parseInt(this.el.dom.style.height, 10); if (this.initialized) { this.disableItems(this.readOnly); } this.pushValue(); this.iframe.className = ''; this.el.addClass('x-hidden'); this.el.dom.setAttribute('tabIndex', -1); this.deferFocus(); this.setSize(this.previousSize); delete this.previousSize; this.iframe.style.height = elHeight + 'px'; } this.fireEvent('editmodechange', this, this.sourceEditMode); }, createLink : function() { var url = prompt(this.createLinkText, this.defaultLinkValue); if(url && url != 'http:/'+'/'){ this.relayCmd('createlink', url); } }, initEvents : function(){ this.originalValue = this.getValue(); }, markInvalid : Ext.emptyFn, clearInvalid : Ext.emptyFn, setValue : function(v){ Ext.form.HtmlEditor.superclass.setValue.call(this, v); this.pushValue(); return this; }, cleanHtml: function(html) { html = String(html); if(Ext.isWebKit){ html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, ''); } if(html.charCodeAt(0) == this.defaultValue.replace(/\D/g, '')){ html = html.substring(1); } return html; }, syncValue : function(){ if(this.initialized){ var bd = this.getEditorBody(); var html = bd.innerHTML; if(Ext.isWebKit){ var bs = bd.getAttribute('style'); var m = bs.match(/text-align:(.*?);/i); if(m && m[1]){ html = '
    ' + html + '
    '; } } html = this.cleanHtml(html); if(this.fireEvent('beforesync', this, html) !== false){ this.el.dom.value = html; this.fireEvent('sync', this, html); } } }, getValue : function() { this[this.sourceEditMode ? 'pushValue' : 'syncValue'](); return Ext.form.HtmlEditor.superclass.getValue.call(this); }, pushValue : function(){ if(this.initialized){ var v = this.el.dom.value; if(!this.activated && v.length < 1){ v = this.defaultValue; } if(this.fireEvent('beforepush', this, v) !== false){ this.getEditorBody().innerHTML = v; if(Ext.isGecko){ this.setDesignMode(false); this.setDesignMode(true); } this.fireEvent('push', this, v); } } }, deferFocus : function(){ this.focus.defer(10, this); }, focus : function(){ if(this.win && !this.sourceEditMode){ this.win.focus(); }else{ this.el.focus(); } }, initEditor : function(){ try{ var dbody = this.getEditorBody(), ss = this.el.getStyles('font-size', 'font-family', 'background-image', 'background-repeat', 'background-color', 'color'), doc, fn; ss['background-attachment'] = 'fixed'; dbody.bgProperties = 'fixed'; Ext.DomHelper.applyStyles(dbody, ss); doc = this.getDoc(); if(doc){ try{ Ext.EventManager.removeAll(doc); }catch(e){} } fn = this.onEditorEvent.createDelegate(this); Ext.EventManager.on(doc, { mousedown: fn, dblclick: fn, click: fn, keyup: fn, buffer:100 }); if(Ext.isGecko){ Ext.EventManager.on(doc, 'keypress', this.applyCommand, this); } if(Ext.isIE || Ext.isWebKit || Ext.isOpera){ Ext.EventManager.on(doc, 'keydown', this.fixKeys, this); } doc.editorInitialized = true; this.initialized = true; this.pushValue(); this.setReadOnly(this.readOnly); this.fireEvent('initialize', this); }catch(e){} }, beforeDestroy : function(){ if(this.monitorTask){ Ext.TaskMgr.stop(this.monitorTask); } if(this.rendered){ Ext.destroy(this.tb); var doc = this.getDoc(); if(doc){ try{ Ext.EventManager.removeAll(doc); for (var prop in doc){ delete doc[prop]; } }catch(e){} } if(this.wrap){ this.wrap.dom.innerHTML = ''; this.wrap.remove(); } } Ext.form.HtmlEditor.superclass.beforeDestroy.call(this); }, onFirstFocus : function(){ this.activated = true; this.disableItems(this.readOnly); if(Ext.isGecko){ this.win.focus(); var s = this.win.getSelection(); if(!s.focusNode || s.focusNode.nodeType != 3){ var r = s.getRangeAt(0); r.selectNodeContents(this.getEditorBody()); r.collapse(true); this.deferFocus(); } try{ this.execCmd('useCSS', true); this.execCmd('styleWithCSS', false); }catch(e){} } this.fireEvent('activate', this); }, adjustFont: function(btn){ var adjust = btn.getItemId() == 'increasefontsize' ? 1 : -1, doc = this.getDoc(), v = parseInt(doc.queryCommandValue('FontSize') || 2, 10); if((Ext.isSafari && !Ext.isSafari2) || Ext.isChrome || Ext.isAir){ if(v <= 10){ v = 1 + adjust; }else if(v <= 13){ v = 2 + adjust; }else if(v <= 16){ v = 3 + adjust; }else if(v <= 18){ v = 4 + adjust; }else if(v <= 24){ v = 5 + adjust; }else { v = 6 + adjust; } v = v.constrain(1, 6); }else{ if(Ext.isSafari){ adjust *= 2; } v = Math.max(1, v+adjust) + (Ext.isSafari ? 'px' : 0); } this.execCmd('FontSize', v); }, onEditorEvent : function(e){ this.updateToolbar(); }, updateToolbar: function(){ if(this.readOnly){ return; } if(!this.activated){ this.onFirstFocus(); return; } var btns = this.tb.items.map, doc = this.getDoc(); if(this.enableFont && !Ext.isSafari2){ var name = (doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase(); if(name != this.fontSelect.dom.value){ this.fontSelect.dom.value = name; } } if(this.enableFormat){ btns.bold.toggle(doc.queryCommandState('bold')); btns.italic.toggle(doc.queryCommandState('italic')); btns.underline.toggle(doc.queryCommandState('underline')); } if(this.enableAlignments){ btns.justifyleft.toggle(doc.queryCommandState('justifyleft')); btns.justifycenter.toggle(doc.queryCommandState('justifycenter')); btns.justifyright.toggle(doc.queryCommandState('justifyright')); } if(!Ext.isSafari2 && this.enableLists){ btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist')); btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist')); } Ext.menu.MenuMgr.hideAll(); this.syncValue(); }, relayBtnCmd : function(btn){ this.relayCmd(btn.getItemId()); }, relayCmd : function(cmd, value){ (function(){ this.focus(); this.execCmd(cmd, value); this.updateToolbar(); }).defer(10, this); }, execCmd : function(cmd, value){ var doc = this.getDoc(); doc.execCommand(cmd, false, value === undefined ? null : value); this.syncValue(); }, applyCommand : function(e){ if(e.ctrlKey){ var c = e.getCharCode(), cmd; if(c > 0){ c = String.fromCharCode(c); switch(c){ case 'b': cmd = 'bold'; break; case 'i': cmd = 'italic'; break; case 'u': cmd = 'underline'; break; } if(cmd){ this.win.focus(); this.execCmd(cmd); this.deferFocus(); e.preventDefault(); } } } }, insertAtCursor : function(text){ if(!this.activated){ return; } if(Ext.isIE){ this.win.focus(); var doc = this.getDoc(), r = doc.selection.createRange(); if(r){ r.pasteHTML(text); this.syncValue(); this.deferFocus(); } }else{ this.win.focus(); this.execCmd('InsertHTML', text); this.deferFocus(); } }, fixKeys : function(){ if(Ext.isIE){ return function(e){ var k = e.getKey(), doc = this.getDoc(), r; if(k == e.TAB){ e.stopEvent(); r = doc.selection.createRange(); if(r){ r.collapse(true); r.pasteHTML('    '); this.deferFocus(); } }else if(k == e.ENTER){ r = doc.selection.createRange(); if(r){ var target = r.parentElement(); if(!target || target.tagName.toLowerCase() != 'li'){ e.stopEvent(); r.pasteHTML('
    '); r.collapse(false); r.select(); } } } }; }else if(Ext.isOpera){ return function(e){ var k = e.getKey(); if(k == e.TAB){ e.stopEvent(); this.win.focus(); this.execCmd('InsertHTML','    '); this.deferFocus(); } }; }else if(Ext.isWebKit){ return function(e){ var k = e.getKey(); if(k == e.TAB){ e.stopEvent(); this.execCmd('InsertText','\t'); this.deferFocus(); }else if(k == e.ENTER){ e.stopEvent(); this.execCmd('InsertHtml','

    '); this.deferFocus(); } }; } }(), getToolbar : function(){ return this.tb; }, buttonTips : { bold : { title: 'Bold (Ctrl+B)', text: 'Make the selected text bold.', cls: 'x-html-editor-tip' }, italic : { title: 'Italic (Ctrl+I)', text: 'Make the selected text italic.', cls: 'x-html-editor-tip' }, underline : { title: 'Underline (Ctrl+U)', text: 'Underline the selected text.', cls: 'x-html-editor-tip' }, increasefontsize : { title: 'Grow Text', text: 'Increase the font size.', cls: 'x-html-editor-tip' }, decreasefontsize : { title: 'Shrink Text', text: 'Decrease the font size.', cls: 'x-html-editor-tip' }, backcolor : { title: 'Text Highlight Color', text: 'Change the background color of the selected text.', cls: 'x-html-editor-tip' }, forecolor : { title: 'Font Color', text: 'Change the color of the selected text.', cls: 'x-html-editor-tip' }, justifyleft : { title: 'Align Text Left', text: 'Align text to the left.', cls: 'x-html-editor-tip' }, justifycenter : { title: 'Center Text', text: 'Center text in the editor.', cls: 'x-html-editor-tip' }, justifyright : { title: 'Align Text Right', text: 'Align text to the right.', cls: 'x-html-editor-tip' }, insertunorderedlist : { title: 'Bullet List', text: 'Start a bulleted list.', cls: 'x-html-editor-tip' }, insertorderedlist : { title: 'Numbered List', text: 'Start a numbered list.', cls: 'x-html-editor-tip' }, createlink : { title: 'Hyperlink', text: 'Make the selected text a hyperlink.', cls: 'x-html-editor-tip' }, sourceedit : { title: 'Source Edit', text: 'Switch to source editing mode.', cls: 'x-html-editor-tip' } } }); Ext.reg('htmleditor', Ext.form.HtmlEditor); Ext.form.TimeField = Ext.extend(Ext.form.ComboBox, { minValue : undefined, maxValue : undefined, minText : "The time in this field must be equal to or after {0}", maxText : "The time in this field must be equal to or before {0}", invalidText : "{0} is not a valid time", format : "g:i A", altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A", increment: 15, mode: 'local', triggerAction: 'all', typeAhead: false, initDate: '1/1/2008', initDateFormat: 'j/n/Y', initComponent : function(){ if(Ext.isDefined(this.minValue)){ this.setMinValue(this.minValue, true); } if(Ext.isDefined(this.maxValue)){ this.setMaxValue(this.maxValue, true); } if(!this.store){ this.generateStore(true); } Ext.form.TimeField.superclass.initComponent.call(this); }, setMinValue: function(value, initial){ this.setLimit(value, true, initial); return this; }, setMaxValue: function(value, initial){ this.setLimit(value, false, initial); return this; }, generateStore: function(initial){ var min = this.minValue || new Date(this.initDate).clearTime(), max = this.maxValue || new Date(this.initDate).clearTime().add('mi', (24 * 60) - 1), times = []; while(min <= max){ times.push(min.dateFormat(this.format)); min = min.add('mi', this.increment); } this.bindStore(times, initial); }, setLimit: function(value, isMin, initial){ var d; if(Ext.isString(value)){ d = this.parseDate(value); }else if(Ext.isDate(value)){ d = value; } if(d){ var val = new Date(this.initDate).clearTime(); val.setHours(d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()); this[isMin ? 'minValue' : 'maxValue'] = val; if(!initial){ this.generateStore(); } } }, getValue : function(){ var v = Ext.form.TimeField.superclass.getValue.call(this); return this.formatDate(this.parseDate(v)) || ''; }, setValue : function(value){ return Ext.form.TimeField.superclass.setValue.call(this, this.formatDate(this.parseDate(value))); }, validateValue : Ext.form.DateField.prototype.validateValue, formatDate : Ext.form.DateField.prototype.formatDate, parseDate: function(value) { if (!value || Ext.isDate(value)) { return value; } var id = this.initDate + ' ', idf = this.initDateFormat + ' ', v = Date.parseDate(id + value, idf + this.format), af = this.altFormats; if (!v && af) { if (!this.altFormatsArray) { this.altFormatsArray = af.split("|"); } for (var i = 0, afa = this.altFormatsArray, len = afa.length; i < len && !v; i++) { v = Date.parseDate(id + value, idf + afa[i]); } } return v; } }); Ext.reg('timefield', Ext.form.TimeField); Ext.form.SliderField = Ext.extend(Ext.form.Field, { useTips : true, tipText : null, actionMode: 'wrap', initComponent : function() { var cfg = Ext.copyTo({ id: this.id + '-slider' }, this.initialConfig, ['vertical', 'minValue', 'maxValue', 'decimalPrecision', 'keyIncrement', 'increment', 'clickToChange', 'animate']); if (this.useTips) { var plug = this.tipText ? {getText: this.tipText} : {}; cfg.plugins = [new Ext.slider.Tip(plug)]; } this.slider = new Ext.Slider(cfg); Ext.form.SliderField.superclass.initComponent.call(this); }, onRender : function(ct, position){ this.autoCreate = { id: this.id, name: this.name, type: 'hidden', tag: 'input' }; Ext.form.SliderField.superclass.onRender.call(this, ct, position); this.wrap = this.el.wrap({cls: 'x-form-field-wrap'}); this.resizeEl = this.positionEl = this.wrap; this.slider.render(this.wrap); }, onResize : function(w, h, aw, ah){ Ext.form.SliderField.superclass.onResize.call(this, w, h, aw, ah); this.slider.setSize(w, h); }, initEvents : function(){ Ext.form.SliderField.superclass.initEvents.call(this); this.slider.on('change', this.onChange, this); }, onChange : function(slider, v){ this.setValue(v, undefined, true); }, onEnable : function(){ Ext.form.SliderField.superclass.onEnable.call(this); this.slider.enable(); }, onDisable : function(){ Ext.form.SliderField.superclass.onDisable.call(this); this.slider.disable(); }, beforeDestroy : function(){ Ext.destroy(this.slider); Ext.form.SliderField.superclass.beforeDestroy.call(this); }, alignErrorIcon : function(){ this.errorIcon.alignTo(this.slider.el, 'tl-tr', [2, 0]); }, setMinValue : function(v){ this.slider.setMinValue(v); return this; }, setMaxValue : function(v){ this.slider.setMaxValue(v); return this; }, setValue : function(v, animate, silent){ if(!silent){ this.slider.setValue(v, animate); } return Ext.form.SliderField.superclass.setValue.call(this, this.slider.getValue()); }, getValue : function(){ return this.slider.getValue(); } }); Ext.reg('sliderfield', Ext.form.SliderField); Ext.form.Label = Ext.extend(Ext.BoxComponent, { onRender : function(ct, position){ if(!this.el){ this.el = document.createElement('label'); this.el.id = this.getId(); this.el.innerHTML = this.text ? Ext.util.Format.htmlEncode(this.text) : (this.html || ''); if(this.forId){ this.el.setAttribute('for', this.forId); } } Ext.form.Label.superclass.onRender.call(this, ct, position); }, setText : function(t, encode){ var e = encode === false; this[!e ? 'text' : 'html'] = t; delete this[e ? 'text' : 'html']; if(this.rendered){ this.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(t) : t; } return this; } }); Ext.reg('label', Ext.form.Label); Ext.form.Action = function(form, options){ this.form = form; this.options = options || {}; }; Ext.form.Action.CLIENT_INVALID = 'client'; Ext.form.Action.SERVER_INVALID = 'server'; Ext.form.Action.CONNECT_FAILURE = 'connect'; Ext.form.Action.LOAD_FAILURE = 'load'; Ext.form.Action.prototype = { type : 'default', run : function(options){ }, success : function(response){ }, handleResponse : function(response){ }, failure : function(response){ this.response = response; this.failureType = Ext.form.Action.CONNECT_FAILURE; this.form.afterAction(this, false); }, processResponse : function(response){ this.response = response; if(!response.responseText && !response.responseXML){ return true; } this.result = this.handleResponse(response); return this.result; }, decodeResponse: function(response) { try { return Ext.decode(response.responseText); } catch(e) { return false; } }, getUrl : function(appendParams){ var url = this.options.url || this.form.url || this.form.el.dom.action; if(appendParams){ var p = this.getParams(); if(p){ url = Ext.urlAppend(url, p); } } return url; }, getMethod : function(){ return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase(); }, getParams : function(){ var bp = this.form.baseParams; var p = this.options.params; if(p){ if(typeof p == "object"){ p = Ext.urlEncode(Ext.applyIf(p, bp)); }else if(typeof p == 'string' && bp){ p += '&' + Ext.urlEncode(bp); } }else if(bp){ p = Ext.urlEncode(bp); } return p; }, createCallback : function(opts){ var opts = opts || {}; return { success: this.success, failure: this.failure, scope: this, timeout: (opts.timeout*1000) || (this.form.timeout*1000), upload: this.form.fileUpload ? this.success : undefined }; } }; Ext.form.Action.Submit = function(form, options){ Ext.form.Action.Submit.superclass.constructor.call(this, form, options); }; Ext.extend(Ext.form.Action.Submit, Ext.form.Action, { type : 'submit', run : function(){ var o = this.options, method = this.getMethod(), isGet = method == 'GET'; if(o.clientValidation === false || this.form.isValid()){ if (o.submitEmptyText === false) { var fields = this.form.items, emptyFields = [], setupEmptyFields = function(f){ if (f.el.getValue() == f.emptyText) { emptyFields.push(f); f.el.dom.value = ""; } if(f.isComposite && f.rendered){ f.items.each(setupEmptyFields); } }; fields.each(setupEmptyFields); } Ext.Ajax.request(Ext.apply(this.createCallback(o), { form:this.form.el.dom, url:this.getUrl(isGet), method: method, headers: o.headers, params:!isGet ? this.getParams() : null, isUpload: this.form.fileUpload })); if (o.submitEmptyText === false) { Ext.each(emptyFields, function(f) { if (f.applyEmptyText) { f.applyEmptyText(); } }); } }else if (o.clientValidation !== false){ this.failureType = Ext.form.Action.CLIENT_INVALID; this.form.afterAction(this, false); } }, success : function(response){ var result = this.processResponse(response); if(result === true || result.success){ this.form.afterAction(this, true); return; } if(result.errors){ this.form.markInvalid(result.errors); } this.failureType = Ext.form.Action.SERVER_INVALID; this.form.afterAction(this, false); }, handleResponse : function(response){ if(this.form.errorReader){ var rs = this.form.errorReader.read(response); var errors = []; if(rs.records){ for(var i = 0, len = rs.records.length; i < len; i++) { var r = rs.records[i]; errors[i] = r.data; } } if(errors.length < 1){ errors = null; } return { success : rs.success, errors : errors }; } return this.decodeResponse(response); } }); Ext.form.Action.Load = function(form, options){ Ext.form.Action.Load.superclass.constructor.call(this, form, options); this.reader = this.form.reader; }; Ext.extend(Ext.form.Action.Load, Ext.form.Action, { type : 'load', run : function(){ Ext.Ajax.request(Ext.apply( this.createCallback(this.options), { method:this.getMethod(), url:this.getUrl(false), headers: this.options.headers, params:this.getParams() })); }, success : function(response){ var result = this.processResponse(response); if(result === true || !result.success || !result.data){ this.failureType = Ext.form.Action.LOAD_FAILURE; this.form.afterAction(this, false); return; } this.form.clearInvalid(); this.form.setValues(result.data); this.form.afterAction(this, true); }, handleResponse : function(response){ if(this.form.reader){ var rs = this.form.reader.read(response); var data = rs.records && rs.records[0] ? rs.records[0].data : null; return { success : rs.success, data : data }; } return this.decodeResponse(response); } }); Ext.form.Action.DirectLoad = Ext.extend(Ext.form.Action.Load, { constructor: function(form, opts) { Ext.form.Action.DirectLoad.superclass.constructor.call(this, form, opts); }, type : 'directload', run : function(){ var args = this.getParams(); args.push(this.success, this); this.form.api.load.apply(window, args); }, getParams : function() { var buf = [], o = {}; var bp = this.form.baseParams; var p = this.options.params; Ext.apply(o, p, bp); var paramOrder = this.form.paramOrder; if(paramOrder){ for(var i = 0, len = paramOrder.length; i < len; i++){ buf.push(o[paramOrder[i]]); } }else if(this.form.paramsAsHash){ buf.push(o); } return buf; }, processResponse : function(result) { this.result = result; return result; }, success : function(response, trans){ if(trans.type == Ext.Direct.exceptions.SERVER){ response = {}; } Ext.form.Action.DirectLoad.superclass.success.call(this, response); } }); Ext.form.Action.DirectSubmit = Ext.extend(Ext.form.Action.Submit, { constructor : function(form, opts) { Ext.form.Action.DirectSubmit.superclass.constructor.call(this, form, opts); }, type : 'directsubmit', run : function(){ var o = this.options; if(o.clientValidation === false || this.form.isValid()){ this.success.params = this.getParams(); this.form.api.submit(this.form.el.dom, this.success, this); }else if (o.clientValidation !== false){ this.failureType = Ext.form.Action.CLIENT_INVALID; this.form.afterAction(this, false); } }, getParams : function() { var o = {}; var bp = this.form.baseParams; var p = this.options.params; Ext.apply(o, p, bp); return o; }, processResponse : function(result) { this.result = result; return result; }, success : function(response, trans){ if(trans.type == Ext.Direct.exceptions.SERVER){ response = {}; } Ext.form.Action.DirectSubmit.superclass.success.call(this, response); } }); Ext.form.Action.ACTION_TYPES = { 'load' : Ext.form.Action.Load, 'submit' : Ext.form.Action.Submit, 'directload' : Ext.form.Action.DirectLoad, 'directsubmit' : Ext.form.Action.DirectSubmit }; Ext.form.VTypes = function(){ var alpha = /^[a-zA-Z_]+$/, alphanum = /^[a-zA-Z0-9_]+$/, email = /^(\w+)([\-+.\'][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/, url = /(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i; return { 'email' : function(v){ return email.test(v); }, 'emailText' : 'This field should be an e-mail address in the format "user@example.com"', 'emailMask' : /[a-z0-9_\.\-\+\'@]/i, /** * The function used to validate URLs * @param {String} value The URL * @return {Boolean} true if the RegExp test passed, and false if not. */ 'url' : function(v){ return url.test(v); }, /** * The error text to display when the url validation function returns false. Defaults to: * 'This field should be a URL in the format "http:/'+'/www.example.com"' * @type String */ 'urlText' : 'This field should be a URL in the format "http:/'+'/www.example.com"', /** * The function used to validate alpha values * @param {String} value The value * @return {Boolean} true if the RegExp test passed, and false if not. */ 'alpha' : function(v){ return alpha.test(v); }, /** * The error text to display when the alpha validation function returns false. Defaults to: * 'This field should only contain letters and _' * @type String */ 'alphaText' : 'This field should only contain letters and _', /** * The keystroke filter mask to be applied on alpha input. Defaults to: * /[a-z_]/i * @type RegExp */ 'alphaMask' : /[a-z_]/i, /** * The function used to validate alphanumeric values * @param {String} value The value * @return {Boolean} true if the RegExp test passed, and false if not. */ 'alphanum' : function(v){ return alphanum.test(v); }, /** * The error text to display when the alphanumeric validation function returns false. Defaults to: * 'This field should only contain letters, numbers and _' * @type String */ 'alphanumText' : 'This field should only contain letters, numbers and _', /** * The keystroke filter mask to be applied on alphanumeric input. Defaults to: * /[a-z0-9_]/i * @type RegExp */ 'alphanumMask' : /[a-z0-9_]/i }; }(); /** * @class Ext.grid.GridPanel * @extends Ext.Panel *

    This class represents the primary interface of a component based grid control to represent data * in a tabular format of rows and columns. The GridPanel is composed of the following:

    *
      *
    • {@link Ext.data.Store Store} : The Model holding the data records (rows) *
    • *
    • {@link Ext.grid.ColumnModel Column model} : Column makeup *
    • *
    • {@link Ext.grid.GridView View} : Encapsulates the user interface *
    • *
    • {@link Ext.grid.AbstractSelectionModel selection model} : Selection behavior *
    • *
    *

    Example usage:

    *
    
    var grid = new Ext.grid.GridPanel({
        {@link #store}: new {@link Ext.data.Store}({
            {@link Ext.data.Store#autoDestroy autoDestroy}: true,
            {@link Ext.data.Store#reader reader}: reader,
            {@link Ext.data.Store#data data}: xg.dummyData
        }),
        {@link #colModel}: new {@link Ext.grid.ColumnModel}({
            {@link Ext.grid.ColumnModel#defaults defaults}: {
                width: 120,
                sortable: true
            },
            {@link Ext.grid.ColumnModel#columns columns}: [
                {id: 'company', header: 'Company', width: 200, sortable: true, dataIndex: 'company'},
                {header: 'Price', renderer: Ext.util.Format.usMoney, dataIndex: 'price'},
                {header: 'Change', dataIndex: 'change'},
                {header: '% Change', dataIndex: 'pctChange'},
                // instead of specifying renderer: Ext.util.Format.dateRenderer('m/d/Y') use xtype
                {
                    header: 'Last Updated', width: 135, dataIndex: 'lastChange',
                    xtype: 'datecolumn', format: 'M d, Y'
                }
            ]
        }),
        {@link #viewConfig}: {
            {@link Ext.grid.GridView#forceFit forceFit}: true,
    
    //      Return CSS class to apply to rows depending upon data values
            {@link Ext.grid.GridView#getRowClass getRowClass}: function(record, index) {
                var c = record.{@link Ext.data.Record#get get}('change');
                if (c < 0) {
                    return 'price-fall';
                } else if (c > 0) {
                    return 'price-rise';
                }
            }
        },
        {@link #sm}: new Ext.grid.RowSelectionModel({singleSelect:true}),
        width: 600,
        height: 300,
        frame: true,
        title: 'Framed with Row Selection and Horizontal Scrolling',
        iconCls: 'icon-grid'
    });
     * 
    *

    Notes:

    *
      *
    • Although this class inherits many configuration options from base classes, some of them * (such as autoScroll, autoWidth, layout, items, etc) are not used by this class, and will * have no effect.
    • *
    • A grid requires a width in which to scroll its columns, and a height in which to * scroll its rows. These dimensions can either be set explicitly through the * {@link Ext.BoxComponent#height height} and {@link Ext.BoxComponent#width width} * configuration options or implicitly set by using the grid as a child item of a * {@link Ext.Container Container} which will have a {@link Ext.Container#layout layout manager} * provide the sizing of its child items (for example the Container of the Grid may specify * {@link Ext.Container#layout layout}:'fit').
    • *
    • To access the data in a Grid, it is necessary to use the data model encapsulated * by the {@link #store Store}. See the {@link #cellclick} event for more details.
    • *
    * @constructor * @param {Object} config The config object * @xtype grid */ Ext.grid.GridPanel = Ext.extend(Ext.Panel, { /** * @cfg {String} autoExpandColumn *

    The {@link Ext.grid.Column#id id} of a {@link Ext.grid.Column column} in * this grid that should expand to fill unused space. This value specified here can not * be 0.

    *

    Note: If the Grid's {@link Ext.grid.GridView view} is configured with * {@link Ext.grid.GridView#forceFit forceFit}=true the autoExpandColumn * is ignored. See {@link Ext.grid.Column}.{@link Ext.grid.Column#width width} * for additional details.

    *

    See {@link #autoExpandMax} and {@link #autoExpandMin} also.

    */ autoExpandColumn : false, autoExpandMax : 1000, autoExpandMin : 50, columnLines : false, ddText : '{0} selected row{1}', deferRowRender : true, enableColumnHide : true, enableColumnMove : true, enableDragDrop : false, enableHdMenu : true, loadMask : false, minColumnWidth : 25, stripeRows : false, trackMouseOver : true, stateEvents : ['columnmove', 'columnresize', 'sortchange', 'groupchange'], view : null, bubbleEvents: [], rendered : false, viewReady : false, initComponent : function() { Ext.grid.GridPanel.superclass.initComponent.call(this); if (this.columnLines) { this.cls = (this.cls || '') + ' x-grid-with-col-lines'; } this.autoScroll = false; this.autoWidth = false; if(Ext.isArray(this.columns)){ this.colModel = new Ext.grid.ColumnModel(this.columns); delete this.columns; } if(this.ds){ this.store = this.ds; delete this.ds; } if(this.cm){ this.colModel = this.cm; delete this.cm; } if(this.sm){ this.selModel = this.sm; delete this.sm; } this.store = Ext.StoreMgr.lookup(this.store); this.addEvents( 'click', 'dblclick', 'contextmenu', 'mousedown', 'mouseup', 'mouseover', 'mouseout', 'keypress', 'keydown', 'cellmousedown', 'rowmousedown', 'headermousedown', 'groupmousedown', 'rowbodymousedown', 'containermousedown', 'cellclick', 'celldblclick', 'rowclick', 'rowdblclick', 'headerclick', 'headerdblclick', 'groupclick', 'groupdblclick', 'containerclick', 'containerdblclick', 'rowbodyclick', 'rowbodydblclick', 'rowcontextmenu', 'cellcontextmenu', 'headercontextmenu', 'groupcontextmenu', 'containercontextmenu', 'rowbodycontextmenu', 'bodyscroll', 'columnresize', 'columnmove', 'sortchange', 'groupchange', 'reconfigure', 'viewready' ); }, onRender : function(ct, position){ Ext.grid.GridPanel.superclass.onRender.apply(this, arguments); var c = this.getGridEl(); this.el.addClass('x-grid-panel'); this.mon(c, { scope: this, mousedown: this.onMouseDown, click: this.onClick, dblclick: this.onDblClick, contextmenu: this.onContextMenu }); this.relayEvents(c, ['mousedown','mouseup','mouseover','mouseout','keypress', 'keydown']); var view = this.getView(); view.init(this); view.render(); this.getSelectionModel().init(this); }, initEvents : function(){ Ext.grid.GridPanel.superclass.initEvents.call(this); if(this.loadMask){ this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({store:this.store}, this.loadMask)); } }, initStateEvents : function(){ Ext.grid.GridPanel.superclass.initStateEvents.call(this); this.mon(this.colModel, 'hiddenchange', this.saveState, this, {delay: 100}); }, applyState : function(state){ var cm = this.colModel, cs = state.columns, store = this.store, s, c, colIndex; if(cs){ for(var i = 0, len = cs.length; i < len; i++){ s = cs[i]; c = cm.getColumnById(s.id); if(c){ colIndex = cm.getIndexById(s.id); cm.setState(colIndex, { hidden: s.hidden, width: s.width, sortable: s.sortable }); if(colIndex != i){ cm.moveColumn(colIndex, i); } } } } if(store){ s = state.sort; if(s){ store[store.remoteSort ? 'setDefaultSort' : 'sort'](s.field, s.direction); } s = state.group; if(store.groupBy){ if(s){ store.groupBy(s); }else{ store.clearGrouping(); } } } var o = Ext.apply({}, state); delete o.columns; delete o.sort; Ext.grid.GridPanel.superclass.applyState.call(this, o); }, getState : function(){ var o = {columns: []}, store = this.store, ss, gs; for(var i = 0, c; (c = this.colModel.config[i]); i++){ o.columns[i] = { id: c.id, width: c.width }; if(c.hidden){ o.columns[i].hidden = true; } if(c.sortable){ o.columns[i].sortable = true; } } if(store){ ss = store.getSortState(); if(ss){ o.sort = ss; } if(store.getGroupState){ gs = store.getGroupState(); if(gs){ o.group = gs; } } } return o; }, afterRender : function(){ Ext.grid.GridPanel.superclass.afterRender.call(this); var v = this.view; this.on('bodyresize', v.layout, v); v.layout(true); if(this.deferRowRender){ if (!this.deferRowRenderTask){ this.deferRowRenderTask = new Ext.util.DelayedTask(v.afterRender, this.view); } this.deferRowRenderTask.delay(10); }else{ v.afterRender(); } this.viewReady = true; }, reconfigure : function(store, colModel){ var rendered = this.rendered; if(rendered){ if(this.loadMask){ this.loadMask.destroy(); this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({}, {store:store}, this.initialConfig.loadMask)); } } if(this.view){ this.view.initData(store, colModel); } this.store = store; this.colModel = colModel; if(rendered){ this.view.refresh(true); } this.fireEvent('reconfigure', this, store, colModel); }, onDestroy : function(){ if (this.deferRowRenderTask && this.deferRowRenderTask.cancel){ this.deferRowRenderTask.cancel(); } if(this.rendered){ Ext.destroy(this.view, this.loadMask); }else if(this.store && this.store.autoDestroy){ this.store.destroy(); } Ext.destroy(this.colModel, this.selModel); this.store = this.selModel = this.colModel = this.view = this.loadMask = null; Ext.grid.GridPanel.superclass.onDestroy.call(this); }, processEvent : function(name, e){ this.view.processEvent(name, e); }, onClick : function(e){ this.processEvent('click', e); }, onMouseDown : function(e){ this.processEvent('mousedown', e); }, onContextMenu : function(e, t){ this.processEvent('contextmenu', e); }, onDblClick : function(e){ this.processEvent('dblclick', e); }, walkCells : function(row, col, step, fn, scope){ var cm = this.colModel, clen = cm.getColumnCount(), ds = this.store, rlen = ds.getCount(), first = true; if(step < 0){ if(col < 0){ row--; first = false; } while(row >= 0){ if(!first){ col = clen-1; } first = false; while(col >= 0){ if(fn.call(scope || this, row, col, cm) === true){ return [row, col]; } col--; } row--; } } else { if(col >= clen){ row++; first = false; } while(row < rlen){ if(!first){ col = 0; } first = false; while(col < clen){ if(fn.call(scope || this, row, col, cm) === true){ return [row, col]; } col++; } row++; } } return null; }, getGridEl : function(){ return this.body; }, stopEditing : Ext.emptyFn, getSelectionModel : function(){ if(!this.selModel){ this.selModel = new Ext.grid.RowSelectionModel( this.disableSelection ? {selectRow: Ext.emptyFn} : null); } return this.selModel; }, getStore : function(){ return this.store; }, getColumnModel : function(){ return this.colModel; }, getView : function() { if (!this.view) { this.view = new Ext.grid.GridView(this.viewConfig); } return this.view; }, getDragDropText : function(){ var count = this.selModel.getCount(); return String.format(this.ddText, count, count == 1 ? '' : 's'); } }); Ext.reg('grid', Ext.grid.GridPanel); Ext.grid.PivotGrid = Ext.extend(Ext.grid.GridPanel, { aggregator: 'sum', renderer: undefined, initComponent: function() { Ext.grid.PivotGrid.superclass.initComponent.apply(this, arguments); this.initAxes(); this.enableColumnResize = false; this.viewConfig = Ext.apply(this.viewConfig || {}, { forceFit: true }); this.colModel = new Ext.grid.ColumnModel({}); }, getAggregator: function() { if (typeof this.aggregator == 'string') { return Ext.grid.PivotAggregatorMgr.types[this.aggregator]; } else { return this.aggregator; } }, setAggregator: function(aggregator) { this.aggregator = aggregator; }, setMeasure: function(measure) { this.measure = measure; }, setLeftAxis: function(axis, refresh) { this.leftAxis = axis; if (refresh) { this.view.refresh(); } }, setTopAxis: function(axis, refresh) { this.topAxis = axis; if (refresh) { this.view.refresh(); } }, initAxes: function() { var PivotAxis = Ext.grid.PivotAxis; if (!(this.leftAxis instanceof PivotAxis)) { this.setLeftAxis(new PivotAxis({ orientation: 'vertical', dimensions : this.leftAxis || [], store : this.store })); }; if (!(this.topAxis instanceof PivotAxis)) { this.setTopAxis(new PivotAxis({ orientation: 'horizontal', dimensions : this.topAxis || [], store : this.store })); }; }, extractData: function() { var records = this.store.data.items, recCount = records.length, cells = [], record, i, j, k; if (recCount == 0) { return []; } var leftTuples = this.leftAxis.getTuples(), leftCount = leftTuples.length, topTuples = this.topAxis.getTuples(), topCount = topTuples.length, aggregator = this.getAggregator(); for (i = 0; i < recCount; i++) { record = records[i]; for (j = 0; j < leftCount; j++) { cells[j] = cells[j] || []; if (leftTuples[j].matcher(record) === true) { for (k = 0; k < topCount; k++) { cells[j][k] = cells[j][k] || []; if (topTuples[k].matcher(record)) { cells[j][k].push(record); } } } } } var rowCount = cells.length, colCount, row; for (i = 0; i < rowCount; i++) { row = cells[i]; colCount = row.length; for (j = 0; j < colCount; j++) { cells[i][j] = aggregator(cells[i][j], this.measure); } } return cells; }, getView: function() { if (!this.view) { this.view = new Ext.grid.PivotGridView(this.viewConfig); } return this.view; } }); Ext.reg('pivotgrid', Ext.grid.PivotGrid); Ext.grid.PivotAggregatorMgr = new Ext.AbstractManager(); Ext.grid.PivotAggregatorMgr.registerType('sum', function(records, measure) { var length = records.length, total = 0, i; for (i = 0; i < length; i++) { total += records[i].get(measure); } return total; }); Ext.grid.PivotAggregatorMgr.registerType('avg', function(records, measure) { var length = records.length, total = 0, i; for (i = 0; i < length; i++) { total += records[i].get(measure); } return (total / length) || 'n/a'; }); Ext.grid.PivotAggregatorMgr.registerType('min', function(records, measure) { var data = [], length = records.length, i; for (i = 0; i < length; i++) { data.push(records[i].get(measure)); } return Math.min.apply(this, data) || 'n/a'; }); Ext.grid.PivotAggregatorMgr.registerType('max', function(records, measure) { var data = [], length = records.length, i; for (i = 0; i < length; i++) { data.push(records[i].get(measure)); } return Math.max.apply(this, data) || 'n/a'; }); Ext.grid.PivotAggregatorMgr.registerType('count', function(records, measure) { return records.length; }); Ext.grid.GridView = Ext.extend(Ext.util.Observable, { deferEmptyText : true, scrollOffset : undefined, autoFill : false, forceFit : false, sortClasses : ['sort-asc', 'sort-desc'], sortAscText : 'Sort Ascending', sortDescText : 'Sort Descending', columnsText : 'Columns', selectedRowClass : 'x-grid3-row-selected', borderWidth : 2, tdClass : 'x-grid3-cell', hdCls : 'x-grid3-hd', markDirty : true, cellSelectorDepth : 4, rowSelectorDepth : 10, rowBodySelectorDepth : 10, cellSelector : 'td.x-grid3-cell', rowSelector : 'div.x-grid3-row', rowBodySelector : 'div.x-grid3-row-body', firstRowCls: 'x-grid3-row-first', lastRowCls: 'x-grid3-row-last', rowClsRe: /(?:^|\s+)x-grid3-row-(first|last|alt)(?:\s+|$)/g, headerMenuOpenCls: 'x-grid3-hd-menu-open', rowOverCls: 'x-grid3-row-over', constructor : function(config) { Ext.apply(this, config); this.addEvents( 'beforerowremoved', 'beforerowsinserted', 'beforerefresh', 'rowremoved', 'rowsinserted', 'rowupdated', 'refresh' ); Ext.grid.GridView.superclass.constructor.call(this); }, masterTpl: new Ext.Template( '
    ', '
    ', '
    ', '
    ', '
    {header}
    ', '
    ', '
    ', '
    ', '
    ', '
    {body}
    ', '', '
    ', '
    ', '
     
    ', '
     
    ', '
    ' ), headerTpl: new Ext.Template( '', '', '{cells}', '', '
    ' ), bodyTpl: new Ext.Template('{rows}'), cellTpl: new Ext.Template( '', '
    {value}
    ', '' ), initTemplates : function() { var templates = this.templates || {}, template, name, headerCellTpl = new Ext.Template( '', '
    ', this.grid.enableHdMenu ? '' : '', '{value}', '', '
    ', '' ), rowBodyText = [ '', '', '
    {body}
    ', '', '' ].join(""), innerText = [ '', '', '{cells}', this.enableRowBody ? rowBodyText : '', '', '
    ' ].join(""); Ext.applyIf(templates, { hcell : headerCellTpl, cell : this.cellTpl, body : this.bodyTpl, header : this.headerTpl, master : this.masterTpl, row : new Ext.Template('
    ' + innerText + '
    '), rowInner: new Ext.Template(innerText) }); for (name in templates) { template = templates[name]; if (template && Ext.isFunction(template.compile) && !template.compiled) { template.disableFormats = true; template.compile(); } } this.templates = templates; this.colRe = new RegExp('x-grid3-td-([^\\s]+)', ''); }, fly : function(el) { if (!this._flyweight) { this._flyweight = new Ext.Element.Flyweight(document.body); } this._flyweight.dom = el; return this._flyweight; }, getEditorParent : function() { return this.scroller.dom; }, initElements : function() { var Element = Ext.Element, el = Ext.get(this.grid.getGridEl().dom.firstChild), mainWrap = new Element(el.child('div.x-grid3-viewport')), mainHd = new Element(mainWrap.child('div.x-grid3-header')), scroller = new Element(mainWrap.child('div.x-grid3-scroller')); if (this.grid.hideHeaders) { mainHd.setDisplayed(false); } if (this.forceFit) { scroller.setStyle('overflow-x', 'hidden'); } Ext.apply(this, { el : el, mainWrap: mainWrap, scroller: scroller, mainHd : mainHd, innerHd : mainHd.child('div.x-grid3-header-inner').dom, mainBody: new Element(Element.fly(scroller).child('div.x-grid3-body')), focusEl : new Element(Element.fly(scroller).child('a')), resizeMarker: new Element(el.child('div.x-grid3-resize-marker')), resizeProxy : new Element(el.child('div.x-grid3-resize-proxy')) }); this.focusEl.swallowEvent('click', true); }, getRows : function() { return this.hasRows() ? this.mainBody.dom.childNodes : []; }, findCell : function(el) { if (!el) { return false; } return this.fly(el).findParent(this.cellSelector, this.cellSelectorDepth); }, findCellIndex : function(el, requiredCls) { var cell = this.findCell(el), hasCls; if (cell) { hasCls = this.fly(cell).hasClass(requiredCls); if (!requiredCls || hasCls) { return this.getCellIndex(cell); } } return false; }, getCellIndex : function(el) { if (el) { var match = el.className.match(this.colRe); if (match && match[1]) { return this.cm.getIndexById(match[1]); } } return false; }, findHeaderCell : function(el) { var cell = this.findCell(el); return cell && this.fly(cell).hasClass(this.hdCls) ? cell : null; }, findHeaderIndex : function(el){ return this.findCellIndex(el, this.hdCls); }, findRow : function(el) { if (!el) { return false; } return this.fly(el).findParent(this.rowSelector, this.rowSelectorDepth); }, findRowIndex : function(el) { var row = this.findRow(el); return row ? row.rowIndex : false; }, findRowBody : function(el) { if (!el) { return false; } return this.fly(el).findParent(this.rowBodySelector, this.rowBodySelectorDepth); }, getRow : function(row) { return this.getRows()[row]; }, getCell : function(row, col) { return Ext.fly(this.getRow(row)).query(this.cellSelector)[col]; }, getHeaderCell : function(index) { return this.mainHd.dom.getElementsByTagName('td')[index]; }, addRowClass : function(rowId, cls) { var row = this.getRow(rowId); if (row) { this.fly(row).addClass(cls); } }, removeRowClass : function(row, cls) { var r = this.getRow(row); if(r){ this.fly(r).removeClass(cls); } }, removeRow : function(row) { Ext.removeNode(this.getRow(row)); this.syncFocusEl(row); }, removeRows : function(firstRow, lastRow) { var bd = this.mainBody.dom, rowIndex; for (rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ Ext.removeNode(bd.childNodes[firstRow]); } this.syncFocusEl(firstRow); }, getScrollState : function() { var sb = this.scroller.dom; return { left: sb.scrollLeft, top : sb.scrollTop }; }, restoreScroll : function(state) { var sb = this.scroller.dom; sb.scrollLeft = state.left; sb.scrollTop = state.top; }, scrollToTop : function() { var dom = this.scroller.dom; dom.scrollTop = 0; dom.scrollLeft = 0; }, syncScroll : function() { this.syncHeaderScroll(); var mb = this.scroller.dom; this.grid.fireEvent('bodyscroll', mb.scrollLeft, mb.scrollTop); }, syncHeaderScroll : function() { var innerHd = this.innerHd, scrollLeft = this.scroller.dom.scrollLeft; innerHd.scrollLeft = scrollLeft; innerHd.scrollLeft = scrollLeft; }, updateSortIcon : function(col, dir) { var sortClasses = this.sortClasses, sortClass = sortClasses[dir == "DESC" ? 1 : 0], headers = this.mainHd.select('td').removeClass(sortClasses); headers.item(col).addClass(sortClass); }, updateAllColumnWidths : function() { var totalWidth = this.getTotalWidth(), colCount = this.cm.getColumnCount(), rows = this.getRows(), rowCount = rows.length, widths = [], row, rowFirstChild, trow, i, j; for (i = 0; i < colCount; i++) { widths[i] = this.getColumnWidth(i); this.getHeaderCell(i).style.width = widths[i]; } this.updateHeaderWidth(); for (i = 0; i < rowCount; i++) { row = rows[i]; row.style.width = totalWidth; rowFirstChild = row.firstChild; if (rowFirstChild) { rowFirstChild.style.width = totalWidth; trow = rowFirstChild.rows[0]; for (j = 0; j < colCount; j++) { trow.childNodes[j].style.width = widths[j]; } } } this.onAllColumnWidthsUpdated(widths, totalWidth); }, updateColumnWidth : function(column, width) { var columnWidth = this.getColumnWidth(column), totalWidth = this.getTotalWidth(), headerCell = this.getHeaderCell(column), nodes = this.getRows(), nodeCount = nodes.length, row, i, firstChild; this.updateHeaderWidth(); headerCell.style.width = columnWidth; for (i = 0; i < nodeCount; i++) { row = nodes[i]; firstChild = row.firstChild; row.style.width = totalWidth; if (firstChild) { firstChild.style.width = totalWidth; firstChild.rows[0].childNodes[column].style.width = columnWidth; } } this.onColumnWidthUpdated(column, columnWidth, totalWidth); }, updateColumnHidden : function(col, hidden) { var totalWidth = this.getTotalWidth(), display = hidden ? 'none' : '', headerCell = this.getHeaderCell(col), nodes = this.getRows(), nodeCount = nodes.length, row, rowFirstChild, i; this.updateHeaderWidth(); headerCell.style.display = display; for (i = 0; i < nodeCount; i++) { row = nodes[i]; row.style.width = totalWidth; rowFirstChild = row.firstChild; if (rowFirstChild) { rowFirstChild.style.width = totalWidth; rowFirstChild.rows[0].childNodes[col].style.display = display; } } this.onColumnHiddenUpdated(col, hidden, totalWidth); delete this.lastViewWidth; this.layout(); }, doRender : function(columns, records, store, startRow, colCount, stripe) { var templates = this.templates, cellTemplate = templates.cell, rowTemplate = templates.row, last = colCount - 1, tstyle = 'width:' + this.getTotalWidth() + ';', rowBuffer = [], colBuffer = [], rowParams = {tstyle: tstyle}, meta = {}, len = records.length, alt, column, record, i, j, rowIndex; for (j = 0; j < len; j++) { record = records[j]; colBuffer = []; rowIndex = j + startRow; for (i = 0; i < colCount; i++) { column = columns[i]; meta.id = column.id; meta.css = i === 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : ''); meta.attr = meta.cellAttr = ''; meta.style = column.style; meta.value = column.renderer.call(column.scope, record.data[column.name], meta, record, rowIndex, i, store); if (Ext.isEmpty(meta.value)) { meta.value = ' '; } if (this.markDirty && record.dirty && typeof record.modified[column.name] != 'undefined') { meta.css += ' x-grid3-dirty-cell'; } colBuffer[colBuffer.length] = cellTemplate.apply(meta); } alt = []; if (stripe && ((rowIndex + 1) % 2 === 0)) { alt[0] = 'x-grid3-row-alt'; } if (record.dirty) { alt[1] = ' x-grid3-dirty-row'; } rowParams.cols = colCount; if (this.getRowClass) { alt[2] = this.getRowClass(record, rowIndex, rowParams, store); } rowParams.alt = alt.join(' '); rowParams.cells = colBuffer.join(''); rowBuffer[rowBuffer.length] = rowTemplate.apply(rowParams); } return rowBuffer.join(''); }, processRows : function(startRow, skipStripe) { if (!this.ds || this.ds.getCount() < 1) { return; } var rows = this.getRows(), length = rows.length, row, i; skipStripe = skipStripe || !this.grid.stripeRows; startRow = startRow || 0; for (i = 0; i < length; i++) { row = rows[i]; if (row) { row.rowIndex = i; if (!skipStripe) { row.className = row.className.replace(this.rowClsRe, ' '); if ((i + 1) % 2 === 0){ row.className += ' x-grid3-row-alt'; } } } } if (startRow === 0) { Ext.fly(rows[0]).addClass(this.firstRowCls); } Ext.fly(rows[length - 1]).addClass(this.lastRowCls); }, afterRender : function() { if (!this.ds || !this.cm) { return; } this.mainBody.dom.innerHTML = this.renderBody() || ' '; this.processRows(0, true); if (this.deferEmptyText !== true) { this.applyEmptyText(); } this.grid.fireEvent('viewready', this.grid); }, afterRenderUI: function() { var grid = this.grid; this.initElements(); Ext.fly(this.innerHd).on('click', this.handleHdDown, this); this.mainHd.on({ scope : this, mouseover: this.handleHdOver, mouseout : this.handleHdOut, mousemove: this.handleHdMove }); this.scroller.on('scroll', this.syncScroll, this); if (grid.enableColumnResize !== false) { this.splitZone = new Ext.grid.GridView.SplitDragZone(grid, this.mainHd.dom); } if (grid.enableColumnMove) { this.columnDrag = new Ext.grid.GridView.ColumnDragZone(grid, this.innerHd); this.columnDrop = new Ext.grid.HeaderDropZone(grid, this.mainHd.dom); } if (grid.enableHdMenu !== false) { this.hmenu = new Ext.menu.Menu({id: grid.id + '-hctx'}); this.hmenu.add( {itemId:'asc', text: this.sortAscText, cls: 'xg-hmenu-sort-asc'}, {itemId:'desc', text: this.sortDescText, cls: 'xg-hmenu-sort-desc'} ); if (grid.enableColumnHide !== false) { this.colMenu = new Ext.menu.Menu({id:grid.id + '-hcols-menu'}); this.colMenu.on({ scope : this, beforeshow: this.beforeColMenuShow, itemclick : this.handleHdMenuClick }); this.hmenu.add('-', { itemId:'columns', hideOnClick: false, text: this.columnsText, menu: this.colMenu, iconCls: 'x-cols-icon' }); } this.hmenu.on('itemclick', this.handleHdMenuClick, this); } if (grid.trackMouseOver) { this.mainBody.on({ scope : this, mouseover: this.onRowOver, mouseout : this.onRowOut }); } if (grid.enableDragDrop || grid.enableDrag) { this.dragZone = new Ext.grid.GridDragZone(grid, { ddGroup : grid.ddGroup || 'GridDD' }); } this.updateHeaderSortState(); }, renderUI : function() { var templates = this.templates; return templates.master.apply({ body : templates.body.apply({rows:' '}), header: this.renderHeaders(), ostyle: 'width:' + this.getOffsetWidth() + ';', bstyle: 'width:' + this.getTotalWidth() + ';' }); }, processEvent : function(name, e) { var target = e.getTarget(), grid = this.grid, header = this.findHeaderIndex(target), row, cell, col, body; grid.fireEvent(name, e); if (header !== false) { grid.fireEvent('header' + name, grid, header, e); } else { row = this.findRowIndex(target); if (row !== false) { cell = this.findCellIndex(target); if (cell !== false) { col = grid.colModel.getColumnAt(cell); if (grid.fireEvent('cell' + name, grid, row, cell, e) !== false) { if (!col || (col.processEvent && (col.processEvent(name, e, grid, row, cell) !== false))) { grid.fireEvent('row' + name, grid, row, e); } } } else { if (grid.fireEvent('row' + name, grid, row, e) !== false) { (body = this.findRowBody(target)) && grid.fireEvent('rowbody' + name, grid, row, e); } } } else { grid.fireEvent('container' + name, grid, e); } } }, layout : function(initial) { if (!this.mainBody) { return; } var grid = this.grid, gridEl = grid.getGridEl(), gridSize = gridEl.getSize(true), gridWidth = gridSize.width, gridHeight = gridSize.height, scroller = this.scroller, scrollStyle, headerHeight, scrollHeight; if (gridWidth < 20 || gridHeight < 20) { return; } if (grid.autoHeight) { scrollStyle = scroller.dom.style; scrollStyle.overflow = 'visible'; if (Ext.isWebKit) { scrollStyle.position = 'static'; } } else { this.el.setSize(gridWidth, gridHeight); headerHeight = this.mainHd.getHeight(); scrollHeight = gridHeight - headerHeight; scroller.setSize(gridWidth, scrollHeight); if (this.innerHd) { this.innerHd.style.width = (gridWidth) + "px"; } } if (this.forceFit || (initial === true && this.autoFill)) { if (this.lastViewWidth != gridWidth) { this.fitColumns(false, false); this.lastViewWidth = gridWidth; } } else { this.autoExpand(); this.syncHeaderScroll(); } this.onLayout(gridWidth, scrollHeight); }, onLayout : function(vw, vh) { }, onColumnWidthUpdated : function(col, w, tw) { }, onAllColumnWidthsUpdated : function(ws, tw) { }, onColumnHiddenUpdated : function(col, hidden, tw) { }, updateColumnText : function(col, text) { }, afterMove : function(colIndex) { }, init : function(grid) { this.grid = grid; this.initTemplates(); this.initData(grid.store, grid.colModel); this.initUI(grid); }, getColumnId : function(index){ return this.cm.getColumnId(index); }, getOffsetWidth : function() { return (this.cm.getTotalWidth() + this.getScrollOffset()) + 'px'; }, getScrollOffset: function() { return Ext.num(this.scrollOffset, Ext.getScrollBarWidth()); }, renderHeaders : function() { var colModel = this.cm, templates = this.templates, headerTpl = templates.hcell, properties = {}, colCount = colModel.getColumnCount(), last = colCount - 1, cells = [], i, cssCls; for (i = 0; i < colCount; i++) { if (i == 0) { cssCls = 'x-grid3-cell-first '; } else { cssCls = i == last ? 'x-grid3-cell-last ' : ''; } properties = { id : colModel.getColumnId(i), value : colModel.getColumnHeader(i) || '', style : this.getColumnStyle(i, true), css : cssCls, tooltip: this.getColumnTooltip(i) }; if (colModel.config[i].align == 'right') { properties.istyle = 'padding-right: 16px;'; } else { delete properties.istyle; } cells[i] = headerTpl.apply(properties); } return templates.header.apply({ cells : cells.join(""), tstyle: String.format("width: {0};", this.getTotalWidth()) }); }, getColumnTooltip : function(i) { var tooltip = this.cm.getColumnTooltip(i); if (tooltip) { if (Ext.QuickTips.isEnabled()) { return 'ext:qtip="' + tooltip + '"'; } else { return 'title="' + tooltip + '"'; } } return ''; }, beforeUpdate : function() { this.grid.stopEditing(true); }, updateHeaders : function() { this.innerHd.firstChild.innerHTML = this.renderHeaders(); this.updateHeaderWidth(false); }, updateHeaderWidth: function(updateMain) { var innerHdChild = this.innerHd.firstChild, totalWidth = this.getTotalWidth(); innerHdChild.style.width = this.getOffsetWidth(); innerHdChild.firstChild.style.width = totalWidth; if (updateMain !== false) { this.mainBody.dom.style.width = totalWidth; } }, focusRow : function(row) { this.focusCell(row, 0, false); }, focusCell : function(row, col, hscroll) { this.syncFocusEl(this.ensureVisible(row, col, hscroll)); var focusEl = this.focusEl; if (Ext.isGecko) { focusEl.focus(); } else { focusEl.focus.defer(1, focusEl); } }, resolveCell : function(row, col, hscroll) { if (!Ext.isNumber(row)) { row = row.rowIndex; } if (!this.ds) { return null; } if (row < 0 || row >= this.ds.getCount()) { return null; } col = (col !== undefined ? col : 0); var rowEl = this.getRow(row), colModel = this.cm, colCount = colModel.getColumnCount(), cellEl; if (!(hscroll === false && col === 0)) { while (col < colCount && colModel.isHidden(col)) { col++; } cellEl = this.getCell(row, col); } return {row: rowEl, cell: cellEl}; }, getResolvedXY : function(resolved) { if (!resolved) { return null; } var cell = resolved.cell, row = resolved.row; if (cell) { return Ext.fly(cell).getXY(); } else { return [this.el.getX(), Ext.fly(row).getY()]; } }, syncFocusEl : function(row, col, hscroll) { var xy = row; if (!Ext.isArray(xy)) { row = Math.min(row, Math.max(0, this.getRows().length-1)); if (isNaN(row)) { return; } xy = this.getResolvedXY(this.resolveCell(row, col, hscroll)); } this.focusEl.setXY(xy || this.scroller.getXY()); }, ensureVisible : function(row, col, hscroll) { var resolved = this.resolveCell(row, col, hscroll); if (!resolved || !resolved.row) { return null; } var rowEl = resolved.row, cellEl = resolved.cell, c = this.scroller.dom, p = rowEl, ctop = 0, stop = this.el.dom; while (p && p != stop) { ctop += p.offsetTop; p = p.offsetParent; } ctop -= this.mainHd.dom.offsetHeight; stop = parseInt(c.scrollTop, 10); var cbot = ctop + rowEl.offsetHeight, ch = c.clientHeight, sbot = stop + ch; if (ctop < stop) { c.scrollTop = ctop; } else if(cbot > sbot) { c.scrollTop = cbot-ch; } if (hscroll !== false) { var cleft = parseInt(cellEl.offsetLeft, 10), cright = cleft + cellEl.offsetWidth, sleft = parseInt(c.scrollLeft, 10), sright = sleft + c.clientWidth; if (cleft < sleft) { c.scrollLeft = cleft; } else if(cright > sright) { c.scrollLeft = cright-c.clientWidth; } } return this.getResolvedXY(resolved); }, insertRows : function(dm, firstRow, lastRow, isUpdate) { var last = dm.getCount() - 1; if( !isUpdate && firstRow === 0 && lastRow >= last) { this.fireEvent('beforerowsinserted', this, firstRow, lastRow); this.refresh(); this.fireEvent('rowsinserted', this, firstRow, lastRow); } else { if (!isUpdate) { this.fireEvent('beforerowsinserted', this, firstRow, lastRow); } var html = this.renderRows(firstRow, lastRow), before = this.getRow(firstRow); if (before) { if(firstRow === 0){ Ext.fly(this.getRow(0)).removeClass(this.firstRowCls); } Ext.DomHelper.insertHtml('beforeBegin', before, html); } else { var r = this.getRow(last - 1); if(r){ Ext.fly(r).removeClass(this.lastRowCls); } Ext.DomHelper.insertHtml('beforeEnd', this.mainBody.dom, html); } if (!isUpdate) { this.processRows(firstRow); this.fireEvent('rowsinserted', this, firstRow, lastRow); } else if (firstRow === 0 || firstRow >= last) { Ext.fly(this.getRow(firstRow)).addClass(firstRow === 0 ? this.firstRowCls : this.lastRowCls); } } this.syncFocusEl(firstRow); }, deleteRows : function(dm, firstRow, lastRow) { if (dm.getRowCount() < 1) { this.refresh(); } else { this.fireEvent('beforerowsdeleted', this, firstRow, lastRow); this.removeRows(firstRow, lastRow); this.processRows(firstRow); this.fireEvent('rowsdeleted', this, firstRow, lastRow); } }, getColumnStyle : function(colIndex, isHeader) { var colModel = this.cm, colConfig = colModel.config, style = isHeader ? '' : colConfig[colIndex].css || '', align = colConfig[colIndex].align; style += String.format("width: {0};", this.getColumnWidth(colIndex)); if (colModel.isHidden(colIndex)) { style += 'display: none; '; } if (align) { style += String.format("text-align: {0};", align); } return style; }, getColumnWidth : function(column) { var columnWidth = this.cm.getColumnWidth(column), borderWidth = this.borderWidth; if (Ext.isNumber(columnWidth)) { if (Ext.isBorderBox || (Ext.isWebKit && !Ext.isSafari2)) { return columnWidth + "px"; } else { return Math.max(columnWidth - borderWidth, 0) + "px"; } } else { return columnWidth; } }, getTotalWidth : function() { return this.cm.getTotalWidth() + 'px'; }, fitColumns : function(preventRefresh, onlyExpand, omitColumn) { var grid = this.grid, colModel = this.cm, totalColWidth = colModel.getTotalWidth(false), gridWidth = this.getGridInnerWidth(), extraWidth = gridWidth - totalColWidth, columns = [], extraCol = 0, width = 0, colWidth, fraction, i; if (gridWidth < 20 || extraWidth === 0) { return false; } var visibleColCount = colModel.getColumnCount(true), totalColCount = colModel.getColumnCount(false), adjCount = visibleColCount - (Ext.isNumber(omitColumn) ? 1 : 0); if (adjCount === 0) { adjCount = 1; omitColumn = undefined; } for (i = 0; i < totalColCount; i++) { if (!colModel.isFixed(i) && i !== omitColumn) { colWidth = colModel.getColumnWidth(i); columns.push(i, colWidth); if (!colModel.isHidden(i)) { extraCol = i; width += colWidth; } } } fraction = (gridWidth - colModel.getTotalWidth()) / width; while (columns.length) { colWidth = columns.pop(); i = columns.pop(); colModel.setColumnWidth(i, Math.max(grid.minColumnWidth, Math.floor(colWidth + colWidth * fraction)), true); } totalColWidth = colModel.getTotalWidth(false); if (totalColWidth > gridWidth) { var adjustCol = (adjCount == visibleColCount) ? extraCol : omitColumn, newWidth = Math.max(1, colModel.getColumnWidth(adjustCol) - (totalColWidth - gridWidth)); colModel.setColumnWidth(adjustCol, newWidth, true); } if (preventRefresh !== true) { this.updateAllColumnWidths(); } return true; }, autoExpand : function(preventUpdate) { var grid = this.grid, colModel = this.cm, gridWidth = this.getGridInnerWidth(), totalColumnWidth = colModel.getTotalWidth(false), autoExpandColumn = grid.autoExpandColumn; if (!this.userResized && autoExpandColumn) { if (gridWidth != totalColumnWidth) { var colIndex = colModel.getIndexById(autoExpandColumn), currentWidth = colModel.getColumnWidth(colIndex), desiredWidth = gridWidth - totalColumnWidth + currentWidth, newWidth = Math.min(Math.max(desiredWidth, grid.autoExpandMin), grid.autoExpandMax); if (currentWidth != newWidth) { colModel.setColumnWidth(colIndex, newWidth, true); if (preventUpdate !== true) { this.updateColumnWidth(colIndex, newWidth); } } } } }, getGridInnerWidth: function() { return this.grid.getGridEl().getWidth(true) - this.getScrollOffset(); }, getColumnData : function() { var columns = [], colModel = this.cm, colCount = colModel.getColumnCount(), fields = this.ds.fields, i, name; for (i = 0; i < colCount; i++) { name = colModel.getDataIndex(i); columns[i] = { name : Ext.isDefined(name) ? name : (fields.get(i) ? fields.get(i).name : undefined), renderer: colModel.getRenderer(i), scope : colModel.getRendererScope(i), id : colModel.getColumnId(i), style : this.getColumnStyle(i) }; } return columns; }, renderRows : function(startRow, endRow) { var grid = this.grid, store = grid.store, stripe = grid.stripeRows, colModel = grid.colModel, colCount = colModel.getColumnCount(), rowCount = store.getCount(), records; if (rowCount < 1) { return ''; } startRow = startRow || 0; endRow = Ext.isDefined(endRow) ? endRow : rowCount - 1; records = store.getRange(startRow, endRow); return this.doRender(this.getColumnData(), records, store, startRow, colCount, stripe); }, renderBody : function(){ var markup = this.renderRows() || ' '; return this.templates.body.apply({rows: markup}); }, refreshRow: function(record) { var store = this.ds, colCount = this.cm.getColumnCount(), columns = this.getColumnData(), last = colCount - 1, cls = ['x-grid3-row'], rowParams = { tstyle: String.format("width: {0};", this.getTotalWidth()) }, colBuffer = [], cellTpl = this.templates.cell, rowIndex, row, column, meta, css, i; if (Ext.isNumber(record)) { rowIndex = record; record = store.getAt(rowIndex); } else { rowIndex = store.indexOf(record); } if (!record || rowIndex < 0) { return; } for (i = 0; i < colCount; i++) { column = columns[i]; if (i == 0) { css = 'x-grid3-cell-first'; } else { css = (i == last) ? 'x-grid3-cell-last ' : ''; } meta = { id : column.id, style : column.style, css : css, attr : "", cellAttr: "" }; meta.value = column.renderer.call(column.scope, record.data[column.name], meta, record, rowIndex, i, store); if (Ext.isEmpty(meta.value)) { meta.value = ' '; } if (this.markDirty && record.dirty && typeof record.modified[column.name] != 'undefined') { meta.css += ' x-grid3-dirty-cell'; } colBuffer[i] = cellTpl.apply(meta); } row = this.getRow(rowIndex); row.className = ''; if (this.grid.stripeRows && ((rowIndex + 1) % 2 === 0)) { cls.push('x-grid3-row-alt'); } if (this.getRowClass) { rowParams.cols = colCount; cls.push(this.getRowClass(record, rowIndex, rowParams, store)); } this.fly(row).addClass(cls).setStyle(rowParams.tstyle); rowParams.cells = colBuffer.join(""); row.innerHTML = this.templates.rowInner.apply(rowParams); this.fireEvent('rowupdated', this, rowIndex, record); }, refresh : function(headersToo) { this.fireEvent('beforerefresh', this); this.grid.stopEditing(true); var result = this.renderBody(); this.mainBody.update(result).setWidth(this.getTotalWidth()); if (headersToo === true) { this.updateHeaders(); this.updateHeaderSortState(); } this.processRows(0, true); this.layout(); this.applyEmptyText(); this.fireEvent('refresh', this); }, applyEmptyText : function() { if (this.emptyText && !this.hasRows()) { this.mainBody.update('
    ' + this.emptyText + '
    '); } }, updateHeaderSortState : function() { var state = this.ds.getSortState(); if (!state) { return; } if (!this.sortState || (this.sortState.field != state.field || this.sortState.direction != state.direction)) { this.grid.fireEvent('sortchange', this.grid, state); } this.sortState = state; var sortColumn = this.cm.findColumnIndex(state.field); if (sortColumn != -1) { var sortDir = state.direction; this.updateSortIcon(sortColumn, sortDir); } }, clearHeaderSortState : function() { if (!this.sortState) { return; } this.grid.fireEvent('sortchange', this.grid, null); this.mainHd.select('td').removeClass(this.sortClasses); delete this.sortState; }, destroy : function() { var me = this, grid = me.grid, gridEl = grid.getGridEl(), dragZone = me.dragZone, splitZone = me.splitZone, columnDrag = me.columnDrag, columnDrop = me.columnDrop, scrollToTopTask = me.scrollToTopTask, columnDragData, columnDragProxy; if (scrollToTopTask && scrollToTopTask.cancel) { scrollToTopTask.cancel(); } Ext.destroyMembers(me, 'colMenu', 'hmenu'); me.initData(null, null); me.purgeListeners(); Ext.fly(me.innerHd).un("click", me.handleHdDown, me); if (grid.enableColumnMove) { columnDragData = columnDrag.dragData; columnDragProxy = columnDrag.proxy; Ext.destroy( columnDrag.el, columnDragProxy.ghost, columnDragProxy.el, columnDrop.el, columnDrop.proxyTop, columnDrop.proxyBottom, columnDragData.ddel, columnDragData.header ); if (columnDragProxy.anim) { Ext.destroy(columnDragProxy.anim); } delete columnDragProxy.ghost; delete columnDragData.ddel; delete columnDragData.header; columnDrag.destroy(); delete Ext.dd.DDM.locationCache[columnDrag.id]; delete columnDrag._domRef; delete columnDrop.proxyTop; delete columnDrop.proxyBottom; columnDrop.destroy(); delete Ext.dd.DDM.locationCache["gridHeader" + gridEl.id]; delete columnDrop._domRef; delete Ext.dd.DDM.ids[columnDrop.ddGroup]; } if (splitZone) { splitZone.destroy(); delete splitZone._domRef; delete Ext.dd.DDM.ids["gridSplitters" + gridEl.id]; } Ext.fly(me.innerHd).removeAllListeners(); Ext.removeNode(me.innerHd); delete me.innerHd; Ext.destroy( me.el, me.mainWrap, me.mainHd, me.scroller, me.mainBody, me.focusEl, me.resizeMarker, me.resizeProxy, me.activeHdBtn, me._flyweight, dragZone, splitZone ); delete grid.container; if (dragZone) { dragZone.destroy(); } Ext.dd.DDM.currentTarget = null; delete Ext.dd.DDM.locationCache[gridEl.id]; Ext.EventManager.removeResizeListener(me.onWindowResize, me); }, onDenyColumnHide : function() { }, render : function() { if (this.autoFill) { var ct = this.grid.ownerCt; if (ct && ct.getLayout()) { ct.on('afterlayout', function() { this.fitColumns(true, true); this.updateHeaders(); this.updateHeaderSortState(); }, this, {single: true}); } } else if (this.forceFit) { this.fitColumns(true, false); } else if (this.grid.autoExpandColumn) { this.autoExpand(true); } this.grid.getGridEl().dom.innerHTML = this.renderUI(); this.afterRenderUI(); }, initData : function(newStore, newColModel) { var me = this; if (me.ds) { var oldStore = me.ds; oldStore.un('add', me.onAdd, me); oldStore.un('load', me.onLoad, me); oldStore.un('clear', me.onClear, me); oldStore.un('remove', me.onRemove, me); oldStore.un('update', me.onUpdate, me); oldStore.un('datachanged', me.onDataChange, me); if (oldStore !== newStore && oldStore.autoDestroy) { oldStore.destroy(); } } if (newStore) { newStore.on({ scope : me, load : me.onLoad, add : me.onAdd, remove : me.onRemove, update : me.onUpdate, clear : me.onClear, datachanged: me.onDataChange }); } if (me.cm) { var oldColModel = me.cm; oldColModel.un('configchange', me.onColConfigChange, me); oldColModel.un('widthchange', me.onColWidthChange, me); oldColModel.un('headerchange', me.onHeaderChange, me); oldColModel.un('hiddenchange', me.onHiddenChange, me); oldColModel.un('columnmoved', me.onColumnMove, me); } if (newColModel) { delete me.lastViewWidth; newColModel.on({ scope : me, configchange: me.onColConfigChange, widthchange : me.onColWidthChange, headerchange: me.onHeaderChange, hiddenchange: me.onHiddenChange, columnmoved : me.onColumnMove }); } me.ds = newStore; me.cm = newColModel; }, onDataChange : function(){ this.refresh(true); this.updateHeaderSortState(); this.syncFocusEl(0); }, onClear : function() { this.refresh(); this.syncFocusEl(0); }, onUpdate : function(store, record) { this.refreshRow(record); }, onAdd : function(store, records, index) { this.insertRows(store, index, index + (records.length-1)); }, onRemove : function(store, record, index, isUpdate) { if (isUpdate !== true) { this.fireEvent('beforerowremoved', this, index, record); } this.removeRow(index); if (isUpdate !== true) { this.processRows(index); this.applyEmptyText(); this.fireEvent('rowremoved', this, index, record); } }, onLoad : function() { if (Ext.isGecko) { if (!this.scrollToTopTask) { this.scrollToTopTask = new Ext.util.DelayedTask(this.scrollToTop, this); } this.scrollToTopTask.delay(1); } else { this.scrollToTop(); } }, onColWidthChange : function(cm, col, width) { this.updateColumnWidth(col, width); }, onHeaderChange : function(cm, col, text) { this.updateHeaders(); }, onHiddenChange : function(cm, col, hidden) { this.updateColumnHidden(col, hidden); }, onColumnMove : function(cm, oldIndex, newIndex) { this.indexMap = null; this.refresh(true); this.restoreScroll(this.getScrollState()); this.afterMove(newIndex); this.grid.fireEvent('columnmove', oldIndex, newIndex); }, onColConfigChange : function() { delete this.lastViewWidth; this.indexMap = null; this.refresh(true); }, initUI : function(grid) { grid.on('headerclick', this.onHeaderClick, this); }, initEvents : Ext.emptyFn, onHeaderClick : function(g, index) { if (this.headersDisabled || !this.cm.isSortable(index)) { return; } g.stopEditing(true); g.store.sort(this.cm.getDataIndex(index)); }, onRowOver : function(e, target) { var row = this.findRowIndex(target); if (row !== false) { this.addRowClass(row, this.rowOverCls); } }, onRowOut : function(e, target) { var row = this.findRowIndex(target); if (row !== false && !e.within(this.getRow(row), true)) { this.removeRowClass(row, this.rowOverCls); } }, onRowSelect : function(row) { this.addRowClass(row, this.selectedRowClass); }, onRowDeselect : function(row) { this.removeRowClass(row, this.selectedRowClass); }, onCellSelect : function(row, col) { var cell = this.getCell(row, col); if (cell) { this.fly(cell).addClass('x-grid3-cell-selected'); } }, onCellDeselect : function(row, col) { var cell = this.getCell(row, col); if (cell) { this.fly(cell).removeClass('x-grid3-cell-selected'); } }, handleWheel : function(e) { e.stopPropagation(); }, onColumnSplitterMoved : function(cellIndex, width) { this.userResized = true; this.grid.colModel.setColumnWidth(cellIndex, width, true); if (this.forceFit) { this.fitColumns(true, false, cellIndex); this.updateAllColumnWidths(); } else { this.updateColumnWidth(cellIndex, width); this.syncHeaderScroll(); } this.grid.fireEvent('columnresize', cellIndex, width); }, beforeColMenuShow : function() { var colModel = this.cm, colCount = colModel.getColumnCount(), colMenu = this.colMenu, i; colMenu.removeAll(); for (i = 0; i < colCount; i++) { if (colModel.config[i].hideable !== false) { colMenu.add(new Ext.menu.CheckItem({ text : colModel.getColumnHeader(i), itemId : 'col-' + colModel.getColumnId(i), checked : !colModel.isHidden(i), disabled : colModel.config[i].hideable === false, hideOnClick: false })); } } }, handleHdMenuClick : function(item) { var store = this.ds, dataIndex = this.cm.getDataIndex(this.hdCtxIndex); switch (item.getItemId()) { case 'asc': store.sort(dataIndex, 'ASC'); break; case 'desc': store.sort(dataIndex, 'DESC'); break; default: this.handleHdMenuClickDefault(item); } return true; }, handleHdMenuClickDefault: function(item) { var colModel = this.cm, itemId = item.getItemId(), index = colModel.getIndexById(itemId.substr(4)); if (index != -1) { if (item.checked && colModel.getColumnsBy(this.isHideableColumn, this).length <= 1) { this.onDenyColumnHide(); return; } colModel.setHidden(index, item.checked); } }, handleHdDown : function(e, target) { if (Ext.fly(target).hasClass('x-grid3-hd-btn')) { e.stopEvent(); var colModel = this.cm, header = this.findHeaderCell(target), index = this.getCellIndex(header), sortable = colModel.isSortable(index), menu = this.hmenu, menuItems = menu.items, menuCls = this.headerMenuOpenCls; this.hdCtxIndex = index; Ext.fly(header).addClass(menuCls); menuItems.get('asc').setDisabled(!sortable); menuItems.get('desc').setDisabled(!sortable); menu.on('hide', function() { Ext.fly(header).removeClass(menuCls); }, this, {single:true}); menu.show(target, 'tl-bl?'); } }, handleHdMove : function(e) { var header = this.findHeaderCell(this.activeHdRef); if (header && !this.headersDisabled) { var handleWidth = this.splitHandleWidth || 5, activeRegion = this.activeHdRegion, headerStyle = header.style, colModel = this.cm, cursor = '', pageX = e.getPageX(); if (this.grid.enableColumnResize !== false) { var activeHeaderIndex = this.activeHdIndex, previousVisible = this.getPreviousVisible(activeHeaderIndex), currentResizable = colModel.isResizable(activeHeaderIndex), previousResizable = previousVisible && colModel.isResizable(previousVisible), inLeftResizer = pageX - activeRegion.left <= handleWidth, inRightResizer = activeRegion.right - pageX <= (!this.activeHdBtn ? handleWidth : 2); if (inLeftResizer && previousResizable) { cursor = Ext.isAir ? 'move' : Ext.isWebKit ? 'e-resize' : 'col-resize'; } else if (inRightResizer && currentResizable) { cursor = Ext.isAir ? 'move' : Ext.isWebKit ? 'w-resize' : 'col-resize'; } } headerStyle.cursor = cursor; } }, getPreviousVisible: function(index) { while (index > 0) { if (!this.cm.isHidden(index - 1)) { return index; } index--; } return undefined; }, handleHdOver : function(e, target) { var header = this.findHeaderCell(target); if (header && !this.headersDisabled) { var fly = this.fly(header); this.activeHdRef = target; this.activeHdIndex = this.getCellIndex(header); this.activeHdRegion = fly.getRegion(); if (!this.isMenuDisabled(this.activeHdIndex, fly)) { fly.addClass('x-grid3-hd-over'); this.activeHdBtn = fly.child('.x-grid3-hd-btn'); if (this.activeHdBtn) { this.activeHdBtn.dom.style.height = (header.firstChild.offsetHeight - 1) + 'px'; } } } }, handleHdOut : function(e, target) { var header = this.findHeaderCell(target); if (header && (!Ext.isIE || !e.within(header, true))) { this.activeHdRef = null; this.fly(header).removeClass('x-grid3-hd-over'); header.style.cursor = ''; } }, isMenuDisabled: function(cellIndex, el) { return this.cm.isMenuDisabled(cellIndex); }, hasRows : function() { var fc = this.mainBody.dom.firstChild; return fc && fc.nodeType == 1 && fc.className != 'x-grid-empty'; }, isHideableColumn : function(c) { return !c.hidden; }, bind : function(d, c) { this.initData(d, c); } }); Ext.grid.GridView.SplitDragZone = Ext.extend(Ext.dd.DDProxy, { constructor: function(grid, hd){ this.grid = grid; this.view = grid.getView(); this.marker = this.view.resizeMarker; this.proxy = this.view.resizeProxy; Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, hd, 'gridSplitters' + this.grid.getGridEl().id, { dragElId : Ext.id(this.proxy.dom), resizeFrame:false }); this.scroll = false; this.hw = this.view.splitHandleWidth || 5; }, b4StartDrag : function(x, y){ this.dragHeadersDisabled = this.view.headersDisabled; this.view.headersDisabled = true; var h = this.view.mainWrap.getHeight(); this.marker.setHeight(h); this.marker.show(); this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), 'tl-tl', [-2, 0]); this.proxy.setHeight(h); var w = this.cm.getColumnWidth(this.cellIndex), minw = Math.max(w-this.grid.minColumnWidth, 0); this.resetConstraints(); this.setXConstraint(minw, 1000); this.setYConstraint(0, 0); this.minX = x - minw; this.maxX = x + 1000; this.startPos = x; Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y); }, allowHeaderDrag : function(e){ return true; }, handleMouseDown : function(e){ var t = this.view.findHeaderCell(e.getTarget()); if(t && this.allowHeaderDrag(e)){ var xy = this.view.fly(t).getXY(), x = xy[0], exy = e.getXY(), ex = exy[0], w = t.offsetWidth, adjust = false; if((ex - x) <= this.hw){ adjust = -1; }else if((x+w) - ex <= this.hw){ adjust = 0; } if(adjust !== false){ this.cm = this.grid.colModel; var ci = this.view.getCellIndex(t); if(adjust == -1){ if (ci + adjust < 0) { return; } while(this.cm.isHidden(ci+adjust)){ --adjust; if(ci+adjust < 0){ return; } } } this.cellIndex = ci+adjust; this.split = t.dom; if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){ Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this, arguments); } }else if(this.view.columnDrag){ this.view.columnDrag.callHandleMouseDown(e); } } }, endDrag : function(e){ this.marker.hide(); var v = this.view, endX = Math.max(this.minX, e.getPageX()), diff = endX - this.startPos, disabled = this.dragHeadersDisabled; v.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff); setTimeout(function(){ v.headersDisabled = disabled; }, 50); }, autoOffset : function(){ this.setDelta(0,0); } }); Ext.grid.PivotGridView = Ext.extend(Ext.grid.GridView, { colHeaderCellCls: 'grid-hd-group-cell', title: '', getColumnHeaders: function() { return this.grid.topAxis.buildHeaders();; }, getRowHeaders: function() { return this.grid.leftAxis.buildHeaders(); }, renderRows : function(startRow, endRow) { var grid = this.grid, rows = grid.extractData(), rowCount = rows.length, templates = this.templates, renderer = grid.renderer, hasRenderer = typeof renderer == 'function', getCellCls = this.getCellCls, hasGetCellCls = typeof getCellCls == 'function', cellTemplate = templates.cell, rowTemplate = templates.row, rowBuffer = [], meta = {}, tstyle = 'width:' + this.getGridInnerWidth() + 'px;', colBuffer, colCount, column, i, row; startRow = startRow || 0; endRow = Ext.isDefined(endRow) ? endRow : rowCount - 1; for (i = 0; i < rowCount; i++) { row = rows[i]; colCount = row.length; colBuffer = []; for (var j = 0; j < colCount; j++) { meta.id = i + '-' + j; meta.css = j === 0 ? 'x-grid3-cell-first ' : (j == (colCount - 1) ? 'x-grid3-cell-last ' : ''); meta.attr = meta.cellAttr = ''; meta.value = row[j]; if (Ext.isEmpty(meta.value)) { meta.value = ' '; } if (hasRenderer) { meta.value = renderer(meta.value); } if (hasGetCellCls) { meta.css += getCellCls(meta.value) + ' '; } colBuffer[colBuffer.length] = cellTemplate.apply(meta); } rowBuffer[rowBuffer.length] = rowTemplate.apply({ tstyle: tstyle, cols : colCount, cells : colBuffer.join(""), alt : '' }); } return rowBuffer.join(""); }, masterTpl: new Ext.Template( '
    ', '
    ', '
    ', '
    {title}
    ', '
    ', '
    ', '
    ', '
    ', '
    ', '
    ', '
    ', '
    {body}
    ', '', '
    ', '
    ', '
     
    ', '
     
    ', '
    ' ), initTemplates: function() { Ext.grid.PivotGridView.superclass.initTemplates.apply(this, arguments); var templates = this.templates || {}; if (!templates.gcell) { templates.gcell = new Ext.XTemplate( '', '
    ', this.grid.enableHdMenu ? '' : '', '{value}', '
    ', '' ); } this.templates = templates; this.hrowRe = new RegExp("ux-grid-hd-group-row-(\\d+)", ""); }, initElements: function() { Ext.grid.PivotGridView.superclass.initElements.apply(this, arguments); this.rowHeadersEl = new Ext.Element(this.scroller.child('div.x-grid3-row-headers')); this.headerTitleEl = new Ext.Element(this.mainHd.child('div.x-grid3-header-title')); }, getGridInnerWidth: function() { var previousWidth = Ext.grid.PivotGridView.superclass.getGridInnerWidth.apply(this, arguments); return previousWidth - this.getTotalRowHeaderWidth(); }, getTotalRowHeaderWidth: function() { var headers = this.getRowHeaders(), length = headers.length, total = 0, i; for (i = 0; i< length; i++) { total += headers[i].width; } return total; }, getTotalColumnHeaderHeight: function() { return this.getColumnHeaders().length * 21; }, getCellIndex : function(el) { if (el) { var match = el.className.match(this.colRe), data; if (match && (data = match[1])) { return parseInt(data.split('-')[1], 10); } } return false; }, renderUI : function() { var templates = this.templates, innerWidth = this.getGridInnerWidth(); return templates.master.apply({ body : templates.body.apply({rows:' '}), ostyle: 'width:' + innerWidth + 'px', bstyle: 'width:' + innerWidth + 'px' }); }, onLayout: function(width, height) { Ext.grid.PivotGridView.superclass.onLayout.apply(this, arguments); var width = this.getGridInnerWidth(); this.resizeColumnHeaders(width); this.resizeAllRows(width); }, refresh : function(headersToo) { this.fireEvent('beforerefresh', this); this.grid.stopEditing(true); var result = this.renderBody(); this.mainBody.update(result).setWidth(this.getGridInnerWidth()); if (headersToo === true) { this.updateHeaders(); this.updateHeaderSortState(); } this.processRows(0, true); this.layout(); this.applyEmptyText(); this.fireEvent('refresh', this); }, renderHeaders: Ext.emptyFn, fitColumns: Ext.emptyFn, resizeColumnHeaders: function(width) { var topAxis = this.grid.topAxis; if (topAxis.rendered) { topAxis.el.setWidth(width); } }, resizeRowHeaders: function() { var rowHeaderWidth = this.getTotalRowHeaderWidth(), marginStyle = String.format("margin-left: {0}px;", rowHeaderWidth); this.rowHeadersEl.setWidth(rowHeaderWidth); this.mainBody.applyStyles(marginStyle); Ext.fly(this.innerHd).applyStyles(marginStyle); this.headerTitleEl.setWidth(rowHeaderWidth); this.headerTitleEl.setHeight(this.getTotalColumnHeaderHeight()); }, resizeAllRows: function(width) { var rows = this.getRows(), length = rows.length, i; for (i = 0; i < length; i++) { Ext.fly(rows[i]).setWidth(width); Ext.fly(rows[i]).child('table').setWidth(width); } }, updateHeaders: function() { this.renderGroupRowHeaders(); this.renderGroupColumnHeaders(); }, renderGroupRowHeaders: function() { var leftAxis = this.grid.leftAxis; this.resizeRowHeaders(); leftAxis.rendered = false; leftAxis.render(this.rowHeadersEl); this.setTitle(this.title); }, setTitle: function(title) { this.headerTitleEl.child('span').dom.innerHTML = title; }, renderGroupColumnHeaders: function() { var topAxis = this.grid.topAxis; topAxis.rendered = false; topAxis.render(this.innerHd.firstChild); }, isMenuDisabled: function(cellIndex, el) { return true; } }); Ext.grid.PivotAxis = Ext.extend(Ext.Component, { orientation: 'horizontal', defaultHeaderWidth: 80, paddingWidth: 7, setDimensions: function(dimensions) { this.dimensions = dimensions; }, onRender: function(ct, position) { var rows = this.orientation == 'horizontal' ? this.renderHorizontalRows() : this.renderVerticalRows(); this.el = Ext.DomHelper.overwrite(ct.dom, {tag: 'table', cn: rows}, true); }, renderHorizontalRows: function() { var headers = this.buildHeaders(), rowCount = headers.length, rows = [], cells, cols, colCount, i, j; for (i = 0; i < rowCount; i++) { cells = []; cols = headers[i].items; colCount = cols.length; for (j = 0; j < colCount; j++) { cells.push({ tag: 'td', html: cols[j].header, colspan: cols[j].span }); } rows[i] = { tag: 'tr', cn: cells }; } return rows; }, renderVerticalRows: function() { var headers = this.buildHeaders(), colCount = headers.length, rowCells = [], rows = [], rowCount, col, row, colWidth, i, j; for (i = 0; i < colCount; i++) { col = headers[i]; colWidth = col.width || 80; rowCount = col.items.length; for (j = 0; j < rowCount; j++) { row = col.items[j]; rowCells[row.start] = rowCells[row.start] || []; rowCells[row.start].push({ tag : 'td', html : row.header, rowspan: row.span, width : Ext.isBorderBox ? colWidth : colWidth - this.paddingWidth }); } } rowCount = rowCells.length; for (i = 0; i < rowCount; i++) { rows[i] = { tag: 'tr', cn : rowCells[i] }; } return rows; }, getTuples: function() { var newStore = new Ext.data.Store({}); newStore.data = this.store.data.clone(); newStore.fields = this.store.fields; var sorters = [], dimensions = this.dimensions, length = dimensions.length, i; for (i = 0; i < length; i++) { sorters.push({ field : dimensions[i].dataIndex, direction: dimensions[i].direction || 'ASC' }); } newStore.sort(sorters); var records = newStore.data.items, hashes = [], tuples = [], recData, hash, info, data, key; length = records.length; for (i = 0; i < length; i++) { info = this.getRecordInfo(records[i]); data = info.data; hash = ""; for (key in data) { hash += data[key] + '---'; } if (hashes.indexOf(hash) == -1) { hashes.push(hash); tuples.push(info); } } newStore.destroy(); return tuples; }, getRecordInfo: function(record) { var dimensions = this.dimensions, length = dimensions.length, data = {}, dimension, dataIndex, i; for (i = 0; i < length; i++) { dimension = dimensions[i]; dataIndex = dimension.dataIndex; data[dataIndex] = record.get(dataIndex); } var createMatcherFunction = function(data) { return function(record) { for (var dataIndex in data) { if (record.get(dataIndex) != data[dataIndex]) { return false; } } return true; }; }; return { data: data, matcher: createMatcherFunction(data) }; }, buildHeaders: function() { var tuples = this.getTuples(), rowCount = tuples.length, dimensions = this.dimensions, dimension, colCount = dimensions.length, headers = [], tuple, rows, currentHeader, previousHeader, span, start, isLast, changed, i, j; for (i = 0; i < colCount; i++) { dimension = dimensions[i]; rows = []; span = 0; start = 0; for (j = 0; j < rowCount; j++) { tuple = tuples[j]; isLast = j == (rowCount - 1); currentHeader = tuple.data[dimension.dataIndex]; changed = previousHeader != undefined && previousHeader != currentHeader; if (i > 0 && j > 0) { changed = changed || tuple.data[dimensions[i-1].dataIndex] != tuples[j-1].data[dimensions[i-1].dataIndex]; } if (changed) { rows.push({ header: previousHeader, span : span, start : start }); start += span; span = 0; } if (isLast) { rows.push({ header: currentHeader, span : span + 1, start : start }); start += span; span = 0; } previousHeader = currentHeader; span++; } headers.push({ items: rows, width: dimension.width || this.defaultHeaderWidth }); previousHeader = undefined; } return headers; } }); Ext.grid.HeaderDragZone = Ext.extend(Ext.dd.DragZone, { maxDragWidth: 120, constructor : function(grid, hd, hd2){ this.grid = grid; this.view = grid.getView(); this.ddGroup = "gridHeader" + this.grid.getGridEl().id; Ext.grid.HeaderDragZone.superclass.constructor.call(this, hd); if(hd2){ this.setHandleElId(Ext.id(hd)); this.setOuterHandleElId(Ext.id(hd2)); } this.scroll = false; }, getDragData : function(e){ var t = Ext.lib.Event.getTarget(e), h = this.view.findHeaderCell(t); if(h){ return {ddel: h.firstChild, header:h}; } return false; }, onInitDrag : function(e){ this.dragHeadersDisabled = this.view.headersDisabled; this.view.headersDisabled = true; var clone = this.dragData.ddel.cloneNode(true); clone.id = Ext.id(); clone.style.width = Math.min(this.dragData.header.offsetWidth,this.maxDragWidth) + "px"; this.proxy.update(clone); return true; }, afterValidDrop : function(){ this.completeDrop(); }, afterInvalidDrop : function(){ this.completeDrop(); }, completeDrop: function(){ var v = this.view, disabled = this.dragHeadersDisabled; setTimeout(function(){ v.headersDisabled = disabled; }, 50); } }); Ext.grid.HeaderDropZone = Ext.extend(Ext.dd.DropZone, { proxyOffsets : [-4, -9], fly: Ext.Element.fly, constructor : function(grid, hd, hd2){ this.grid = grid; this.view = grid.getView(); this.proxyTop = Ext.DomHelper.append(document.body, { cls:"col-move-top", html:" " }, true); this.proxyBottom = Ext.DomHelper.append(document.body, { cls:"col-move-bottom", html:" " }, true); this.proxyTop.hide = this.proxyBottom.hide = function(){ this.setLeftTop(-100,-100); this.setStyle("visibility", "hidden"); }; this.ddGroup = "gridHeader" + this.grid.getGridEl().id; Ext.grid.HeaderDropZone.superclass.constructor.call(this, grid.getGridEl().dom); }, getTargetFromEvent : function(e){ var t = Ext.lib.Event.getTarget(e), cindex = this.view.findCellIndex(t); if(cindex !== false){ return this.view.getHeaderCell(cindex); } }, nextVisible : function(h){ var v = this.view, cm = this.grid.colModel; h = h.nextSibling; while(h){ if(!cm.isHidden(v.getCellIndex(h))){ return h; } h = h.nextSibling; } return null; }, prevVisible : function(h){ var v = this.view, cm = this.grid.colModel; h = h.prevSibling; while(h){ if(!cm.isHidden(v.getCellIndex(h))){ return h; } h = h.prevSibling; } return null; }, positionIndicator : function(h, n, e){ var x = Ext.lib.Event.getPageX(e), r = Ext.lib.Dom.getRegion(n.firstChild), px, pt, py = r.top + this.proxyOffsets[1]; if((r.right - x) <= (r.right-r.left)/2){ px = r.right+this.view.borderWidth; pt = "after"; }else{ px = r.left; pt = "before"; } if(this.grid.colModel.isFixed(this.view.getCellIndex(n))){ return false; } px += this.proxyOffsets[0]; this.proxyTop.setLeftTop(px, py); this.proxyTop.show(); if(!this.bottomOffset){ this.bottomOffset = this.view.mainHd.getHeight(); } this.proxyBottom.setLeftTop(px, py+this.proxyTop.dom.offsetHeight+this.bottomOffset); this.proxyBottom.show(); return pt; }, onNodeEnter : function(n, dd, e, data){ if(data.header != n){ this.positionIndicator(data.header, n, e); } }, onNodeOver : function(n, dd, e, data){ var result = false; if(data.header != n){ result = this.positionIndicator(data.header, n, e); } if(!result){ this.proxyTop.hide(); this.proxyBottom.hide(); } return result ? this.dropAllowed : this.dropNotAllowed; }, onNodeOut : function(n, dd, e, data){ this.proxyTop.hide(); this.proxyBottom.hide(); }, onNodeDrop : function(n, dd, e, data){ var h = data.header; if(h != n){ var cm = this.grid.colModel, x = Ext.lib.Event.getPageX(e), r = Ext.lib.Dom.getRegion(n.firstChild), pt = (r.right - x) <= ((r.right-r.left)/2) ? "after" : "before", oldIndex = this.view.getCellIndex(h), newIndex = this.view.getCellIndex(n); if(pt == "after"){ newIndex++; } if(oldIndex < newIndex){ newIndex--; } cm.moveColumn(oldIndex, newIndex); return true; } return false; } }); Ext.grid.GridView.ColumnDragZone = Ext.extend(Ext.grid.HeaderDragZone, { constructor : function(grid, hd){ Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, grid, hd, null); this.proxy.el.addClass('x-grid3-col-dd'); }, handleMouseDown : function(e){ }, callHandleMouseDown : function(e){ Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this, e); } }); Ext.grid.SplitDragZone = Ext.extend(Ext.dd.DDProxy, { fly: Ext.Element.fly, constructor : function(grid, hd, hd2){ this.grid = grid; this.view = grid.getView(); this.proxy = this.view.resizeProxy; Ext.grid.SplitDragZone.superclass.constructor.call(this, hd, "gridSplitters" + this.grid.getGridEl().id, { dragElId : Ext.id(this.proxy.dom), resizeFrame:false }); this.setHandleElId(Ext.id(hd)); this.setOuterHandleElId(Ext.id(hd2)); this.scroll = false; }, b4StartDrag : function(x, y){ this.view.headersDisabled = true; this.proxy.setHeight(this.view.mainWrap.getHeight()); var w = this.cm.getColumnWidth(this.cellIndex); var minw = Math.max(w-this.grid.minColumnWidth, 0); this.resetConstraints(); this.setXConstraint(minw, 1000); this.setYConstraint(0, 0); this.minX = x - minw; this.maxX = x + 1000; this.startPos = x; Ext.dd.DDProxy.prototype.b4StartDrag.call(this, x, y); }, handleMouseDown : function(e){ var ev = Ext.EventObject.setEvent(e); var t = this.fly(ev.getTarget()); if(t.hasClass("x-grid-split")){ this.cellIndex = this.view.getCellIndex(t.dom); this.split = t.dom; this.cm = this.grid.colModel; if(this.cm.isResizable(this.cellIndex) && !this.cm.isFixed(this.cellIndex)){ Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this, arguments); } } }, endDrag : function(e){ this.view.headersDisabled = false; var endX = Math.max(this.minX, Ext.lib.Event.getPageX(e)); var diff = endX - this.startPos; this.view.onColumnSplitterMoved(this.cellIndex, this.cm.getColumnWidth(this.cellIndex)+diff); }, autoOffset : function(){ this.setDelta(0,0); } }); Ext.grid.GridDragZone = function(grid, config){ this.view = grid.getView(); Ext.grid.GridDragZone.superclass.constructor.call(this, this.view.mainBody.dom, config); this.scroll = false; this.grid = grid; this.ddel = document.createElement('div'); this.ddel.className = 'x-grid-dd-wrap'; }; Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, { ddGroup : "GridDD", getDragData : function(e){ var t = Ext.lib.Event.getTarget(e); var rowIndex = this.view.findRowIndex(t); if(rowIndex !== false){ var sm = this.grid.selModel; if(!sm.isSelected(rowIndex) || e.hasModifier()){ sm.handleMouseDown(this.grid, rowIndex, e); } return {grid: this.grid, ddel: this.ddel, rowIndex: rowIndex, selections:sm.getSelections()}; } return false; }, onInitDrag : function(e){ var data = this.dragData; this.ddel.innerHTML = this.grid.getDragDropText(); this.proxy.update(this.ddel); }, afterRepair : function(){ this.dragging = false; }, getRepairXY : function(e, data){ return false; }, onEndDrag : function(data, e){ }, onValidDrop : function(dd, e, id){ this.hideProxy(); }, beforeInvalidDrop : function(e, id){ } }); Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { defaultWidth: 100, defaultSortable: false, constructor : function(config) { if (config.columns) { Ext.apply(this, config); this.setConfig(config.columns, true); } else { this.setConfig(config, true); } this.addEvents( "widthchange", "headerchange", "hiddenchange", "columnmoved", "configchange" ); Ext.grid.ColumnModel.superclass.constructor.call(this); }, getColumnId : function(index) { return this.config[index].id; }, getColumnAt : function(index) { return this.config[index]; }, setConfig : function(config, initial) { var i, c, len; if (!initial) { delete this.totalWidth; for (i = 0, len = this.config.length; i < len; i++) { c = this.config[i]; if (c.setEditor) { c.setEditor(null); } } } this.defaults = Ext.apply({ width: this.defaultWidth, sortable: this.defaultSortable }, this.defaults); this.config = config; this.lookup = {}; for (i = 0, len = config.length; i < len; i++) { c = Ext.applyIf(config[i], this.defaults); if (Ext.isEmpty(c.id)) { c.id = i; } if (!c.isColumn) { var Cls = Ext.grid.Column.types[c.xtype || 'gridcolumn']; c = new Cls(c); config[i] = c; } this.lookup[c.id] = c; } if (!initial) { this.fireEvent('configchange', this); } }, getColumnById : function(id) { return this.lookup[id]; }, getIndexById : function(id) { for (var i = 0, len = this.config.length; i < len; i++) { if (this.config[i].id == id) { return i; } } return -1; }, moveColumn : function(oldIndex, newIndex) { var config = this.config, c = config[oldIndex]; config.splice(oldIndex, 1); config.splice(newIndex, 0, c); this.dataMap = null; this.fireEvent("columnmoved", this, oldIndex, newIndex); }, getColumnCount : function(visibleOnly) { var length = this.config.length, c = 0, i; if (visibleOnly === true) { for (i = 0; i < length; i++) { if (!this.isHidden(i)) { c++; } } return c; } return length; }, getColumnsBy : function(fn, scope) { var config = this.config, length = config.length, result = [], i, c; for (i = 0; i < length; i++){ c = config[i]; if (fn.call(scope || this, c, i) === true) { result[result.length] = c; } } return result; }, isSortable : function(col) { return !!this.config[col].sortable; }, isMenuDisabled : function(col) { return !!this.config[col].menuDisabled; }, getRenderer : function(col) { return this.config[col].renderer || Ext.grid.ColumnModel.defaultRenderer; }, getRendererScope : function(col) { return this.config[col].scope; }, setRenderer : function(col, fn) { this.config[col].renderer = fn; }, getColumnWidth : function(col) { var width = this.config[col].width; if(typeof width != 'number'){ width = this.defaultWidth; } return width; }, setColumnWidth : function(col, width, suppressEvent) { this.config[col].width = width; this.totalWidth = null; if (!suppressEvent) { this.fireEvent("widthchange", this, col, width); } }, getTotalWidth : function(includeHidden) { if (!this.totalWidth) { this.totalWidth = 0; for (var i = 0, len = this.config.length; i < len; i++) { if (includeHidden || !this.isHidden(i)) { this.totalWidth += this.getColumnWidth(i); } } } return this.totalWidth; }, getColumnHeader : function(col) { return this.config[col].header; }, setColumnHeader : function(col, header) { this.config[col].header = header; this.fireEvent("headerchange", this, col, header); }, getColumnTooltip : function(col) { return this.config[col].tooltip; }, setColumnTooltip : function(col, tooltip) { this.config[col].tooltip = tooltip; }, getDataIndex : function(col) { return this.config[col].dataIndex; }, setDataIndex : function(col, dataIndex) { this.config[col].dataIndex = dataIndex; }, findColumnIndex : function(dataIndex) { var c = this.config; for(var i = 0, len = c.length; i < len; i++){ if(c[i].dataIndex == dataIndex){ return i; } } return -1; }, isCellEditable : function(colIndex, rowIndex) { var c = this.config[colIndex], ed = c.editable; return !!(ed || (!Ext.isDefined(ed) && c.editor)); }, getCellEditor : function(colIndex, rowIndex) { return this.config[colIndex].getCellEditor(rowIndex); }, setEditable : function(col, editable) { this.config[col].editable = editable; }, isHidden : function(colIndex) { return !!this.config[colIndex].hidden; }, isFixed : function(colIndex) { return !!this.config[colIndex].fixed; }, isResizable : function(colIndex) { return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true; }, setHidden : function(colIndex, hidden) { var c = this.config[colIndex]; if(c.hidden !== hidden){ c.hidden = hidden; this.totalWidth = null; this.fireEvent("hiddenchange", this, colIndex, hidden); } }, setEditor : function(col, editor) { this.config[col].setEditor(editor); }, destroy : function() { var length = this.config.length, i = 0; for (; i < length; i++){ this.config[i].destroy(); } delete this.config; delete this.lookup; this.purgeListeners(); }, setState : function(col, state) { state = Ext.applyIf(state, this.defaults); Ext.apply(this.config[col], state); } }); Ext.grid.ColumnModel.defaultRenderer = function(value) { if (typeof value == "string" && value.length < 1) { return " "; } return value; }; Ext.grid.AbstractSelectionModel = Ext.extend(Ext.util.Observable, { constructor : function(){ this.locked = false; Ext.grid.AbstractSelectionModel.superclass.constructor.call(this); }, init : function(grid){ this.grid = grid; if(this.lockOnInit){ delete this.lockOnInit; this.locked = false; this.lock(); } this.initEvents(); }, lock : function(){ if(!this.locked){ this.locked = true; var g = this.grid; if(g){ g.getView().on({ scope: this, beforerefresh: this.sortUnLock, refresh: this.sortLock }); }else{ this.lockOnInit = true; } } }, sortLock : function() { this.locked = true; }, sortUnLock : function() { this.locked = false; }, unlock : function(){ if(this.locked){ this.locked = false; var g = this.grid, gv; if(g){ gv = g.getView(); gv.un('beforerefresh', this.sortUnLock, this); gv.un('refresh', this.sortLock, this); }else{ delete this.lockOnInit; } } }, isLocked : function(){ return this.locked; }, destroy: function(){ this.unlock(); this.purgeListeners(); } }); Ext.grid.RowSelectionModel = Ext.extend(Ext.grid.AbstractSelectionModel, { singleSelect : false, constructor : function(config){ Ext.apply(this, config); this.selections = new Ext.util.MixedCollection(false, function(o){ return o.id; }); this.last = false; this.lastActive = false; this.addEvents( 'selectionchange', 'beforerowselect', 'rowselect', 'rowdeselect' ); Ext.grid.RowSelectionModel.superclass.constructor.call(this); }, initEvents : function(){ if(!this.grid.enableDragDrop && !this.grid.enableDrag){ this.grid.on('rowmousedown', this.handleMouseDown, this); } this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), { up: this.onKeyPress, down: this.onKeyPress, scope: this }); this.grid.getView().on({ scope: this, refresh: this.onRefresh, rowupdated: this.onRowUpdated, rowremoved: this.onRemove }); }, onKeyPress : function(e, name){ var up = name == 'up', method = up ? 'selectPrevious' : 'selectNext', add = up ? -1 : 1, last; if(!e.shiftKey || this.singleSelect){ this[method](false); }else if(this.last !== false && this.lastActive !== false){ last = this.last; this.selectRange(this.last, this.lastActive + add); this.grid.getView().focusRow(this.lastActive); if(last !== false){ this.last = last; } }else{ this.selectFirstRow(); } }, onRefresh : function(){ var ds = this.grid.store, s = this.getSelections(), i = 0, len = s.length, index, r; this.silent = true; this.clearSelections(true); for(; i < len; i++){ r = s[i]; if((index = ds.indexOfId(r.id)) != -1){ this.selectRow(index, true); } } if(s.length != this.selections.getCount()){ this.fireEvent('selectionchange', this); } this.silent = false; }, onRemove : function(v, index, r){ if(this.selections.remove(r) !== false){ this.fireEvent('selectionchange', this); } }, onRowUpdated : function(v, index, r){ if(this.isSelected(r)){ v.onRowSelect(index); } }, selectRecords : function(records, keepExisting){ if(!keepExisting){ this.clearSelections(); } var ds = this.grid.store, i = 0, len = records.length; for(; i < len; i++){ this.selectRow(ds.indexOf(records[i]), true); } }, getCount : function(){ return this.selections.length; }, selectFirstRow : function(){ this.selectRow(0); }, selectLastRow : function(keepExisting){ this.selectRow(this.grid.store.getCount() - 1, keepExisting); }, selectNext : function(keepExisting){ if(this.hasNext()){ this.selectRow(this.last+1, keepExisting); this.grid.getView().focusRow(this.last); return true; } return false; }, selectPrevious : function(keepExisting){ if(this.hasPrevious()){ this.selectRow(this.last-1, keepExisting); this.grid.getView().focusRow(this.last); return true; } return false; }, hasNext : function(){ return this.last !== false && (this.last+1) < this.grid.store.getCount(); }, hasPrevious : function(){ return !!this.last; }, getSelections : function(){ return [].concat(this.selections.items); }, getSelected : function(){ return this.selections.itemAt(0); }, each : function(fn, scope){ var s = this.getSelections(), i = 0, len = s.length; for(; i < len; i++){ if(fn.call(scope || this, s[i], i) === false){ return false; } } return true; }, clearSelections : function(fast){ if(this.isLocked()){ return; } if(fast !== true){ var ds = this.grid.store, s = this.selections; s.each(function(r){ this.deselectRow(ds.indexOfId(r.id)); }, this); s.clear(); }else{ this.selections.clear(); } this.last = false; }, selectAll : function(){ if(this.isLocked()){ return; } this.selections.clear(); for(var i = 0, len = this.grid.store.getCount(); i < len; i++){ this.selectRow(i, true); } }, hasSelection : function(){ return this.selections.length > 0; }, isSelected : function(index){ var r = Ext.isNumber(index) ? this.grid.store.getAt(index) : index; return (r && this.selections.key(r.id) ? true : false); }, isIdSelected : function(id){ return (this.selections.key(id) ? true : false); }, handleMouseDown : function(g, rowIndex, e){ if(e.button !== 0 || this.isLocked()){ return; } var view = this.grid.getView(); if(e.shiftKey && !this.singleSelect && this.last !== false){ var last = this.last; this.selectRange(last, rowIndex, e.ctrlKey); this.last = last; view.focusRow(rowIndex); }else{ var isSelected = this.isSelected(rowIndex); if(e.ctrlKey && isSelected){ this.deselectRow(rowIndex); }else if(!isSelected || this.getCount() > 1){ this.selectRow(rowIndex, e.ctrlKey || e.shiftKey); view.focusRow(rowIndex); } } }, selectRows : function(rows, keepExisting){ if(!keepExisting){ this.clearSelections(); } for(var i = 0, len = rows.length; i < len; i++){ this.selectRow(rows[i], true); } }, selectRange : function(startRow, endRow, keepExisting){ var i; if(this.isLocked()){ return; } if(!keepExisting){ this.clearSelections(); } if(startRow <= endRow){ for(i = startRow; i <= endRow; i++){ this.selectRow(i, true); } }else{ for(i = startRow; i >= endRow; i--){ this.selectRow(i, true); } } }, deselectRange : function(startRow, endRow, preventViewNotify){ if(this.isLocked()){ return; } for(var i = startRow; i <= endRow; i++){ this.deselectRow(i, preventViewNotify); } }, selectRow : function(index, keepExisting, preventViewNotify){ if(this.isLocked() || (index < 0 || index >= this.grid.store.getCount()) || (keepExisting && this.isSelected(index))){ return; } var r = this.grid.store.getAt(index); if(r && this.fireEvent('beforerowselect', this, index, keepExisting, r) !== false){ if(!keepExisting || this.singleSelect){ this.clearSelections(); } this.selections.add(r); this.last = this.lastActive = index; if(!preventViewNotify){ this.grid.getView().onRowSelect(index); } if(!this.silent){ this.fireEvent('rowselect', this, index, r); this.fireEvent('selectionchange', this); } } }, deselectRow : function(index, preventViewNotify){ if(this.isLocked()){ return; } if(this.last == index){ this.last = false; } if(this.lastActive == index){ this.lastActive = false; } var r = this.grid.store.getAt(index); if(r){ this.selections.remove(r); if(!preventViewNotify){ this.grid.getView().onRowDeselect(index); } this.fireEvent('rowdeselect', this, index, r); this.fireEvent('selectionchange', this); } }, acceptsNav : function(row, col, cm){ return !cm.isHidden(col) && cm.isCellEditable(col, row); }, onEditorKey : function(field, e){ var k = e.getKey(), newCell, g = this.grid, last = g.lastEdit, ed = g.activeEditor, shift = e.shiftKey, ae, last, r, c; if(k == e.TAB){ e.stopEvent(); ed.completeEdit(); if(shift){ newCell = g.walkCells(ed.row, ed.col-1, -1, this.acceptsNav, this); }else{ newCell = g.walkCells(ed.row, ed.col+1, 1, this.acceptsNav, this); } }else if(k == e.ENTER){ if(this.moveEditorOnEnter !== false){ if(shift){ newCell = g.walkCells(last.row - 1, last.col, -1, this.acceptsNav, this); }else{ newCell = g.walkCells(last.row + 1, last.col, 1, this.acceptsNav, this); } } } if(newCell){ r = newCell[0]; c = newCell[1]; this.onEditorSelect(r, last.row); if(g.isEditor && g.editing){ ae = g.activeEditor; if(ae && ae.field.triggerBlur){ ae.field.triggerBlur(); } } g.startEditing(r, c); } }, onEditorSelect: function(row, lastRow){ if(lastRow != row){ this.selectRow(row); } }, destroy : function(){ Ext.destroy(this.rowNav); this.rowNav = null; Ext.grid.RowSelectionModel.superclass.destroy.call(this); } }); Ext.grid.Column = Ext.extend(Ext.util.Observable, { isColumn : true, constructor : function(config){ Ext.apply(this, config); if(Ext.isString(this.renderer)){ this.renderer = Ext.util.Format[this.renderer]; }else if(Ext.isObject(this.renderer)){ this.scope = this.renderer.scope; this.renderer = this.renderer.fn; } if(!this.scope){ this.scope = this; } var ed = this.editor; delete this.editor; this.setEditor(ed); this.addEvents( 'click', 'contextmenu', 'dblclick', 'mousedown' ); Ext.grid.Column.superclass.constructor.call(this); }, processEvent : function(name, e, grid, rowIndex, colIndex){ return this.fireEvent(name, this, grid, rowIndex, e); }, destroy: function() { if(this.setEditor){ this.setEditor(null); } this.purgeListeners(); }, renderer : function(value){ return value; }, getEditor: function(rowIndex){ return this.editable !== false ? this.editor : null; }, setEditor : function(editor){ var ed = this.editor; if(ed){ if(ed.gridEditor){ ed.gridEditor.destroy(); delete ed.gridEditor; }else{ ed.destroy(); } } this.editor = null; if(editor){ if(!editor.isXType){ editor = Ext.create(editor, 'textfield'); } this.editor = editor; } }, getCellEditor: function(rowIndex){ var ed = this.getEditor(rowIndex); if(ed){ if(!ed.startEdit){ if(!ed.gridEditor){ ed.gridEditor = new Ext.grid.GridEditor(ed); } ed = ed.gridEditor; } } return ed; } }); Ext.grid.BooleanColumn = Ext.extend(Ext.grid.Column, { trueText: 'true', falseText: 'false', undefinedText: ' ', constructor: function(cfg){ Ext.grid.BooleanColumn.superclass.constructor.call(this, cfg); var t = this.trueText, f = this.falseText, u = this.undefinedText; this.renderer = function(v){ if(v === undefined){ return u; } if(!v || v === 'false'){ return f; } return t; }; } }); Ext.grid.NumberColumn = Ext.extend(Ext.grid.Column, { format : '0,000.00', constructor: function(cfg){ Ext.grid.NumberColumn.superclass.constructor.call(this, cfg); this.renderer = Ext.util.Format.numberRenderer(this.format); } }); Ext.grid.DateColumn = Ext.extend(Ext.grid.Column, { format : 'm/d/Y', constructor: function(cfg){ Ext.grid.DateColumn.superclass.constructor.call(this, cfg); this.renderer = Ext.util.Format.dateRenderer(this.format); } }); Ext.grid.TemplateColumn = Ext.extend(Ext.grid.Column, { constructor: function(cfg){ Ext.grid.TemplateColumn.superclass.constructor.call(this, cfg); var tpl = (!Ext.isPrimitive(this.tpl) && this.tpl.compile) ? this.tpl : new Ext.XTemplate(this.tpl); this.renderer = function(value, p, r){ return tpl.apply(r.data); }; this.tpl = tpl; } }); Ext.grid.ActionColumn = Ext.extend(Ext.grid.Column, { header: ' ', actionIdRe: /x-action-col-(\d+)/, altText: '', constructor: function(cfg) { var me = this, items = cfg.items || (me.items = [me]), l = items.length, i, item; Ext.grid.ActionColumn.superclass.constructor.call(me, cfg); me.renderer = function(v, meta) { v = Ext.isFunction(cfg.renderer) ? cfg.renderer.apply(this, arguments)||'' : ''; meta.css += ' x-action-col-cell'; for (i = 0; i < l; i++) { item = items[i]; v += '' + (item.altText || me.altText) + ''; } return v; }; }, destroy: function() { delete this.items; delete this.renderer; return Ext.grid.ActionColumn.superclass.destroy.apply(this, arguments); }, processEvent : function(name, e, grid, rowIndex, colIndex){ var m = e.getTarget().className.match(this.actionIdRe), item, fn; if (m && (item = this.items[parseInt(m[1], 10)])) { if (name == 'click') { (fn = item.handler || this.handler) && fn.call(item.scope||this.scope||this, grid, rowIndex, colIndex, item, e); } else if ((name == 'mousedown') && (item.stopSelection !== false)) { return false; } } return Ext.grid.ActionColumn.superclass.processEvent.apply(this, arguments); } }); Ext.grid.Column.types = { gridcolumn : Ext.grid.Column, booleancolumn: Ext.grid.BooleanColumn, numbercolumn: Ext.grid.NumberColumn, datecolumn: Ext.grid.DateColumn, templatecolumn: Ext.grid.TemplateColumn, actioncolumn: Ext.grid.ActionColumn }; Ext.grid.RowNumberer = Ext.extend(Object, { header: "", width: 23, sortable: false, constructor : function(config){ Ext.apply(this, config); if(this.rowspan){ this.renderer = this.renderer.createDelegate(this); } }, fixed:true, hideable: false, menuDisabled:true, dataIndex: '', id: 'numberer', rowspan: undefined, renderer : function(v, p, record, rowIndex){ if(this.rowspan){ p.cellAttr = 'rowspan="'+this.rowspan+'"'; } return rowIndex+1; } }); Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, { header : '
     
    ', width : 20, sortable : false, menuDisabled : true, fixed : true, hideable: false, dataIndex : '', id : 'checker', isColumn: true, constructor : function(){ Ext.grid.CheckboxSelectionModel.superclass.constructor.apply(this, arguments); if(this.checkOnly){ this.handleMouseDown = Ext.emptyFn; } }, initEvents : function(){ Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this); this.grid.on('render', function(){ Ext.fly(this.grid.getView().innerHd).on('mousedown', this.onHdMouseDown, this); }, this); }, processEvent : function(name, e, grid, rowIndex, colIndex){ if (name == 'mousedown') { this.onMouseDown(e, e.getTarget()); return false; } else { return Ext.grid.Column.prototype.processEvent.apply(this, arguments); } }, onMouseDown : function(e, t){ if(e.button === 0 && t.className == 'x-grid3-row-checker'){ e.stopEvent(); var row = e.getTarget('.x-grid3-row'); if(row){ var index = row.rowIndex; if(this.isSelected(index)){ this.deselectRow(index); }else{ this.selectRow(index, true); this.grid.getView().focusRow(index); } } } }, onHdMouseDown : function(e, t) { if(t.className == 'x-grid3-hd-checker'){ e.stopEvent(); var hd = Ext.fly(t.parentNode); var isChecked = hd.hasClass('x-grid3-hd-checker-on'); if(isChecked){ hd.removeClass('x-grid3-hd-checker-on'); this.clearSelections(); }else{ hd.addClass('x-grid3-hd-checker-on'); this.selectAll(); } } }, renderer : function(v, p, record){ return '
     
    '; }, onEditorSelect: function(row, lastRow){ if(lastRow != row && !this.checkOnly){ this.selectRow(row); } } }); Ext.grid.CellSelectionModel = Ext.extend(Ext.grid.AbstractSelectionModel, { constructor : function(config){ Ext.apply(this, config); this.selection = null; this.addEvents( "beforecellselect", "cellselect", "selectionchange" ); Ext.grid.CellSelectionModel.superclass.constructor.call(this); }, initEvents : function(){ this.grid.on('cellmousedown', this.handleMouseDown, this); this.grid.on(Ext.EventManager.getKeyEvent(), this.handleKeyDown, this); this.grid.getView().on({ scope: this, refresh: this.onViewChange, rowupdated: this.onRowUpdated, beforerowremoved: this.clearSelections, beforerowsinserted: this.clearSelections }); if(this.grid.isEditor){ this.grid.on('beforeedit', this.beforeEdit, this); } }, beforeEdit : function(e){ this.select(e.row, e.column, false, true, e.record); }, onRowUpdated : function(v, index, r){ if(this.selection && this.selection.record == r){ v.onCellSelect(index, this.selection.cell[1]); } }, onViewChange : function(){ this.clearSelections(true); }, getSelectedCell : function(){ return this.selection ? this.selection.cell : null; }, clearSelections : function(preventNotify){ var s = this.selection; if(s){ if(preventNotify !== true){ this.grid.view.onCellDeselect(s.cell[0], s.cell[1]); } this.selection = null; this.fireEvent("selectionchange", this, null); } }, hasSelection : function(){ return this.selection ? true : false; }, handleMouseDown : function(g, row, cell, e){ if(e.button !== 0 || this.isLocked()){ return; } this.select(row, cell); }, select : function(rowIndex, colIndex, preventViewNotify, preventFocus, r){ if(this.fireEvent("beforecellselect", this, rowIndex, colIndex) !== false){ this.clearSelections(); r = r || this.grid.store.getAt(rowIndex); this.selection = { record : r, cell : [rowIndex, colIndex] }; if(!preventViewNotify){ var v = this.grid.getView(); v.onCellSelect(rowIndex, colIndex); if(preventFocus !== true){ v.focusCell(rowIndex, colIndex); } } this.fireEvent("cellselect", this, rowIndex, colIndex); this.fireEvent("selectionchange", this, this.selection); } }, isSelectable : function(rowIndex, colIndex, cm){ return !cm.isHidden(colIndex); }, onEditorKey: function(field, e){ if(e.getKey() == e.TAB){ this.handleKeyDown(e); } }, handleKeyDown : function(e){ if(!e.isNavKeyPress()){ return; } var k = e.getKey(), g = this.grid, s = this.selection, sm = this, walk = function(row, col, step){ return g.walkCells( row, col, step, g.isEditor && g.editing ? sm.acceptsNav : sm.isSelectable, sm ); }, cell, newCell, r, c, ae; switch(k){ case e.ESC: case e.PAGE_UP: case e.PAGE_DOWN: break; default: e.stopEvent(); break; } if(!s){ cell = walk(0, 0, 1); if(cell){ this.select(cell[0], cell[1]); } return; } cell = s.cell; r = cell[0]; c = cell[1]; switch(k){ case e.TAB: if(e.shiftKey){ newCell = walk(r, c - 1, -1); }else{ newCell = walk(r, c + 1, 1); } break; case e.DOWN: newCell = walk(r + 1, c, 1); break; case e.UP: newCell = walk(r - 1, c, -1); break; case e.RIGHT: newCell = walk(r, c + 1, 1); break; case e.LEFT: newCell = walk(r, c - 1, -1); break; case e.ENTER: if (g.isEditor && !g.editing) { g.startEditing(r, c); return; } break; } if(newCell){ r = newCell[0]; c = newCell[1]; this.select(r, c); if(g.isEditor && g.editing){ ae = g.activeEditor; if(ae && ae.field.triggerBlur){ ae.field.triggerBlur(); } g.startEditing(r, c); } } }, acceptsNav : function(row, col, cm){ return !cm.isHidden(col) && cm.isCellEditable(col, row); } }); Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, { clicksToEdit: 2, forceValidation: false, isEditor : true, detectEdit: false, autoEncode : false, trackMouseOver: false, initComponent : function(){ Ext.grid.EditorGridPanel.superclass.initComponent.call(this); if(!this.selModel){ this.selModel = new Ext.grid.CellSelectionModel(); } this.activeEditor = null; this.addEvents( "beforeedit", "afteredit", "validateedit" ); }, initEvents : function(){ Ext.grid.EditorGridPanel.superclass.initEvents.call(this); this.getGridEl().on('mousewheel', this.stopEditing.createDelegate(this, [true]), this); this.on('columnresize', this.stopEditing, this, [true]); if(this.clicksToEdit == 1){ this.on("cellclick", this.onCellDblClick, this); }else { var view = this.getView(); if(this.clicksToEdit == 'auto' && view.mainBody){ view.mainBody.on('mousedown', this.onAutoEditClick, this); } this.on('celldblclick', this.onCellDblClick, this); } }, onResize : function(){ Ext.grid.EditorGridPanel.superclass.onResize.apply(this, arguments); var ae = this.activeEditor; if(this.editing && ae){ ae.realign(true); } }, onCellDblClick : function(g, row, col){ this.startEditing(row, col); }, onAutoEditClick : function(e, t){ if(e.button !== 0){ return; } var row = this.view.findRowIndex(t), col = this.view.findCellIndex(t); if(row !== false && col !== false){ this.stopEditing(); if(this.selModel.getSelectedCell){ var sc = this.selModel.getSelectedCell(); if(sc && sc[0] === row && sc[1] === col){ this.startEditing(row, col); } }else{ if(this.selModel.isSelected(row)){ this.startEditing(row, col); } } } }, onEditComplete : function(ed, value, startValue){ this.editing = false; this.lastActiveEditor = this.activeEditor; this.activeEditor = null; var r = ed.record, field = this.colModel.getDataIndex(ed.col); value = this.postEditValue(value, startValue, r, field); if(this.forceValidation === true || String(value) !== String(startValue)){ var e = { grid: this, record: r, field: field, originalValue: startValue, value: value, row: ed.row, column: ed.col, cancel:false }; if(this.fireEvent("validateedit", e) !== false && !e.cancel && String(value) !== String(startValue)){ r.set(field, e.value); delete e.cancel; this.fireEvent("afteredit", e); } } this.view.focusCell(ed.row, ed.col); }, startEditing : function(row, col){ this.stopEditing(); if(this.colModel.isCellEditable(col, row)){ this.view.ensureVisible(row, col, true); var r = this.store.getAt(row), field = this.colModel.getDataIndex(col), e = { grid: this, record: r, field: field, value: r.data[field], row: row, column: col, cancel:false }; if(this.fireEvent("beforeedit", e) !== false && !e.cancel){ this.editing = true; var ed = this.colModel.getCellEditor(col, row); if(!ed){ return; } if(!ed.rendered){ ed.parentEl = this.view.getEditorParent(ed); ed.on({ scope: this, render: { fn: function(c){ c.field.focus(false, true); }, single: true, scope: this }, specialkey: function(field, e){ this.getSelectionModel().onEditorKey(field, e); }, complete: this.onEditComplete, canceledit: this.stopEditing.createDelegate(this, [true]) }); } Ext.apply(ed, { row : row, col : col, record : r }); this.lastEdit = { row: row, col: col }; this.activeEditor = ed; ed.selectSameEditor = (this.activeEditor == this.lastActiveEditor); var v = this.preEditValue(r, field); ed.startEdit(this.view.getCell(row, col).firstChild, Ext.isDefined(v) ? v : ''); (function(){ delete ed.selectSameEditor; }).defer(50); } } }, preEditValue : function(r, field){ var value = r.data[field]; return this.autoEncode && Ext.isString(value) ? Ext.util.Format.htmlDecode(value) : value; }, postEditValue : function(value, originalValue, r, field){ return this.autoEncode && Ext.isString(value) ? Ext.util.Format.htmlEncode(value) : value; }, stopEditing : function(cancel){ if(this.editing){ var ae = this.lastActiveEditor = this.activeEditor; if(ae){ ae[cancel === true ? 'cancelEdit' : 'completeEdit'](); this.view.focusCell(ae.row, ae.col); } this.activeEditor = null; } this.editing = false; } }); Ext.reg('editorgrid', Ext.grid.EditorGridPanel); Ext.grid.GridEditor = function(field, config){ Ext.grid.GridEditor.superclass.constructor.call(this, field, config); field.monitorTab = false; }; Ext.extend(Ext.grid.GridEditor, Ext.Editor, { alignment: "tl-tl", autoSize: "width", hideEl : false, cls: "x-small-editor x-grid-editor", shim:false, shadow:false }); Ext.grid.PropertyRecord = Ext.data.Record.create([ {name:'name',type:'string'}, 'value' ]); Ext.grid.PropertyStore = Ext.extend(Ext.util.Observable, { constructor : function(grid, source){ this.grid = grid; this.store = new Ext.data.Store({ recordType : Ext.grid.PropertyRecord }); this.store.on('update', this.onUpdate, this); if(source){ this.setSource(source); } Ext.grid.PropertyStore.superclass.constructor.call(this); }, setSource : function(o){ this.source = o; this.store.removeAll(); var data = []; for(var k in o){ if(this.isEditableValue(o[k])){ data.push(new Ext.grid.PropertyRecord({name: k, value: o[k]}, k)); } } this.store.loadRecords({records: data}, {}, true); }, onUpdate : function(ds, record, type){ if(type == Ext.data.Record.EDIT){ var v = record.data.value; var oldValue = record.modified.value; if(this.grid.fireEvent('beforepropertychange', this.source, record.id, v, oldValue) !== false){ this.source[record.id] = v; record.commit(); this.grid.fireEvent('propertychange', this.source, record.id, v, oldValue); }else{ record.reject(); } } }, getProperty : function(row){ return this.store.getAt(row); }, isEditableValue: function(val){ return Ext.isPrimitive(val) || Ext.isDate(val); }, setValue : function(prop, value, create){ var r = this.getRec(prop); if(r){ r.set('value', value); this.source[prop] = value; }else if(create){ this.source[prop] = value; r = new Ext.grid.PropertyRecord({name: prop, value: value}, prop); this.store.add(r); } }, remove : function(prop){ var r = this.getRec(prop); if(r){ this.store.remove(r); delete this.source[prop]; } }, getRec : function(prop){ return this.store.getById(prop); }, getSource : function(){ return this.source; } }); Ext.grid.PropertyColumnModel = Ext.extend(Ext.grid.ColumnModel, { nameText : 'Name', valueText : 'Value', dateFormat : 'm/j/Y', trueText: 'true', falseText: 'false', constructor : function(grid, store){ var g = Ext.grid, f = Ext.form; this.grid = grid; g.PropertyColumnModel.superclass.constructor.call(this, [ {header: this.nameText, width:50, sortable: true, dataIndex:'name', id: 'name', menuDisabled:true}, {header: this.valueText, width:50, resizable:false, dataIndex: 'value', id: 'value', menuDisabled:true} ]); this.store = store; var bfield = new f.Field({ autoCreate: {tag: 'select', children: [ {tag: 'option', value: 'true', html: this.trueText}, {tag: 'option', value: 'false', html: this.falseText} ]}, getValue : function(){ return this.el.dom.value == 'true'; } }); this.editors = { 'date' : new g.GridEditor(new f.DateField({selectOnFocus:true})), 'string' : new g.GridEditor(new f.TextField({selectOnFocus:true})), 'number' : new g.GridEditor(new f.NumberField({selectOnFocus:true, style:'text-align:left;'})), 'boolean' : new g.GridEditor(bfield, { autoSize: 'both' }) }; this.renderCellDelegate = this.renderCell.createDelegate(this); this.renderPropDelegate = this.renderProp.createDelegate(this); }, renderDate : function(dateVal){ return dateVal.dateFormat(this.dateFormat); }, renderBool : function(bVal){ return this[bVal ? 'trueText' : 'falseText']; }, isCellEditable : function(colIndex, rowIndex){ return colIndex == 1; }, getRenderer : function(col){ return col == 1 ? this.renderCellDelegate : this.renderPropDelegate; }, renderProp : function(v){ return this.getPropertyName(v); }, renderCell : function(val, meta, rec){ var renderer = this.grid.customRenderers[rec.get('name')]; if(renderer){ return renderer.apply(this, arguments); } var rv = val; if(Ext.isDate(val)){ rv = this.renderDate(val); }else if(typeof val == 'boolean'){ rv = this.renderBool(val); } return Ext.util.Format.htmlEncode(rv); }, getPropertyName : function(name){ var pn = this.grid.propertyNames; return pn && pn[name] ? pn[name] : name; }, getCellEditor : function(colIndex, rowIndex){ var p = this.store.getProperty(rowIndex), n = p.data.name, val = p.data.value; if(this.grid.customEditors[n]){ return this.grid.customEditors[n]; } if(Ext.isDate(val)){ return this.editors.date; }else if(typeof val == 'number'){ return this.editors.number; }else if(typeof val == 'boolean'){ return this.editors['boolean']; }else{ return this.editors.string; } }, destroy : function(){ Ext.grid.PropertyColumnModel.superclass.destroy.call(this); this.destroyEditors(this.editors); this.destroyEditors(this.grid.customEditors); }, destroyEditors: function(editors){ for(var ed in editors){ Ext.destroy(editors[ed]); } } }); Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, { enableColumnMove:false, stripeRows:false, trackMouseOver: false, clicksToEdit:1, enableHdMenu : false, viewConfig : { forceFit:true }, initComponent : function(){ this.customRenderers = this.customRenderers || {}; this.customEditors = this.customEditors || {}; this.lastEditRow = null; var store = new Ext.grid.PropertyStore(this); this.propStore = store; var cm = new Ext.grid.PropertyColumnModel(this, store); store.store.sort('name', 'ASC'); this.addEvents( 'beforepropertychange', 'propertychange' ); this.cm = cm; this.ds = store.store; Ext.grid.PropertyGrid.superclass.initComponent.call(this); this.mon(this.selModel, 'beforecellselect', function(sm, rowIndex, colIndex){ if(colIndex === 0){ this.startEditing.defer(200, this, [rowIndex, 1]); return false; } }, this); }, onRender : function(){ Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments); this.getGridEl().addClass('x-props-grid'); }, afterRender: function(){ Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments); if(this.source){ this.setSource(this.source); } }, setSource : function(source){ this.propStore.setSource(source); }, getSource : function(){ return this.propStore.getSource(); }, setProperty : function(prop, value, create){ this.propStore.setValue(prop, value, create); }, removeProperty : function(prop){ this.propStore.remove(prop); } }); Ext.reg("propertygrid", Ext.grid.PropertyGrid); Ext.grid.GroupingView = Ext.extend(Ext.grid.GridView, { groupByText : 'Group By This Field', showGroupsText : 'Show in Groups', hideGroupedColumn : false, showGroupName : true, startCollapsed : false, enableGrouping : true, enableGroupingMenu : true, enableNoGroups : true, emptyGroupText : '(None)', ignoreAdd : false, groupTextTpl : '{text}', groupMode: 'value', cancelEditOnToggle: true, initTemplates : function(){ Ext.grid.GroupingView.superclass.initTemplates.call(this); this.state = {}; var sm = this.grid.getSelectionModel(); sm.on(sm.selectRow ? 'beforerowselect' : 'beforecellselect', this.onBeforeRowSelect, this); if(!this.startGroup){ this.startGroup = new Ext.XTemplate( '
    ', '
    ', this.groupTextTpl ,'
    ', '
    ' ); } this.startGroup.compile(); if (!this.endGroup) { this.endGroup = '
    '; } }, findGroup : function(el){ return Ext.fly(el).up('.x-grid-group', this.mainBody.dom); }, getGroups : function(){ return this.hasRows() ? this.mainBody.dom.childNodes : []; }, onAdd : function(ds, records, index) { if (this.canGroup() && !this.ignoreAdd) { var ss = this.getScrollState(); this.fireEvent('beforerowsinserted', ds, index, index + (records.length-1)); this.refresh(); this.restoreScroll(ss); this.fireEvent('rowsinserted', ds, index, index + (records.length-1)); } else if (!this.canGroup()) { Ext.grid.GroupingView.superclass.onAdd.apply(this, arguments); } }, onRemove : function(ds, record, index, isUpdate){ Ext.grid.GroupingView.superclass.onRemove.apply(this, arguments); var g = document.getElementById(record._groupId); if(g && g.childNodes[1].childNodes.length < 1){ Ext.removeNode(g); } this.applyEmptyText(); }, refreshRow : function(record){ if(this.ds.getCount()==1){ this.refresh(); }else{ this.isUpdating = true; Ext.grid.GroupingView.superclass.refreshRow.apply(this, arguments); this.isUpdating = false; } }, beforeMenuShow : function(){ var item, items = this.hmenu.items, disabled = this.cm.config[this.hdCtxIndex].groupable === false; if((item = items.get('groupBy'))){ item.setDisabled(disabled); } if((item = items.get('showGroups'))){ item.setDisabled(disabled); item.setChecked(this.canGroup(), true); } }, renderUI : function(){ var markup = Ext.grid.GroupingView.superclass.renderUI.call(this); if(this.enableGroupingMenu && this.hmenu){ this.hmenu.add('-',{ itemId:'groupBy', text: this.groupByText, handler: this.onGroupByClick, scope: this, iconCls:'x-group-by-icon' }); if(this.enableNoGroups){ this.hmenu.add({ itemId:'showGroups', text: this.showGroupsText, checked: true, checkHandler: this.onShowGroupsClick, scope: this }); } this.hmenu.on('beforeshow', this.beforeMenuShow, this); } return markup; }, processEvent: function(name, e){ Ext.grid.GroupingView.superclass.processEvent.call(this, name, e); var hd = e.getTarget('.x-grid-group-hd', this.mainBody); if(hd){ var field = this.getGroupField(), prefix = this.getPrefix(field), groupValue = hd.id.substring(prefix.length), emptyRe = new RegExp('gp-' + Ext.escapeRe(field) + '--hd'); groupValue = groupValue.substr(0, groupValue.length - 3); if(groupValue || emptyRe.test(hd.id)){ this.grid.fireEvent('group' + name, this.grid, field, groupValue, e); } if(name == 'mousedown' && e.button == 0){ this.toggleGroup(hd.parentNode); } } }, onGroupByClick : function(){ var grid = this.grid; this.enableGrouping = true; grid.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex)); grid.fireEvent('groupchange', grid, grid.store.getGroupState()); this.beforeMenuShow(); this.refresh(); }, onShowGroupsClick : function(mi, checked){ this.enableGrouping = checked; if(checked){ this.onGroupByClick(); }else{ this.grid.store.clearGrouping(); this.grid.fireEvent('groupchange', this, null); } }, toggleRowIndex : function(rowIndex, expanded){ if(!this.canGroup()){ return; } var row = this.getRow(rowIndex); if(row){ this.toggleGroup(this.findGroup(row), expanded); } }, toggleGroup : function(group, expanded){ var gel = Ext.get(group), id = Ext.util.Format.htmlEncode(gel.id); expanded = Ext.isDefined(expanded) ? expanded : gel.hasClass('x-grid-group-collapsed'); if(this.state[id] !== expanded){ if (this.cancelEditOnToggle !== false) { this.grid.stopEditing(true); } this.state[id] = expanded; gel[expanded ? 'removeClass' : 'addClass']('x-grid-group-collapsed'); } }, toggleAllGroups : function(expanded){ var groups = this.getGroups(); for(var i = 0, len = groups.length; i < len; i++){ this.toggleGroup(groups[i], expanded); } }, expandAllGroups : function(){ this.toggleAllGroups(true); }, collapseAllGroups : function(){ this.toggleAllGroups(false); }, getGroup : function(v, r, groupRenderer, rowIndex, colIndex, ds){ var column = this.cm.config[colIndex], g = groupRenderer ? groupRenderer.call(column.scope, v, {}, r, rowIndex, colIndex, ds) : String(v); if(g === '' || g === ' '){ g = column.emptyGroupText || this.emptyGroupText; } return g; }, getGroupField : function(){ return this.grid.store.getGroupState(); }, afterRender : function(){ if(!this.ds || !this.cm){ return; } Ext.grid.GroupingView.superclass.afterRender.call(this); if(this.grid.deferRowRender){ this.updateGroupWidths(); } }, afterRenderUI: function () { Ext.grid.GroupingView.superclass.afterRenderUI.call(this); if (this.enableGroupingMenu && this.hmenu) { this.hmenu.add('-',{ itemId:'groupBy', text: this.groupByText, handler: this.onGroupByClick, scope: this, iconCls:'x-group-by-icon' }); if (this.enableNoGroups) { this.hmenu.add({ itemId:'showGroups', text: this.showGroupsText, checked: true, checkHandler: this.onShowGroupsClick, scope: this }); } this.hmenu.on('beforeshow', this.beforeMenuShow, this); } }, renderRows : function(){ var groupField = this.getGroupField(); var eg = !!groupField; if(this.hideGroupedColumn) { var colIndex = this.cm.findColumnIndex(groupField), hasLastGroupField = Ext.isDefined(this.lastGroupField); if(!eg && hasLastGroupField){ this.mainBody.update(''); this.cm.setHidden(this.cm.findColumnIndex(this.lastGroupField), false); delete this.lastGroupField; }else if (eg && !hasLastGroupField){ this.lastGroupField = groupField; this.cm.setHidden(colIndex, true); }else if (eg && hasLastGroupField && groupField !== this.lastGroupField) { this.mainBody.update(''); var oldIndex = this.cm.findColumnIndex(this.lastGroupField); this.cm.setHidden(oldIndex, false); this.lastGroupField = groupField; this.cm.setHidden(colIndex, true); } } return Ext.grid.GroupingView.superclass.renderRows.apply( this, arguments); }, doRender : function(cs, rs, ds, startRow, colCount, stripe){ if(rs.length < 1){ return ''; } if(!this.canGroup() || this.isUpdating){ return Ext.grid.GroupingView.superclass.doRender.apply(this, arguments); } var groupField = this.getGroupField(), colIndex = this.cm.findColumnIndex(groupField), g, gstyle = 'width:' + this.getTotalWidth() + ';', cfg = this.cm.config[colIndex], groupRenderer = cfg.groupRenderer || cfg.renderer, prefix = this.showGroupName ? (cfg.groupName || cfg.header)+': ' : '', groups = [], curGroup, i, len, gid; for(i = 0, len = rs.length; i < len; i++){ var rowIndex = startRow + i, r = rs[i], gvalue = r.data[groupField]; g = this.getGroup(gvalue, r, groupRenderer, rowIndex, colIndex, ds); if(!curGroup || curGroup.group != g){ gid = this.constructId(gvalue, groupField, colIndex); this.state[gid] = !(Ext.isDefined(this.state[gid]) ? !this.state[gid] : this.startCollapsed); curGroup = { group: g, gvalue: gvalue, text: prefix + g, groupId: gid, startRow: rowIndex, rs: [r], cls: this.state[gid] ? '' : 'x-grid-group-collapsed', style: gstyle }; groups.push(curGroup); }else{ curGroup.rs.push(r); } r._groupId = gid; } var buf = []; for(i = 0, len = groups.length; i < len; i++){ g = groups[i]; this.doGroupStart(buf, g, cs, ds, colCount); buf[buf.length] = Ext.grid.GroupingView.superclass.doRender.call( this, cs, g.rs, ds, g.startRow, colCount, stripe); this.doGroupEnd(buf, g, cs, ds, colCount); } return buf.join(''); }, getGroupId : function(value){ var field = this.getGroupField(); return this.constructId(value, field, this.cm.findColumnIndex(field)); }, constructId : function(value, field, idx){ var cfg = this.cm.config[idx], groupRenderer = cfg.groupRenderer || cfg.renderer, val = (this.groupMode == 'value') ? value : this.getGroup(value, {data:{}}, groupRenderer, 0, idx, this.ds); return this.getPrefix(field) + Ext.util.Format.htmlEncode(val); }, canGroup : function(){ return this.enableGrouping && !!this.getGroupField(); }, getPrefix: function(field){ return this.grid.getGridEl().id + '-gp-' + field + '-'; }, doGroupStart : function(buf, g, cs, ds, colCount){ buf[buf.length] = this.startGroup.apply(g); }, doGroupEnd : function(buf, g, cs, ds, colCount){ buf[buf.length] = this.endGroup; }, getRows : function(){ if(!this.canGroup()){ return Ext.grid.GroupingView.superclass.getRows.call(this); } var r = [], gs = this.getGroups(), g, i = 0, len = gs.length, j, jlen; for(; i < len; ++i){ g = gs[i].childNodes[1]; if(g){ g = g.childNodes; for(j = 0, jlen = g.length; j < jlen; ++j){ r[r.length] = g[j]; } } } return r; }, updateGroupWidths : function(){ if(!this.canGroup() || !this.hasRows()){ return; } var tw = Math.max(this.cm.getTotalWidth(), this.el.dom.offsetWidth-this.getScrollOffset()) +'px'; var gs = this.getGroups(); for(var i = 0, len = gs.length; i < len; i++){ gs[i].firstChild.style.width = tw; } }, onColumnWidthUpdated : function(col, w, tw){ Ext.grid.GroupingView.superclass.onColumnWidthUpdated.call(this, col, w, tw); this.updateGroupWidths(); }, onAllColumnWidthsUpdated : function(ws, tw){ Ext.grid.GroupingView.superclass.onAllColumnWidthsUpdated.call(this, ws, tw); this.updateGroupWidths(); }, onColumnHiddenUpdated : function(col, hidden, tw){ Ext.grid.GroupingView.superclass.onColumnHiddenUpdated.call(this, col, hidden, tw); this.updateGroupWidths(); }, onLayout : function(){ this.updateGroupWidths(); }, onBeforeRowSelect : function(sm, rowIndex){ this.toggleRowIndex(rowIndex, true); } }); Ext.grid.GroupingView.GROUP_ID = 1000; ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1653243061.0 graphite-web-1.1.10/webapp/content/js/ext/ext-all.js0000664000000000000000000257127300000000000022202 0ustar00rootroot00000000000000/* * Ext JS Library 3.4.0 * Copyright(c) 2006-2011 Sencha Inc. * licensing@sencha.com * http://www.sencha.com/license */ (function(){var h=Ext.util,j=Ext.each,g=true,i=false;h.Observable=function(){var k=this,l=k.events;if(k.listeners){k.on(k.listeners);delete k.listeners}k.events=l||{}};h.Observable.prototype={filterOptRe:/^(?:scope|delay|buffer|single)$/,fireEvent:function(){var k=Array.prototype.slice.call(arguments,0),m=k[0].toLowerCase(),n=this,l=g,p=n.events[m],s,o,r;if(n.eventsSuspended===g){if(o=n.eventQueue){o.push(k)}}else{if(typeof p=="object"){if(p.bubble){if(p.fire.apply(p,k.slice(1))===i){return i}r=n.getBubbleTarget&&n.getBubbleTarget();if(r&&r.enableBubble){s=r.events[m];if(!s||typeof s!="object"||!s.bubble){r.enableBubble(m)}return r.fireEvent.apply(r,k)}}else{k.shift();l=p.fire.apply(p,k)}}}return l},addListener:function(k,m,l,r){var n=this,q,s,p;if(typeof k=="object"){r=k;for(q in r){s=r[q];if(!n.filterOptRe.test(q)){n.addListener(q,s.fn||s,s.scope||r.scope,s.fn?s:r)}}}else{k=k.toLowerCase();p=n.events[k]||g;if(typeof p=="boolean"){n.events[k]=p=new h.Event(n,k)}p.addListener(m,l,typeof r=="object"?r:{})}},removeListener:function(k,m,l){var n=this.events[k.toLowerCase()];if(typeof n=="object"){n.removeListener(m,l)}},purgeListeners:function(){var m=this.events,k,l;for(l in m){k=m[l];if(typeof k=="object"){k.clearListeners()}}},addEvents:function(n){var m=this;m.events=m.events||{};if(typeof n=="string"){var k=arguments,l=k.length;while(l--){m.events[k[l]]=m.events[k[l]]||g}}else{Ext.applyIf(m.events,n)}},hasListener:function(k){var l=this.events[k.toLowerCase()];return typeof l=="object"&&l.listeners.length>0},suspendEvents:function(k){this.eventsSuspended=g;if(k&&!this.eventQueue){this.eventQueue=[]}},resumeEvents:function(){var k=this,l=k.eventQueue||[];k.eventsSuspended=i;delete k.eventQueue;j(l,function(m){k.fireEvent.apply(k,m)})}};var d=h.Observable.prototype;d.on=d.addListener;d.un=d.removeListener;h.Observable.releaseCapture=function(k){k.fireEvent=d.fireEvent};function e(l,m,k){return function(){if(m.target==arguments[0]){l.apply(k,Array.prototype.slice.call(arguments,0))}}}function b(n,p,k,m){k.task=new h.DelayedTask();return function(){k.task.delay(p.buffer,n,m,Array.prototype.slice.call(arguments,0))}}function c(m,n,l,k){return function(){n.removeListener(l,k);return m.apply(k,arguments)}}function a(n,p,k,m){return function(){var l=new h.DelayedTask(),o=Array.prototype.slice.call(arguments,0);if(!k.tasks){k.tasks=[]}k.tasks.push(l);l.delay(p.delay||10,function(){k.tasks.remove(l);n.apply(m,o)},m)}}h.Event=function(l,k){this.name=k;this.obj=l;this.listeners=[]};h.Event.prototype={addListener:function(o,n,m){var p=this,k;n=n||p.obj;if(!p.isListening(o,n)){k=p.createListener(o,n,m);if(p.firing){p.listeners=p.listeners.slice(0)}p.listeners.push(k)}},createListener:function(p,n,q){q=q||{};n=n||this.obj;var k={fn:p,scope:n,options:q},m=p;if(q.target){m=e(m,q,n)}if(q.delay){m=a(m,q,k,n)}if(q.single){m=c(m,this,p,n)}if(q.buffer){m=b(m,q,k,n)}k.fireFn=m;return k},findListener:function(o,n){var p=this.listeners,m=p.length,k;n=n||this.obj;while(m--){k=p[m];if(k){if(k.fn==o&&k.scope==n){return m}}}return -1},isListening:function(l,k){return this.findListener(l,k)!=-1},removeListener:function(r,q){var p,m,n,s=this,o=i;if((p=s.findListener(r,q))!=-1){if(s.firing){s.listeners=s.listeners.slice(0)}m=s.listeners[p];if(m.task){m.task.cancel();delete m.task}n=m.tasks&&m.tasks.length;if(n){while(n--){m.tasks[n].cancel()}delete m.tasks}s.listeners.splice(p,1);o=g}return o},clearListeners:function(){var n=this,k=n.listeners,m=k.length;while(m--){n.removeListener(k[m].fn,k[m].scope)}},fire:function(){var q=this,p=q.listeners,k=p.length,o=0,m;if(k>0){q.firing=g;var n=Array.prototype.slice.call(arguments,0);for(;o",i="",b=a+"",j=""+i,l=b+"",w=""+j;function h(B,D,C,E,A,y){var z=r.insertHtml(E,Ext.getDom(B),u(D));return C?Ext.get(z,true):z}function u(D){var z="",y,C,B,E;if(typeof D=="string"){z=D}else{if(Ext.isArray(D)){for(var A=0;A"}}}return z}function g(F,C,B,D){x.innerHTML=[C,B,D].join("");var y=-1,A=x,z;while(++y "'+D+'"'},insertBefore:function(y,A,z){return h(y,A,z,c)},insertAfter:function(y,A,z){return h(y,A,z,p,"nextSibling")},insertFirst:function(y,A,z){return h(y,A,z,n,"firstChild")},append:function(y,A,z){return h(y,A,z,q,"",true)},overwrite:function(y,A,z){y=Ext.getDom(y);y.innerHTML=u(A);return z?Ext.get(y.firstChild):y.firstChild},createHtml:u};return r}();Ext.Template=function(h){var j=this,c=arguments,e=[],d;if(Ext.isArray(h)){h=h.join("")}else{if(c.length>1){for(var g=0,b=c.length;g+~]\s?|\s|$)/,tagTokenRe=/^(#)?([\w\-\*]+)/,nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/,isIE=window.ActiveXObject?true:false,key=30803;eval("var batch = 30803;");function child(parent,index){var i=0,n=parent.firstChild;while(n){if(n.nodeType==1){if(++i==index){return n}}n=n.nextSibling}return null}function next(n){while((n=n.nextSibling)&&n.nodeType!=1){}return n}function prev(n){while((n=n.previousSibling)&&n.nodeType!=1){}return n}function children(parent){var n=parent.firstChild,nodeIndex=-1,nextNode;while(n){nextNode=n.nextSibling;if(n.nodeType==3&&!nonSpace.test(n.nodeValue)){parent.removeChild(n)}else{n.nodeIndex=++nodeIndex}n=nextNode}return this}function byClassName(nodeSet,cls){if(!cls){return nodeSet}var result=[],ri=-1;for(var i=0,ci;ci=nodeSet[i];i++){if((" "+ci.className+" ").indexOf(cls)!=-1){result[++ri]=ci}}return result}function attrValue(n,attr){if(!n.tagName&&typeof n.length!="undefined"){n=n[0]}if(!n){return null}if(attr=="for"){return n.htmlFor}if(attr=="class"||attr=="className"){return n.className}return n.getAttribute(attr)||n[attr]}function getNodes(ns,mode,tagName){var result=[],ri=-1,cs;if(!ns){return result}tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns]}if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci}}}else{if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=ni.childNodes;for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=="*"){result[++ri]=cj}}}}else{if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=="*")){result[++ri]=n}}}else{if(mode=="~"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)){if(n.nodeName==utag||n.nodeName==tagName||tagName=="*"){result[++ri]=n}}}}}}}return result}function concat(a,b){if(b.slice){return a.concat(b)}for(var i=0,l=b.length;i1){return nodup(results)}return results},isXml:function(el){var docEl=(el?el.ownerDocument||el:0).documentElement;return docEl?docEl.nodeName!=="HTML":false},select:document.querySelectorAll?function(path,root,type){root=root||document;if(!Ext.DomQuery.isXml(root)){try{var cs=root.querySelectorAll(path);return Ext.toArray(cs)}catch(ex){}}return Ext.DomQuery.jsSelect.call(this,path,root,type)}:function(path,root,type){return Ext.DomQuery.jsSelect.call(this,path,root,type)},selectNode:function(path,root){return Ext.DomQuery.select(path,root)[0]},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,"");if(!valueCache[path]){valueCache[path]=Ext.DomQuery.compile(path,"select")}var n=valueCache[path](root),v;n=n[0]?n[0]:n;if(typeof n.normalize=="function"){n.normalize()}v=(n&&n.firstChild?n.firstChild.nodeValue:null);return((v===null||v===undefined||v==="")?defaultValue:v)},selectNumber:function(path,root,defaultValue){var v=Ext.DomQuery.selectValue(path,root,defaultValue||0);return parseFloat(v)},is:function(el,ss){if(typeof el=="string"){el=document.getElementById(el)}var isArray=Ext.isArray(el),result=Ext.DomQuery.filter(isArray?el:[el],ss);return isArray?(result.length==el.length):(result.length>0)},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,"");if(!simpleCache[ss]){simpleCache[ss]=Ext.DomQuery.compile(ss,"simple")}var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result},matchers:[{re:/^\.([\w\-]+)/,select:'n = byClassName(n, " {1} ");'},{re:/^\:([\w\-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:'n = byPseudo(n, "{1}", "{2}");'},{re:/^(?:([\[\{])(?:@)?([\w\-]+)\s?(?:(=|.=)\s?(["']?)(.*?)\4)?[\]\}])/,select:'n = byAttribute(n, "{2}", "{5}", "{3}", "{1}");'},{re:/^#([\w\-]+)/,select:'n = byId(n, "{1}");'},{re:/^@([\w\-]+)/,select:'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'}],operators:{"=":function(a,v){return a==v},"!=":function(a,v){return a!=v},"^=":function(a,v){return a&&a.substr(0,v.length)==v},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v},"*=":function(a,v){return a&&a.indexOf(v)!==-1},"%=":function(a,v){return(a%v)==0},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&(" "+a+" ").indexOf(" "+v+" ")!=-1}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"nth-child":function(c,a){var r=[],ri=-1,m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a),f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j}}pn._batch=batch}if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n}}else{if((n.nodeIndex+l)%f==0){r[++ri]=n}}}return r},"only-child":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci}}return r},empty:function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var cns=ci.childNodes,j=0,cn,empty=true;while(cn=cns[j]){++j;if(cn.nodeType==1||cn.nodeType==3){empty=false;break}}if(empty){r[++ri]=ci}}return r},contains:function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||"").indexOf(v)!=-1){r[++ri]=ci}}return r},nodeValue:function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci}}return r},checked:function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci}}return r},not:function(c,ss){return Ext.DomQuery.filter(c,ss,true)},any:function(c,selectors){var ss=selectors.split("|"),r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break}}}return r},odd:function(c){return this["nth-child"](c,"odd")},even:function(c){return this["nth-child"](c,"even")},nth:function(c,a){return c[a-1]||[]},first:function(c){return c[0]||[]},last:function(c){return c[c.length-1]||[]},has:function(c,ss){var s=Ext.DomQuery.select,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci}}return r},next:function(c,ss){var is=Ext.DomQuery.is,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r},prev:function(c,ss){var is=Ext.DomQuery.is,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r}}}}();Ext.query=Ext.DomQuery.select;Ext.util.DelayedTask=function(d,c,a){var e=this,g,b=function(){clearInterval(g);g=null;d.apply(c,a||[])};e.delay=function(i,k,j,h){e.cancel();d=k||d;c=j||c;a=h||a;g=setInterval(b,i)};e.cancel=function(){if(g){clearInterval(g);g=null}}};(function(){var h=document;Ext.Element=function(l,m){var n=typeof l=="string"?h.getElementById(l):l,o;if(!n){return null}o=n.id;if(!m&&o&&Ext.elCache[o]){return Ext.elCache[o].el}this.dom=n;this.id=o||Ext.id(n)};var d=Ext.DomHelper,e=Ext.Element,a=Ext.elCache;e.prototype={set:function(q,m){var n=this.dom,l,p,m=(m!==false)&&!!n.setAttribute;for(l in q){if(q.hasOwnProperty(l)){p=q[l];if(l=="style"){d.applyStyles(n,p)}else{if(l=="cls"){n.className=p}else{if(m){n.setAttribute(l,p)}else{n[l]=p}}}}}return this},defaultUnit:"px",is:function(l){return Ext.DomQuery.is(this.dom,l)},focus:function(o,n){var l=this,n=n||l.dom;try{if(Number(o)){l.focus.defer(o,null,[null,n])}else{n.focus()}}catch(m){}return l},blur:function(){try{this.dom.blur()}catch(l){}return this},getValue:function(l){var m=this.dom.value;return l?parseInt(m,10):m},addListener:function(l,o,n,m){Ext.EventManager.on(this.dom,l,o,n||this,m);return this},removeListener:function(l,n,m){Ext.EventManager.removeListener(this.dom,l,n,m||this);return this},removeAllListeners:function(){Ext.EventManager.removeAll(this.dom);return this},purgeAllListeners:function(){Ext.EventManager.purgeElement(this,true);return this},addUnits:function(l){if(l===""||l=="auto"||l===undefined){l=l||""}else{if(!isNaN(l)||!i.test(l)){l=l+(this.defaultUnit||"px")}}return l},load:function(m,n,l){Ext.Ajax.request(Ext.apply({params:n,url:m.url||m,callback:l,el:this.dom,indicatorText:m.indicatorText||""},Ext.isObject(m)?m:{}));return this},isBorderBox:function(){return Ext.isBorderBox||Ext.isForcedBorderBox||g[(this.dom.tagName||"").toLowerCase()]},remove:function(){var l=this,m=l.dom;if(m){delete l.dom;Ext.removeNode(m)}},hover:function(m,l,o,n){var p=this;p.on("mouseenter",m,o||p.dom,n);p.on("mouseleave",l,o||p.dom,n);return p},contains:function(l){return !l?false:Ext.lib.Dom.isAncestor(this.dom,l.dom?l.dom:l)},getAttributeNS:function(m,l){return this.getAttribute(l,m)},getAttribute:(function(){var p=document.createElement("table"),o=false,m="getAttribute" in p,l=/undefined|unknown/;if(m){try{p.getAttribute("ext:qtip")}catch(n){o=true}return function(q,s){var r=this.dom,t;if(r.getAttributeNS){t=r.getAttributeNS(s,q)||null}if(t==null){if(s){if(o&&r.tagName.toUpperCase()=="TABLE"){try{t=r.getAttribute(s+":"+q)}catch(u){t=""}}else{t=r.getAttribute(s+":"+q)}}else{t=r.getAttribute(q)||r[q]}}return t||""}}else{return function(q,s){var r=this.om,u,t;if(s){t=r[s+":"+q];u=l.test(typeof t)?undefined:t}else{u=r[q]}return u||""}}p=null})(),update:function(l){if(this.dom){this.dom.innerHTML=l}return this}};var k=e.prototype;e.addMethods=function(l){Ext.apply(k,l)};k.on=k.addListener;k.un=k.removeListener;k.autoBoxAdjust=true;var i=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,c;e.get=function(m){var l,p,o;if(!m){return null}if(typeof m=="string"){if(!(p=h.getElementById(m))){return null}if(a[m]&&a[m].el){l=a[m].el;l.dom=p}else{l=e.addToCache(new e(p))}return l}else{if(m.tagName){if(!(o=m.id)){o=Ext.id(m)}if(a[o]&&a[o].el){l=a[o].el;l.dom=m}else{l=e.addToCache(new e(m))}return l}else{if(m instanceof e){if(m!=c){if(Ext.isIE&&(m.id==undefined||m.id=="")){m.dom=m.dom}else{m.dom=h.getElementById(m.id)||m.dom}}return m}else{if(m.isComposite){return m}else{if(Ext.isArray(m)){return e.select(m)}else{if(m==h){if(!c){var n=function(){};n.prototype=e.prototype;c=new n();c.dom=h}return c}}}}}}return null};e.addToCache=function(l,m){m=m||l.id;a[m]={el:l,data:{},events:{}};return l};e.data=function(m,l,n){m=e.get(m);if(!m){return null}var o=a[m.id].data;if(arguments.length==2){return o[l]}else{return(o[l]=n)}};function j(){if(!Ext.enableGarbageCollector){clearInterval(e.collectorThreadId)}else{var l,n,q,p;for(l in a){p=a[l];if(p.skipGC){continue}n=p.el;q=n.dom;if(!q||!q.parentNode||(!q.offsetParent&&!h.getElementById(l))){if(Ext.enableListenerCollection){Ext.EventManager.removeAll(q)}delete a[l]}}if(Ext.isIE){var m={};for(l in a){m[l]=a[l]}a=Ext.elCache=m}}}e.collectorThreadId=setInterval(j,30000);var b=function(){};b.prototype=e.prototype;e.Flyweight=function(l){this.dom=l};e.Flyweight.prototype=new b();e.Flyweight.prototype.isFlyweight=true;e._flyweights={};e.fly=function(n,l){var m=null;l=l||"_global";if(n=Ext.getDom(n)){(e._flyweights[l]=e._flyweights[l]||new e.Flyweight()).dom=n;m=e._flyweights[l]}return m};Ext.get=e.get;Ext.fly=e.fly;var g=Ext.isStrict?{select:1}:{input:1,select:1,textarea:1};if(Ext.isIE||Ext.isGecko){g.button=1}})();Ext.Element.addMethods(function(){var d="parentNode",b="nextSibling",c="previousSibling",e=Ext.DomQuery,a=Ext.get;return{findParent:function(m,l,h){var j=this.dom,g=document.body,k=0,i;if(Ext.isGecko&&Object.prototype.toString.call(j)=="[object XULElement]"){return null}l=l||50;if(isNaN(l)){i=Ext.getDom(l);l=Number.MAX_VALUE}while(j&&j.nodeType==1&&k "+g,this.dom);return h?i:a(i)},parent:function(g,h){return this.matchNode(d,d,g,h)},next:function(g,h){return this.matchNode(b,b,g,h)},prev:function(g,h){return this.matchNode(c,c,g,h)},first:function(g,h){return this.matchNode(b,"firstChild",g,h)},last:function(g,h){return this.matchNode(c,"lastChild",g,h)},matchNode:function(h,k,g,i){var j=this.dom[k];while(j){if(j.nodeType==1&&(!g||e.is(j,g))){return !i?a(j):j}j=j[h]}return null}}}());Ext.Element.addMethods(function(){var c=Ext.getDom,a=Ext.get,b=Ext.DomHelper;return{appendChild:function(d){return a(d).appendTo(this)},appendTo:function(d){c(d).appendChild(this.dom);return this},insertBefore:function(d){(d=c(d)).parentNode.insertBefore(this.dom,d);return this},insertAfter:function(d){(d=c(d)).parentNode.insertBefore(this.dom,d.nextSibling);return this},insertFirst:function(e,d){e=e||{};if(e.nodeType||e.dom||typeof e=="string"){e=c(e);this.dom.insertBefore(e,this.dom.firstChild);return !d?a(e):e}else{return this.createChild(e,this.dom.firstChild,d)}},replace:function(d){d=a(d);this.insertBefore(d);d.remove();return this},replaceWith:function(d){var e=this;if(d.nodeType||d.dom||typeof d=="string"){d=c(d);e.dom.parentNode.insertBefore(d,e.dom)}else{d=b.insertBefore(e.dom,d)}delete Ext.elCache[e.id];Ext.removeNode(e.dom);e.id=Ext.id(e.dom=d);Ext.Element.addToCache(e.isFlyweight?new Ext.Element(e.dom):e);return e},createChild:function(e,d,g){e=e||{tag:"div"};return d?b.insertBefore(d,e,g!==true):b[!this.dom.firstChild?"overwrite":"append"](this.dom,e,g!==true)},wrap:function(d,e){var g=b.insertBefore(this.dom,d||{tag:"div"},!e);g.dom?g.dom.appendChild(this.dom):g.appendChild(this.dom);return g},insertHtml:function(e,g,d){var h=b.insertHtml(e,this.dom,g);return d?Ext.get(h):h}}}());Ext.Element.addMethods(function(){var A=Ext.supports,h={},x=/(-[a-z])/gi,s=document.defaultView,D=/alpha\(opacity=(.*)\)/i,l=/^\s+|\s+$/g,B=Ext.Element,u=/\s+/,b=/\w/g,d="padding",c="margin",y="border",t="-left",q="-right",w="-top",o="-bottom",j="-width",r=Math,z="hidden",e="isClipped",k="overflow",n="overflow-x",m="overflow-y",C="originalClip",i={l:y+t+j,r:y+q+j,t:y+w+j,b:y+o+j},g={l:d+t,r:d+q,t:d+w,b:d+o},a={l:c+t,r:c+q,t:c+w,b:c+o},E=Ext.Element.data;function p(F,G){return G.charAt(1).toUpperCase()}function v(F){return h[F]||(h[F]=F=="float"?(A.cssFloat?"cssFloat":"styleFloat"):F.replace(x,p))}return{adjustWidth:function(F){var G=this;var H=(typeof F=="number");if(H&&G.autoBoxAdjust&&!G.isBorderBox()){F-=(G.getBorderWidth("lr")+G.getPadding("lr"))}return(H&&F<0)?0:F},adjustHeight:function(F){var G=this;var H=(typeof F=="number");if(H&&G.autoBoxAdjust&&!G.isBorderBox()){F-=(G.getBorderWidth("tb")+G.getPadding("tb"))}return(H&&F<0)?0:F},addClass:function(J){var K=this,I,F,H,G=[];if(!Ext.isArray(J)){if(typeof J=="string"&&!this.hasClass(J)){K.dom.className+=" "+J}}else{for(I=0,F=J.length;I5?H.toLowerCase():G)},setStyle:function(I,H){var F,G;if(typeof I!="object"){F={};F[I]=H;I=F}for(G in I){H=I[G];G=="opacity"?this.setOpacity(H):this.dom.style[v(G)]=H}return this},setOpacity:function(G,F){var J=this,H=J.dom.style;if(!F||!J.anim){if(Ext.isIE){var I=G<1?"alpha(opacity="+G*100+")":"",K=H.filter.replace(D,"").replace(l,"");H.zoom=1;H.filter=K+(K.length>0?" ":"")+I}else{H.opacity=G}}else{J.anim({opacity:{to:G}},J.preanim(arguments,1),null,0.35,"easeIn")}return J},clearOpacity:function(){var F=this.dom.style;if(Ext.isIE){if(!Ext.isEmpty(F.filter)){F.filter=F.filter.replace(D,"").replace(l,"")}}else{F.opacity=F["-moz-opacity"]=F["-khtml-opacity"]=""}return this},getHeight:function(H){var G=this,J=G.dom,I=Ext.isIE&&G.isStyle("display","none"),F=r.max(J.offsetHeight,I?0:J.clientHeight)||0;F=!H?F:F-G.getBorderWidth("tb")-G.getPadding("tb");return F<0?0:F},getWidth:function(G){var H=this,J=H.dom,I=Ext.isIE&&H.isStyle("display","none"),F=r.max(J.offsetWidth,I?0:J.clientWidth)||0;F=!G?F:F-H.getBorderWidth("lr")-H.getPadding("lr");return F<0?0:F},setWidth:function(G,F){var H=this;G=H.adjustWidth(G);!F||!H.anim?H.dom.style.width=H.addUnits(G):H.anim({width:{to:G}},H.preanim(arguments,1));return H},setHeight:function(F,G){var H=this;F=H.adjustHeight(F);!G||!H.anim?H.dom.style.height=H.addUnits(F):H.anim({height:{to:F}},H.preanim(arguments,1));return H},getBorderWidth:function(F){return this.addStyles(F,i)},getPadding:function(F){return this.addStyles(F,g)},clip:function(){var F=this,G=F.dom;if(!E(G,e)){E(G,e,true);E(G,C,{o:F.getStyle(k),x:F.getStyle(n),y:F.getStyle(m)});F.setStyle(k,z);F.setStyle(n,z);F.setStyle(m,z)}return F},unclip:function(){var F=this,H=F.dom;if(E(H,e)){E(H,e,false);var G=E(H,C);if(G.o){F.setStyle(k,G.o)}if(G.x){F.setStyle(n,G.x)}if(G.y){F.setStyle(m,G.y)}}return F},addStyles:function(M,L){var J=0,K=M.match(b),I,H,G,F=K.length;for(G=0;Ga.clientHeight||a.scrollWidth>a.clientWidth},scrollTo:function(a,b){this.dom["scroll"+(/top/i.test(a)?"Top":"Left")]=b;return this},getScroll:function(){var i=this.dom,h=document,a=h.body,c=h.documentElement,b,g,e;if(i==h||i==a){if(Ext.isIE&&Ext.isStrict){b=c.scrollLeft;g=c.scrollTop}else{b=window.pageXOffset;g=window.pageYOffset}e={left:b||(a?a.scrollLeft:0),top:g||(a?a.scrollTop:0)}}else{e={left:i.scrollLeft,top:i.scrollTop}}return e}});Ext.Element.VISIBILITY=1;Ext.Element.DISPLAY=2;Ext.Element.OFFSETS=3;Ext.Element.ASCLASS=4;Ext.Element.visibilityCls="x-hide-nosize";Ext.Element.addMethods(function(){var e=Ext.Element,p="opacity",j="visibility",g="display",d="hidden",n="offsets",k="asclass",m="none",a="nosize",b="originalDisplay",c="visibilityMode",h="isVisible",i=e.data,l=function(r){var q=i(r,b);if(q===undefined){i(r,b,q="")}return q},o=function(r){var q=i(r,c);if(q===undefined){i(r,c,q=1)}return q};return{originalDisplay:"",visibilityMode:1,setVisibilityMode:function(q){i(this.dom,c,q);return this},animate:function(r,t,s,u,q){this.anim(r,{duration:t,callback:s,easing:u},q);return this},anim:function(t,u,r,w,s,q){r=r||"run";u=u||{};var v=this,x=Ext.lib.Anim[r](v.dom,t,(u.duration||w)||0.35,(u.easing||s)||"easeOut",function(){if(q){q.call(v)}if(u.callback){u.callback.call(u.scope||v,v,u)}},v);u.anim=x;return x},preanim:function(q,r){return !q[r]?false:(typeof q[r]=="object"?q[r]:{duration:q[r+1],callback:q[r+2],easing:q[r+3]})},isVisible:function(){var q=this,s=q.dom,r=i(s,h);if(typeof r=="boolean"){return r}r=!q.isStyle(j,d)&&!q.isStyle(g,m)&&!((o(s)==e.ASCLASS)&&q.hasClass(q.visibilityCls||e.visibilityCls));i(s,h,r);return r},setVisible:function(t,q){var w=this,r,y,x,v,u=w.dom,s=o(u);if(typeof q=="string"){switch(q){case g:s=e.DISPLAY;break;case j:s=e.VISIBILITY;break;case n:s=e.OFFSETS;break;case a:case k:s=e.ASCLASS;break}w.setVisibilityMode(s);q=false}if(!q||!w.anim){if(s==e.ASCLASS){w[t?"removeClass":"addClass"](w.visibilityCls||e.visibilityCls)}else{if(s==e.DISPLAY){return w.setDisplayed(t)}else{if(s==e.OFFSETS){if(!t){w.hideModeStyles={position:w.getStyle("position"),top:w.getStyle("top"),left:w.getStyle("left")};w.applyStyles({position:"absolute",top:"-10000px",left:"-10000px"})}else{w.applyStyles(w.hideModeStyles||{position:"",top:"",left:""});delete w.hideModeStyles}}else{w.fixDisplay();u.style.visibility=t?"visible":d}}}}else{if(t){w.setOpacity(0.01);w.setVisible(true)}w.anim({opacity:{to:(t?1:0)}},w.preanim(arguments,1),null,0.35,"easeIn",function(){t||w.setVisible(false).setOpacity(1)})}i(u,h,t);return w},hasMetrics:function(){var q=this.dom;return this.isVisible()||(o(q)==e.VISIBILITY)},toggle:function(q){var r=this;r.setVisible(!r.isVisible(),r.preanim(arguments,0));return r},setDisplayed:function(q){if(typeof q=="boolean"){q=q?l(this.dom):m}this.setStyle(g,q);return this},fixDisplay:function(){var q=this;if(q.isStyle(g,m)){q.setStyle(j,d);q.setStyle(g,l(this.dom));if(q.isStyle(g,m)){q.setStyle(g,"block")}}},hide:function(q){if(typeof q=="string"){this.setVisible(false,q);return this}this.setVisible(false,this.preanim(arguments,0));return this},show:function(q){if(typeof q=="string"){this.setVisible(true,q);return this}this.setVisible(true,this.preanim(arguments,0));return this}}}());(function(){var y=null,A=undefined,k=true,t=false,j="setX",h="setY",a="setXY",n="left",l="bottom",s="top",m="right",q="height",g="width",i="points",w="hidden",z="absolute",u="visible",e="motion",o="position",r="easeOut",d=new Ext.Element.Flyweight(),v={},x=function(B){return B||{}},p=function(B){d.dom=B;d.id=Ext.id(B);return d},c=function(B){if(!v[B]){v[B]=[]}return v[B]},b=function(C,B){v[C]=B};Ext.enableFx=k;Ext.Fx={switchStatements:function(C,D,B){return D.apply(this,B[C])},slideIn:function(H,E){E=x(E);var J=this,G=J.dom,M=G.style,O,B,L,D,C,M,I,N,K,F;H=H||"t";J.queueFx(E,function(){O=p(G).getXY();p(G).fixDisplay();B=p(G).getFxRestore();L={x:O[0],y:O[1],0:O[0],1:O[1],width:G.offsetWidth,height:G.offsetHeight};L.right=L.x+L.width;L.bottom=L.y+L.height;p(G).setWidth(L.width).setHeight(L.height);D=p(G).fxWrap(B.pos,E,w);M.visibility=u;M.position=z;function P(){p(G).fxUnwrap(D,B.pos,E);M.width=B.width;M.height=B.height;p(G).afterFx(E)}N={to:[L.x,L.y]};K={to:L.width};F={to:L.height};function Q(U,R,V,S,X,Z,ac,ab,aa,W,T){var Y={};p(U).setWidth(V).setHeight(S);if(p(U)[X]){p(U)[X](Z)}R[ac]=R[ab]="0";if(aa){Y.width=aa}if(W){Y.height=W}if(T){Y.points=T}return Y}I=p(G).switchStatements(H.toLowerCase(),Q,{t:[D,M,L.width,0,y,y,n,l,y,F,y],l:[D,M,0,L.height,y,y,m,s,K,y,y],r:[D,M,L.width,L.height,j,L.right,n,s,y,y,N],b:[D,M,L.width,L.height,h,L.bottom,n,s,y,F,N],tl:[D,M,0,0,y,y,m,l,K,F,N],bl:[D,M,0,0,h,L.y+L.height,m,s,K,F,N],br:[D,M,0,0,a,[L.right,L.bottom],n,s,K,F,N],tr:[D,M,0,0,j,L.x+L.width,n,l,K,F,N]});M.visibility=u;p(D).show();arguments.callee.anim=p(D).fxanim(I,E,e,0.5,r,P)});return J},slideOut:function(F,D){D=x(D);var H=this,E=H.dom,K=E.style,L=H.getXY(),C,B,I,J,G={to:0};F=F||"t";H.queueFx(D,function(){B=p(E).getFxRestore();I={x:L[0],y:L[1],0:L[0],1:L[1],width:E.offsetWidth,height:E.offsetHeight};I.right=I.x+I.width;I.bottom=I.y+I.height;p(E).setWidth(I.width).setHeight(I.height);C=p(E).fxWrap(B.pos,D,u);K.visibility=u;K.position=z;p(C).setWidth(I.width).setHeight(I.height);function M(){D.useDisplay?p(E).setDisplayed(t):p(E).hide();p(E).fxUnwrap(C,B.pos,D);K.width=B.width;K.height=B.height;p(E).afterFx(D)}function N(O,W,U,X,S,V,R,T,Q){var P={};O[W]=O[U]="0";P[X]=S;if(V){P[V]=R}if(T){P[T]=Q}return P}J=p(E).switchStatements(F.toLowerCase(),N,{t:[K,n,l,q,G],l:[K,m,s,g,G],r:[K,n,s,g,G,i,{to:[I.right,I.y]}],b:[K,n,s,q,G,i,{to:[I.x,I.bottom]}],tl:[K,m,l,g,G,q,G],bl:[K,m,s,g,G,q,G,i,{to:[I.x,I.bottom]}],br:[K,n,s,g,G,q,G,i,{to:[I.x+I.width,I.bottom]}],tr:[K,n,l,g,G,q,G,i,{to:[I.right,I.y]}]});arguments.callee.anim=p(C).fxanim(J,D,e,0.5,r,M)});return H},puff:function(H){H=x(H);var F=this,G=F.dom,C=G.style,D,B,E;F.queueFx(H,function(){D=p(G).getWidth();B=p(G).getHeight();p(G).clearOpacity();p(G).show();E=p(G).getFxRestore();function I(){H.useDisplay?p(G).setDisplayed(t):p(G).hide();p(G).clearOpacity();p(G).setPositioning(E.pos);C.width=E.width;C.height=E.height;C.fontSize="";p(G).afterFx(H)}arguments.callee.anim=p(G).fxanim({width:{to:p(G).adjustWidth(D*2)},height:{to:p(G).adjustHeight(B*2)},points:{by:[-D*0.5,-B*0.5]},opacity:{to:0},fontSize:{to:200,unit:"%"}},H,e,0.5,r,I)});return F},switchOff:function(F){F=x(F);var D=this,E=D.dom,B=E.style,C;D.queueFx(F,function(){p(E).clearOpacity();p(E).clip();C=p(E).getFxRestore();function G(){F.useDisplay?p(E).setDisplayed(t):p(E).hide();p(E).clearOpacity();p(E).setPositioning(C.pos);B.width=C.width;B.height=C.height;p(E).afterFx(F)}p(E).fxanim({opacity:{to:0.3}},y,y,0.1,y,function(){p(E).clearOpacity();(function(){p(E).fxanim({height:{to:1},points:{by:[0,p(E).getHeight()*0.5]}},F,e,0.3,"easeIn",G)}).defer(100)})});return D},highlight:function(D,H){H=x(H);var F=this,G=F.dom,B=H.attr||"backgroundColor",C={},E;F.queueFx(H,function(){p(G).clearOpacity();p(G).show();function I(){G.style[B]=E;p(G).afterFx(H)}E=G.style[B];C[B]={from:D||"ffff9c",to:H.endColor||p(G).getColor(B)||"ffffff"};arguments.callee.anim=p(G).fxanim(C,H,"color",1,"easeIn",I)});return F},frame:function(B,E,H){H=x(H);var D=this,G=D.dom,C,F;D.queueFx(H,function(){B=B||"#C3DAF9";if(B.length==6){B="#"+B}E=E||1;p(G).show();var L=p(G).getXY(),J={x:L[0],y:L[1],0:L[0],1:L[1],width:G.offsetWidth,height:G.offsetHeight},I=function(){C=p(document.body||document.documentElement).createChild({style:{position:z,"z-index":35000,border:"0px solid "+B}});return C.queueFx({},K)};arguments.callee.anim={isAnimated:true,stop:function(){E=0;C.stopFx()}};function K(){var M=Ext.isBorderBox?2:1;F=C.anim({top:{from:J.y,to:J.y-20},left:{from:J.x,to:J.x-20},borderWidth:{from:0,to:10},opacity:{from:1,to:0},height:{from:J.height,to:J.height+20*M},width:{from:J.width,to:J.width+20*M}},{duration:H.duration||1,callback:function(){C.remove();--E>0?I():p(G).afterFx(H)}});arguments.callee.anim={isAnimated:true,stop:function(){F.stop()}}}I()});return D},pause:function(D){var C=this.dom,B;this.queueFx({},function(){B=setTimeout(function(){p(C).afterFx({})},D*1000);arguments.callee.anim={isAnimated:true,stop:function(){clearTimeout(B);p(C).afterFx({})}}});return this},fadeIn:function(D){D=x(D);var B=this,C=B.dom,E=D.endOpacity||1;B.queueFx(D,function(){p(C).setOpacity(0);p(C).fixDisplay();C.style.visibility=u;arguments.callee.anim=p(C).fxanim({opacity:{to:E}},D,y,0.5,r,function(){if(E==1){p(C).clearOpacity()}p(C).afterFx(D)})});return B},fadeOut:function(E){E=x(E);var C=this,D=C.dom,B=D.style,F=E.endOpacity||0;C.queueFx(E,function(){arguments.callee.anim=p(D).fxanim({opacity:{to:F}},E,y,0.5,r,function(){if(F==0){Ext.Element.data(D,"visibilityMode")==Ext.Element.DISPLAY||E.useDisplay?B.display="none":B.visibility=w;p(D).clearOpacity()}p(D).afterFx(E)})});return C},scale:function(B,C,D){this.shift(Ext.apply({},D,{width:B,height:C}));return this},shift:function(D){D=x(D);var C=this.dom,B={};this.queueFx(D,function(){for(var E in D){if(D[E]!=A){B[E]={to:D[E]}}}B.width?B.width.to=p(C).adjustWidth(D.width):B;B.height?B.height.to=p(C).adjustWidth(D.height):B;if(B.x||B.y||B.xy){B.points=B.xy||{to:[B.x?B.x.to:p(C).getX(),B.y?B.y.to:p(C).getY()]}}arguments.callee.anim=p(C).fxanim(B,D,e,0.35,r,function(){p(C).afterFx(D)})});return this},ghost:function(E,C){C=x(C);var G=this,D=G.dom,J=D.style,H={opacity:{to:0},points:{}},K=H.points,B,I,F;E=E||"b";G.queueFx(C,function(){B=p(D).getFxRestore();I=p(D).getWidth();F=p(D).getHeight();function L(){C.useDisplay?p(D).setDisplayed(t):p(D).hide();p(D).clearOpacity();p(D).setPositioning(B.pos);J.width=B.width;J.height=B.height;p(D).afterFx(C)}K.by=p(D).switchStatements(E.toLowerCase(),function(N,M){return[N,M]},{t:[0,-F],l:[-I,0],r:[I,0],b:[0,F],tl:[-I,-F],bl:[-I,F],br:[I,F],tr:[I,-F]});arguments.callee.anim=p(D).fxanim(H,C,e,0.5,r,L)});return G},syncFx:function(){var B=this;B.fxDefaults=Ext.apply(B.fxDefaults||{},{block:t,concurrent:k,stopFx:t});return B},sequenceFx:function(){var B=this;B.fxDefaults=Ext.apply(B.fxDefaults||{},{block:t,concurrent:t,stopFx:t});return B},nextFx:function(){var B=c(this.dom.id)[0];if(B){B.call(this)}},hasActiveFx:function(){return c(this.dom.id)[0]},stopFx:function(B){var C=this,E=C.dom.id;if(C.hasActiveFx()){var D=c(E)[0];if(D&&D.anim){if(D.anim.isAnimated){b(E,[D]);D.anim.stop(B!==undefined?B:k)}else{b(E,[])}}}return C},beforeFx:function(B){if(this.hasActiveFx()&&!B.concurrent){if(B.stopFx){this.stopFx();return k}return t}return k},hasFxBlock:function(){var B=c(this.dom.id);return B&&B[0]&&B[0].block},queueFx:function(E,B){var C=p(this.dom);if(!C.hasFxBlock()){Ext.applyIf(E,C.fxDefaults);if(!E.concurrent){var D=C.beforeFx(E);B.block=E.block;c(C.dom.id).push(B);if(D){C.nextFx()}}else{B.call(C)}}return C},fxWrap:function(H,F,D){var E=this.dom,C,B;if(!F.wrap||!(C=Ext.getDom(F.wrap))){if(F.fixPosition){B=p(E).getXY()}var G=document.createElement("div");G.style.visibility=D;C=E.parentNode.insertBefore(G,E);p(C).setPositioning(H);if(p(C).isStyle(o,"static")){p(C).position("relative")}p(E).clearPositioning("auto");p(C).clip();C.appendChild(E);if(B){p(C).setXY(B)}}return C},fxUnwrap:function(C,F,E){var D=this.dom;p(D).clearPositioning();p(D).setPositioning(F);if(!E.wrap){var B=p(C).dom.parentNode;B.insertBefore(D,C);p(C).remove()}},getFxRestore:function(){var B=this.dom.style;return{pos:this.getPositioning(),width:B.width,height:B.height}},afterFx:function(C){var B=this.dom,D=B.id;if(C.afterStyle){p(B).setStyle(C.afterStyle)}if(C.afterCls){p(B).addClass(C.afterCls)}if(C.remove==k){p(B).remove()}if(C.callback){C.callback.call(C.scope,p(B))}if(!C.concurrent){c(D).shift();p(B).nextFx()}},fxanim:function(E,F,C,G,D,B){C=C||"run";F=F||{};var H=Ext.lib.Anim[C](this.dom,E,(F.duration||G)||0.35,(F.easing||D)||r,B,this);F.anim=H;return H}};Ext.Fx.resize=Ext.Fx.scale;Ext.Element.addMethods(Ext.Fx)})();Ext.CompositeElementLite=function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.Element.Flyweight()};Ext.CompositeElementLite.prototype={isComposite:true,getElement:function(a){var b=this.el;b.dom=a;b.id=a.id;return b},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(d,b){var e=this,g=e.elements;if(!d){return this}if(typeof d=="string"){d=Ext.Element.selectorFunction(d,b)}else{if(d.isComposite){d=d.elements}else{if(!Ext.isIterable(d)){d=[d]}}}for(var c=0,a=d.length;c-1){c=Ext.getDom(c);if(a){g=this.elements[b];g.parentNode.insertBefore(c,g);Ext.removeNode(g)}this.elements.splice(b,1,c)}return this},clear:function(){this.elements=[]}};Ext.CompositeElementLite.prototype.on=Ext.CompositeElementLite.prototype.addListener;Ext.CompositeElementLite.importElementMethods=function(){var c,b=Ext.Element.prototype,a=Ext.CompositeElementLite.prototype;for(c in b){if(typeof b[c]=="function"){(function(d){a[d]=a[d]||function(){return this.invoke(d,arguments)}}).call(a,c)}}};Ext.CompositeElementLite.importElementMethods();if(Ext.DomQuery){Ext.Element.selectorFunction=Ext.DomQuery.select}Ext.Element.select=function(a,b){var c;if(typeof a=="string"){c=Ext.Element.selectorFunction(a,b)}else{if(a.length!==undefined){c=a}else{throw"Invalid selector"}}return new Ext.CompositeElementLite(c)};Ext.select=Ext.Element.select;(function(){var b="beforerequest",e="requestcomplete",d="requestexception",h=undefined,c="load",i="POST",a="GET",g=window;Ext.data.Connection=function(j){Ext.apply(this,j);this.addEvents(b,e,d);Ext.data.Connection.superclass.constructor.call(this)};Ext.extend(Ext.data.Connection,Ext.util.Observable,{timeout:30000,autoAbort:false,disableCaching:true,disableCachingParam:"_dc",request:function(n){var s=this;if(s.fireEvent(b,s,n)){if(n.el){if(!Ext.isEmpty(n.indicatorText)){s.indicatorText='
    '+n.indicatorText+"
    "}if(s.indicatorText){Ext.getDom(n.el).innerHTML=s.indicatorText}n.success=(Ext.isFunction(n.success)?n.success:function(){}).createInterceptor(function(o){Ext.getDom(n.el).innerHTML=o.responseText})}var l=n.params,k=n.url||s.url,j,q={success:s.handleResponse,failure:s.handleFailure,scope:s,argument:{options:n},timeout:Ext.num(n.timeout,s.timeout)},m,t;if(Ext.isFunction(l)){l=l.call(n.scope||g,n)}l=Ext.urlEncode(s.extraParams,Ext.isObject(l)?Ext.urlEncode(l):l);if(Ext.isFunction(k)){k=k.call(n.scope||g,n)}if((m=Ext.getDom(n.form))){k=k||m.action;if(n.isUpload||(/multipart\/form-data/i.test(m.getAttribute("enctype")))){return s.doFormUpload.call(s,n,l,k)}t=Ext.lib.Ajax.serializeForm(m);l=l?(l+"&"+t):t}j=n.method||s.method||((l||n.xmlData||n.jsonData)?i:a);if(j===a&&(s.disableCaching&&n.disableCaching!==false)||n.disableCaching===true){var r=n.disableCachingParam||s.disableCachingParam;k=Ext.urlAppend(k,r+"="+(new Date().getTime()))}n.headers=Ext.applyIf(n.headers||{},s.defaultHeaders||{});if(n.autoAbort===true||s.autoAbort){s.abort()}if((j==a||n.xmlData||n.jsonData)&&l){k=Ext.urlAppend(k,l);l=""}return(s.transId=Ext.lib.Ajax.request(j,k,q,l,n))}else{return n.callback?n.callback.apply(n.scope,[n,h,h]):null}},isLoading:function(j){return j?Ext.lib.Ajax.isCallInProgress(j):!!this.transId},abort:function(j){if(j||this.isLoading()){Ext.lib.Ajax.abort(j||this.transId)}},handleResponse:function(j){this.transId=false;var k=j.argument.options;j.argument=k?k.argument:null;this.fireEvent(e,this,j,k);if(k.success){k.success.call(k.scope,j,k)}if(k.callback){k.callback.call(k.scope,k,true,j)}},handleFailure:function(j,l){this.transId=false;var k=j.argument.options;j.argument=k?k.argument:null;this.fireEvent(d,this,j,k,l);if(k.failure){k.failure.call(k.scope,j,k)}if(k.callback){k.callback.call(k.scope,k,false,j)}},doFormUpload:function(q,j,k){var l=Ext.id(),v=document,r=v.createElement("iframe"),m=Ext.getDom(q.form),u=[],t,p="multipart/form-data",n={target:m.target,method:m.method,encoding:m.encoding,enctype:m.enctype,action:m.action};Ext.fly(r).set({id:l,name:l,cls:"x-hidden",src:Ext.SSL_SECURE_URL});v.body.appendChild(r);if(Ext.isIE){document.frames[l].name=l}Ext.fly(m).set({target:l,method:i,enctype:p,encoding:p,action:k||n.action});Ext.iterate(Ext.urlDecode(j,false),function(w,o){t=v.createElement("input");Ext.fly(t).set({type:"hidden",value:o,name:w});m.appendChild(t);u.push(t)});function s(){var x=this,w={responseText:"",responseXML:null,argument:q.argument},A,z;try{A=r.contentWindow.document||r.contentDocument||g.frames[l].document;if(A){if(A.body){if(/textarea/i.test((z=A.body.firstChild||{}).tagName)){w.responseText=z.value}else{w.responseText=A.body.innerHTML}}w.responseXML=A.XMLDocument||A}}catch(y){}Ext.EventManager.removeListener(r,c,s,x);x.fireEvent(e,x,w,q);function o(D,C,B){if(Ext.isFunction(D)){D.apply(C,B)}}o(q.success,q.scope,[w,q]);o(q.callback,q.scope,[q,true,w]);if(!x.debugUploads){setTimeout(function(){Ext.removeNode(r)},100)}}Ext.EventManager.on(r,c,s,this);m.submit();Ext.fly(m).set(n);Ext.each(u,function(o){Ext.removeNode(o)})}})})();Ext.Ajax=new Ext.data.Connection({autoAbort:false,serializeForm:function(a){return Ext.lib.Ajax.serializeForm(a)}});Ext.util.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return json?eval("("+json+")"):""},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.util.JSON.encodeDate(o)}else{if(Ext.isString(o)){return encodeString(o)}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{var a=["{"],b,i,v;for(i in o){if(!o.getElementsByTagName){if(!useHasOwn||o.hasOwnProperty(i)){v=o[i];switch(typeof v){case"undefined":case"function":case"unknown":break;default:if(b){a.push(",")}a.push(doEncode(i),":",v===null?"null":doEncode(v));b=true}}}}a.push("}");return a.join("")}}}}}}},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},encodeString=function(s){if(/["\\\x00-\x1f]/.test(s)){return'"'+s.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c}c=b.charCodeAt();return"\\u00"+Math.floor(c/16).toString(16)+(c%16).toString(16)})+'"'}return'"'+s+'"'},encodeArray=function(o){var a=["["],b,i,l=o.length,v;for(i=0;i
    ';e.body.appendChild(g);d=g.lastChild;if((c=e.defaultView)){if(c.getComputedStyle(g.firstChild.firstChild,null).marginRight!="0px"){b.correctRightMargin=false}if(c.getComputedStyle(d,null).backgroundColor!="transparent"){b.correctTransparentColor=false}}b.cssFloat=!!d.style.cssFloat;e.body.removeChild(g)};if(Ext.isReady){a()}else{Ext.onReady(a)}})();Ext.EventObject=function(){var b=Ext.lib.Event,c=/(dbl)?click/,a={3:13,63234:37,63235:39,63232:38,63233:40,63276:33,63277:34,63272:46,63273:36,63275:35},d=Ext.isIE?{1:0,4:1,2:2}:{0:0,1:1,2:2};Ext.EventObjectImpl=function(g){if(g){this.setEvent(g.browserEvent||g)}};Ext.EventObjectImpl.prototype={setEvent:function(h){var g=this;if(h==g||(h&&h.browserEvent)){return h}g.browserEvent=h;if(h){g.button=h.button?d[h.button]:(h.which?h.which-1:-1);if(c.test(h.type)&&g.button==-1){g.button=0}g.type=h.type;g.shiftKey=h.shiftKey;g.ctrlKey=h.ctrlKey||h.metaKey||false;g.altKey=h.altKey;g.keyCode=h.keyCode;g.charCode=h.charCode;g.target=b.getTarget(h);g.xy=b.getXY(h)}else{g.button=-1;g.shiftKey=false;g.ctrlKey=false;g.altKey=false;g.keyCode=0;g.charCode=0;g.target=null;g.xy=[0,0]}return g},stopEvent:function(){var e=this;if(e.browserEvent){if(e.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(e)}b.stopEvent(e.browserEvent)}},preventDefault:function(){if(this.browserEvent){b.preventDefault(this.browserEvent)}},stopPropagation:function(){var e=this;if(e.browserEvent){if(e.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(e)}b.stopPropagation(e.browserEvent)}},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){return this.normalizeKey(this.keyCode||this.charCode)},normalizeKey:function(e){return Ext.isSafari?(a[e]||e):e},getPageX:function(){return this.xy[0]},getPageY:function(){return this.xy[1]},getXY:function(){return this.xy},getTarget:function(g,h,e){return g?Ext.fly(this.target).findParent(g,h,e):(e?Ext.get(this.target):this.target)},getRelatedTarget:function(){return this.browserEvent?b.getRelatedTarget(this.browserEvent):null},getWheelDelta:function(){var g=this.browserEvent;var h=0;if(g.wheelDelta){h=g.wheelDelta/120}else{if(g.detail){h=-g.detail/3}}return h},within:function(h,i,e){if(h){var g=this[i?"getRelatedTarget":"getTarget"]();return g&&((e?(g==Ext.getDom(h)):false)||Ext.fly(h).contains(g))}return false}};return new Ext.EventObjectImpl()}();Ext.Loader=Ext.apply({},{load:function(j,i,k,c){var k=k||this,g=document.getElementsByTagName("head")[0],b=document.createDocumentFragment(),a=j.length,h=0,e=this;var l=function(m){g.appendChild(e.buildScriptTag(j[m],d))};var d=function(){h++;if(a==h&&typeof i=="function"){i.call(k)}else{if(c===true){l(h)}}};if(c===true){l.call(this,0)}else{Ext.each(j,function(n,m){b.appendChild(this.buildScriptTag(n,d))},this);g.appendChild(b)}},buildScriptTag:function(b,c){var a=document.createElement("script");a.type="text/javascript";a.src=b;if(a.readyState){a.onreadystatechange=function(){if(a.readyState=="loaded"||a.readyState=="complete"){a.onreadystatechange=null;c()}}}else{a.onload=c}return a}});Ext.ns("Ext.grid","Ext.list","Ext.dd","Ext.tree","Ext.form","Ext.menu","Ext.state","Ext.layout.boxOverflow","Ext.app","Ext.ux","Ext.chart","Ext.direct","Ext.slider");Ext.apply(Ext,function(){var c=Ext,a=0,b=null;return{emptyFn:function(){},BLANK_IMAGE_URL:Ext.isIE6||Ext.isIE7||Ext.isAir?"http://www.extjs.com/s.gif":"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",extendX:function(d,e){return Ext.extend(d,e(d.prototype))},getDoc:function(){return Ext.get(document)},num:function(e,d){e=Number(Ext.isEmpty(e)||Ext.isArray(e)||typeof e=="boolean"||(typeof e=="string"&&e.trim().length==0)?NaN:e);return isNaN(e)?d:e},value:function(g,d,e){return Ext.isEmpty(g,e)?d:g},escapeRe:function(d){return d.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1")},sequence:function(h,d,g,e){h[d]=h[d].createSequence(g,e)},addBehaviors:function(i){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(i)})}else{var e={},h,d,g;for(d in i){if((h=d.split("@"))[1]){g=h[0];if(!e[g]){e[g]=Ext.select(g)}e[g].on(h[1],i[d])}}e=null}},getScrollBarWidth:function(g){if(!Ext.isReady){return 0}if(g===true||b===null){var i=Ext.getBody().createChild('
    '),h=i.child("div",true);var e=h.offsetWidth;i.setStyle("overflow",(Ext.isWebKit||Ext.isGecko)?"auto":"scroll");var d=h.offsetWidth;i.remove();b=e-d+2}return b},combine:function(){var g=arguments,e=g.length,j=[];for(var h=0;hh?1:-1};Ext.each(d,function(h){g=e(g,h)==1?g:h});return g},mean:function(d){return d.length>0?Ext.sum(d)/d.length:undefined},sum:function(d){var e=0;Ext.each(d,function(g){e+=g});return e},partition:function(d,e){var g=[[],[]];Ext.each(d,function(j,k,h){g[(e&&e(j,k,h))||(!e&&j)?0:1].push(j)});return g},invoke:function(d,e){var h=[],g=Array.prototype.slice.call(arguments,2);Ext.each(d,function(j,k){if(j&&typeof j[e]=="function"){h.push(j[e].apply(j,g))}else{h.push(undefined)}});return h},pluck:function(d,g){var e=[];Ext.each(d,function(h){e.push(h[g])});return e},zip:function(){var n=Ext.partition(arguments,function(i){return typeof i!="function"}),k=n[0],m=n[1][0],d=Ext.max(Ext.pluck(k,"length")),h=[];for(var l=0;l=a.left&&b.right<=a.right&&b.top>=a.top&&b.bottom<=a.bottom)},getArea:function(){var a=this;return((a.bottom-a.top)*(a.right-a.left))},intersect:function(h){var g=this,d=Math.max(g.top,h.top),e=Math.min(g.right,h.right),a=Math.min(g.bottom,h.bottom),c=Math.max(g.left,h.left);if(a>=d&&e>=c){return new Ext.lib.Region(d,e,a,c)}},union:function(h){var g=this,d=Math.min(g.top,h.top),e=Math.max(g.right,h.right),a=Math.max(g.bottom,h.bottom),c=Math.min(g.left,h.left);return new Ext.lib.Region(d,e,a,c)},constrainTo:function(b){var a=this;a.top=a.top.constrain(b.top,b.bottom);a.bottom=a.bottom.constrain(b.top,b.bottom);a.left=a.left.constrain(b.left,b.right);a.right=a.right.constrain(b.left,b.right);return a},adjust:function(d,c,a,g){var e=this;e.top+=d;e.left+=c;e.right+=g;e.bottom+=a;return e}};Ext.lib.Region.getRegion=function(e){var h=Ext.lib.Dom.getXY(e),d=h[1],g=h[0]+e.offsetWidth,a=h[1]+e.offsetHeight,c=h[0];return new Ext.lib.Region(d,g,a,c)};Ext.lib.Point=function(a,c){if(Ext.isArray(a)){c=a[1];a=a[0]}var b=this;b.x=b.right=b.left=b[0]=a;b.y=b.top=b.bottom=b[1]=c};Ext.lib.Point.prototype=new Ext.lib.Region();Ext.apply(Ext.DomHelper,function(){var e,a="afterbegin",h="afterend",i="beforebegin",d="beforeend",b=/tag|children|cn|html$/i;function g(m,p,n,q,l,j){m=Ext.getDom(m);var k;if(e.useDom){k=c(p,null);if(j){m.appendChild(k)}else{(l=="firstChild"?m:m.parentNode).insertBefore(k,m[l]||m)}}else{k=Ext.DomHelper.insertHtml(q,m,Ext.DomHelper.createHtml(p))}return n?Ext.get(k,true):k}function c(j,r){var k,u=document,p,s,m,t;if(Ext.isArray(j)){k=u.createDocumentFragment();for(var q=0,n=j.length;q0){return setTimeout(d,c)}d();return 0},createSequence:function(c,b,a){if(!Ext.isFunction(b)){return c}else{return function(){var d=c.apply(this||window,arguments);b.apply(a||this||window,arguments);return d}}}};Ext.defer=Ext.util.Functions.defer;Ext.createInterceptor=Ext.util.Functions.createInterceptor;Ext.createSequence=Ext.util.Functions.createSequence;Ext.createDelegate=Ext.util.Functions.createDelegate;Ext.apply(Ext.util.Observable.prototype,function(){function a(j){var i=(this.methodEvents=this.methodEvents||{})[j],d,c,g,h=this;if(!i){this.methodEvents[j]=i={};i.originalFn=this[j];i.methodName=j;i.before=[];i.after=[];var b=function(l,k,e){if((c=l.apply(k||h,e))!==undefined){if(typeof c=="object"){if(c.returnValue!==undefined){d=c.returnValue}else{d=c}g=!!c.cancel}else{if(c===false){g=true}else{d=c}}}};this[j]=function(){var l=Array.prototype.slice.call(arguments,0),k;d=c=undefined;g=false;for(var m=0,e=i.before.length;m=525:!((Ext.isGecko&&!Ext.isWindows)||Ext.isOpera);return{_unload:function(){Ext.EventManager.un(window,"resize",this.fireWindowResize,this);c.call(Ext.EventManager)},doResizeEvent:function(){var m=a.getViewHeight(),l=a.getViewWidth();if(h!=m||i!=l){d.fire(i=l,h=m)}},onWindowResize:function(n,m,l){if(!d){d=new Ext.util.Event();k=new Ext.util.DelayedTask(this.doResizeEvent);Ext.EventManager.on(window,"resize",this.fireWindowResize,this)}d.addListener(n,m,l)},fireWindowResize:function(){if(d){k.delay(100)}},onTextResize:function(o,n,l){if(!g){g=new Ext.util.Event();var m=new Ext.Element(document.createElement("div"));m.dom.className="x-text-resize";m.dom.innerHTML="X";m.appendTo(document.body);b=m.dom.offsetHeight;setInterval(function(){if(m.dom.offsetHeight!=b){g.fire(b,b=m.dom.offsetHeight)}},this.textResizeInterval)}g.addListener(o,n,l)},removeResizeListener:function(m,l){if(d){d.removeListener(m,l)}},fireResize:function(){if(d){d.fire(a.getViewWidth(),a.getViewHeight())}},textResizeInterval:50,ieDeferSrc:false,getKeyEvent:function(){return e?"keydown":"keypress"},useKeydown:e}}());Ext.EventManager.on=Ext.EventManager.addListener;Ext.apply(Ext.EventObjectImpl.prototype,{BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,RETURN:13,SHIFT:16,CTRL:17,CONTROL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGEUP:33,PAGE_DOWN:34,PAGEDOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,isNavKeyPress:function(){var b=this,a=this.normalizeKey(b.keyCode);return(a>=33&&a<=40)||a==b.RETURN||a==b.TAB||a==b.ESC},isSpecialKey:function(){var a=this.normalizeKey(this.keyCode);return(this.type=="keypress"&&this.ctrlKey)||this.isNavKeyPress()||(a==this.BACKSPACE)||(a>=16&&a<=20)||(a>=44&&a<=46)},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1])},hasModifier:function(){return((this.ctrlKey||this.altKey)||this.shiftKey)}});Ext.Element.addMethods({swallowEvent:function(a,b){var d=this;function c(g){g.stopPropagation();if(b){g.preventDefault()}}if(Ext.isArray(a)){Ext.each(a,function(g){d.on(g,c)});return d}d.on(a,c);return d},relayEvent:function(a,b){this.on(a,function(c){b.fireEvent(a,c)})},clean:function(b){var d=this,e=d.dom,g=e.firstChild,c=-1;if(Ext.Element.data(e,"isCleaned")&&b!==true){return d}while(g){var a=g.nextSibling;if(g.nodeType==3&&!(/\S/.test(g.nodeValue))){e.removeChild(g)}else{g.nodeIndex=++c}g=a}Ext.Element.data(e,"isCleaned",true);return d},load:function(){var a=this.getUpdater();a.update.apply(a,arguments);return this},getUpdater:function(){return this.updateManager||(this.updateManager=new Ext.Updater(this))},update:function(html,loadScripts,callback){if(!this.dom){return this}html=html||"";if(loadScripts!==true){this.dom.innerHTML=html;if(typeof callback=="function"){callback()}return this}var id=Ext.id(),dom=this.dom;html+='';Ext.lib.Event.onAvailable(id,function(){var DOC=document,hd=DOC.getElementsByTagName("head")[0],re=/(?:]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,srcRe=/\ssrc=([\'\"])(.*?)\1/i,typeRe=/\stype=([\'\"])(.*?)\1/i,match,attrs,srcMatch,typeMatch,el,s;while((match=re.exec(html))){attrs=match[1];srcMatch=attrs?attrs.match(srcRe):false;if(srcMatch&&srcMatch[2]){s=DOC.createElement("script");s.src=srcMatch[2];typeMatch=attrs.match(typeRe);if(typeMatch&&typeMatch[2]){s.type=typeMatch[2]}hd.appendChild(s)}else{if(match[2]&&match[2].length>0){if(window.execScript){window.execScript(match[2])}else{window.eval(match[2])}}}}el=DOC.getElementById(id);if(el){Ext.removeNode(el)}if(typeof callback=="function"){callback()}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this},removeAllListeners:function(){this.removeAnchor();Ext.EventManager.removeAll(this.dom);return this},createProxy:function(a,e,d){a=(typeof a=="object")?a:{tag:"div",cls:a};var c=this,b=e?Ext.DomHelper.append(e,a,true):Ext.DomHelper.insertBefore(c.dom,a,true);if(d&&c.setBox&&c.getBox){b.setBox(c.getBox())}return b}});Ext.Element.prototype.getUpdateManager=Ext.Element.prototype.getUpdater;Ext.Element.addMethods({getAnchorXY:function(e,l,q){e=(e||"tl").toLowerCase();q=q||{};var k=this,b=k.dom==document.body||k.dom==document,n=q.width||b?Ext.lib.Dom.getViewWidth():k.getWidth(),i=q.height||b?Ext.lib.Dom.getViewHeight():k.getHeight(),p,a=Math.round,c=k.getXY(),m=k.getScroll(),j=b?m.left:!l?c[0]:0,g=b?m.top:!l?c[1]:0,d={c:[a(n*0.5),a(i*0.5)],t:[a(n*0.5),0],l:[0,a(i*0.5)],r:[n,a(i*0.5)],b:[a(n*0.5),i],tl:[0,0],bl:[0,i],br:[n,i],tr:[n,0]};p=d[e];return[p[0]+j,p[1]+g]},anchorTo:function(b,h,c,a,k,l){var i=this,e=i.dom,j=!Ext.isEmpty(k),d=function(){Ext.fly(e).alignTo(b,h,c,a);Ext.callback(l,Ext.fly(e))},g=this.getAnchor();this.removeAnchor();Ext.apply(g,{fn:d,scroll:j});Ext.EventManager.onWindowResize(d,null);if(j){Ext.EventManager.on(window,"scroll",d,null,{buffer:!isNaN(k)?k:50})}d.call(i);return i},removeAnchor:function(){var b=this,a=this.getAnchor();if(a&&a.fn){Ext.EventManager.removeResizeListener(a.fn);if(a.scroll){Ext.EventManager.un(window,"scroll",a.fn)}delete a.fn}return b},getAnchor:function(){var b=Ext.Element.data,c=this.dom;if(!c){return}var a=b(c,"_anchor");if(!a){a=b(c,"_anchor",{})}return a},getAlignToXY:function(g,A,B){g=Ext.get(g);if(!g||!g.dom){throw"Element.alignToXY with an element that doesn't exist"}B=B||[0,0];A=(!A||A=="?"?"tl-bl?":(!(/-/).test(A)&&A!==""?"tl-"+A:A||"tl-bl")).toLowerCase();var K=this,H=K.dom,M,L,n,l,s,F,v,t=Ext.lib.Dom.getViewWidth()-10,G=Ext.lib.Dom.getViewHeight()-10,b,i,j,k,u,z,N=document,J=N.documentElement,q=N.body,E=(J.scrollLeft||q.scrollLeft||0)+5,D=(J.scrollTop||q.scrollTop||0)+5,I=false,e="",a="",C=A.match(/^([a-z]+)-([a-z]+)(\?)?$/);if(!C){throw"Element.alignTo with an invalid alignment "+A}e=C[1];a=C[2];I=!!C[3];M=K.getAnchorXY(e,true);L=g.getAnchorXY(a,false);n=L[0]-M[0]+B[0];l=L[1]-M[1]+B[1];if(I){s=K.getWidth();F=K.getHeight();v=g.getRegion();b=e.charAt(0);i=e.charAt(e.length-1);j=a.charAt(0);k=a.charAt(a.length-1);u=((b=="t"&&j=="b")||(b=="b"&&j=="t"));z=((i=="r"&&k=="l")||(i=="l"&&k=="r"));if(n+s>t+E){n=z?v.left-s:t+E-s}if(nG+D){l=u?v.top-F:G+D-F}if(lB){p=B-q;m=true}if((o+C)>g){o=g-C;m=true}if(p"+String.format(Ext.Element.boxMarkup,c)+"
    "));Ext.DomQuery.selectNode("."+c+"-mc",d.dom).appendChild(this.dom);return d},setSize:function(e,c,d){var g=this;if(typeof e=="object"){c=e.height;e=e.width}e=g.adjustWidth(e);c=g.adjustHeight(c);if(!d||!g.anim){g.dom.style.width=g.addUnits(e);g.dom.style.height=g.addUnits(c)}else{g.anim({width:{to:e},height:{to:c}},g.preanim(arguments,2))}return g},getComputedHeight:function(){var d=this,c=Math.max(d.dom.offsetHeight,d.dom.clientHeight);if(!c){c=parseFloat(d.getStyle("height"))||0;if(!d.isBorderBox()){c+=d.getFrameWidth("tb")}}return c},getComputedWidth:function(){var c=Math.max(this.dom.offsetWidth,this.dom.clientWidth);if(!c){c=parseFloat(this.getStyle("width"))||0;if(!this.isBorderBox()){c+=this.getFrameWidth("lr")}}return c},getFrameWidth:function(d,c){return c&&this.isBorderBox()?0:(this.getPadding(d)+this.getBorderWidth(d))},addClassOnOver:function(c){this.hover(function(){Ext.fly(this,a).addClass(c)},function(){Ext.fly(this,a).removeClass(c)});return this},addClassOnFocus:function(c){this.on("focus",function(){Ext.fly(this,a).addClass(c)},this.dom);this.on("blur",function(){Ext.fly(this,a).removeClass(c)},this.dom);return this},addClassOnClick:function(c){var d=this.dom;this.on("mousedown",function(){Ext.fly(d,a).addClass(c);var g=Ext.getDoc(),e=function(){Ext.fly(d,a).removeClass(c);g.removeListener("mouseup",e)};g.on("mouseup",e)});return this},getViewSize:function(){var g=document,h=this.dom,c=(h==g||h==g.body);if(c){var e=Ext.lib.Dom;return{width:e.getViewWidth(),height:e.getViewHeight()}}else{return{width:h.clientWidth,height:h.clientHeight}}},getStyleSize:function(){var j=this,c,i,l=document,m=this.dom,e=(m==l||m==l.body),g=m.style;if(e){var k=Ext.lib.Dom;return{width:k.getViewWidth(),height:k.getViewHeight()}}if(g.width&&g.width!="auto"){c=parseFloat(g.width);if(j.isBorderBox()){c-=j.getFrameWidth("lr")}}if(g.height&&g.height!="auto"){i=parseFloat(g.height);if(j.isBorderBox()){i-=j.getFrameWidth("tb")}}return{width:c||j.getWidth(true),height:i||j.getHeight(true)}},getSize:function(c){return{width:this.getWidth(c),height:this.getHeight(c)}},repaint:function(){var c=this.dom;this.addClass("x-repaint");setTimeout(function(){Ext.fly(c).removeClass("x-repaint")},1);return this},unselectable:function(){this.dom.unselectable="on";return this.swallowEvent("selectstart",true).applyStyles("-moz-user-select:none;-khtml-user-select:none;").addClass("x-unselectable")},getMargins:function(d){var e=this,c,g={t:"top",l:"left",r:"right",b:"bottom"},h={};if(!d){for(c in e.margins){h[g[c]]=parseFloat(e.getStyle(e.margins[c]))||0}return h}else{return e.addStyles.call(e,d,e.margins)}}}}());Ext.Element.addMethods({setBox:function(e,g,b){var d=this,a=e.width,c=e.height;if((g&&!d.autoBoxAdjust)&&!d.isBorderBox()){a-=(d.getBorderWidth("lr")+d.getPadding("lr"));c-=(d.getBorderWidth("tb")+d.getPadding("tb"))}d.setBounds(e.x,e.y,a,c,d.animTest.call(d,arguments,b,2));return d},getBox:function(j,p){var m=this,v,e,o,d=m.getBorderWidth,q=m.getPadding,g,a,u,n;if(!p){v=m.getXY()}else{e=parseInt(m.getStyle("left"),10)||0;o=parseInt(m.getStyle("top"),10)||0;v=[e,o]}var c=m.dom,s=c.offsetWidth,i=c.offsetHeight,k;if(!j){k={x:v[0],y:v[1],0:v[0],1:v[1],width:s,height:i}}else{g=d.call(m,"l")+q.call(m,"l");a=d.call(m,"r")+q.call(m,"r");u=d.call(m,"t")+q.call(m,"t");n=d.call(m,"b")+q.call(m,"b");k={x:v[0]+g,y:v[1]+u,0:v[0]+g,1:v[1]+u,width:s-(g+a),height:i-(u+n)}}k.right=k.x+k.width;k.bottom=k.y+k.height;return k},move:function(j,b,c){var g=this,m=g.getXY(),k=m[0],i=m[1],d=[k-b,i],l=[k+b,i],h=[k,i-b],a=[k,i+b],e={l:d,left:d,r:l,right:l,t:h,top:h,up:h,b:a,bottom:a,down:a};j=j.toLowerCase();g.moveTo(e[j][0],e[j][1],g.animTest.call(g,arguments,c,2))},setLeftTop:function(d,c){var b=this,a=b.dom.style;a.left=b.addUnits(d);a.top=b.addUnits(c);return b},getRegion:function(){return Ext.lib.Dom.getRegion(this.dom)},setBounds:function(b,g,d,a,c){var e=this;if(!c||!e.anim){e.setSize(d,a);e.setLocation(b,g)}else{e.anim({points:{to:[b,g]},width:{to:e.adjustWidth(d)},height:{to:e.adjustHeight(a)}},e.preanim(arguments,4),"motion")}return e},setRegion:function(b,a){return this.setBounds(b.left,b.top,b.right-b.left,b.bottom-b.top,this.animTest.call(this,arguments,a,1))}});Ext.Element.addMethods({scrollTo:function(b,d,a){var e=/top/i.test(b),c=this,g=c.dom,h;if(!a||!c.anim){h="scroll"+(e?"Top":"Left");g[h]=d}else{h="scroll"+(e?"Left":"Top");c.anim({scroll:{to:e?[g[h],d]:[d,g[h]]}},c.preanim(arguments,2),"scroll")}return c},scrollIntoView:function(e,i){var p=Ext.getDom(e)||Ext.getBody().dom,h=this.dom,g=this.getOffsetsTo(p),k=g[0]+p.scrollLeft,u=g[1]+p.scrollTop,q=u+h.offsetHeight,d=k+h.offsetWidth,a=p.clientHeight,m=parseInt(p.scrollTop,10),s=parseInt(p.scrollLeft,10),j=m+a,n=s+p.clientWidth;if(h.offsetHeight>a||uj){p.scrollTop=q-a}}p.scrollTop=p.scrollTop;if(i!==false){if(h.offsetWidth>p.clientWidth||kn){p.scrollLeft=d-p.clientWidth}}p.scrollLeft=p.scrollLeft}return this},scrollChildIntoView:function(b,a){Ext.fly(b,"_scrollChildIntoView").scrollIntoView(this,a)},scroll:function(m,b,d){if(!this.isScrollable()){return false}var e=this.dom,g=e.scrollLeft,p=e.scrollTop,n=e.scrollWidth,k=e.scrollHeight,i=e.clientWidth,a=e.clientHeight,c=false,o,j={l:Math.min(g+b,n-i),r:o=Math.max(g-b,0),t:Math.max(p-b,0),b:Math.min(p+b,k-a)};j.d=j.b;j.u=j.t;m=m.substr(0,1);if((o=j[m])>-1){c=true;this.scrollTo(m=="l"||m=="r"?"left":"top",o,this.preanim(arguments,2))}return c}});Ext.Element.addMethods(function(){var d="visibility",b="display",a="hidden",h="none",c="x-masked",g="x-masked-relative",e=Ext.Element.data;return{isVisible:function(i){var j=!this.isStyle(d,a)&&!this.isStyle(b,h),k=this.dom.parentNode;if(i!==true||!j){return j}while(k&&!(/^body/i.test(k.tagName))){if(!Ext.fly(k,"_isVisible").isVisible()){return false}k=k.parentNode}return true},isDisplayed:function(){return !this.isStyle(b,h)},enableDisplayMode:function(i){this.setVisibilityMode(Ext.Element.DISPLAY);if(!Ext.isEmpty(i)){e(this.dom,"originalDisplay",i)}return this},mask:function(j,n){var p=this,l=p.dom,o=Ext.DomHelper,m="ext-el-mask-msg",i,q;if(!/^body/i.test(l.tagName)&&p.getStyle("position")=="static"){p.addClass(g)}if(i=e(l,"maskMsg")){i.remove()}if(i=e(l,"mask")){i.remove()}q=o.append(l,{cls:"ext-el-mask"},true);e(l,"mask",q);p.addClass(c);q.setDisplayed(true);if(typeof j=="string"){var k=o.append(l,{cls:m,cn:{tag:"div"}},true);e(l,"maskMsg",k);k.dom.className=n?m+" "+n:m;k.dom.firstChild.innerHTML=j;k.setDisplayed(true);k.center(p)}if(Ext.isIE&&!(Ext.isIE7&&Ext.isStrict)&&p.getStyle("height")=="auto"){q.setSize(undefined,p.getHeight())}return q},unmask:function(){var k=this,l=k.dom,i=e(l,"mask"),j=e(l,"maskMsg");if(i){if(j){j.remove();e(l,"maskMsg",undefined)}i.remove();e(l,"mask",undefined);k.removeClass([c,g])}},isMasked:function(){var i=e(this.dom,"mask");return i&&i.isVisible()},createShim:function(){var i=document.createElement("iframe"),j;i.frameBorder="0";i.className="ext-shim";i.src=Ext.SSL_SECURE_URL;j=Ext.get(this.dom.parentNode.insertBefore(i,this.dom));j.autoBoxAdjust=false;return j}}}());Ext.Element.addMethods({addKeyListener:function(b,d,c){var a;if(typeof b!="object"||Ext.isArray(b)){a={key:b,fn:d,scope:c}}else{a={key:b.key,shift:b.shift,ctrl:b.ctrl,alt:b.alt,fn:d,scope:c}}return new Ext.KeyMap(this,a)},addKeyMap:function(a){return new Ext.KeyMap(this,a)}});Ext.CompositeElementLite.importElementMethods();Ext.apply(Ext.CompositeElementLite.prototype,{addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(d,e){var c=this,a=this.elements,b;Ext.each(d,function(g){if((b=(a[g]||a[g=c.indexOf(g)]))){if(e){if(b.dom){b.remove()}else{Ext.removeNode(b)}}a.splice(g,1)}});return this}});Ext.CompositeElement=Ext.extend(Ext.CompositeElementLite,{constructor:function(b,a){this.elements=[];this.add(b,a)},getElement:function(a){return a},transformElement:function(a){return Ext.get(a)}});Ext.Element.select=function(a,d,b){var c;if(typeof a=="string"){c=Ext.Element.selectorFunction(a,b)}else{if(a.length!==undefined){c=a}else{throw"Invalid selector"}}return(d===true)?new Ext.CompositeElement(c):new Ext.CompositeElementLite(c)};Ext.select=Ext.Element.select;Ext.UpdateManager=Ext.Updater=Ext.extend(Ext.util.Observable,function(){var b="beforeupdate",d="update",c="failure";function a(h){var i=this;i.transaction=null;if(h.argument.form&&h.argument.reset){try{h.argument.form.reset()}catch(j){}}if(i.loadScripts){i.renderer.render(i.el,h,i,g.createDelegate(i,[h]))}else{i.renderer.render(i.el,h,i);g.call(i,h)}}function g(h,i,j){this.fireEvent(i||d,this.el,h);if(Ext.isFunction(h.argument.callback)){h.argument.callback.call(h.argument.scope,this.el,Ext.isEmpty(j)?true:false,h,h.argument.options)}}function e(h){g.call(this,h,c,!!(this.transaction=null))}return{constructor:function(i,h){var j=this;i=Ext.get(i);if(!h&&i.updateManager){return i.updateManager}j.el=i;j.defaultUrl=null;j.addEvents(b,d,c);Ext.apply(j,Ext.Updater.defaults);j.transaction=null;j.refreshDelegate=j.refresh.createDelegate(j);j.updateDelegate=j.update.createDelegate(j);j.formUpdateDelegate=(j.formUpdate||function(){}).createDelegate(j);j.renderer=j.renderer||j.getDefaultRenderer();Ext.Updater.superclass.constructor.call(j)},setRenderer:function(h){this.renderer=h},getRenderer:function(){return this.renderer},getDefaultRenderer:function(){return new Ext.Updater.BasicRenderer()},setDefaultUrl:function(h){this.defaultUrl=h},getEl:function(){return this.el},update:function(i,n,p,l){var k=this,h,j;if(k.fireEvent(b,k.el,i,n)!==false){if(Ext.isObject(i)){h=i;i=h.url;n=n||h.params;p=p||h.callback;l=l||h.discardUrl;j=h.scope;if(!Ext.isEmpty(h.nocache)){k.disableCaching=h.nocache}if(!Ext.isEmpty(h.text)){k.indicatorText='
    '+h.text+"
    "}if(!Ext.isEmpty(h.scripts)){k.loadScripts=h.scripts}if(!Ext.isEmpty(h.timeout)){k.timeout=h.timeout}}k.showLoading();if(!l){k.defaultUrl=i}if(Ext.isFunction(i)){i=i.call(k)}var m=Ext.apply({},{url:i,params:(Ext.isFunction(n)&&j)?n.createDelegate(j):n,success:a,failure:e,scope:k,callback:undefined,timeout:(k.timeout*1000),disableCaching:k.disableCaching,argument:{options:h,url:i,form:null,callback:p,scope:j||window,params:n}},h);k.transaction=Ext.Ajax.request(m)}},formUpdate:function(k,h,j,l){var i=this;if(i.fireEvent(b,i.el,k,h)!==false){if(Ext.isFunction(h)){h=h.call(i)}k=Ext.getDom(k);i.transaction=Ext.Ajax.request({form:k,url:h,success:a,failure:e,scope:i,timeout:(i.timeout*1000),argument:{url:h,form:k,callback:l,reset:j}});i.showLoading.defer(1,i)}},startAutoRefresh:function(i,j,l,m,h){var k=this;if(h){k.update(j||k.defaultUrl,l,m,true)}if(k.autoRefreshProcId){clearInterval(k.autoRefreshProcId)}k.autoRefreshProcId=setInterval(k.update.createDelegate(k,[j||k.defaultUrl,l,m,true]),i*1000)},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);delete this.autoRefreshProcId}},isAutoRefreshing:function(){return !!this.autoRefreshProcId},showLoading:function(){if(this.showLoadIndicator){this.el.dom.innerHTML=this.indicatorText}},abort:function(){if(this.transaction){Ext.Ajax.abort(this.transaction)}},isUpdating:function(){return this.transaction?Ext.Ajax.isLoading(this.transaction):false},refresh:function(h){if(this.defaultUrl){this.update(this.defaultUrl,null,h,true)}}}}());Ext.Updater.defaults={timeout:30,disableCaching:false,showLoadIndicator:true,indicatorText:'
    Loading...
    ',loadScripts:false,sslBlankUrl:Ext.SSL_SECURE_URL};Ext.Updater.updateElement=function(d,c,e,b){var a=Ext.get(d).getUpdater();Ext.apply(a,b);a.update(c,e,b?b.callback:null)};Ext.Updater.BasicRenderer=function(){};Ext.Updater.BasicRenderer.prototype={render:function(c,a,b,d){c.update(a.responseText,b.loadScripts,d)}};(function(){Date.useStrict=false;function b(d){var c=Array.prototype.slice.call(arguments,1);return d.replace(/\{(\d+)\}/g,function(e,g){return c[g]})}Date.formatCodeToRegex=function(d,c){var e=Date.parseCodes[d];if(e){e=typeof e=="function"?e():e;Date.parseCodes[d]=e}return e?Ext.applyIf({c:e.c?b(e.c,c||"{0}"):e.c},e):{g:0,c:null,s:Ext.escapeRe(d)}};var a=Date.formatCodeToRegex;Ext.apply(Date,{parseFunctions:{"M$":function(d,c){var e=new RegExp("\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/");var g=(d||"").match(e);return g?new Date(((g[1]||"")+g[2])*1):null}},parseRegexes:[],formatFunctions:{"M$":function(){return"\\/Date("+this.getTime()+")\\/"}},y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",defaults:{},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},getShortMonthName:function(c){return Date.monthNames[c].substring(0,3)},getShortDayName:function(c){return Date.dayNames[c].substring(0,3)},getMonthNumber:function(c){return Date.monthNumbers[c.substring(0,1).toUpperCase()+c.substring(1,3).toLowerCase()]},formatContainsHourInfo:(function(){var d=/(\\.)/g,c=/([gGhHisucUOPZ]|M\$)/;return function(e){return c.test(e.replace(d,""))}})(),formatCodes:{d:"String.leftPad(this.getDate(), 2, '0')",D:"Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"this.getSuffix()",w:"this.getDay()",z:"this.getDayOfYear()",W:"String.leftPad(this.getWeekOfYear(), 2, '0')",F:"Date.monthNames[this.getMonth()]",m:"String.leftPad(this.getMonth() + 1, 2, '0')",M:"Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"this.getDaysInMonth()",L:"(this.isLeapYear() ? 1 : 0)",o:"(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"String.leftPad(this.getHours(), 2, '0')",i:"String.leftPad(this.getMinutes(), 2, '0')",s:"String.leftPad(this.getSeconds(), 2, '0')",u:"String.leftPad(this.getMilliseconds(), 3, '0')",O:"this.getGMTOffset()",P:"this.getGMTOffset(true)",T:"this.getTimezone()",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var k="Y-m-dTH:i:sP",h=[],g=0,d=k.length;g= 0 && y >= 0){","v = new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (v.isLeapYear() && z <= 365))? v.add(Date.DAY, z) : null);","}else if(strict === true && !Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = new Date(y < 100 ? 100 : y, m, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");return function(m){var e=Date.parseRegexes.length,o=1,g=[],l=[],k=false,d="",j=0,h,n;for(;j Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:function(){return a("A")},A:{calcLast:true,g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return a("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return a("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var e=[],c=[a("Y",1),a("m",2),a("d",3),a("h",4),a("i",5),a("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",a("P",8).c,"}else{",a("O",8).c,"}","}"].join("\n")}];for(var g=0,d=c.length;g0?"-":"+")+String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset())/60),2,"0")+(a?":":"")+String.leftPad(Math.abs(this.getTimezoneOffset()%60),2,"0")},getDayOfYear:function(){var b=0,e=this.clone(),a=this.getMonth(),c;for(c=0,e.setDate(1),e.setMonth(0);c28){a=Math.min(a,this.getFirstDateOfMonth().add("mo",c).getLastDateOfMonth().getDate())}e.setDate(a);e.setMonth(this.getMonth()+c);break;case Date.YEAR:e.setFullYear(this.getFullYear()+c);break}return e},between:function(c,a){var b=this.getTime();return c.getTime()<=b&&b<=a.getTime()}});Date.prototype.format=Date.prototype.dateFormat;if(Ext.isSafari&&(navigator.userAgent.match(/WebKit\/(\d+)/)[1]||NaN)<420){Ext.apply(Date.prototype,{_xMonth:Date.prototype.setMonth,_xDate:Date.prototype.setDate,setMonth:function(a){if(a<=-1){var d=Math.ceil(-a),c=Math.ceil(d/12),b=(d%12)?12-d%12:0;this.setFullYear(this.getFullYear()-c);return this._xMonth(b)}else{return this._xMonth(a)}},setDate:function(a){return this.setTime(this.getTime()-(this.getDate()-a)*86400000)}})}Ext.util.MixedCollection=function(b,a){this.items=[];this.map={};this.keys=[];this.length=0;this.addEvents("clear","add","replace","remove","sort");this.allowFunctions=b===true;if(a){this.getKey=a}Ext.util.MixedCollection.superclass.constructor.call(this)};Ext.extend(Ext.util.MixedCollection,Ext.util.Observable,{allowFunctions:false,add:function(b,c){if(arguments.length==1){c=arguments[0];b=this.getKey(c)}if(typeof b!="undefined"&&b!==null){var a=this.map[b];if(typeof a!="undefined"){return this.replace(b,c)}this.map[b]=c}this.length++;this.items.push(c);this.keys.push(b);this.fireEvent("add",this.length-1,c,b);return c},getKey:function(a){return a.id},replace:function(c,d){if(arguments.length==1){d=arguments[0];c=this.getKey(d)}var a=this.map[c];if(typeof c=="undefined"||c===null||typeof a=="undefined"){return this.add(c,d)}var b=this.indexOfKey(c);this.items[b]=d;this.map[c]=d;this.fireEvent("replace",c,a,d);return d},addAll:function(e){if(arguments.length>1||Ext.isArray(e)){var b=arguments.length>1?arguments:e;for(var d=0,a=b.length;d=this.length){return this.add(b,c)}this.length++;this.items.splice(a,0,c);if(typeof b!="undefined"&&b!==null){this.map[b]=c}this.keys.splice(a,0,b);this.fireEvent("add",a,c,b);return c},remove:function(a){return this.removeAt(this.indexOf(a))},removeAt:function(a){if(a=0){this.length--;var c=this.items[a];this.items.splice(a,1);var b=this.keys[a];if(typeof b!="undefined"){delete this.map[b]}this.keys.splice(a,1);this.fireEvent("remove",c,b);return c}return false},removeKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(a){return this.items.indexOf(a)},indexOfKey:function(a){return this.keys.indexOf(a)},item:function(b){var a=this.map[b],c=a!==undefined?a:(typeof b=="number")?this.items[b]:undefined;return typeof c!="function"||this.allowFunctions?c:null},itemAt:function(a){return this.items[a]},key:function(a){return this.map[a]},contains:function(a){return this.indexOf(a)!=-1},containsKey:function(a){return typeof this.map[a]!="undefined"},clear:function(){this.length=0;this.items=[];this.keys=[];this.map={};this.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},_sort:function(k,a,j){var d,e,b=String(a).toUpperCase()=="DESC"?-1:1,h=[],l=this.keys,g=this.items;j=j||function(i,c){return i-c};for(d=0,e=g.length;de?1:(g=a;c--){d[d.length]=b[c]}}return d},filter:function(c,b,d,a){if(Ext.isEmpty(b,false)){return this.clone()}b=this.createValueMatcher(b,d,a);return this.filterBy(function(e){return e&&b.test(e[c])})},filterBy:function(g,e){var h=new Ext.util.MixedCollection();h.getKey=this.getKey;var b=this.keys,d=this.items;for(var c=0,a=d.length;c]+>/gi,stripScriptsRe=/(?:)((\n|\r|.)*?)(?:<\/script>)/ig,nl2brRe=/\r?\n/g;return{ellipsis:function(value,len,word){if(value&&value.length>len){if(word){var vs=value.substr(0,len-2),index=Math.max(vs.lastIndexOf(" "),vs.lastIndexOf("."),vs.lastIndexOf("!"),vs.lastIndexOf("?"));if(index==-1||index<(len-15)){return value.substr(0,len-3)+"..."}else{return vs.substr(0,index)+"..."}}else{return value.substr(0,len-3)+"..."}}return value},undef:function(value){return value!==undefined?value:""},defaultValue:function(value,defaultValue){return value!==undefined&&value!==""?value:defaultValue},htmlEncode:function(value){return !value?value:String(value).replace(/&/g,"&").replace(/>/g,">").replace(/").replace(/</g,"<").replace(/"/g,'"').replace(/&/g,"&")},trim:function(value){return String(value).replace(trimRe,"")},substr:function(value,start,length){return String(value).substr(start,length)},lowercase:function(value){return String(value).toLowerCase()},uppercase:function(value){return String(value).toUpperCase()},capitalize:function(value){return !value?value:value.charAt(0).toUpperCase()+value.substr(1).toLowerCase()},call:function(value,fn){if(arguments.length>2){var args=Array.prototype.slice.call(arguments,2);args.unshift(value);return eval(fn).apply(window,args)}else{return eval(fn).call(window,value)}},usMoney:function(v){v=(Math.round((v-0)*100))/100;v=(v==Math.floor(v))?v+".00":((v*10==Math.floor(v*10))?v+"0":v);v=String(v);var ps=v.split("."),whole=ps[0],sub=ps[1]?"."+ps[1]:".00",r=/(\d+)(\d{3})/;while(r.test(whole)){whole=whole.replace(r,"$1,$2")}v=whole+sub;if(v.charAt(0)=="-"){return"-$"+v.substr(1)}return"$"+v},date:function(v,format){if(!v){return""}if(!Ext.isDate(v)){v=new Date(Date.parse(v))}return v.dateFormat(format||"m/d/Y")},dateRenderer:function(format){return function(v){return Ext.util.Format.date(v,format)}},stripTags:function(v){return !v?v:String(v).replace(stripTagsRE,"")},stripScripts:function(v){return !v?v:String(v).replace(stripScriptsRe,"")},fileSize:function(size){if(size<1024){return size+" bytes"}else{if(size<1048576){return(Math.round(((size*10)/1024))/10)+" KB"}else{return(Math.round(((size*10)/1048576))/10)+" MB"}}},math:function(){var fns={};return function(v,a){if(!fns[a]){fns[a]=new Function("v","return v "+a+";")}return fns[a](v)}}(),round:function(value,precision){var result=Number(value);if(typeof precision=="number"){precision=Math.pow(10,precision);result=Math.round(value*precision)/precision}return result},number:function(v,format){if(!format){return v}v=Ext.num(v,NaN);if(isNaN(v)){return""}var comma=",",dec=".",i18n=false,neg=v<0;v=Math.abs(v);if(format.substr(format.length-2)=="/i"){format=format.substr(0,format.length-2);i18n=true;comma=".";dec=","}var hasComma=format.indexOf(comma)!=-1,psplit=(i18n?format.replace(/[^\d\,]/g,""):format.replace(/[^\d\.]/g,"")).split(dec);if(1")}}}();Ext.XTemplate=function(){Ext.XTemplate.superclass.constructor.apply(this,arguments);var y=this,j=y.html,q=/]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/,d=/^]*?for="(.*?)"/,v=/^]*?if="(.*?)"/,x=/^]*?exec="(.*?)"/,r,p=0,k=[],o="values",w="parent",l="xindex",n="xcount",e="return ",c="with(values){ ";j=["",j,""].join("");while((r=j.match(q))){var b=r[0].match(d),a=r[0].match(v),A=r[0].match(x),g=null,h=null,t=null,z=b&&b[1]?b[1]:"";if(a){g=a&&a[1]?a[1]:null;if(g){h=new Function(o,w,l,n,c+e+(Ext.util.Format.htmlDecode(g))+"; }")}}if(A){g=A&&A[1]?A[1]:null;if(g){t=new Function(o,w,l,n,c+(Ext.util.Format.htmlDecode(g))+"; }")}}if(z){switch(z){case".":z=new Function(o,w,c+e+o+"; }");break;case"..":z=new Function(o,w,c+e+w+"; }");break;default:z=new Function(o,w,c+e+z+"; }")}}k.push({id:p,target:z,exec:t,test:h,body:r[1]||""});j=j.replace(r[0],"{xtpl"+p+"}");++p}for(var u=k.length-1;u>=0;--u){y.compileTpl(k[u])}y.master=k[k.length-1];y.tpls=k};Ext.extend(Ext.XTemplate,Ext.Template,{re:/\{([\w\-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,codeRe:/\{\[((?:\\\]|.|\n)*?)\]\}/g,applySubTemplate:function(a,k,j,d,c){var h=this,g,m=h.tpls[a],l,b=[];if((m.test&&!m.test.call(h,k,j,d,c))||(m.exec&&m.exec.call(h,k,j,d,c))){return""}l=m.target?m.target.call(h,k,j):k;g=l.length;j=m.target?k:j;if(m.target&&Ext.isArray(l)){for(var e=0,g=l.length;e=0;--g){d[k[g].selectorText.toLowerCase()]=k[g]}}catch(i){}},getRules:function(h){if(d===null||h){d={};var k=c.styleSheets;for(var j=0,g=k.length;j=37&&a<=40){b.stopEvent()}},destroy:function(){this.disable()},enable:function(){if(this.disabled){if(Ext.isSafari2){this.el.on("keyup",this.stopKeyUp,this)}this.el.on(this.isKeydown()?"keydown":"keypress",this.relay,this);this.disabled=false}},disable:function(){if(!this.disabled){if(Ext.isSafari2){this.el.un("keyup",this.stopKeyUp,this)}this.el.un(this.isKeydown()?"keydown":"keypress",this.relay,this);this.disabled=true}},setDisabled:function(a){this[a?"disable":"enable"]()},isKeydown:function(){return this.forceKeyDown||Ext.EventManager.useKeydown}};Ext.KeyMap=function(c,b,a){this.el=Ext.get(c);this.eventName=a||"keydown";this.bindings=[];if(b){this.addBinding(b)}this.enable()};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(b){if(Ext.isArray(b)){Ext.each(b,function(j){this.addBinding(j)},this);return}var k=b.key,g=b.fn||b.handler,l=b.scope;if(b.stopEvent){this.stopEvent=b.stopEvent}if(typeof k=="string"){var h=[];var e=k.toUpperCase();for(var c=0,d=e.length;c2)?a[2]:null;var h=(i>3)?a[3]:"/";var d=(i>4)?a[4]:null;var g=(i>5)?a[5]:false;document.cookie=c+"="+escape(e)+((b===null)?"":("; expires="+b.toGMTString()))+((h===null)?"":("; path="+h))+((d===null)?"":("; domain="+d))+((g===true)?"; secure":"")},get:function(d){var b=d+"=";var g=b.length;var a=document.cookie.length;var e=0;var c=0;while(e0){return this.ownerCt.items.itemAt(a-1)}}return null},getBubbleTarget:function(){return this.ownerCt}});Ext.reg("component",Ext.Component);Ext.Action=Ext.extend(Object,{constructor:function(a){this.initialConfig=a;this.itemId=a.itemId=(a.itemId||a.id||Ext.id());this.items=[]},isAction:true,setText:function(a){this.initialConfig.text=a;this.callEach("setText",[a])},getText:function(){return this.initialConfig.text},setIconClass:function(a){this.initialConfig.iconCls=a;this.callEach("setIconClass",[a])},getIconClass:function(){return this.initialConfig.iconCls},setDisabled:function(a){this.initialConfig.disabled=a;this.callEach("setDisabled",[a])},enable:function(){this.setDisabled(false)},disable:function(){this.setDisabled(true)},isDisabled:function(){return this.initialConfig.disabled},setHidden:function(a){this.initialConfig.hidden=a;this.callEach("setVisible",[!a])},show:function(){this.setHidden(false)},hide:function(){this.setHidden(true)},isHidden:function(){return this.initialConfig.hidden},setHandler:function(b,a){this.initialConfig.handler=b;this.initialConfig.scope=a;this.callEach("setHandler",[b,a])},each:function(b,a){Ext.each(this.items,b,a)},callEach:function(e,b){var d=this.items;for(var c=0,a=d.length;cj+o.left){k=j-l-c;g=true}if((i+e)>d+o.top){i=d-e-c;g=true}if(k=m){i=m-e-5}}n=[k,i];this.storeXY(n);a.setXY.call(this,n);this.sync()}}return this},getConstrainOffset:function(){return this.shadowOffset},isVisible:function(){return this.visible},showAction:function(){this.visible=true;if(this.useDisplay===true){this.setDisplayed("")}else{if(this.lastXY){a.setXY.call(this,this.lastXY)}else{if(this.lastLT){a.setLeftTop.call(this,this.lastLT[0],this.lastLT[1])}}}},hideAction:function(){this.visible=false;if(this.useDisplay===true){this.setDisplayed(false)}else{this.setLeftTop(-10000,-10000)}},setVisible:function(i,h,k,l,j){if(i){this.showAction()}if(h&&i){var g=function(){this.sync(true);if(l){l()}}.createDelegate(this);a.setVisible.call(this,true,true,k,g,j)}else{if(!i){this.hideUnders(true)}var g=l;if(h){g=function(){this.hideAction();if(l){l()}}.createDelegate(this)}a.setVisible.call(this,i,h,k,g,j);if(i){this.sync(true)}else{if(!h){this.hideAction()}}}return this},storeXY:function(c){delete this.lastLT;this.lastXY=c},storeLeftTop:function(d,c){delete this.lastXY;this.lastLT=[d,c]},beforeFx:function(){this.beforeAction();return Ext.Layer.superclass.beforeFx.apply(this,arguments)},afterFx:function(){Ext.Layer.superclass.afterFx.apply(this,arguments);this.sync(this.isVisible())},beforeAction:function(){if(!this.updating&&this.shadow){this.shadow.hide()}},setLeft:function(c){this.storeLeftTop(c,this.getTop(true));a.setLeft.apply(this,arguments);this.sync();return this},setTop:function(c){this.storeLeftTop(this.getLeft(true),c);a.setTop.apply(this,arguments);this.sync();return this},setLeftTop:function(d,c){this.storeLeftTop(d,c);a.setLeftTop.apply(this,arguments);this.sync();return this},setXY:function(j,h,k,l,i){this.fixDisplay();this.beforeAction();this.storeXY(j);var g=this.createCB(l);a.setXY.call(this,j,h,k,g,i);if(!h){g()}return this},createCB:function(e){var d=this;return function(){d.constrainXY();d.sync(true);if(e){e()}}},setX:function(g,h,j,k,i){this.setXY([g,this.getY()],h,j,k,i);return this},setY:function(k,g,i,j,h){this.setXY([this.getX(),k],g,i,j,h);return this},setSize:function(j,k,i,m,n,l){this.beforeAction();var g=this.createCB(n);a.setSize.call(this,j,k,i,m,g,l);if(!i){g()}return this},setWidth:function(i,h,k,l,j){this.beforeAction();var g=this.createCB(l);a.setWidth.call(this,i,h,k,g,j);if(!h){g()}return this},setHeight:function(j,i,l,m,k){this.beforeAction();var g=this.createCB(m);a.setHeight.call(this,j,i,l,g,k);if(!i){g()}return this},setBounds:function(o,m,p,i,n,k,l,j){this.beforeAction();var g=this.createCB(l);if(!n){this.storeXY([o,m]);a.setXY.call(this,[o,m]);a.setSize.call(this,p,i,n,k,g,j);g()}else{a.setBounds.call(this,o,m,p,i,n,k,g,j)}return this},setZIndex:function(c){this.zindex=c;this.setStyle("z-index",c+2);if(this.shadow){this.shadow.setZIndex(c+1)}if(this.shim){this.shim.setStyle("z-index",c)}return this}})})();Ext.Shadow=function(d){Ext.apply(this,d);if(typeof this.mode!="string"){this.mode=this.defaultMode}var e=this.offset,c={h:0},b=Math.floor(this.offset/2);switch(this.mode.toLowerCase()){case"drop":c.w=0;c.l=c.t=e;c.t-=1;if(Ext.isIE){c.l-=this.offset+b;c.t-=this.offset+b;c.w-=b;c.h-=b;c.t+=1}break;case"sides":c.w=(e*2);c.l=-e;c.t=e-1;if(Ext.isIE){c.l-=(this.offset-b);c.t-=this.offset+b;c.l+=1;c.w-=(this.offset-b)*2;c.w-=b+1;c.h-=1}break;case"frame":c.w=c.h=(e*2);c.l=c.t=-e;c.t+=1;c.h-=2;if(Ext.isIE){c.l-=(this.offset-b);c.t-=(this.offset-b);c.l+=1;c.w-=(this.offset+b+1);c.h-=(this.offset+b);c.h+=1}break}this.adjusts=c};Ext.Shadow.prototype={offset:4,defaultMode:"drop",show:function(a){a=Ext.get(a);if(!this.el){this.el=Ext.Shadow.Pool.pull();if(this.el.dom.nextSibling!=a.dom){this.el.insertBefore(a)}}this.el.setStyle("z-index",this.zIndex||parseInt(a.getStyle("z-index"),10)-1);if(Ext.isIE){this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")"}this.realign(a.getLeft(true),a.getTop(true),a.getWidth(),a.getHeight());this.el.dom.style.display="block"},isVisible:function(){return this.el?true:false},realign:function(b,r,q,g){if(!this.el){return}var n=this.adjusts,k=this.el.dom,u=k.style,i=0,p=(q+n.w),e=(g+n.h),j=p+"px",o=e+"px",m,c;u.left=(b+n.l)+"px";u.top=(r+n.t)+"px";if(u.width!=j||u.height!=o){u.width=j;u.height=o;if(!Ext.isIE){m=k.childNodes;c=Math.max(0,(p-12))+"px";m[0].childNodes[1].style.width=c;m[1].childNodes[1].style.width=c;m[2].childNodes[1].style.width=c;m[1].style.height=Math.max(0,(e-12))+"px"}}},hide:function(){if(this.el){this.el.dom.style.display="none";Ext.Shadow.Pool.push(this.el);delete this.el}},setZIndex:function(a){this.zIndex=a;if(this.el){this.el.setStyle("z-index",a)}}};Ext.Shadow.Pool=function(){var b=[],a=Ext.isIE?'
    ':'
    ';return{pull:function(){var c=b.shift();if(!c){c=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,a));c.autoBoxAdjust=false}return c},push:function(c){b.push(c)}}}();Ext.BoxComponent=Ext.extend(Ext.Component,{initComponent:function(){Ext.BoxComponent.superclass.initComponent.call(this);this.addEvents("resize","move")},boxReady:false,deferHeight:false,setSize:function(b,d){if(typeof b=="object"){d=b.height;b=b.width}if(Ext.isDefined(b)&&Ext.isDefined(this.boxMinWidth)&&(bthis.boxMaxWidth)){b=this.boxMaxWidth}if(Ext.isDefined(d)&&Ext.isDefined(this.boxMaxHeight)&&(d>this.boxMaxHeight)){d=this.boxMaxHeight}if(!this.boxReady){this.width=b;this.height=d;return this}if(this.cacheSizes!==false&&this.lastSize&&this.lastSize.width==b&&this.lastSize.height==d){return this}this.lastSize={width:b,height:d};var c=this.adjustSize(b,d),g=c.width,a=c.height,e;if(g!==undefined||a!==undefined){e=this.getResizeEl();if(!this.deferHeight&&g!==undefined&&a!==undefined){e.setSize(g,a)}else{if(!this.deferHeight&&a!==undefined){e.setHeight(a)}else{if(g!==undefined){e.setWidth(g)}}}this.onResize(g,a,b,d);this.fireEvent("resize",this,g,a,b,d)}return this},setWidth:function(a){return this.setSize(a)},setHeight:function(a){return this.setSize(undefined,a)},getSize:function(){return this.getResizeEl().getSize()},getWidth:function(){return this.getResizeEl().getWidth()},getHeight:function(){return this.getResizeEl().getHeight()},getOuterSize:function(){var a=this.getResizeEl();return{width:a.getWidth()+a.getMargins("lr"),height:a.getHeight()+a.getMargins("tb")}},getPosition:function(a){var b=this.getPositionEl();if(a===true){return[b.getLeft(true),b.getTop(true)]}return this.xy||b.getXY()},getBox:function(a){var c=this.getPosition(a);var b=this.getSize();b.x=c[0];b.y=c[1];return b},updateBox:function(a){this.setSize(a.width,a.height);this.setPagePosition(a.x,a.y);return this},getResizeEl:function(){return this.resizeEl||this.el},setAutoScroll:function(a){if(this.rendered){this.getContentTarget().setOverflow(a?"auto":"")}this.autoScroll=a;return this},setPosition:function(a,g){if(a&&typeof a[1]=="number"){g=a[1];a=a[0]}this.x=a;this.y=g;if(!this.boxReady){return this}var b=this.adjustPosition(a,g);var e=b.x,d=b.y;var c=this.getPositionEl();if(e!==undefined||d!==undefined){if(e!==undefined&&d!==undefined){c.setLeftTop(e,d)}else{if(e!==undefined){c.setLeft(e)}else{if(d!==undefined){c.setTop(d)}}}this.onPosition(e,d);this.fireEvent("move",this,e,d)}return this},setPagePosition:function(a,c){if(a&&typeof a[1]=="number"){c=a[1];a=a[0]}this.pageX=a;this.pageY=c;if(!this.boxReady){return}if(a===undefined||c===undefined){return}var b=this.getPositionEl().translatePoints(a,c);this.setPosition(b.left,b.top);return this},afterRender:function(){Ext.BoxComponent.superclass.afterRender.call(this);if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl)}if(this.positionEl){this.positionEl=Ext.get(this.positionEl)}this.boxReady=true;Ext.isDefined(this.autoScroll)&&this.setAutoScroll(this.autoScroll);this.setSize(this.width,this.height);if(this.x||this.y){this.setPosition(this.x,this.y)}else{if(this.pageX||this.pageY){this.setPagePosition(this.pageX,this.pageY)}}},syncSize:function(){delete this.lastSize;this.setSize(this.autoWidth?undefined:this.getResizeEl().getWidth(),this.autoHeight?undefined:this.getResizeEl().getHeight());return this},onResize:function(d,b,a,c){},onPosition:function(a,b){},adjustSize:function(a,b){if(this.autoWidth){a="auto"}if(this.autoHeight){b="auto"}return{width:a,height:b}},adjustPosition:function(a,b){return{x:a,y:b}}});Ext.reg("box",Ext.BoxComponent);Ext.Spacer=Ext.extend(Ext.BoxComponent,{autoEl:"div"});Ext.reg("spacer",Ext.Spacer);Ext.SplitBar=function(c,e,b,d,a){this.el=Ext.get(c,true);this.el.dom.unselectable="on";this.resizingEl=Ext.get(e,true);this.orientation=b||Ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.animate=false;this.useShim=false;this.shim=null;if(!a){this.proxy=Ext.SplitBar.createProxy(this.orientation)}else{this.proxy=Ext.get(a).dom}this.dd=new Ext.dd.DDProxy(this.el.dom.id,"XSplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new Ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.placement=d||(this.el.getX()>this.resizingEl.getX()?Ext.SplitBar.LEFT:Ext.SplitBar.RIGHT);this.el.addClass("x-splitbar-h")}else{this.placement=d||(this.el.getY()>this.resizingEl.getY()?Ext.SplitBar.TOP:Ext.SplitBar.BOTTOM);this.el.addClass("x-splitbar-v")}this.addEvents("resize","moved","beforeresize","beforeapply");Ext.SplitBar.superclass.constructor.call(this)};Ext.extend(Ext.SplitBar,Ext.util.Observable,{onStartProxyDrag:function(a,e){this.fireEvent("beforeresize",this);this.overlay=Ext.DomHelper.append(document.body,{cls:"x-drag-overlay",html:" "},true);this.overlay.unselectable();this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();Ext.get(this.proxy).setDisplayed("block");var c=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();this.activeMaxSize=this.getMaximumSize();var d=c-this.activeMinSize;var b=Math.max(this.activeMaxSize-c,0);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==Ext.SplitBar.LEFT?d:b,this.placement==Ext.SplitBar.LEFT?b:d,this.tickSize);this.dd.setYConstraint(0,0)}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==Ext.SplitBar.TOP?d:b,this.placement==Ext.SplitBar.TOP?b:d,this.tickSize)}this.dragSpecs.startSize=c;this.dragSpecs.startPoint=[a,e];Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd,a,e)},onEndProxyDrag:function(c){Ext.get(this.proxy).setDisplayed(false);var b=Ext.lib.Event.getXY(c);if(this.overlay){Ext.destroy(this.overlay);delete this.overlay}var a;if(this.orientation==Ext.SplitBar.HORIZONTAL){a=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.LEFT?b[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-b[0])}else{a=this.dragSpecs.startSize+(this.placement==Ext.SplitBar.TOP?b[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-b[1])}a=Math.min(Math.max(a,this.activeMinSize),this.activeMaxSize);if(a!=this.dragSpecs.startSize){if(this.fireEvent("beforeapply",this,a)!==false){this.adapter.setElementSize(this,a);this.fireEvent("moved",this,a);this.fireEvent("resize",this,a)}}},getAdapter:function(){return this.adapter},setAdapter:function(a){this.adapter=a;this.adapter.init(this)},getMinimumSize:function(){return this.minSize},setMinimumSize:function(a){this.minSize=a},getMaximumSize:function(){return this.maxSize},setMaximumSize:function(a){this.maxSize=a},setCurrentSize:function(b){var a=this.animate;this.animate=false;this.adapter.setElementSize(this,b);this.animate=a},destroy:function(a){Ext.destroy(this.shim,Ext.get(this.proxy));this.dd.unreg();if(a){this.el.remove()}this.purgeListeners()}});Ext.SplitBar.createProxy=function(b){var c=new Ext.Element(document.createElement("div"));document.body.appendChild(c.dom);c.unselectable();var a="x-splitbar-proxy";c.addClass(a+" "+(b==Ext.SplitBar.HORIZONTAL?a+"-h":a+"-v"));return c.dom};Ext.SplitBar.BasicLayoutAdapter=function(){};Ext.SplitBar.BasicLayoutAdapter.prototype={init:function(a){},getElementSize:function(a){if(a.orientation==Ext.SplitBar.HORIZONTAL){return a.resizingEl.getWidth()}else{return a.resizingEl.getHeight()}},setElementSize:function(b,a,c){if(b.orientation==Ext.SplitBar.HORIZONTAL){if(!b.animate){b.resizingEl.setWidth(a);if(c){c(b,a)}}else{b.resizingEl.setWidth(a,true,0.1,c,"easeOut")}}else{if(!b.animate){b.resizingEl.setHeight(a);if(c){c(b,a)}}else{b.resizingEl.setHeight(a,true,0.1,c,"easeOut")}}}};Ext.SplitBar.AbsoluteLayoutAdapter=function(a){this.basic=new Ext.SplitBar.BasicLayoutAdapter();this.container=Ext.get(a)};Ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(a){this.basic.init(a)},getElementSize:function(a){return this.basic.getElementSize(a)},setElementSize:function(b,a,c){this.basic.setElementSize(b,a,this.moveSplitter.createDelegate(this,[b]))},moveSplitter:function(a){var b=Ext.SplitBar;switch(a.placement){case b.LEFT:a.el.setX(a.resizingEl.getRight());break;case b.RIGHT:a.el.setStyle("right",(this.container.getWidth()-a.resizingEl.getLeft())+"px");break;case b.TOP:a.el.setY(a.resizingEl.getBottom());break;case b.BOTTOM:a.el.setY(a.resizingEl.getTop()-a.el.getHeight());break}}};Ext.SplitBar.VERTICAL=1;Ext.SplitBar.HORIZONTAL=2;Ext.SplitBar.LEFT=1;Ext.SplitBar.RIGHT=2;Ext.SplitBar.TOP=3;Ext.SplitBar.BOTTOM=4;Ext.Container=Ext.extend(Ext.BoxComponent,{bufferResize:50,autoDestroy:true,forceLayout:false,defaultType:"panel",resizeEvent:"resize",bubbleEvents:["add","remove"],initComponent:function(){Ext.Container.superclass.initComponent.call(this);this.addEvents("afterlayout","beforeadd","beforeremove","add","remove");var a=this.items;if(a){delete this.items;this.add(a)}},initItems:function(){if(!this.items){this.items=new Ext.util.MixedCollection(false,this.getComponentId);this.getLayout()}},setLayout:function(a){if(this.layout&&this.layout!=a){this.layout.setContainer(null)}this.layout=a;this.initItems();a.setContainer(this)},afterRender:function(){Ext.Container.superclass.afterRender.call(this);if(!this.layout){this.layout="auto"}if(Ext.isObject(this.layout)&&!this.layout.layout){this.layoutConfig=this.layout;this.layout=this.layoutConfig.type}if(Ext.isString(this.layout)){this.layout=new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig)}this.setLayout(this.layout);if(this.activeItem!==undefined&&this.layout.setActiveItem){var a=this.activeItem;delete this.activeItem;this.layout.setActiveItem(a)}if(!this.ownerCt){this.doLayout(false,true)}if(this.monitorResize===true){Ext.EventManager.onWindowResize(this.doLayout,this,[false])}},getLayoutTarget:function(){return this.el},getComponentId:function(a){return a.getItemId()},add:function(b){this.initItems();var e=arguments.length>1;if(e||Ext.isArray(b)){var a=[];Ext.each(e?arguments:b,function(h){a.push(this.add(h))},this);return a}var g=this.lookupComponent(this.applyDefaults(b));var d=this.items.length;if(this.fireEvent("beforeadd",this,g,d)!==false&&this.onBeforeAdd(g)!==false){this.items.add(g);g.onAdded(this,d);this.onAdd(g);this.fireEvent("add",this,g,d)}return g},onAdd:function(a){},onAdded:function(a,b){this.ownerCt=a;this.initRef();this.cascade(function(d){d.initRef()});this.fireEvent("added",this,a,b)},insert:function(e,b){var d=arguments,h=d.length,a=[],g,j;this.initItems();if(h>2){for(g=h-1;g>=1;--g){a.push(this.insert(e,d[g]))}return a}j=this.lookupComponent(this.applyDefaults(b));e=Math.min(e,this.items.length);if(this.fireEvent("beforeadd",this,j,e)!==false&&this.onBeforeAdd(j)!==false){if(j.ownerCt==this){this.items.remove(j)}this.items.insert(e,j);j.onAdded(this,e);this.onAdd(j);this.fireEvent("add",this,j,e)}return j},applyDefaults:function(b){var a=this.defaults;if(a){if(Ext.isFunction(a)){a=a.call(this,b)}if(Ext.isString(b)){b=Ext.ComponentMgr.get(b);Ext.apply(b,a)}else{if(!b.events){Ext.applyIf(b.isAction?b.initialConfig:b,a)}else{Ext.apply(b,a)}}}return b},onBeforeAdd:function(a){if(a.ownerCt){a.ownerCt.remove(a,false)}if(this.hideBorders===true){a.border=(a.border===true)}},remove:function(a,b){this.initItems();var d=this.getComponent(a);if(d&&this.fireEvent("beforeremove",this,d)!==false){this.doRemove(d,b);this.fireEvent("remove",this,d)}return d},onRemove:function(a){},doRemove:function(e,d){var b=this.layout,a=b&&this.rendered;if(a){b.onRemove(e)}this.items.remove(e);e.onRemoved();this.onRemove(e);if(d===true||(d!==false&&this.autoDestroy)){e.destroy()}if(a){b.afterRemove(e)}},removeAll:function(c){this.initItems();var e,g=[],b=[];this.items.each(function(h){g.push(h)});for(var d=0,a=g.length;d','','
    ','
    ',"
    ");a.disableFormats=true;return a.compile()})(),destroy:function(){if(this.resizeTask&&this.resizeTask.cancel){this.resizeTask.cancel()}if(this.container){this.container.un(this.container.resizeEvent,this.onResize,this)}if(!Ext.isEmpty(this.targetCls)){var a=this.container.getLayoutTarget();if(a){a.removeClass(this.targetCls)}}}});Ext.layout.AutoLayout=Ext.extend(Ext.layout.ContainerLayout,{type:"auto",monitorResize:true,onLayout:function(d,g){Ext.layout.AutoLayout.superclass.onLayout.call(this,d,g);var e=this.getRenderedItems(d),a=e.length,b,h;for(b=0;b0){b.setSize(a)}}});Ext.Container.LAYOUTS.fit=Ext.layout.FitLayout;Ext.layout.CardLayout=Ext.extend(Ext.layout.FitLayout,{deferredRender:false,layoutOnCardChange:false,renderHidden:true,type:"card",setActiveItem:function(d){var a=this.activeItem,b=this.container;d=b.getComponent(d);if(d&&a!=d){if(a){a.hide();if(a.hidden!==true){return false}a.fireEvent("deactivate",a)}var c=d.doLayout&&(this.layoutOnCardChange||!d.rendered);this.activeItem=d;delete d.deferLayout;d.show();this.layout();if(c){d.doLayout()}d.fireEvent("activate",d)}},renderAll:function(a,b){if(this.deferredRender){this.renderItem(this.activeItem,undefined,b)}else{Ext.layout.CardLayout.superclass.renderAll.call(this,a,b)}}});Ext.Container.LAYOUTS.card=Ext.layout.CardLayout;Ext.layout.AnchorLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:"anchor",defaultAnchor:"100%",parseAnchorRE:/^(r|right|b|bottom)$/i,getLayoutTargetSize:function(){var b=this.container.getLayoutTarget(),a={};if(b){a=b.getViewSize();if(Ext.isIE&&Ext.isStrict&&a.width==0){a=b.getStyleSize()}a.width-=b.getPadding("lr");a.height-=b.getPadding("tb")}return a},onLayout:function(m,w){Ext.layout.AnchorLayout.superclass.onLayout.call(this,m,w);var p=this.getLayoutTargetSize(),k=p.width,o=p.height,q=w.getStyle("overflow"),n=this.getRenderedItems(m),t=n.length,g=[],j,a,v,l,h,c,e,d,u=0,s,b;if(k<20&&o<20){return}if(m.anchorSize){if(typeof m.anchorSize=="number"){a=m.anchorSize}else{a=m.anchorSize.width;v=m.anchorSize.height}}else{a=m.initialConfig.width;v=m.initialConfig.height}for(s=0;s 
    ');b.disableFormats=true;b.compile();Ext.layout.BorderLayout.Region.prototype.toolTemplate=b}this.collapsedEl=this.targetEl.createChild({cls:"x-layout-collapsed x-layout-collapsed-"+this.position,id:this.panel.id+"-xcollapsed"});this.collapsedEl.enableDisplayMode("block");if(this.collapseMode=="mini"){this.collapsedEl.addClass("x-layout-cmini-"+this.position);this.miniCollapsedEl=this.collapsedEl.createChild({cls:"x-layout-mini x-layout-mini-"+this.position,html:" "});this.miniCollapsedEl.addClassOnOver("x-layout-mini-over");this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this.onExpandClick,this,{stopEvent:true})}else{if(this.collapsible!==false&&!this.hideCollapseTool){var a=this.expandToolEl=this.toolTemplate.append(this.collapsedEl.dom,{id:"expand-"+this.position},true);a.addClassOnOver("x-tool-expand-"+this.position+"-over");a.on("click",this.onExpandClick,this,{stopEvent:true})}if(this.floatable!==false||this.titleCollapse){this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this[this.floatable?"collapseClick":"onExpandClick"],this)}}}return this.collapsedEl},onExpandClick:function(a){if(this.isSlid){this.panel.expand(false)}else{this.panel.expand()}},onCollapseClick:function(a){this.panel.collapse()},beforeCollapse:function(c,a){this.lastAnim=a;if(this.splitEl){this.splitEl.hide()}this.getCollapsedEl().show();var b=this.panel.getEl();this.originalZIndex=b.getStyle("z-index");b.setStyle("z-index",100);this.isCollapsed=true;this.layout.layout()},onCollapse:function(a){this.panel.el.setStyle("z-index",1);if(this.lastAnim===false||this.panel.animCollapse===false){this.getCollapsedEl().dom.style.visibility="visible"}else{this.getCollapsedEl().slideIn(this.panel.slideAnchor,{duration:0.2})}this.state.collapsed=true;this.panel.saveState()},beforeExpand:function(a){if(this.isSlid){this.afterSlideIn()}var b=this.getCollapsedEl();this.el.show();if(this.position=="east"||this.position=="west"){this.panel.setSize(undefined,b.getHeight())}else{this.panel.setSize(b.getWidth(),undefined)}b.hide();b.dom.style.visibility="hidden";this.panel.el.setStyle("z-index",this.floatingZIndex)},onExpand:function(){this.isCollapsed=false;if(this.splitEl){this.splitEl.show()}this.layout.layout();this.panel.el.setStyle("z-index",this.originalZIndex);this.state.collapsed=false;this.panel.saveState()},collapseClick:function(a){if(this.isSlid){a.stopPropagation();this.slideIn()}else{a.stopPropagation();this.slideOut()}},onHide:function(){if(this.isCollapsed){this.getCollapsedEl().hide()}else{if(this.splitEl){this.splitEl.hide()}}},onShow:function(){if(this.isCollapsed){this.getCollapsedEl().show()}else{if(this.splitEl){this.splitEl.show()}}},isVisible:function(){return !this.panel.hidden},getMargins:function(){return this.isCollapsed&&this.cmargins?this.cmargins:this.margins},getSize:function(){return this.isCollapsed?this.getCollapsedEl().getSize():this.panel.getSize()},setPanel:function(a){this.panel=a},getMinWidth:function(){return this.minWidth},getMinHeight:function(){return this.minHeight},applyLayoutCollapsed:function(a){var b=this.getCollapsedEl();b.setLeftTop(a.x,a.y);b.setSize(a.width,a.height)},applyLayout:function(a){if(this.isCollapsed){this.applyLayoutCollapsed(a)}else{this.panel.setPosition(a.x,a.y);this.panel.setSize(a.width,a.height)}},beforeSlide:function(){this.panel.beforeEffect()},afterSlide:function(){this.panel.afterEffect()},initAutoHide:function(){if(this.autoHide!==false){if(!this.autoHideHd){this.autoHideSlideTask=new Ext.util.DelayedTask(this.slideIn,this);this.autoHideHd={mouseout:function(a){if(!a.within(this.el,true)){this.autoHideSlideTask.delay(500)}},mouseover:function(a){this.autoHideSlideTask.cancel()},scope:this}}this.el.on(this.autoHideHd);this.collapsedEl.on(this.autoHideHd)}},clearAutoHide:function(){if(this.autoHide!==false){this.el.un("mouseout",this.autoHideHd.mouseout);this.el.un("mouseover",this.autoHideHd.mouseover);this.collapsedEl.un("mouseout",this.autoHideHd.mouseout);this.collapsedEl.un("mouseover",this.autoHideHd.mouseover)}},clearMonitor:function(){Ext.getDoc().un("click",this.slideInIf,this)},slideOut:function(){if(this.isSlid||this.el.hasActiveFx()){return}this.isSlid=true;var b=this.panel.tools,c,a;if(b&&b.toggle){b.toggle.hide()}this.el.show();a=this.panel.collapsed;this.panel.collapsed=false;if(this.position=="east"||this.position=="west"){c=this.panel.deferHeight;this.panel.deferHeight=false;this.panel.setSize(undefined,this.collapsedEl.getHeight());this.panel.deferHeight=c}else{this.panel.setSize(this.collapsedEl.getWidth(),undefined)}this.panel.collapsed=a;this.restoreLT=[this.el.dom.style.left,this.el.dom.style.top];this.el.alignTo(this.collapsedEl,this.getCollapseAnchor());this.el.setStyle("z-index",this.floatingZIndex+2);this.panel.el.replaceClass("x-panel-collapsed","x-panel-floating");if(this.animFloat!==false){this.beforeSlide();this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.afterSlide();this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)},scope:this,block:true})}else{this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this)}},afterSlideIn:function(){this.clearAutoHide();this.isSlid=false;this.clearMonitor();this.el.setStyle("z-index","");this.panel.el.replaceClass("x-panel-floating","x-panel-collapsed");this.el.dom.style.left=this.restoreLT[0];this.el.dom.style.top=this.restoreLT[1];var a=this.panel.tools;if(a&&a.toggle){a.toggle.show()}},slideIn:function(a){if(!this.isSlid||this.el.hasActiveFx()){Ext.callback(a);return}this.isSlid=false;if(this.animFloat!==false){this.beforeSlide();this.el.slideOut(this.getSlideAnchor(),{callback:function(){this.el.hide();this.afterSlide();this.afterSlideIn();Ext.callback(a)},scope:this,block:true})}else{this.el.hide();this.afterSlideIn()}},slideInIf:function(a){if(!a.within(this.el)){this.slideIn()}},anchors:{west:"left",east:"right",north:"top",south:"bottom"},sanchors:{west:"l",east:"r",north:"t",south:"b"},canchors:{west:"tl-tr",east:"tr-tl",north:"tl-bl",south:"bl-tl"},getAnchor:function(){return this.anchors[this.position]},getCollapseAnchor:function(){return this.canchors[this.position]},getSlideAnchor:function(){return this.sanchors[this.position]},getAlignAdj:function(){var a=this.cmargins;switch(this.position){case"west":return[0,0];break;case"east":return[0,0];break;case"north":return[0,0];break;case"south":return[0,0];break}},getExpandAdj:function(){var b=this.collapsedEl,a=this.cmargins;switch(this.position){case"west":return[-(a.right+b.getWidth()+a.left),0];break;case"east":return[a.right+b.getWidth()+a.left,0];break;case"north":return[0,-(a.top+a.bottom+b.getHeight())];break;case"south":return[0,a.top+a.bottom+b.getHeight()];break}},destroy:function(){if(this.autoHideSlideTask&&this.autoHideSlideTask.cancel){this.autoHideSlideTask.cancel()}Ext.destroyMembers(this,"miniCollapsedEl","collapsedEl","expandToolEl")}};Ext.layout.BorderLayout.SplitRegion=function(b,a,c){Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this,b,a,c);this.applyLayout=this.applyFns[c]};Ext.extend(Ext.layout.BorderLayout.SplitRegion,Ext.layout.BorderLayout.Region,{splitTip:"Drag to resize.",collapsibleSplitTip:"Drag to resize. Double click to hide.",useSplitTips:false,splitSettings:{north:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.TOP,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},south:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.BOTTOM,maxFn:"getVMaxSize",minProp:"minHeight",maxProp:"maxHeight"},east:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.RIGHT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"},west:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.LEFT,maxFn:"getHMaxSize",minProp:"minWidth",maxProp:"maxWidth"}},applyFns:{west:function(c){if(this.isCollapsed){return this.applyLayoutCollapsed(c)}var d=this.splitEl.dom,b=d.style;this.panel.setPosition(c.x,c.y);var a=d.offsetWidth;b.left=(c.x+c.width-a)+"px";b.top=(c.y)+"px";b.height=Math.max(0,c.height)+"px";this.panel.setSize(c.width-a,c.height)},east:function(c){if(this.isCollapsed){return this.applyLayoutCollapsed(c)}var d=this.splitEl.dom,b=d.style;var a=d.offsetWidth;this.panel.setPosition(c.x+a,c.y);b.left=(c.x)+"px";b.top=(c.y)+"px";b.height=Math.max(0,c.height)+"px";this.panel.setSize(c.width-a,c.height)},north:function(c){if(this.isCollapsed){return this.applyLayoutCollapsed(c)}var d=this.splitEl.dom,b=d.style;var a=d.offsetHeight;this.panel.setPosition(c.x,c.y);b.left=(c.x)+"px";b.top=(c.y+c.height-a)+"px";b.width=Math.max(0,c.width)+"px";this.panel.setSize(c.width,c.height-a)},south:function(c){if(this.isCollapsed){return this.applyLayoutCollapsed(c)}var d=this.splitEl.dom,b=d.style;var a=d.offsetHeight;this.panel.setPosition(c.x,c.y+a);b.left=(c.x)+"px";b.top=(c.y)+"px";b.width=Math.max(0,c.width)+"px";this.panel.setSize(c.width,c.height-a)}},render:function(a,c){Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this,a,c);var d=this.position;this.splitEl=a.createChild({cls:"x-layout-split x-layout-split-"+d,html:" ",id:this.panel.id+"-xsplit"});if(this.collapseMode=="mini"){this.miniSplitEl=this.splitEl.createChild({cls:"x-layout-mini x-layout-mini-"+d,html:" "});this.miniSplitEl.addClassOnOver("x-layout-mini-over");this.miniSplitEl.on("click",this.onCollapseClick,this,{stopEvent:true})}var b=this.splitSettings[d];this.split=new Ext.SplitBar(this.splitEl.dom,c.el,b.orientation);this.split.tickSize=this.tickSize;this.split.placement=b.placement;this.split.getMaximumSize=this[b.maxFn].createDelegate(this);this.split.minSize=this.minSize||this[b.minProp];this.split.on("beforeapply",this.onSplitMove,this);this.split.useShim=this.useShim===true;this.maxSize=this.maxSize||this[b.maxProp];if(c.hidden){this.splitEl.hide()}if(this.useSplitTips){this.splitEl.dom.title=this.collapsible?this.collapsibleSplitTip:this.splitTip}if(this.collapsible){this.splitEl.on("dblclick",this.onCollapseClick,this)}},getSize:function(){if(this.isCollapsed){return this.collapsedEl.getSize()}var a=this.panel.getSize();if(this.position=="north"||this.position=="south"){a.height+=this.splitEl.dom.offsetHeight}else{a.width+=this.splitEl.dom.offsetWidth}return a},getHMaxSize:function(){var b=this.maxSize||10000;var a=this.layout.center;return Math.min(b,(this.el.getWidth()+a.el.getWidth())-a.getMinWidth())},getVMaxSize:function(){var b=this.maxSize||10000;var a=this.layout.center;return Math.min(b,(this.el.getHeight()+a.el.getHeight())-a.getMinHeight())},onSplitMove:function(b,a){var c=this.panel.getSize();this.lastSplitSize=a;if(this.position=="north"||this.position=="south"){this.panel.setSize(c.width,a);this.state.height=a}else{this.panel.setSize(a,c.height);this.state.width=a}this.layout.layout();this.panel.saveState();return false},getSplitBar:function(){return this.split},destroy:function(){Ext.destroy(this.miniSplitEl,this.split,this.splitEl);Ext.layout.BorderLayout.SplitRegion.superclass.destroy.call(this)}});Ext.Container.LAYOUTS.border=Ext.layout.BorderLayout;Ext.layout.FormLayout=Ext.extend(Ext.layout.AnchorLayout,{labelSeparator:":",trackLabels:true,type:"form",onRemove:function(d){Ext.layout.FormLayout.superclass.onRemove.call(this,d);if(this.trackLabels){d.un("show",this.onFieldShow,this);d.un("hide",this.onFieldHide,this)}var b=d.getPositionEl(),a=d.getItemCt&&d.getItemCt();if(d.rendered&&a){if(b&&b.dom){b.insertAfter(a)}Ext.destroy(a);Ext.destroyMembers(d,"label","itemCt");if(d.customItemCt){Ext.destroyMembers(d,"getItemCt","customItemCt")}}},setContainer:function(a){Ext.layout.FormLayout.superclass.setContainer.call(this,a);if(a.labelAlign){a.addClass("x-form-label-"+a.labelAlign)}if(a.hideLabels){Ext.apply(this,{labelStyle:"display:none",elementStyle:"padding-left:0;",labelAdjust:0})}else{this.labelSeparator=Ext.isDefined(a.labelSeparator)?a.labelSeparator:this.labelSeparator;a.labelWidth=a.labelWidth||100;if(Ext.isNumber(a.labelWidth)){var b=Ext.isNumber(a.labelPad)?a.labelPad:5;Ext.apply(this,{labelAdjust:a.labelWidth+b,labelStyle:"width:"+a.labelWidth+"px;",elementStyle:"padding-left:"+(a.labelWidth+b)+"px"})}if(a.labelAlign=="top"){Ext.apply(this,{labelStyle:"width:auto;",labelAdjust:0,elementStyle:"padding-left:0;"})}}},isHide:function(a){return a.hideLabel||this.container.hideLabels},onFieldShow:function(a){a.getItemCt().removeClass("x-hide-"+a.hideMode);if(a.isComposite){a.doLayout()}},onFieldHide:function(a){a.getItemCt().addClass("x-hide-"+a.hideMode)},getLabelStyle:function(e){var b="",c=[this.labelStyle,e];for(var d=0,a=c.length;d=b)||(this.cells[c]&&this.cells[c][a])){if(b&&a>=b){c++;a=0}else{a++}}return[a,c]},renderItem:function(e,a,d){if(!this.table){this.table=d.createChild(Ext.apply({tag:"table",cls:"x-table-layout",cellspacing:0,cn:{tag:"tbody"}},this.tableAttrs),null,true)}if(e&&!e.rendered){e.render(this.getNextCell(e));this.configureItem(e)}else{if(e&&!this.isValidParent(e,d)){var b=this.getNextCell(e);b.insertBefore(e.getPositionEl().dom,null);e.container=Ext.get(b);this.configureItem(e)}}},isValidParent:function(b,a){return b.getPositionEl().up("table",5).dom.parentNode===(a.dom||a)},destroy:function(){delete this.table;Ext.layout.TableLayout.superclass.destroy.call(this)}});Ext.Container.LAYOUTS.table=Ext.layout.TableLayout;Ext.layout.AbsoluteLayout=Ext.extend(Ext.layout.AnchorLayout,{extraCls:"x-abs-layout-item",type:"absolute",onLayout:function(a,b){b.position();this.paddingLeft=b.getPadding("l");this.paddingTop=b.getPadding("t");Ext.layout.AbsoluteLayout.superclass.onLayout.call(this,a,b)},adjustWidthAnchor:function(b,a){return b?b-a.getPosition(true)[0]+this.paddingLeft:b},adjustHeightAnchor:function(b,a){return b?b-a.getPosition(true)[1]+this.paddingTop:b}});Ext.Container.LAYOUTS.absolute=Ext.layout.AbsoluteLayout;Ext.layout.BoxLayout=Ext.extend(Ext.layout.ContainerLayout,{defaultMargins:{left:0,top:0,right:0,bottom:0},padding:"0",pack:"start",monitorResize:true,type:"box",scrollOffset:0,extraCls:"x-box-item",targetCls:"x-box-layout-ct",innerCls:"x-box-inner",constructor:function(a){Ext.layout.BoxLayout.superclass.constructor.call(this,a);if(Ext.isString(this.defaultMargins)){this.defaultMargins=this.parseMargins(this.defaultMargins)}var d=this.overflowHandler;if(typeof d=="string"){d={type:d}}var c="none";if(d&&d.type!=undefined){c=d.type}var b=Ext.layout.boxOverflow[c];if(b[this.type]){b=b[this.type]}this.overflowHandler=new b(this,d)},onLayout:function(b,h){Ext.layout.BoxLayout.superclass.onLayout.call(this,b,h);var d=this.getLayoutTargetSize(),i=this.getVisibleItems(b),c=this.calculateChildBoxes(i,d),g=c.boxes,j=c.meta;if(d.width>0){var k=this.overflowHandler,a=j.tooNarrow?"handleOverflow":"clearOverflow";var e=k[a](c,d);if(e){if(e.targetSize){d=e.targetSize}if(e.recalculate){i=this.getVisibleItems(b);c=this.calculateChildBoxes(i,d);g=c.boxes}}}this.layoutTargetLastSize=d;this.childBoxCache=c;this.updateInnerCtSize(d,c);this.updateChildBoxes(g);this.handleTargetOverflow(d,b,h)},updateChildBoxes:function(c){for(var b=0,e=c.length;b(None)',constructor:function(a){Ext.layout.boxOverflow.Menu.superclass.constructor.apply(this,arguments);this.menuItems=[]},createInnerElements:function(){if(!this.afterCt){this.afterCt=this.layout.innerCt.insertSibling({cls:this.afterCls},"before")}},clearOverflow:function(a,g){var e=g.width+(this.afterCt?this.afterCt.getWidth():0),b=this.menuItems;this.hideTrigger();for(var c=0,d=b.length;ci.width;return l}},handleOverflow:function(d,h){this.showTrigger();var k=h.width-this.afterCt.getWidth(),l=d.boxes,e=0,r=false;for(var o=0,c=l.length;o=0;j--){var q=l[j].component,p=l[j].left+l[j].width;if(p>=k){this.menuItems.unshift({component:q,width:l[j].width});q.hide()}else{break}}}if(this.menuItems.length==0){this.hideTrigger()}return{targetSize:{height:h.height,width:k},recalculate:r}}});Ext.layout.boxOverflow.menu.hbox=Ext.layout.boxOverflow.HorizontalMenu;Ext.layout.boxOverflow.Scroller=Ext.extend(Ext.layout.boxOverflow.None,{animateScroll:true,scrollIncrement:100,wheelIncrement:3,scrollRepeatInterval:400,scrollDuration:0.4,beforeCls:"x-strip-left",afterCls:"x-strip-right",scrollerCls:"x-strip-scroller",beforeScrollerCls:"x-strip-scroller-left",afterScrollerCls:"x-strip-scroller-right",createWheelListener:function(){this.layout.innerCt.on({scope:this,mousewheel:function(a){a.stopEvent();this.scrollBy(a.getWheelDelta()*this.wheelIncrement*-1,false)}})},handleOverflow:function(a,b){this.createInnerElements();this.showScrollers()},clearOverflow:function(){this.hideScrollers()},showScrollers:function(){this.createScrollers();this.beforeScroller.show();this.afterScroller.show();this.updateScrollButtons()},hideScrollers:function(){if(this.beforeScroller!=undefined){this.beforeScroller.hide();this.afterScroller.hide()}},createScrollers:function(){if(!this.beforeScroller&&!this.afterScroller){var a=this.beforeCt.createChild({cls:String.format("{0} {1} ",this.scrollerCls,this.beforeScrollerCls)});var b=this.afterCt.createChild({cls:String.format("{0} {1}",this.scrollerCls,this.afterScrollerCls)});a.addClassOnOver(this.beforeScrollerCls+"-hover");b.addClassOnOver(this.afterScrollerCls+"-hover");a.setVisibilityMode(Ext.Element.DISPLAY);b.setVisibilityMode(Ext.Element.DISPLAY);this.beforeRepeater=new Ext.util.ClickRepeater(a,{interval:this.scrollRepeatInterval,handler:this.scrollLeft,scope:this});this.afterRepeater=new Ext.util.ClickRepeater(b,{interval:this.scrollRepeatInterval,handler:this.scrollRight,scope:this});this.beforeScroller=a;this.afterScroller=b}},destroy:function(){Ext.destroy(this.beforeScroller,this.afterScroller,this.beforeRepeater,this.afterRepeater,this.beforeCt,this.afterCt)},scrollBy:function(b,a){this.scrollTo(this.getScrollPosition()+b,a)},getItem:function(a){if(Ext.isString(a)){a=Ext.getCmp(a)}else{if(Ext.isNumber(a)){a=this.items[a]}}return a},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this}},updateScrollButtons:function(){if(this.beforeScroller==undefined||this.afterScroller==undefined){return}var d=this.atExtremeBefore()?"addClass":"removeClass",c=this.atExtremeAfter()?"addClass":"removeClass",a=this.beforeScrollerCls+"-disabled",b=this.afterScrollerCls+"-disabled";this.beforeScroller[d](a);this.afterScroller[c](b);this.scrolling=false},atExtremeBefore:function(){return this.getScrollPosition()===0},scrollLeft:function(a){this.scrollBy(-this.scrollIncrement,a)},scrollRight:function(a){this.scrollBy(this.scrollIncrement,a)},scrollToItem:function(d,b){d=this.getItem(d);if(d!=undefined){var a=this.getItemVisibility(d);if(!a.fullyVisible){var c=d.getBox(true,true),e=c.x;if(a.hiddenRight){e-=(this.layout.innerCt.getWidth()-c.width)}this.scrollTo(e,b)}}},getItemVisibility:function(e){var d=this.getItem(e).getBox(true,true),a=d.x,c=d.x+d.width,g=this.getScrollPosition(),b=this.layout.innerCt.getWidth()+g;return{hiddenLeft:ab,fullyVisible:a>g&&c=this.getMaxScrollBottom()}});Ext.layout.boxOverflow.scroller.vbox=Ext.layout.boxOverflow.VerticalScroller;Ext.layout.boxOverflow.HorizontalScroller=Ext.extend(Ext.layout.boxOverflow.Scroller,{handleOverflow:function(a,b){Ext.layout.boxOverflow.HorizontalScroller.superclass.handleOverflow.apply(this,arguments);return{targetSize:{height:b.height,width:b.width-(this.beforeCt.getWidth()+this.afterCt.getWidth())}}},createInnerElements:function(){var a=this.layout.innerCt;if(!this.beforeCt){this.afterCt=a.insertSibling({cls:this.afterCls},"before");this.beforeCt=a.insertSibling({cls:this.beforeCls},"before");this.createWheelListener()}},scrollTo:function(a,b){var d=this.getScrollPosition(),c=a.constrain(0,this.getMaxScrollRight());if(c!=d&&!this.scrolling){if(b==undefined){b=this.animateScroll}this.layout.innerCt.scrollTo("left",c,b?this.getScrollAnim():false);if(b){this.scrolling=true}else{this.scrolling=false;this.updateScrollButtons()}}},getScrollPosition:function(){return parseInt(this.layout.innerCt.dom.scrollLeft,10)||0},getMaxScrollRight:function(){return this.layout.innerCt.dom.scrollWidth-this.layout.innerCt.getWidth()},atExtremeAfter:function(){return this.getScrollPosition()>=this.getMaxScrollRight()}});Ext.layout.boxOverflow.scroller.hbox=Ext.layout.boxOverflow.HorizontalScroller;Ext.layout.HBoxLayout=Ext.extend(Ext.layout.BoxLayout,{align:"top",type:"hbox",calculateChildBoxes:function(r,b){var F=r.length,R=this.padding,D=R.top,U=R.left,y=D+R.bottom,O=U+R.right,a=b.width-this.scrollOffset,e=b.height,o=Math.max(0,e-y),P=this.pack=="start",W=this.pack=="center",A=this.pack=="end",L=0,Q=0,T=0,l=0,X=0,H=[],k,J,M,V,w,j,S,I,c,x,q,N;for(S=0;Sa;var n=Math.max(0,a-L-O);if(p){for(S=0;S0){var C=[];for(var E=0,v=F;Ei.available?1:-1});for(var S=0,v=C.length;S0){I.top=D+q+(z/2)}}U+=I.width+w.right}return{boxes:H,meta:{maxHeight:Q,nonFlexWidth:L,desiredWidth:l,minimumWidth:X,shortfall:l-a,tooNarrow:p}}}});Ext.Container.LAYOUTS.hbox=Ext.layout.HBoxLayout;Ext.layout.VBoxLayout=Ext.extend(Ext.layout.BoxLayout,{align:"left",type:"vbox",calculateChildBoxes:function(o,b){var E=o.length,R=this.padding,C=R.top,V=R.left,x=C+R.bottom,O=V+R.right,a=b.width-this.scrollOffset,c=b.height,K=Math.max(0,a-O),P=this.pack=="start",X=this.pack=="center",z=this.pack=="end",k=0,u=0,U=0,L=0,m=0,G=[],h,I,N,W,t,g,T,H,S,w,n,d,r;for(T=0;Tc;var q=Math.max(0,(c-k-x));if(l){for(T=0,r=E;T0){var J=[];for(var D=0,r=E;Di.available?1:-1});for(var T=0,r=J.length;T0){H.left=V+w+(y/2)}}C+=H.height+t.bottom}return{boxes:G,meta:{maxWidth:u,nonFlexHeight:k,desiredHeight:L,minimumHeight:m,shortfall:L-c,tooNarrow:l}}}});Ext.Container.LAYOUTS.vbox=Ext.layout.VBoxLayout;Ext.layout.ToolbarLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:"toolbar",triggerWidth:18,noItemsMenuText:'
    (None)
    ',lastOverflow:false,tableHTML:['',"","",'",'","","","
    ','',"",'',"","
    ","
    ','',"","","","","","","
    ",'',"",'',"","
    ","
    ",'',"",'',"","
    ","
    ","
    "].join(""),onLayout:function(e,j){if(!this.leftTr){var h=e.buttonAlign=="center"?"center":"left";j.addClass("x-toolbar-layout-ct");j.insertHtml("beforeEnd",String.format(this.tableHTML,h));this.leftTr=j.child("tr.x-toolbar-left-row",true);this.rightTr=j.child("tr.x-toolbar-right-row",true);this.extrasTr=j.child("tr.x-toolbar-extras-row",true);if(this.hiddenItem==undefined){this.hiddenItems=[]}}var k=e.buttonAlign=="right"?this.rightTr:this.leftTr,l=e.items.items,d=0;for(var b=0,g=l.length,m;b=0&&(d=e[a]);a--){if(!d.firstChild){b.removeChild(d)}}},insertCell:function(e,b,a){var d=document.createElement("td");d.className="x-toolbar-cell";b.insertBefore(d,b.childNodes[a]||null);return d},hideItem:function(a){this.hiddenItems.push(a);a.xtbHidden=true;a.xtbWidth=a.getPositionEl().dom.parentNode.offsetWidth;a.hide()},unhideItem:function(a){a.show();a.xtbHidden=false;this.hiddenItems.remove(a)},getItemWidth:function(a){return a.hidden?(a.xtbWidth||0):a.getPositionEl().dom.parentNode.offsetWidth},fitToSize:function(k){if(this.container.enableOverflow===false){return}var b=k.dom.clientWidth,j=k.dom.firstChild.offsetWidth,m=b-this.triggerWidth,a=this.lastWidth||0,c=this.hiddenItems,e=c.length!=0,n=b>=a;this.lastWidth=b;if(j>b||(e&&n)){var l=this.container.items.items,h=l.length,d=0,o;for(var g=0;gm){if(!(o.hidden||o.xtbHidden)){this.hideItem(o)}}else{if(o.xtbHidden){this.unhideItem(o)}}}}}e=c.length!=0;if(e){this.initMore();if(!this.lastOverflow){this.container.fireEvent("overflowchange",this.container,true);this.lastOverflow=true}}else{if(this.more){this.clearMenu();this.more.destroy();delete this.more;if(this.lastOverflow){this.container.fireEvent("overflowchange",this.container,false);this.lastOverflow=false}}}},createMenuConfig:function(c,a){var b=Ext.apply({},c.initialConfig),d=c.toggleGroup;Ext.copyTo(b,c,["iconCls","icon","itemId","disabled","handler","scope","menu"]);Ext.apply(b,{text:c.overflowText||c.text,hideOnClick:a});if(d||c.enableToggle){Ext.apply(b,{group:d,checked:c.pressed,listeners:{checkchange:function(g,e){c.toggle(e)}}})}delete b.ownerCt;delete b.xtype;delete b.id;return b},addComponentToMenu:function(b,a){if(a instanceof Ext.Toolbar.Separator){b.add("-")}else{if(Ext.isFunction(a.isXType)){if(a.isXType("splitbutton")){b.add(this.createMenuConfig(a,true))}else{if(a.isXType("button")){b.add(this.createMenuConfig(a,!a.menu))}else{if(a.isXType("buttongroup")){a.items.each(function(c){this.addComponentToMenu(b,c)},this)}}}}}},clearMenu:function(){var a=this.moreMenu;if(a&&a.items){a.items.each(function(b){delete b.menu})}},beforeMoreShow:function(h){var b=this.container.items.items,a=b.length,g,e;var c=function(j,i){return j.isXType("buttongroup")&&!(i instanceof Ext.Toolbar.Separator)};this.clearMenu();h.removeAll();for(var d=0;d','','{altText}',"","")}if(g&&!g.rendered){if(Ext.isNumber(b)){b=e.dom.childNodes[b]}var d=this.getItemArgs(g);g.render(g.positionEl=b?this.itemTpl.insertBefore(b,d,true):this.itemTpl.append(e,d,true));g.positionEl.menuItemId=g.getItemId();if(!d.isMenuItem&&d.needsIcon){g.positionEl.addClass("x-menu-list-item-indent")}this.configureItem(g)}else{if(g&&!this.isValidParent(g,e)){if(Ext.isNumber(b)){b=e.dom.childNodes[b]}e.dom.insertBefore(g.getActionEl().dom,b||null)}}},getItemArgs:function(d){var a=d instanceof Ext.menu.Item,b=!(a||d instanceof Ext.menu.Separator);return{isMenuItem:a,needsIcon:b&&(d.icon||d.iconCls),icon:d.icon||Ext.BLANK_IMAGE_URL,iconCls:"x-menu-item-icon "+(d.iconCls||""),itemId:"x-menu-el-"+d.id,itemCls:"x-menu-list-item ",altText:d.altText||""}},isValidParent:function(b,a){return b.el.up("li.x-menu-list-item",5).dom.parentNode===(a.dom||a)},onLayout:function(a,b){Ext.layout.MenuLayout.superclass.onLayout.call(this,a,b);this.doAutoSize()},doAutoSize:function(){var c=this.container,a=c.width;if(c.floating){if(a){c.setWidth(a)}else{if(Ext.isIE){c.setWidth(Ext.isStrict&&(Ext.isIE7||Ext.isIE8||Ext.isIE9)?"auto":c.minWidth);var d=c.getEl(),b=d.dom.offsetWidth;c.setWidth(c.getLayoutTarget().getWidth()+d.getFrameWidth("lr"))}}}}});Ext.Container.LAYOUTS.menu=Ext.layout.MenuLayout;Ext.Viewport=Ext.extend(Ext.Container,{initComponent:function(){Ext.Viewport.superclass.initComponent.call(this);document.getElementsByTagName("html")[0].className+=" x-viewport";this.el=Ext.getBody();this.el.setHeight=Ext.emptyFn;this.el.setWidth=Ext.emptyFn;this.el.setSize=Ext.emptyFn;this.el.dom.scroll="no";this.allowDomMove=false;this.autoWidth=true;this.autoHeight=true;Ext.EventManager.onWindowResize(this.fireResize,this);this.renderTo=this.el},fireResize:function(a,b){this.fireEvent("resize",this,a,b,a,b)}});Ext.reg("viewport",Ext.Viewport);Ext.Panel=Ext.extend(Ext.Container,{baseCls:"x-panel",collapsedCls:"x-panel-collapsed",maskDisabled:true,animCollapse:Ext.enableFx,headerAsText:true,buttonAlign:"right",collapsed:false,collapseFirst:true,minButtonWidth:75,elements:"body",preventBodyReset:false,padding:undefined,resizeEvent:"bodyresize",toolTarget:"header",collapseEl:"bwrap",slideAnchor:"t",disabledClass:"",deferHeight:true,expandDefaults:{duration:0.25},collapseDefaults:{duration:0.25},initComponent:function(){Ext.Panel.superclass.initComponent.call(this);this.addEvents("bodyresize","titlechange","iconchange","collapse","expand","beforecollapse","beforeexpand","beforeclose","close","activate","deactivate");if(this.unstyled){this.baseCls="x-plain"}this.toolbars=[];if(this.tbar){this.elements+=",tbar";this.topToolbar=this.createToolbar(this.tbar);this.tbar=null}if(this.bbar){this.elements+=",bbar";this.bottomToolbar=this.createToolbar(this.bbar);this.bbar=null}if(this.header===true){this.elements+=",header";this.header=null}else{if(this.headerCfg||(this.title&&this.header!==false)){this.elements+=",header"}}if(this.footerCfg||this.footer===true){this.elements+=",footer";this.footer=null}if(this.buttons){this.fbar=this.buttons;this.buttons=null}if(this.fbar){this.createFbar(this.fbar)}if(this.autoLoad){this.on("render",this.doAutoLoad,this,{delay:10})}},createFbar:function(b){var a=this.minButtonWidth;this.elements+=",footer";this.fbar=this.createToolbar(b,{buttonAlign:this.buttonAlign,toolbarCls:"x-panel-fbar",enableOverflow:false,defaults:function(d){return{minWidth:d.minWidth||a}}});this.fbar.items.each(function(d){d.minWidth=d.minWidth||this.minButtonWidth},this);this.buttons=this.fbar.items.items},createToolbar:function(b,c){var a;if(Ext.isArray(b)){b={items:b}}a=b.events?Ext.apply(b,c):this.createComponent(Ext.apply({},b,c),"toolbar");this.toolbars.push(a);return a},createElement:function(a,c){if(this[a]){c.appendChild(this[a].dom);return}if(a==="bwrap"||this.elements.indexOf(a)!=-1){if(this[a+"Cfg"]){this[a]=Ext.fly(c).createChild(this[a+"Cfg"])}else{var b=document.createElement("div");b.className=this[a+"Cls"];this[a]=Ext.get(c.appendChild(b))}if(this[a+"CssClass"]){this[a].addClass(this[a+"CssClass"])}if(this[a+"Style"]){this[a].applyStyles(this[a+"Style"])}}},onRender:function(g,e){Ext.Panel.superclass.onRender.call(this,g,e);this.createClasses();var a=this.el,h=a.dom,k,i;if(this.collapsible&&!this.hideCollapseTool){this.tools=this.tools?this.tools.slice(0):[];this.tools[this.collapseFirst?"unshift":"push"]({id:"toggle",handler:this.toggleCollapse,scope:this})}if(this.tools){i=this.tools;this.elements+=(this.header!==false)?",header":""}this.tools={};a.addClass(this.baseCls);if(h.firstChild){this.header=a.down("."+this.headerCls);this.bwrap=a.down("."+this.bwrapCls);var j=this.bwrap?this.bwrap:a;this.tbar=j.down("."+this.tbarCls);this.body=j.down("."+this.bodyCls);this.bbar=j.down("."+this.bbarCls);this.footer=j.down("."+this.footerCls);this.fromMarkup=true}if(this.preventBodyReset===true){a.addClass("x-panel-reset")}if(this.cls){a.addClass(this.cls)}if(this.buttons){this.elements+=",footer"}if(this.frame){a.insertHtml("afterBegin",String.format(Ext.Element.boxMarkup,this.baseCls));this.createElement("header",h.firstChild.firstChild.firstChild);this.createElement("bwrap",h);k=this.bwrap.dom;var c=h.childNodes[1],b=h.childNodes[2];k.appendChild(c);k.appendChild(b);var l=k.firstChild.firstChild.firstChild;this.createElement("tbar",l);this.createElement("body",l);this.createElement("bbar",l);this.createElement("footer",k.lastChild.firstChild.firstChild);if(!this.footer){this.bwrap.dom.lastChild.className+=" x-panel-nofooter"}this.ft=Ext.get(this.bwrap.dom.lastChild);this.mc=Ext.get(l)}else{this.createElement("header",h);this.createElement("bwrap",h);k=this.bwrap.dom;this.createElement("tbar",k);this.createElement("body",k);this.createElement("bbar",k);this.createElement("footer",k);if(!this.header){this.body.addClass(this.bodyCls+"-noheader");if(this.tbar){this.tbar.addClass(this.tbarCls+"-noheader")}}}if(Ext.isDefined(this.padding)){this.body.setStyle("padding",this.body.addUnits(this.padding))}if(this.border===false){this.el.addClass(this.baseCls+"-noborder");this.body.addClass(this.bodyCls+"-noborder");if(this.header){this.header.addClass(this.headerCls+"-noborder")}if(this.footer){this.footer.addClass(this.footerCls+"-noborder")}if(this.tbar){this.tbar.addClass(this.tbarCls+"-noborder")}if(this.bbar){this.bbar.addClass(this.bbarCls+"-noborder")}}if(this.bodyBorder===false){this.body.addClass(this.bodyCls+"-noborder")}this.bwrap.enableDisplayMode("block");if(this.header){this.header.unselectable();if(this.headerAsText){this.header.dom.innerHTML=''+this.header.dom.innerHTML+"";if(this.iconCls){this.setIconClass(this.iconCls)}}}if(this.floating){this.makeFloating(this.floating)}if(this.collapsible&&this.titleCollapse&&this.header){this.mon(this.header,"click",this.toggleCollapse,this);this.header.setStyle("cursor","pointer")}if(i){this.addTool.apply(this,i)}if(this.fbar){this.footer.addClass("x-panel-btns");this.fbar.ownerCt=this;this.fbar.render(this.footer);this.footer.createChild({cls:"x-clear"})}if(this.tbar&&this.topToolbar){this.topToolbar.ownerCt=this;this.topToolbar.render(this.tbar)}if(this.bbar&&this.bottomToolbar){this.bottomToolbar.ownerCt=this;this.bottomToolbar.render(this.bbar)}},setIconClass:function(b){var a=this.iconCls;this.iconCls=b;if(this.rendered&&this.header){if(this.frame){this.header.addClass("x-panel-icon");this.header.replaceClass(a,this.iconCls)}else{var e=this.header,c=e.child("img.x-panel-inline-icon");if(c){Ext.fly(c).replaceClass(a,this.iconCls)}else{var d=e.child("span."+this.headerTextCls);if(d){Ext.DomHelper.insertBefore(d.dom,{tag:"img",alt:"",src:Ext.BLANK_IMAGE_URL,cls:"x-panel-inline-icon "+this.iconCls})}}}}this.fireEvent("iconchange",this,b,a)},makeFloating:function(a){this.floating=true;this.el=new Ext.Layer(Ext.apply({},a,{shadow:Ext.isDefined(this.shadow)?this.shadow:"sides",shadowOffset:this.shadowOffset,constrain:false,shim:this.shim===false?false:undefined}),this.el)},getTopToolbar:function(){return this.topToolbar},getBottomToolbar:function(){return this.bottomToolbar},getFooterToolbar:function(){return this.fbar},addButton:function(a,c,b){if(!this.fbar){this.createFbar([])}if(c){if(Ext.isString(a)){a={text:a}}a=Ext.apply({handler:c,scope:b},a)}return this.fbar.add(a)},addTool:function(){if(!this.rendered){if(!this.tools){this.tools=[]}Ext.each(arguments,function(a){this.tools.push(a)},this);return}if(!this[this.toolTarget]){return}if(!this.toolTemplate){var h=new Ext.Template('
     
    ');h.disableFormats=true;h.compile();Ext.Panel.prototype.toolTemplate=h}for(var g=0,d=arguments,c=d.length;g0){Ext.each(this.toolbars,function(c){c.doLayout(undefined,a)});this.syncHeight()}},syncHeight:function(){var b=this.toolbarHeight,c=this.body,a=this.lastSize.height,d;if(this.autoHeight||!Ext.isDefined(a)||a=="auto"){return}if(b!=this.getToolbarHeight()){b=Math.max(0,a-this.getFrameHeight());c.setHeight(b);d=c.getSize();this.toolbarHeight=this.getToolbarHeight();this.onBodyResize(d.width,d.height)}},onShow:function(){if(this.floating){return this.el.show()}Ext.Panel.superclass.onShow.call(this)},onHide:function(){if(this.floating){return this.el.hide()}Ext.Panel.superclass.onHide.call(this)},createToolHandler:function(c,a,d,b){return function(g){c.removeClass(d);if(a.stopEvent!==false){g.stopEvent()}if(a.handler){a.handler.call(a.scope||c,g,c,b,a)}}},afterRender:function(){if(this.floating&&!this.hidden){this.el.show()}if(this.title){this.setTitle(this.title)}Ext.Panel.superclass.afterRender.call(this);if(this.collapsed){this.collapsed=false;this.collapse(false)}this.initEvents()},getKeyMap:function(){if(!this.keyMap){this.keyMap=new Ext.KeyMap(this.el,this.keys)}return this.keyMap},initEvents:function(){if(this.keys){this.getKeyMap()}if(this.draggable){this.initDraggable()}if(this.toolbars.length>0){Ext.each(this.toolbars,function(a){a.doLayout();a.on({scope:this,afterlayout:this.syncHeight,remove:this.syncHeight})},this);this.syncHeight()}},initDraggable:function(){this.dd=new Ext.Panel.DD(this,Ext.isBoolean(this.draggable)?null:this.draggable)},beforeEffect:function(a){if(this.floating){this.el.beforeAction()}if(a!==false){this.el.addClass("x-panel-animated")}},afterEffect:function(a){this.syncShadow();this.el.removeClass("x-panel-animated")},createEffect:function(c,b,d){var e={scope:d,block:true};if(c===true){e.callback=b;return e}else{if(!c.callback){e.callback=b}else{e.callback=function(){b.call(d);Ext.callback(c.callback,c.scope)}}}return Ext.applyIf(e,c)},collapse:function(b){if(this.collapsed||this.el.hasFxBlock()||this.fireEvent("beforecollapse",this,b)===false){return}var a=b===true||(b!==false&&this.animCollapse);this.beforeEffect(a);this.onCollapse(a,b);return this},onCollapse:function(a,b){if(a){this[this.collapseEl].slideOut(this.slideAnchor,Ext.apply(this.createEffect(b||true,this.afterCollapse,this),this.collapseDefaults))}else{this[this.collapseEl].hide(this.hideMode);this.afterCollapse(false)}},afterCollapse:function(a){this.collapsed=true;this.el.addClass(this.collapsedCls);if(a!==false){this[this.collapseEl].hide(this.hideMode)}this.afterEffect(a);this.cascade(function(b){if(b.lastSize){b.lastSize={width:undefined,height:undefined}}});this.fireEvent("collapse",this)},expand:function(b){if(!this.collapsed||this.el.hasFxBlock()||this.fireEvent("beforeexpand",this,b)===false){return}var a=b===true||(b!==false&&this.animCollapse);this.el.removeClass(this.collapsedCls);this.beforeEffect(a);this.onExpand(a,b);return this},onExpand:function(a,b){if(a){this[this.collapseEl].slideIn(this.slideAnchor,Ext.apply(this.createEffect(b||true,this.afterExpand,this),this.expandDefaults))}else{this[this.collapseEl].show(this.hideMode);this.afterExpand(false)}},afterExpand:function(a){this.collapsed=false;if(a!==false){this[this.collapseEl].show(this.hideMode)}this.afterEffect(a);if(this.deferLayout){delete this.deferLayout;this.doLayout(true)}this.fireEvent("expand",this)},toggleCollapse:function(a){this[this.collapsed?"expand":"collapse"](a);return this},onDisable:function(){if(this.rendered&&this.maskDisabled){this.el.mask()}Ext.Panel.superclass.onDisable.call(this)},onEnable:function(){if(this.rendered&&this.maskDisabled){this.el.unmask()}Ext.Panel.superclass.onEnable.call(this)},onResize:function(g,d,c,e){var a=g,b=d;if(Ext.isDefined(a)||Ext.isDefined(b)){if(!this.collapsed){if(Ext.isNumber(a)){this.body.setWidth(a=this.adjustBodyWidth(a-this.getFrameWidth()))}else{if(a=="auto"){a=this.body.setWidth("auto").dom.offsetWidth}else{a=this.body.dom.offsetWidth}}if(this.tbar){this.tbar.setWidth(a);if(this.topToolbar){this.topToolbar.setSize(a)}}if(this.bbar){this.bbar.setWidth(a);if(this.bottomToolbar){this.bottomToolbar.setSize(a);if(Ext.isIE){this.bbar.setStyle("position","static");this.bbar.setStyle("position","")}}}if(this.footer){this.footer.setWidth(a);if(this.fbar){this.fbar.setSize(Ext.isIE?(a-this.footer.getFrameWidth("lr")):"auto")}}if(Ext.isNumber(b)){b=Math.max(0,b-this.getFrameHeight());this.body.setHeight(b)}else{if(b=="auto"){this.body.setHeight(b)}}if(this.disabled&&this.el._mask){this.el._mask.setSize(this.el.dom.clientWidth,this.el.getHeight())}}else{this.queuedBodySize={width:a,height:b};if(!this.queuedExpand&&this.allowQueuedExpand!==false){this.queuedExpand=true;this.on("expand",function(){delete this.queuedExpand;this.onResize(this.queuedBodySize.width,this.queuedBodySize.height)},this,{single:true})}}this.onBodyResize(a,b)}this.syncShadow();Ext.Panel.superclass.onResize.call(this,g,d,c,e)},onBodyResize:function(a,b){this.fireEvent("bodyresize",this,a,b)},getToolbarHeight:function(){var a=0;if(this.rendered){Ext.each(this.toolbars,function(b){a+=b.getHeight()},this)}return a},adjustBodyHeight:function(a){return a},adjustBodyWidth:function(a){return a},onPosition:function(){this.syncShadow()},getFrameWidth:function(){var b=this.el.getFrameWidth("lr")+this.bwrap.getFrameWidth("lr");if(this.frame){var a=this.bwrap.dom.firstChild;b+=(Ext.fly(a).getFrameWidth("l")+Ext.fly(a.firstChild).getFrameWidth("r"));b+=this.mc.getFrameWidth("lr")}return b},getFrameHeight:function(){var a=this.el.getFrameWidth("tb")+this.bwrap.getFrameWidth("tb");a+=(this.tbar?this.tbar.getHeight():0)+(this.bbar?this.bbar.getHeight():0);if(this.frame){a+=this.el.dom.firstChild.offsetHeight+this.ft.dom.offsetHeight+this.mc.getFrameWidth("tb")}else{a+=(this.header?this.header.getHeight():0)+(this.footer?this.footer.getHeight():0)}return a},getInnerWidth:function(){return this.getSize().width-this.getFrameWidth()},getInnerHeight:function(){return this.body.getHeight()},syncShadow:function(){if(this.floating){this.el.sync(true)}},getLayoutTarget:function(){return this.body},getContentTarget:function(){return this.body},setTitle:function(b,a){this.title=b;if(this.header&&this.headerAsText){this.header.child("span").update(b)}if(a){this.setIconClass(a)}this.fireEvent("titlechange",this,b);return this},getUpdater:function(){return this.body.getUpdater()},load:function(){var a=this.body.getUpdater();a.update.apply(a,arguments);return this},beforeDestroy:function(){Ext.Panel.superclass.beforeDestroy.call(this);if(this.header){this.header.removeAllListeners()}if(this.tools){for(var a in this.tools){Ext.destroy(this.tools[a])}}if(this.toolbars.length>0){Ext.each(this.toolbars,function(b){b.un("afterlayout",this.syncHeight,this);b.un("remove",this.syncHeight,this)},this)}if(Ext.isArray(this.buttons)){while(this.buttons.length){Ext.destroy(this.buttons[0])}}if(this.rendered){Ext.destroy(this.ft,this.header,this.footer,this.tbar,this.bbar,this.body,this.mc,this.bwrap,this.dd);if(this.fbar){Ext.destroy(this.fbar,this.fbar.el)}}Ext.destroy(this.toolbars)},createClasses:function(){this.headerCls=this.baseCls+"-header";this.headerTextCls=this.baseCls+"-header-text";this.bwrapCls=this.baseCls+"-bwrap";this.tbarCls=this.baseCls+"-tbar";this.bodyCls=this.baseCls+"-body";this.bbarCls=this.baseCls+"-bbar";this.footerCls=this.baseCls+"-footer"},createGhost:function(a,e,b){var d=document.createElement("div");d.className="x-panel-ghost "+(a?a:"");if(this.header){d.appendChild(this.el.dom.firstChild.cloneNode(true))}Ext.fly(d.appendChild(document.createElement("ul"))).setHeight(this.bwrap.getHeight());d.style.width=this.el.dom.offsetWidth+"px";if(!b){this.container.dom.appendChild(d)}else{Ext.getDom(b).appendChild(d)}if(e!==false&&this.el.useShim!==false){var c=new Ext.Layer({shadow:false,useDisplay:true,constrain:false},d);c.show();return c}else{return new Ext.Element(d)}},doAutoLoad:function(){var a=this.body.getUpdater();if(this.renderer){a.setRenderer(this.renderer)}a.update(Ext.isObject(this.autoLoad)?this.autoLoad:{url:this.autoLoad})},getTool:function(a){return this.tools[a]}});Ext.reg("panel",Ext.Panel);Ext.Editor=function(b,a){if(b.field){this.field=Ext.create(b.field,"textfield");a=Ext.apply({},b);delete a.field}else{this.field=b}Ext.Editor.superclass.constructor.call(this,a)};Ext.extend(Ext.Editor,Ext.Component,{allowBlur:true,value:"",alignment:"c-c?",offsets:[0,0],shadow:"frame",constrain:false,swallowKeys:true,completeOnEnter:true,cancelOnEsc:true,updateEl:false,initComponent:function(){Ext.Editor.superclass.initComponent.call(this);this.addEvents("beforestartedit","startedit","beforecomplete","complete","canceledit","specialkey")},onRender:function(b,a){this.el=new Ext.Layer({shadow:this.shadow,cls:"x-editor",parentEl:b,shim:this.shim,shadowOffset:this.shadowOffset||4,id:this.id,constrain:this.constrain});if(this.zIndex){this.el.setZIndex(this.zIndex)}this.el.setStyle("overflow",Ext.isGecko?"auto":"hidden");if(this.field.msgTarget!="title"){this.field.msgTarget="qtip"}this.field.inEditor=true;this.mon(this.field,{scope:this,blur:this.onBlur,specialkey:this.onSpecialKey});if(this.field.grow){this.mon(this.field,"autosize",this.el.sync,this.el,{delay:1})}this.field.render(this.el).show();this.field.getEl().dom.name="";if(this.swallowKeys){this.field.el.swallowEvent(["keypress","keydown"])}},onSpecialKey:function(g,d){var b=d.getKey(),a=this.completeOnEnter&&b==d.ENTER,c=this.cancelOnEsc&&b==d.ESC;if(a||c){d.stopEvent();if(a){this.completeEdit()}else{this.cancelEdit()}if(g.triggerBlur){g.triggerBlur()}}this.fireEvent("specialkey",g,d)},startEdit:function(b,c){if(this.editing){this.completeEdit()}this.boundEl=Ext.get(b);var a=c!==undefined?c:this.boundEl.dom.innerHTML;if(!this.rendered){this.render(this.parentEl||document.body)}if(this.fireEvent("beforestartedit",this,this.boundEl,a)!==false){this.startValue=a;this.field.reset();this.field.setValue(a);this.realign(true);this.editing=true;this.show()}},doAutoSize:function(){if(this.autoSize){var b=this.boundEl.getSize(),a=this.field.getSize();switch(this.autoSize){case"width":this.setSize(b.width,a.height);break;case"height":this.setSize(a.width,b.height);break;case"none":this.setSize(a.width,a.height);break;default:this.setSize(b.width,b.height)}}},setSize:function(a,b){delete this.field.lastSize;this.field.setSize(a,b);if(this.el){if(Ext.isGecko2||Ext.isOpera||(Ext.isIE7&&Ext.isStrict)){this.el.setSize(a,b)}this.el.sync()}},realign:function(a){if(a===true){this.doAutoSize()}this.el.alignTo(this.boundEl,this.alignment,this.offsets)},completeEdit:function(a){if(!this.editing){return}if(this.field.assertValue){this.field.assertValue()}var b=this.getValue();if(!this.field.isValid()){if(this.revertInvalid!==false){this.cancelEdit(a)}return}if(String(b)===String(this.startValue)&&this.ignoreNoChange){this.hideEdit(a);return}if(this.fireEvent("beforecomplete",this,b,this.startValue)!==false){b=this.getValue();if(this.updateEl&&this.boundEl){this.boundEl.update(b)}this.hideEdit(a);this.fireEvent("complete",this,b,this.startValue)}},onShow:function(){this.el.show();if(this.hideEl!==false){this.boundEl.hide()}this.field.show().focus(false,true);this.fireEvent("startedit",this.boundEl,this.startValue)},cancelEdit:function(a){if(this.editing){var b=this.getValue();this.setValue(this.startValue);this.hideEdit(a);this.fireEvent("canceledit",this,b,this.startValue)}},hideEdit:function(a){if(a!==true){this.editing=false;this.hide()}},onBlur:function(){if(this.allowBlur===true&&this.editing&&this.selectSameEditor!==true){this.completeEdit()}},onHide:function(){if(this.editing){this.completeEdit();return}this.field.blur();if(this.field.collapse){this.field.collapse()}this.el.hide();if(this.hideEl!==false){this.boundEl.show()}},setValue:function(a){this.field.setValue(a)},getValue:function(){return this.field.getValue()},beforeDestroy:function(){Ext.destroyMembers(this,"field");delete this.parentEl;delete this.boundEl}});Ext.reg("editor",Ext.Editor);Ext.ColorPalette=Ext.extend(Ext.Component,{itemCls:"x-color-palette",value:null,clickEvent:"click",ctype:"Ext.ColorPalette",allowReselect:false,colors:["000000","993300","333300","003300","003366","000080","333399","333333","800000","FF6600","808000","008000","008080","0000FF","666699","808080","FF0000","FF9900","99CC00","339966","33CCCC","3366FF","800080","969696","FF00FF","FFCC00","FFFF00","00FF00","00FFFF","00CCFF","993366","C0C0C0","FF99CC","FFCC99","FFFF99","CCFFCC","CCFFFF","99CCFF","CC99FF","FFFFFF"],initComponent:function(){Ext.ColorPalette.superclass.initComponent.call(this);this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope,true)}},onRender:function(b,a){this.autoEl={tag:"div",cls:this.itemCls};Ext.ColorPalette.superclass.onRender.call(this,b,a);var c=this.tpl||new Ext.XTemplate(' ');c.overwrite(this.el,this.colors);this.mon(this.el,this.clickEvent,this.handleClick,this,{delegate:"a"});if(this.clickEvent!="click"){this.mon(this.el,"click",Ext.emptyFn,this,{delegate:"a",preventDefault:true})}},afterRender:function(){Ext.ColorPalette.superclass.afterRender.call(this);if(this.value){var a=this.value;this.value=null;this.select(a,true)}},handleClick:function(b,a){b.preventDefault();if(!this.disabled){var d=a.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];this.select(d.toUpperCase())}},select:function(b,a){b=b.replace("#","");if(b!=this.value||this.allowReselect){var c=this.el;if(this.value){c.child("a.color-"+this.value).removeClass("x-color-palette-sel")}c.child("a.color-"+b).addClass("x-color-palette-sel");this.value=b;if(a!==true){this.fireEvent("select",this,b)}}}});Ext.reg("colorpalette",Ext.ColorPalette);Ext.DatePicker=Ext.extend(Ext.BoxComponent,{todayText:"Today",okText:" OK ",cancelText:"Cancel",todayTip:"{0} (Spacebar)",minText:"This date is before the minimum date",maxText:"This date is after the maximum date",format:"m/d/y",disabledDaysText:"Disabled",disabledDatesText:"Disabled",monthNames:Date.monthNames,dayNames:Date.dayNames,nextText:"Next Month (Control+Right)",prevText:"Previous Month (Control+Left)",monthYearText:"Choose a month (Control+Up/Down to move years)",startDay:0,showToday:true,focusOnSelect:true,initHour:12,initComponent:function(){Ext.DatePicker.superclass.initComponent.call(this);this.value=this.value?this.value.clearTime(true):new Date().clearTime();this.addEvents("select");if(this.handler){this.on("select",this.handler,this.scope||this)}this.initDisabledDays()},initDisabledDays:function(){if(!this.disabledDatesRE&&this.disabledDates){var b=this.disabledDates,a=b.length-1,c="(?:";Ext.each(b,function(g,e){c+=Ext.isDate(g)?"^"+Ext.escapeRe(g.dateFormat(this.format))+"$":b[e];if(e!=a){c+="|"}},this);this.disabledDatesRE=new RegExp(c+")")}},setDisabledDates:function(a){if(Ext.isArray(a)){this.disabledDates=a;this.disabledDatesRE=null}else{this.disabledDatesRE=a}this.initDisabledDays();this.update(this.value,true)},setDisabledDays:function(a){this.disabledDays=a;this.update(this.value,true)},setMinDate:function(a){this.minDate=a;this.update(this.value,true)},setMaxDate:function(a){this.maxDate=a;this.update(this.value,true)},setValue:function(a){this.value=a.clearTime(true);this.update(this.value)},getValue:function(){return this.value},focus:function(){this.update(this.activeDate)},onEnable:function(a){Ext.DatePicker.superclass.onEnable.call(this);this.doDisabled(false);this.update(a?this.value:this.activeDate);if(Ext.isIE){this.el.repaint()}},onDisable:function(){Ext.DatePicker.superclass.onDisable.call(this);this.doDisabled(true);if(Ext.isIE&&!Ext.isIE8){Ext.each([].concat(this.textNodes,this.el.query("th span")),function(a){Ext.fly(a).repaint()})}},doDisabled:function(a){this.keyNav.setDisabled(a);this.prevRepeater.setDisabled(a);this.nextRepeater.setDisabled(a);if(this.showToday){this.todayKeyListener.setDisabled(a);this.todayBtn.setDisabled(a)}},onRender:function(e,b){var a=['','','",this.showToday?'':"",'
      
    '],c=this.dayNames,h;for(h=0;h<7;h++){var k=this.startDay+h;if(k>6){k=k-7}a.push("")}a[a.length]="";for(h=0;h<42;h++){if(h%7===0&&h!==0){a[a.length]=""}a[a.length]=''}a.push("
    ",c[k].substr(0,1),"
    ');var j=document.createElement("div");j.className="x-date-picker";j.innerHTML=a.join("");e.dom.insertBefore(j,b);this.el=Ext.get(j);this.eventEl=Ext.get(j.firstChild);this.prevRepeater=new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"),{handler:this.showPrevMonth,scope:this,preventDefault:true,stopDefault:true});this.nextRepeater=new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"),{handler:this.showNextMonth,scope:this,preventDefault:true,stopDefault:true});this.monthPicker=this.el.down("div.x-date-mp");this.monthPicker.enableDisplayMode("block");this.keyNav=new Ext.KeyNav(this.eventEl,{left:function(d){if(d.ctrlKey){this.showPrevMonth()}else{this.update(this.activeDate.add("d",-1))}},right:function(d){if(d.ctrlKey){this.showNextMonth()}else{this.update(this.activeDate.add("d",1))}},up:function(d){if(d.ctrlKey){this.showNextYear()}else{this.update(this.activeDate.add("d",-7))}},down:function(d){if(d.ctrlKey){this.showPrevYear()}else{this.update(this.activeDate.add("d",7))}},pageUp:function(d){this.showNextMonth()},pageDown:function(d){this.showPrevMonth()},enter:function(d){d.stopPropagation();return true},scope:this});this.el.unselectable();this.cells=this.el.select("table.x-date-inner tbody td");this.textNodes=this.el.query("table.x-date-inner tbody span");this.mbtn=new Ext.Button({text:" ",tooltip:this.monthYearText,renderTo:this.el.child("td.x-date-middle",true)});this.mbtn.el.child("em").addClass("x-btn-arrow");if(this.showToday){this.todayKeyListener=this.eventEl.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);var g=(new Date()).dateFormat(this.format);this.todayBtn=new Ext.Button({renderTo:this.el.child("td.x-date-bottom",true),text:String.format(this.todayText,g),tooltip:String.format(this.todayTip,g),handler:this.selectToday,scope:this})}this.mon(this.eventEl,"mousewheel",this.handleMouseWheel,this);this.mon(this.eventEl,"click",this.handleDateClick,this,{delegate:"a.x-date-date"});this.mon(this.mbtn,"click",this.showMonthPicker,this);this.onEnable(true)},createMonthPicker:function(){if(!this.monthPicker.dom.firstChild){var a=[''];for(var b=0;b<6;b++){a.push('",'",b===0?'':'')}a.push('","
    ',Date.getShortMonthName(b),"',Date.getShortMonthName(b+6),"
    ");this.monthPicker.update(a.join(""));this.mon(this.monthPicker,"click",this.onMonthClick,this);this.mon(this.monthPicker,"dblclick",this.onMonthDblClick,this);this.mpMonths=this.monthPicker.select("td.x-date-mp-month");this.mpYears=this.monthPicker.select("td.x-date-mp-year");this.mpMonths.each(function(c,d,e){e+=1;if((e%2)===0){c.dom.xmonth=5+Math.round(e*0.5)}else{c.dom.xmonth=Math.round((e-1)*0.5)}})}},showMonthPicker:function(){if(!this.disabled){this.createMonthPicker();var a=this.el.getSize();this.monthPicker.setSize(a);this.monthPicker.child("table").setSize(a);this.mpSelMonth=(this.activeDate||this.value).getMonth();this.updateMPMonth(this.mpSelMonth);this.mpSelYear=(this.activeDate||this.value).getFullYear();this.updateMPYear(this.mpSelYear);this.monthPicker.slideIn("t",{duration:0.2})}},updateMPYear:function(e){this.mpyear=e;var c=this.mpYears.elements;for(var b=1;b<=10;b++){var d=c[b-1],a;if((b%2)===0){a=e+Math.round(b*0.5);d.firstChild.innerHTML=a;d.xyear=a}else{a=e-(5-Math.round(b*0.5));d.firstChild.innerHTML=a;d.xyear=a}this.mpYears.item(b-1)[a==this.mpSelYear?"addClass":"removeClass"]("x-date-mp-sel")}},updateMPMonth:function(a){this.mpMonths.each(function(b,c,d){b[b.dom.xmonth==a?"addClass":"removeClass"]("x-date-mp-sel")})},selectMPMonth:function(a){},onMonthClick:function(g,b){g.stopEvent();var c=new Ext.Element(b),a;if(c.is("button.x-date-mp-cancel")){this.hideMonthPicker()}else{if(c.is("button.x-date-mp-ok")){var h=new Date(this.mpSelYear,this.mpSelMonth,(this.activeDate||this.value).getDate());if(h.getMonth()!=this.mpSelMonth){h=new Date(this.mpSelYear,this.mpSelMonth,1).getLastDateOfMonth()}this.update(h);this.hideMonthPicker()}else{if((a=c.up("td.x-date-mp-month",2))){this.mpMonths.removeClass("x-date-mp-sel");a.addClass("x-date-mp-sel");this.mpSelMonth=a.dom.xmonth}else{if((a=c.up("td.x-date-mp-year",2))){this.mpYears.removeClass("x-date-mp-sel");a.addClass("x-date-mp-sel");this.mpSelYear=a.dom.xyear}else{if(c.is("a.x-date-mp-prev")){this.updateMPYear(this.mpyear-10)}else{if(c.is("a.x-date-mp-next")){this.updateMPYear(this.mpyear+10)}}}}}}},onMonthDblClick:function(d,b){d.stopEvent();var c=new Ext.Element(b),a;if((a=c.up("td.x-date-mp-month",2))){this.update(new Date(this.mpSelYear,a.dom.xmonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}else{if((a=c.up("td.x-date-mp-year",2))){this.update(new Date(a.dom.xyear,this.mpSelMonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker()}}},hideMonthPicker:function(a){if(this.monthPicker){if(a===true){this.monthPicker.hide()}else{this.monthPicker.slideOut("t",{duration:0.2})}}},showPrevMonth:function(a){this.update(this.activeDate.add("mo",-1))},showNextMonth:function(a){this.update(this.activeDate.add("mo",1))},showPrevYear:function(){this.update(this.activeDate.add("y",-1))},showNextYear:function(){this.update(this.activeDate.add("y",1))},handleMouseWheel:function(a){a.stopEvent();if(!this.disabled){var b=a.getWheelDelta();if(b>0){this.showPrevMonth()}else{if(b<0){this.showNextMonth()}}}},handleDateClick:function(b,a){b.stopEvent();if(!this.disabled&&a.dateValue&&!Ext.fly(a.parentNode).hasClass("x-date-disabled")){this.cancelFocus=this.focusOnSelect===false;this.setValue(new Date(a.dateValue));delete this.cancelFocus;this.fireEvent("select",this,this.value)}},selectToday:function(){if(this.todayBtn&&!this.todayBtn.disabled){this.setValue(new Date().clearTime());this.fireEvent("select",this,this.value)}},update:function(G,A){if(this.rendered){var a=this.activeDate,p=this.isVisible();this.activeDate=G;if(!A&&a&&this.el){var o=G.getTime();if(a.getMonth()==G.getMonth()&&a.getFullYear()==G.getFullYear()){this.cells.removeClass("x-date-selected");this.cells.each(function(d){if(d.dom.firstChild.dateValue==o){d.addClass("x-date-selected");if(p&&!this.cancelFocus){Ext.fly(d.dom.firstChild).focus(50)}return false}},this);return}}var k=G.getDaysInMonth(),q=G.getFirstDateOfMonth(),g=q.getDay()-this.startDay;if(g<0){g+=7}k+=g;var B=G.add("mo",-1),h=B.getDaysInMonth()-g,e=this.cells.elements,r=this.textNodes,D=(new Date(B.getFullYear(),B.getMonth(),h,this.initHour)),C=new Date().clearTime().getTime(),v=G.clearTime(true).getTime(),u=this.minDate?this.minDate.clearTime(true):Number.NEGATIVE_INFINITY,y=this.maxDate?this.maxDate.clearTime(true):Number.POSITIVE_INFINITY,F=this.disabledDatesRE,s=this.disabledDatesText,I=this.disabledDays?this.disabledDays.join(""):false,E=this.disabledDaysText,z=this.format;if(this.showToday){var m=new Date().clearTime(),c=(my||(F&&z&&F.test(m.dateFormat(z)))||(I&&I.indexOf(m.getDay())!=-1));if(!this.disabled){this.todayBtn.setDisabled(c);this.todayKeyListener[c?"disable":"enable"]()}}var l=function(J,d){d.title="";var i=D.clearTime(true).getTime();d.firstChild.dateValue=i;if(i==C){d.className+=" x-date-today";d.title=J.todayText}if(i==v){d.className+=" x-date-selected";if(p){Ext.fly(d.firstChild).focus(50)}}if(iy){d.className=" x-date-disabled";d.title=J.maxText;return}if(I){if(I.indexOf(D.getDay())!=-1){d.title=E;d.className=" x-date-disabled"}}if(F&&z){var w=D.dateFormat(z);if(F.test(w)){d.title=s.replace("%0",w);d.className=" x-date-disabled"}}};var x=0;for(;x=a.value){d=a.value}}c.setValue(b,d,false);c.fireEvent("drag",c,g,this)},getNewValue:function(){var a=this.slider,b=a.innerEl.translatePoints(this.tracker.getXY());return Ext.util.Format.round(a.reverseValue(b.left),a.decimalPrecision)},onDragEnd:function(c){var a=this.slider,b=this.value;this.el.removeClass("x-slider-thumb-drag");this.dragging=false;a.fireEvent("dragend",a,c);if(this.dragStartValue!=b){a.fireEvent("changecomplete",a,b,this)}},destroy:function(){Ext.destroyMembers(this,"tracker","el")}});Ext.slider.MultiSlider=Ext.extend(Ext.BoxComponent,{vertical:false,minValue:0,maxValue:100,decimalPrecision:0,keyIncrement:1,increment:0,clickRange:[5,15],clickToChange:true,animate:true,constrainThumbs:true,topThumbZIndex:10000,initComponent:function(){if(!Ext.isDefined(this.value)){this.value=this.minValue}this.thumbs=[];Ext.slider.MultiSlider.superclass.initComponent.call(this);this.keyIncrement=Math.max(this.increment,this.keyIncrement);this.addEvents("beforechange","change","changecomplete","dragstart","drag","dragend");if(this.values==undefined||Ext.isEmpty(this.values)){this.values=[0]}var a=this.values;for(var b=0;bthis.clickRange[0]&&c.top=c){d+=c}else{if(a*2<-c){d-=c}}}return d.constrain(this.minValue,this.maxValue)},afterRender:function(){Ext.slider.MultiSlider.superclass.afterRender.apply(this,arguments);for(var c=0;ce?e:c.value}this.syncThumb()},setValue:function(d,c,b,g){var a=this.thumbs[d],e=a.el;c=this.normalizeValue(c);if(c!==a.value&&this.fireEvent("beforechange",this,c,a.value,a)!==false){a.value=c;if(this.rendered){this.moveThumb(d,this.translateValue(c),b!==false);this.fireEvent("change",this,c,a);if(g){this.fireEvent("changecomplete",this,c,a)}}}},translateValue:function(a){var b=this.getRatio();return(a*b)-(this.minValue*b)-this.halfThumb},reverseValue:function(b){var a=this.getRatio();return(b+(this.minValue*a))/a},moveThumb:function(d,c,b){var a=this.thumbs[d].el;if(!b||this.animate===false){a.setLeft(c)}else{a.shift({left:c,stopFx:true,duration:0.35})}},focus:function(){this.focusEl.focus(10)},onResize:function(c,e){var b=this.thumbs,a=b.length,d=0;for(;dthis.clickRange[0]&&c.left','
    ','
    ','
    ',"
     
    ","
    ","
    ",'
    ',"
     
    ","
    ","
    ","");this.el=a?c.insertBefore(a,{cls:this.baseCls},true):c.append(d,{cls:this.baseCls},true);if(this.id){this.el.dom.id=this.id}var b=this.el.dom.firstChild;this.progressBar=Ext.get(b.firstChild);if(this.textEl){this.textEl=Ext.get(this.textEl);delete this.textTopEl}else{this.textTopEl=Ext.get(this.progressBar.dom.firstChild);var e=Ext.get(b.childNodes[1]);this.textTopEl.setStyle("z-index",99).addClass("x-hidden");this.textEl=new Ext.CompositeElement([this.textTopEl.dom.firstChild,e.dom.firstChild]);this.textEl.setWidth(b.offsetWidth)}this.progressBar.setHeight(b.offsetHeight)},afterRender:function(){Ext.ProgressBar.superclass.afterRender.call(this);if(this.value){this.updateProgress(this.value,this.text)}else{this.updateText(this.text)}},updateProgress:function(c,d,b){this.value=c||0;if(d){this.updateText(d)}if(this.rendered&&!this.isDestroyed){var a=Math.floor(c*this.el.dom.firstChild.offsetWidth);this.progressBar.setWidth(a,b===true||(b!==false&&this.animate));if(this.textTopEl){this.textTopEl.removeClass("x-hidden").setWidth(a)}}this.fireEvent("update",this,c,d);return this},wait:function(b){if(!this.waitTimer){var a=this;b=b||{};this.updateText(b.text);this.waitTimer=Ext.TaskMgr.start({run:function(c){var d=b.increment||10;c-=1;this.updateProgress(((((c+d)%d)+1)*(100/d))*0.01,null,b.animate)},interval:b.interval||1000,duration:b.duration,onStop:function(){if(b.fn){b.fn.apply(b.scope||this)}this.reset()},scope:a})}return this},isWaiting:function(){return this.waitTimer!==null},updateText:function(a){this.text=a||" ";if(this.rendered){this.textEl.update(this.text)}return this},syncProgressBar:function(){if(this.value){this.updateProgress(this.value,this.text)}return this},setSize:function(a,c){Ext.ProgressBar.superclass.setSize.call(this,a,c);if(this.textTopEl){var b=this.el.dom.firstChild;this.textEl.setSize(b.offsetWidth,b.offsetHeight)}this.syncProgressBar();return this},reset:function(a){this.updateProgress(0);if(this.textTopEl){this.textTopEl.addClass("x-hidden")}this.clearTimer();if(a===true){this.hide()}return this},clearTimer:function(){if(this.waitTimer){this.waitTimer.onStop=null;Ext.TaskMgr.stop(this.waitTimer);this.waitTimer=null}},onDestroy:function(){this.clearTimer();if(this.rendered){if(this.textEl.isComposite){this.textEl.clear()}Ext.destroyMembers(this,"textEl","progressBar","textTopEl")}Ext.ProgressBar.superclass.onDestroy.call(this)}});Ext.reg("progress",Ext.ProgressBar);(function(){var a=Ext.EventManager;var b=Ext.lib.Dom;Ext.dd.DragDrop=function(e,c,d){if(e){this.init(e,c,d)}};Ext.dd.DragDrop.prototype={id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true},moveOnly:false,unlock:function(){this.locked=false},isTarget:true,padding:null,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,b4StartDrag:function(c,d){},startDrag:function(c,d){},b4Drag:function(c){},onDrag:function(c){},onDragEnter:function(c,d){},b4DragOver:function(c){},onDragOver:function(c,d){},b4DragOut:function(c){},onDragOut:function(c,d){},b4DragDrop:function(c){},onDragDrop:function(c,d){},onInvalidDrop:function(c){},b4EndDrag:function(c){},endDrag:function(c){},b4MouseDown:function(c){},onMouseDown:function(c){},onMouseUp:function(c){},onAvailable:function(){},defaultPadding:{left:0,right:0,top:0,bottom:0},constrainTo:function(j,h,o){if(Ext.isNumber(h)){h={left:h,right:h,top:h,bottom:h}}h=h||this.defaultPadding;var l=Ext.get(this.getEl()).getBox(),d=Ext.get(j),n=d.getScroll(),k,e=d.dom;if(e==document.body){k={x:n.left,y:n.top,width:Ext.lib.Dom.getViewWidth(),height:Ext.lib.Dom.getViewHeight()}}else{var m=d.getXY();k={x:m[0],y:m[1],width:e.clientWidth,height:e.clientHeight}}var i=l.y-k.y,g=l.x-k.x;this.resetConstraints();this.setXConstraint(g-(h.left||0),k.width-g-l.width-(h.right||0),this.xTickSize);this.setYConstraint(i-(h.top||0),k.height-i-l.height-(h.bottom||0),this.yTickSize)},getEl:function(){if(!this._domRef){this._domRef=Ext.getDom(this.id)}return this._domRef},getDragEl:function(){return Ext.getDom(this.dragElId)},init:function(e,c,d){this.initTarget(e,c,d);a.on(this.id,"mousedown",this.handleMouseDown,this)},initTarget:function(e,c,d){this.config=d||{};this.DDM=Ext.dd.DDM;this.groups={};if(typeof e!=="string"){e=Ext.id(e)}this.id=e;this.addToGroup((c)?c:"default");this.handleElId=e;this.setDragElId(e);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();this.handleOnAvailable()},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false)},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable()},setPadding:function(e,c,g,d){if(!c&&0!==c){this.padding=[e,e,e,e]}else{if(!g&&0!==g){this.padding=[e,c,e,c]}else{this.padding=[e,c,g,d]}}},setInitPosition:function(g,e){var h=this.getEl();if(!this.DDM.verifyEl(h)){return}var d=g||0;var c=e||0;var i=b.getXY(h);this.initPageX=i[0]-d;this.initPageY=i[1]-c;this.lastPageX=i[0];this.lastPageY=i[1];this.setStartPosition(i)},setStartPosition:function(d){var c=d||b.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=c[0];this.startPageY=c[1]},addToGroup:function(c){this.groups[c]=true;this.DDM.regDragDrop(this,c)},removeFromGroup:function(c){if(this.groups[c]){delete this.groups[c]}this.DDM.removeDDFromGroup(this,c)},setDragElId:function(c){this.dragElId=c},setHandleElId:function(c){if(typeof c!=="string"){c=Ext.id(c)}this.handleElId=c;this.DDM.regHandle(this.id,c)},setOuterHandleElId:function(c){if(typeof c!=="string"){c=Ext.id(c)}a.on(c,"mousedown",this.handleMouseDown,this);this.setHandleElId(c);this.hasOuterHandles=true},unreg:function(){a.un(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this)},destroy:function(){this.unreg()},isLocked:function(){return(this.DDM.isLocked()||this.locked)},handleMouseDown:function(g,d){if(this.primaryButtonOnly&&g.button!=0){return}if(this.isLocked()){return}this.DDM.refreshCache(this.groups);var c=new Ext.lib.Point(Ext.lib.Event.getPageX(g),Ext.lib.Event.getPageY(g));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(c,this)){}else{if(this.clickValidator(g)){this.setStartPosition();this.b4MouseDown(g);this.onMouseDown(g);this.DDM.handleMouseDown(g,this);this.DDM.stopEvent(g)}else{}}},clickValidator:function(d){var c=d.getTarget();return(this.isValidHandleChild(c)&&(this.id==this.handleElId||this.DDM.handleWasClicked(c,this.id)))},addInvalidHandleType:function(c){var d=c.toUpperCase();this.invalidHandleTypes[d]=d},addInvalidHandleId:function(c){if(typeof c!=="string"){c=Ext.id(c)}this.invalidHandleIds[c]=c},addInvalidHandleClass:function(c){this.invalidHandleClasses.push(c)},removeInvalidHandleType:function(c){var d=c.toUpperCase();delete this.invalidHandleTypes[d]},removeInvalidHandleId:function(c){if(typeof c!=="string"){c=Ext.id(c)}delete this.invalidHandleIds[c]},removeInvalidHandleClass:function(d){for(var e=0,c=this.invalidHandleClasses.length;e=this.minX;d=d-c){if(!e[d]){this.xTicks[this.xTicks.length]=d;e[d]=true}}for(d=this.initPageX;d<=this.maxX;d=d+c){if(!e[d]){this.xTicks[this.xTicks.length]=d;e[d]=true}}this.xTicks.sort(this.DDM.numericSort)},setYTicks:function(g,c){this.yTicks=[];this.yTickSize=c;var e={};for(var d=this.initPageY;d>=this.minY;d=d-c){if(!e[d]){this.yTicks[this.yTicks.length]=d;e[d]=true}}for(d=this.initPageY;d<=this.maxY;d=d+c){if(!e[d]){this.yTicks[this.yTicks.length]=d;e[d]=true}}this.yTicks.sort(this.DDM.numericSort)},setXConstraint:function(e,d,c){this.leftConstraint=e;this.rightConstraint=d;this.minX=this.initPageX-e;this.maxX=this.initPageX+d;if(c){this.setXTicks(this.initPageX,c)}this.constrainX=true},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks()},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0},setYConstraint:function(c,e,d){this.topConstraint=c;this.bottomConstraint=e;this.minY=this.initPageY-c;this.maxY=this.initPageY+e;if(d){this.setYTicks(this.initPageY,d)}this.constrainY=true},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var d=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var c=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(d,c)}else{this.setInitPosition()}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize)}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize)}},getTick:function(k,g){if(!g){return k}else{if(g[0]>=k){return g[0]}else{for(var d=0,c=g.length;d=k){var j=k-g[d];var h=g[e]-k;return(h>j)?g[d]:g[e]}}return g[g.length-1]}}},toString:function(){return("DragDrop "+this.id)}}})();if(!Ext.dd.DragDropMgr){Ext.dd.DragDropMgr=function(){var a=Ext.EventManager;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,init:function(){this.initialized=true},POINT:0,INTERSECT:1,mode:0,_execOnAll:function(d,c){for(var e in this.ids){for(var b in this.ids[e]){var g=this.ids[e][b];if(!this.isTypeOfDD(g)){continue}g[d].apply(g,c)}}},_onLoad:function(){this.init();a.on(document,"mouseup",this.handleMouseUp,this,true);a.on(document,"mousemove",this.handleMouseMove,this,true);a.on(window,"unload",this._onUnload,this,true);a.on(window,"resize",this._onResize,this,true)},_onResize:function(b){this._execOnAll("resetConstraints",[])},lock:function(){this.locked=true},unlock:function(){this.locked=false},isLocked:function(){return this.locked},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:350,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(c,b){if(!this.initialized){this.init()}if(!this.ids[b]){this.ids[b]={}}this.ids[b][c.id]=c},removeDDFromGroup:function(d,b){if(!this.ids[b]){this.ids[b]={}}var c=this.ids[b];if(c&&c[d.id]){delete c[d.id]}},_remove:function(c){for(var b in c.groups){if(b&&this.ids[b]&&this.ids[b][c.id]){delete this.ids[b][c.id]}}delete this.handleIds[c.id]},regHandle:function(c,b){if(!this.handleIds[c]){this.handleIds[c]={}}this.handleIds[c][b]=b},isDragDrop:function(b){return(this.getDDById(b))?true:false},getRelated:function(h,c){var g=[];for(var e in h.groups){for(var d in this.ids[e]){var b=this.ids[e][d];if(!this.isTypeOfDD(b)){continue}if(!c||b.isTarget){g[g.length]=b}}}return g},isLegalTarget:function(g,e){var c=this.getRelated(g,true);for(var d=0,b=c.length;dthis.clickPixelThresh||b>this.clickPixelThresh){this.startDrag(this.startX,this.startY)}}if(this.dragThreshMet){this.dragCurrent.b4Drag(d);this.dragCurrent.onDrag(d);if(!this.dragCurrent.moveOnly){this.fireEvents(d,false)}}this.stopEvent(d);return true},fireEvents:function(n,o){var q=this.dragCurrent;if(!q||q.isLocked()){return}var r=n.getPoint();var b=[];var g=[];var l=[];var j=[];var d=[];for(var h in this.dragOvers){var c=this.dragOvers[h];if(!this.isTypeOfDD(c)){continue}if(!this.isOverTarget(r,c,this.mode)){g.push(c)}b[h]=true;delete this.dragOvers[h]}for(var p in q.groups){if("string"!=typeof p){continue}for(h in this.ids[p]){var k=this.ids[p][h];if(!this.isTypeOfDD(k)){continue}if(k.isTarget&&!k.isLocked()&&((k!=q)||(q.ignoreSelf===false))){if(this.isOverTarget(r,k,this.mode)){if(o){j.push(k)}else{if(!b[k.id]){d.push(k)}else{l.push(k)}this.dragOvers[k.id]=k}}}}}if(this.mode){if(g.length){q.b4DragOut(n,g);q.onDragOut(n,g)}if(d.length){q.onDragEnter(n,d)}if(l.length){q.b4DragOver(n,l);q.onDragOver(n,l)}if(j.length){q.b4DragDrop(n,j);q.onDragDrop(n,j)}}else{var m=0;for(h=0,m=g.length;h2000){}else{setTimeout(b._addListeners,10);if(document&&document.body){b._timeoutCount+=1}}}},handleWasClicked:function(b,d){if(this.isHandle(d,b.id)){return true}else{var c=b.parentNode;while(c){if(this.isHandle(d,c.id)){return true}else{c=c.parentNode}}}return false}}}();Ext.dd.DDM=Ext.dd.DragDropMgr;Ext.dd.DDM._addListeners()}Ext.dd.DD=function(c,a,b){if(c){this.init(c,a,b)}};Ext.extend(Ext.dd.DD,Ext.dd.DragDrop,{scroll:true,autoOffset:function(c,b){var a=c-this.startPageX;var d=b-this.startPageY;this.setDelta(a,d)},setDelta:function(b,a){this.deltaX=b;this.deltaY=a},setDragElPos:function(c,b){var a=this.getDragEl();this.alignElWithMouse(a,c,b)},alignElWithMouse:function(c,h,g){var e=this.getTargetCoord(h,g);var b=c.dom?c:Ext.fly(c,"_dd");if(!this.deltaSetXY){var i=[e.x,e.y];b.setXY(i);var d=b.getLeft(true);var a=b.getTop(true);this.deltaSetXY=[d-e.x,a-e.y]}else{b.setLeftTop(e.x+this.deltaSetXY[0],e.y+this.deltaSetXY[1])}this.cachePosition(e.x,e.y);this.autoScroll(e.x,e.y,c.offsetHeight,c.offsetWidth);return e},cachePosition:function(b,a){if(b){this.lastPageX=b;this.lastPageY=a}else{var c=Ext.lib.Dom.getXY(this.getEl());this.lastPageX=c[0];this.lastPageY=c[1]}},autoScroll:function(l,k,e,m){if(this.scroll){var n=Ext.lib.Dom.getViewHeight();var b=Ext.lib.Dom.getViewWidth();var p=this.DDM.getScrollTop();var d=this.DDM.getScrollLeft();var j=e+k;var o=m+l;var i=(n+p-k-this.deltaY);var g=(b+d-l-this.deltaX);var c=40;var a=(document.all)?80:30;if(j>n&&i0&&k-pb&&g0&&l-dthis.maxX){a=this.maxX}}if(this.constrainY){if(dthis.maxY){d=this.maxY}}a=this.getTick(a,this.xTicks);d=this.getTick(d,this.yTicks);return{x:a,y:d}},applyConfig:function(){Ext.dd.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false)},b4MouseDown:function(a){this.autoOffset(a.getPageX(),a.getPageY())},b4Drag:function(a){this.setDragElPos(a.getPageX(),a.getPageY())},toString:function(){return("DD "+this.id)}});Ext.dd.DDProxy=function(c,a,b){if(c){this.init(c,a,b);this.initFrame()}};Ext.dd.DDProxy.dragElId="ygddfdiv";Ext.extend(Ext.dd.DDProxy,Ext.dd.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var b=this;var a=document.body;if(!a||!a.firstChild){setTimeout(function(){b.createFrame()},50);return}var d=this.getDragEl();if(!d){d=document.createElement("div");d.id=this.dragElId;var c=d.style;c.position="absolute";c.visibility="hidden";c.cursor="move";c.border="2px solid #aaa";c.zIndex=999;a.insertBefore(d,a.firstChild)}},initFrame:function(){this.createFrame()},applyConfig:function(){Ext.dd.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId)},showFrame:function(e,d){var c=this.getEl();var a=this.getDragEl();var b=a.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(b.width,10)/2),Math.round(parseInt(b.height,10)/2))}this.setDragElPos(e,d);Ext.fly(a).show()},_resizeProxy:function(){if(this.resizeFrame){var a=this.getEl();Ext.fly(this.getDragEl()).setSize(a.offsetWidth,a.offsetHeight)}},b4MouseDown:function(b){var a=b.getPageX();var c=b.getPageY();this.autoOffset(a,c);this.setDragElPos(a,c)},b4StartDrag:function(a,b){this.showFrame(a,b)},b4EndDrag:function(a){Ext.fly(this.getDragEl()).hide()},endDrag:function(c){var b=this.getEl();var a=this.getDragEl();a.style.visibility="";this.beforeMove();b.style.visibility="hidden";Ext.dd.DDM.moveToEl(b,a);a.style.visibility="hidden";b.style.visibility="";this.afterDrag()},beforeMove:function(){},afterDrag:function(){},toString:function(){return("DDProxy "+this.id)}});Ext.dd.DDTarget=function(c,a,b){if(c){this.initTarget(c,a,b)}};Ext.extend(Ext.dd.DDTarget,Ext.dd.DragDrop,{getDragEl:Ext.emptyFn,isValidHandleChild:Ext.emptyFn,startDrag:Ext.emptyFn,endDrag:Ext.emptyFn,onDrag:Ext.emptyFn,onDragDrop:Ext.emptyFn,onDragEnter:Ext.emptyFn,onDragOut:Ext.emptyFn,onDragOver:Ext.emptyFn,onInvalidDrop:Ext.emptyFn,onMouseDown:Ext.emptyFn,onMouseUp:Ext.emptyFn,setXConstraint:Ext.emptyFn,setYConstraint:Ext.emptyFn,resetConstraints:Ext.emptyFn,clearConstraints:Ext.emptyFn,clearTicks:Ext.emptyFn,setInitPosition:Ext.emptyFn,setDragElId:Ext.emptyFn,setHandleElId:Ext.emptyFn,setOuterHandleElId:Ext.emptyFn,addInvalidHandleClass:Ext.emptyFn,addInvalidHandleId:Ext.emptyFn,addInvalidHandleType:Ext.emptyFn,removeInvalidHandleClass:Ext.emptyFn,removeInvalidHandleId:Ext.emptyFn,removeInvalidHandleType:Ext.emptyFn,toString:function(){return("DDTarget "+this.id)}});Ext.dd.DragTracker=Ext.extend(Ext.util.Observable,{active:false,tolerance:5,autoStart:false,constructor:function(a){Ext.apply(this,a);this.addEvents("mousedown","mouseup","mousemove","dragstart","dragend","drag");this.dragRegion=new Ext.lib.Region(0,0,0,0);if(this.el){this.initEl(this.el)}Ext.dd.DragTracker.superclass.constructor.call(this,a)},initEl:function(a){this.el=Ext.get(a);a.on("mousedown",this.onMouseDown,this,this.delegate?{delegate:this.delegate}:undefined)},destroy:function(){this.el.un("mousedown",this.onMouseDown,this);delete this.el},onMouseDown:function(b,a){if(this.fireEvent("mousedown",this,b)!==false&&this.onBeforeStart(b)!==false){this.startXY=this.lastXY=b.getXY();this.dragTarget=this.delegate?a:this.el.dom;if(this.preventDefault!==false){b.preventDefault()}Ext.getDoc().on({scope:this,mouseup:this.onMouseUp,mousemove:this.onMouseMove,selectstart:this.stopSelect});if(this.autoStart){this.timer=this.triggerStart.defer(this.autoStart===true?1000:this.autoStart,this,[b])}}},onMouseMove:function(d,c){if(this.active&&Ext.isIE&&!d.browserEvent.button){d.preventDefault();this.onMouseUp(d);return}d.preventDefault();var b=d.getXY(),a=this.startXY;this.lastXY=b;if(!this.active){if(Math.abs(a[0]-b[0])>this.tolerance||Math.abs(a[1]-b[1])>this.tolerance){this.triggerStart(d)}else{return}}this.fireEvent("mousemove",this,d);this.onDrag(d);this.fireEvent("drag",this,d)},onMouseUp:function(c){var b=Ext.getDoc(),a=this.active;b.un("mousemove",this.onMouseMove,this);b.un("mouseup",this.onMouseUp,this);b.un("selectstart",this.stopSelect,this);c.preventDefault();this.clearStart();this.active=false;delete this.elRegion;this.fireEvent("mouseup",this,c);if(a){this.onEnd(c);this.fireEvent("dragend",this,c)}},triggerStart:function(a){this.clearStart();this.active=true;this.onStart(a);this.fireEvent("dragstart",this,a)},clearStart:function(){if(this.timer){clearTimeout(this.timer);delete this.timer}},stopSelect:function(a){a.stopEvent();return false},onBeforeStart:function(a){},onStart:function(a){},onDrag:function(a){},onEnd:function(a){},getDragTarget:function(){return this.dragTarget},getDragCt:function(){return this.el},getXY:function(a){return a?this.constrainModes[a].call(this,this.lastXY):this.lastXY},getOffset:function(c){var b=this.getXY(c),a=this.startXY;return[a[0]-b[0],a[1]-b[1]]},constrainModes:{point:function(b){if(!this.elRegion){this.elRegion=this.getDragCt().getRegion()}var a=this.dragRegion;a.left=b[0];a.top=b[1];a.right=b[0];a.bottom=b[1];a.constrainTo(this.elRegion);return[a.left,a.top]}}});Ext.dd.ScrollManager=function(){var c=Ext.dd.DragDropMgr;var e={};var b=null;var i={};var h=function(l){b=null;a()};var j=function(){if(c.dragCurrent){c.refreshCache(c.dragCurrent.groups)}};var d=function(){if(c.dragCurrent){var l=Ext.dd.ScrollManager;var m=i.el.ddScrollConfig?i.el.ddScrollConfig.increment:l.increment;if(!l.animate){if(i.el.scroll(i.dir,m)){j()}}else{i.el.scroll(i.dir,m,true,l.animDuration,j)}}};var a=function(){if(i.id){clearInterval(i.id)}i.id=0;i.el=null;i.dir=""};var g=function(m,l){a();i.el=m;i.dir=l;var o=m.ddScrollConfig?m.ddScrollConfig.ddGroup:undefined,n=(m.ddScrollConfig&&m.ddScrollConfig.frequency)?m.ddScrollConfig.frequency:Ext.dd.ScrollManager.frequency;if(o===undefined||c.dragCurrent.ddGroup==o){i.id=setInterval(d,n)}};var k=function(o,q){if(q||!c.dragCurrent){return}var s=Ext.dd.ScrollManager;if(!b||b!=c.dragCurrent){b=c.dragCurrent;s.refreshCache()}var t=Ext.lib.Event.getXY(o);var u=new Ext.lib.Point(t[0],t[1]);for(var m in e){var n=e[m],l=n._region;var p=n.ddScrollConfig?n.ddScrollConfig:s;if(l&&l.contains(u)&&n.isScrollable()){if(l.bottom-u.y<=p.vthresh){if(i.el!=n){g(n,"down")}return}else{if(l.right-u.x<=p.hthresh){if(i.el!=n){g(n,"left")}return}else{if(u.y-l.top<=p.vthresh){if(i.el!=n){g(n,"up")}return}else{if(u.x-l.left<=p.hthresh){if(i.el!=n){g(n,"right")}return}}}}}}a()};c.fireEvents=c.fireEvents.createSequence(k,c);c.stopDrag=c.stopDrag.createSequence(h,c);return{register:function(n){if(Ext.isArray(n)){for(var m=0,l=n.length;m]+>/gi,asText:function(a){return String(a).replace(this.stripTagsRE,"")},asUCText:function(a){return String(a).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(a){return String(a).toUpperCase()},asDate:function(a){if(!a){return 0}if(Ext.isDate(a)){return a.getTime()}return Date.parse(String(a))},asFloat:function(a){var b=parseFloat(String(a).replace(/,/g,""));return isNaN(b)?0:b},asInt:function(a){var b=parseInt(String(a).replace(/,/g,""),10);return isNaN(b)?0:b}};Ext.data.Record=function(a,b){this.id=(b||b===0)?b:Ext.data.Record.id(this);this.data=a||{}};Ext.data.Record.create=function(e){var c=Ext.extend(Ext.data.Record,{});var d=c.prototype;d.fields=new Ext.util.MixedCollection(false,function(g){return g.name});for(var b=0,a=e.length;b-1){a.join(null);this.data.removeAt(b)}if(this.pruneModifiedRecords){this.modified.remove(a)}if(this.snapshot){this.snapshot.remove(a)}if(b>-1){this.fireEvent("remove",this,a,b)}},removeAt:function(a){this.remove(this.getAt(a))},removeAll:function(b){var a=[];this.each(function(c){a.push(c)});this.clearData();if(this.snapshot){this.snapshot.clear()}if(this.pruneModifiedRecords){this.modified=[]}if(b!==true){this.fireEvent("clear",this,a)}},onClear:function(b,a){Ext.each(a,function(d,c){this.destroyRecord(this,d,c)},this)},insert:function(d,c){var e,a,b;c=[].concat(c);for(e=0,a=c.length;e=0;d--){if(b[d].phantom===true){var a=b.splice(d,1).shift();if(a.isValid()){g.push(a)}}else{if(!b[d].isValid()){b.splice(d,1)}}}if(g.length){h.push(["create",g])}if(b.length){h.push(["update",b])}}j=h.length;if(j){e=++this.batchCounter;for(d=0;d=0;b--){this.modified.splice(this.modified.indexOf(a[b]),1)}}else{this.modified.splice(this.modified.indexOf(a),1)}},reMap:function(b){if(Ext.isArray(b)){for(var d=0,a=b.length;d=0;c--){this.insert(b[c].lastIndex,b[c])}}},handleException:function(a){Ext.handleError(a)},reload:function(a){this.load(Ext.applyIf(a||{},this.lastOptions))},loadRecords:function(b,l,h){var e,g;if(this.isDestroyed===true){return}if(!b||h===false){if(h!==false){this.fireEvent("load",this,[],l)}if(l.callback){l.callback.call(l.scope||this,[],l,false,b)}return}var a=b.records,j=b.totalRecords||a.length;if(!l||l.add!==true){if(this.pruneModifiedRecords){this.modified=[]}for(e=0,g=a.length;e-1){this.doUpdate(d)}else{k.push(d);++c}}this.totalLength=Math.max(j,this.data.length+c);this.add(k)}this.fireEvent("load",this,a,l);if(l.callback){l.callback.call(l.scope||this,a,l,true)}},loadData:function(c,a){var b=this.reader.readRecords(c);this.loadRecords(b,{add:a},true)},getCount:function(){return this.data.length||0},getTotalCount:function(){return this.totalLength||0},getSortState:function(){return this.sortInfo},applySort:function(){if((this.sortInfo||this.multiSortInfo)&&!this.remoteSort){this.sortData()}},sortData:function(){var a=this.hasMultiSort?this.multiSortInfo:this.sortInfo,k=a.direction||"ASC",h=a.sorters,c=[];if(!this.hasMultiSort){h=[{direction:k,field:a.field}]}for(var d=0,b=h.length;d1){for(var p=1,o=c.length;ph?1:(i=0;b--){if(Ext.isArray(c)){this.realize(a.splice(b,1).shift(),c.splice(b,1).shift())}else{this.realize(a.splice(b,1).shift(),c)}}}else{if(Ext.isArray(c)&&c.length==1){c=c.shift()}if(!this.isData(c)){throw new Ext.data.DataReader.Error("realize",a)}a.phantom=false;a._phid=a.id;a.id=this.getId(c);a.data=c;a.commit();a.store.reMap(a)}},update:function(a,c){if(Ext.isArray(a)){for(var b=a.length-1;b>=0;b--){if(Ext.isArray(c)){this.update(a.splice(b,1).shift(),c.splice(b,1).shift())}else{this.update(a.splice(b,1).shift(),c)}}}else{if(Ext.isArray(c)&&c.length==1){c=c.shift()}if(this.isData(c)){a.data=Ext.apply(a.data,c)}a.commit()}},extractData:function(k,a){var j=(this instanceof Ext.data.JsonReader)?"json":"node";var c=[];if(this.isData(k)&&!(this instanceof Ext.data.XmlReader)){k=[k]}var h=this.recordType.prototype.fields,o=h.items,m=h.length,c=[];if(a===true){var l=this.recordType;for(var e=0;e=0){return new Function("obj","return obj"+(b>0?".":"")+c)}return function(d){return d[c]}}}(),extractValues:function(h,d,a){var g,c={};for(var e=0;e<\u003fxml version="{version}" encoding="{encoding}"\u003f><{documentRoot}><{name}>{value}<{root}><{parent.record}><{name}>{value}',render:function(b,c,a){c=this.toArray(c);b.xmlData=this.tpl.applyTemplate({version:this.xmlVersion,encoding:this.xmlEncoding,documentRoot:(c.length>0||this.forceDocumentRoot===true)?this.documentRoot:false,record:this.meta.record,root:this.root,baseParams:c,records:(Ext.isArray(a[0]))?a:[a]})},createRecord:function(a){return this.toArray(this.toHash(a))},updateRecord:function(a){return this.toArray(this.toHash(a))},destroyRecord:function(b){var a={};a[this.meta.idProperty]=b.id;return this.toArray(a)}});Ext.data.XmlReader=function(a,b){a=a||{};Ext.applyIf(a,{idProperty:a.idProperty||a.idPath||a.id,successProperty:a.successProperty||a.success});Ext.data.XmlReader.superclass.constructor.call(this,a,b||a.fields)};Ext.extend(Ext.data.XmlReader,Ext.data.DataReader,{read:function(a){var b=a.responseXML;if(!b){throw {message:"XmlReader.read: XML Document not available"}}return this.readRecords(b)},readRecords:function(d){this.xmlData=d;var a=d.documentElement||d,c=Ext.DomQuery,g=0,e=true;if(this.meta.totalProperty){g=this.getTotal(a,0)}if(this.meta.successProperty){e=this.getSuccess(a)}var b=this.extractData(c.select(this.meta.record,a),true);return{success:e,records:b,totalRecords:g||b.length}},readResponse:function(g,b){var e=Ext.DomQuery,h=b.responseXML,a=h.documentElement||h;var c=new Ext.data.Response({action:g,success:this.getSuccess(a),message:this.getMessage(a),data:this.extractData(e.select(this.meta.record,a)||e.select(this.meta.root,a),false),raw:h});if(Ext.isEmpty(c.success)){throw new Ext.data.DataReader.Error("successProperty-response",this.meta.successProperty)}if(g===Ext.data.Api.actions.create){var d=Ext.isDefined(c.data);if(d&&Ext.isEmpty(c.data)){throw new Ext.data.JsonReader.Error("root-empty",this.meta.root)}else{if(!d){throw new Ext.data.JsonReader.Error("root-undefined-response",this.meta.root)}}}return c},getSuccess:function(){return true},buildExtractors:function(){if(this.ef){return}var l=this.meta,h=this.recordType,e=h.prototype.fields,k=e.items,j=e.length;if(l.totalProperty){this.getTotal=this.createAccessor(l.totalProperty)}if(l.successProperty){this.getSuccess=this.createAccessor(l.successProperty)}if(l.messageProperty){this.getMessage=this.createAccessor(l.messageProperty)}this.getRoot=function(g){return(!Ext.isEmpty(g[this.meta.record]))?g[this.meta.record]:g[this.meta.root]};if(l.idPath||l.idProperty){var d=this.createAccessor(l.idPath||l.idProperty);this.getId=function(g){var i=d(g)||g.id;return(i===undefined||i==="")?null:i}}else{this.getId=function(){return null}}var c=[];for(var b=0;b0&&c[0].field==this.groupField){c.shift()}this.groupField=e;this.groupDir=d;this.applyGroupField();var b=function(){this.fireEvent("groupchange",this,this.getGroupState())};if(this.groupOnSort){this.sort(e,d);b.call(this);return}if(this.remoteGroup){this.on("load",b,this,{single:true});this.reload()}else{this.sort(c);b.call(this)}},sort:function(h,c){if(this.remoteSort){return Ext.data.GroupingStore.superclass.sort.call(this,h,c)}var g=[];if(Ext.isArray(arguments[0])){g=arguments[0]}else{if(h==undefined){g=this.sortInfo?[this.sortInfo]:[]}else{var e=this.fields.get(h);if(!e){return false}var b=e.name,a=this.sortInfo||null,d=this.sortToggle?this.sortToggle[b]:null;if(!c){if(a&&a.field==b){c=(this.sortToggle[b]||"ASC").toggle("ASC","DESC")}else{c=e.sortDir}}this.sortToggle[b]=c;this.sortInfo={field:b,direction:c};g=[this.sortInfo]}}if(this.groupField){g.unshift({direction:this.groupDir,field:this.groupField})}return this.multiSort.call(this,g,c)},applyGroupField:function(){if(this.remoteGroup){if(!this.baseParams){this.baseParams={}}Ext.apply(this.baseParams,{groupBy:this.groupField,groupDir:this.groupDir});var a=this.lastOptions;if(a&&a.params){a.params.groupDir=this.groupDir;delete a.params.groupBy}}},applyGrouping:function(a){if(this.groupField!==false){this.groupBy(this.groupField,true,this.groupDir);return true}else{if(a===true){this.fireEvent("datachanged",this)}return false}},getGroupState:function(){return this.groupOnSort&&this.groupField!==false?(this.sortInfo?this.sortInfo.field:undefined):this.groupField}});Ext.reg("groupingstore",Ext.data.GroupingStore);Ext.data.DirectProxy=function(a){Ext.apply(this,a);if(typeof this.paramOrder=="string"){this.paramOrder=this.paramOrder.split(/[\s,|]/)}Ext.data.DirectProxy.superclass.constructor.call(this,a)};Ext.extend(Ext.data.DirectProxy,Ext.data.DataProxy,{paramOrder:undefined,paramsAsHash:true,directFn:undefined,doRequest:function(b,c,a,e,k,l,n){var j=[],h=this.api[b]||this.directFn;switch(b){case Ext.data.Api.actions.create:j.push(a.jsonData);break;case Ext.data.Api.actions.read:if(h.directCfg.method.len>0){if(this.paramOrder){for(var d=0,g=this.paramOrder.length;d1){for(var d=0,b=c.length;d0){this.doSend(a==1?this.callBuffer[0]:this.callBuffer);this.callBuffer=[]}},queueTransaction:function(a){if(a.form){this.processForm(a);return}this.callBuffer.push(a);if(this.enableBuffer){if(!this.callTask){this.callTask=new Ext.util.DelayedTask(this.combineAndSend,this)}this.callTask.delay(Ext.isNumber(this.enableBuffer)?this.enableBuffer:10)}else{this.combineAndSend()}},doCall:function(i,a,b){var h=null,e=b[a.len],g=b[a.len+1];if(a.len!==0){h=b.slice(0,a.len)}var d=new Ext.Direct.Transaction({provider:this,args:b,action:i,method:a.name,data:h,cb:g&&Ext.isFunction(e)?e.createDelegate(g):e});if(this.fireEvent("beforecall",this,d,a)!==false){Ext.Direct.addTransaction(d);this.queueTransaction(d);this.fireEvent("call",this,d,a)}},doForm:function(j,b,g,i,e){var d=new Ext.Direct.Transaction({provider:this,action:j,method:b.name,args:[g,i,e],cb:e&&Ext.isFunction(i)?i.createDelegate(e):i,isForm:true});if(this.fireEvent("beforecall",this,d,b)!==false){Ext.Direct.addTransaction(d);var a=String(g.getAttribute("enctype")).toLowerCase()=="multipart/form-data",h={extTID:d.tid,extAction:j,extMethod:b.name,extType:"rpc",extUpload:String(a)};Ext.apply(d,{form:Ext.getDom(g),isUpload:a,params:i&&Ext.isObject(i.params)?Ext.apply(h,i.params):h});this.fireEvent("call",this,d,b);this.processForm(d)}},processForm:function(a){Ext.Ajax.request({url:this.url,params:a.params,callback:this.onData,scope:this,form:a.form,isUpload:a.isUpload,ts:a})},createMethod:function(d,a){var b;if(!a.formHandler){b=function(){this.doCall(d,a,Array.prototype.slice.call(arguments,0))}.createDelegate(this)}else{b=function(e,g,c){this.doForm(d,a,e,g,c)}.createDelegate(this)}b.directCfg={action:d,method:a};return b},getTransaction:function(a){return a&&a.tid?Ext.Direct.getTransaction(a.tid):null},doCallback:function(c,g){var d=g.status?"success":"failure";if(c&&c.cb){var b=c.cb,a=Ext.isDefined(g.result)?g.result:g.data;if(Ext.isFunction(b)){b(a,g)}else{Ext.callback(b[d],b.scope,[a,g]);Ext.callback(b.callback,b.scope,[a,g])}}}});Ext.Direct.PROVIDERS.remoting=Ext.direct.RemotingProvider;Ext.Resizable=Ext.extend(Ext.util.Observable,{constructor:function(d,e){this.el=Ext.get(d);if(e&&e.wrap){e.resizeChild=this.el;this.el=this.el.wrap(typeof e.wrap=="object"?e.wrap:{cls:"xresizable-wrap"});this.el.id=this.el.dom.id=e.resizeChild.id+"-rzwrap";this.el.setStyle("overflow","hidden");this.el.setPositioning(e.resizeChild.getPositioning());e.resizeChild.clearPositioning();if(!e.width||!e.height){var g=e.resizeChild.getSize();this.el.setSize(g.width,g.height)}if(e.pinned&&!e.adjustments){e.adjustments="auto"}}this.proxy=this.el.createProxy({tag:"div",cls:"x-resizable-proxy",id:this.el.id+"-rzproxy"},Ext.getBody());this.proxy.unselectable();this.proxy.enableDisplayMode("block");Ext.apply(this,e);if(this.pinned){this.disableTrackOver=true;this.el.addClass("x-resizable-pinned")}var k=this.el.getStyle("position");if(k!="absolute"&&k!="fixed"){this.el.setStyle("position","relative")}if(!this.handles){this.handles="s,e,se";if(this.multiDirectional){this.handles+=",n,w"}}if(this.handles=="all"){this.handles="n s e w ne nw se sw"}var o=this.handles.split(/\s*?[,;]\s*?| /);var c=Ext.Resizable.positions;for(var j=0,l=o.length;j0){if(a>(e/2)){d=c+(e-a)}else{d=c-a}}return Math.max(b,d)},resizeElement:function(){var a=this.proxy.getBox();if(this.updateBox){this.el.setBox(a,false,this.animate,this.duration,null,this.easing)}else{this.el.setSize(a.width,a.height,this.animate,this.duration,null,this.easing)}this.updateChildSize();if(!this.dynamic){this.proxy.hide()}if(this.draggable&&this.constrainTo){this.dd.resetConstraints();this.dd.constrainTo(this.constrainTo)}return a},constrain:function(b,c,a,d){if(b-cd){c=b-d}}return c},onMouseMove:function(z){if(this.enabled&&this.activeHandle){try{if(this.resizeRegion&&!this.resizeRegion.contains(z.getPoint())){return}var t=this.curSize||this.startBox,l=this.startBox.x,k=this.startBox.y,c=l,b=k,m=t.width,u=t.height,d=m,o=u,n=this.minWidth,A=this.minHeight,s=this.maxWidth,D=this.maxHeight,i=this.widthIncrement,a=this.heightIncrement,B=z.getXY(),r=-(this.startPoint[0]-Math.max(this.minX,B[0])),p=-(this.startPoint[1]-Math.max(this.minY,B[1])),j=this.activeHandle.position,E,g;switch(j){case"east":m+=r;m=Math.min(Math.max(n,m),s);break;case"south":u+=p;u=Math.min(Math.max(A,u),D);break;case"southeast":m+=r;u+=p;m=Math.min(Math.max(n,m),s);u=Math.min(Math.max(A,u),D);break;case"north":p=this.constrain(u,p,A,D);k+=p;u-=p;break;case"west":r=this.constrain(m,r,n,s);l+=r;m-=r;break;case"northeast":m+=r;m=Math.min(Math.max(n,m),s);p=this.constrain(u,p,A,D);k+=p;u-=p;break;case"northwest":r=this.constrain(m,r,n,s);p=this.constrain(u,p,A,D);k+=p;u-=p;l+=r;m-=r;break;case"southwest":r=this.constrain(m,r,n,s);u+=p;u=Math.min(Math.max(A,u),D);l+=r;m-=r;break}var q=this.snap(m,i,n);var C=this.snap(u,a,A);if(q!=m||C!=u){switch(j){case"northeast":k-=C-u;break;case"north":k-=C-u;break;case"southwest":l-=q-m;break;case"west":l-=q-m;break;case"northwest":l-=q-m;k-=C-u;break}m=q;u=C}if(this.preserveRatio){switch(j){case"southeast":case"east":u=o*(m/d);u=Math.min(Math.max(A,u),D);m=d*(u/o);break;case"south":m=d*(u/o);m=Math.min(Math.max(n,m),s);u=o*(m/d);break;case"northeast":m=d*(u/o);m=Math.min(Math.max(n,m),s);u=o*(m/d);break;case"north":E=m;m=d*(u/o);m=Math.min(Math.max(n,m),s);u=o*(m/d);l+=(E-m)/2;break;case"southwest":u=o*(m/d);u=Math.min(Math.max(A,u),D);E=m;m=d*(u/o);l+=E-m;break;case"west":g=u;u=o*(m/d);u=Math.min(Math.max(A,u),D);k+=(g-u)/2;E=m;m=d*(u/o);l+=E-m;break;case"northwest":E=m;g=u;u=o*(m/d);u=Math.min(Math.max(A,u),D);m=d*(u/o);k+=g-u;l+=E-m;break}}this.proxy.setBounds(l,k,m,u);if(this.dynamic){this.resizeElement()}}catch(v){}}},handleOver:function(){if(this.enabled){this.el.addClass("x-resizable-over")}},handleOut:function(){if(!this.resizing){this.el.removeClass("x-resizable-over")}},getEl:function(){return this.el},getResizeChild:function(){return this.resizeChild},destroy:function(b){Ext.destroy(this.dd,this.overlay,this.proxy);this.overlay=null;this.proxy=null;var c=Ext.Resizable.positions;for(var a in c){if(typeof c[a]!="function"&&this[c[a]]){this[c[a]].destroy()}}if(b){this.el.update("");Ext.destroy(this.el);this.el=null}this.purgeListeners()},syncHandleHeight:function(){var a=this.el.getHeight(true);if(this.west){this.west.el.setHeight(a)}if(this.east){this.east.el.setHeight(a)}}});Ext.Resizable.positions={n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"};Ext.Resizable.Handle=Ext.extend(Object,{constructor:function(d,g,c,e,a){if(!this.tpl){var b=Ext.DomHelper.createTemplate({tag:"div",cls:"x-resizable-handle x-resizable-handle-{0}"});b.compile();Ext.Resizable.Handle.prototype.tpl=b}this.position=g;this.rz=d;this.el=this.tpl.append(d.el.dom,[this.position],true);this.el.unselectable();if(e){this.el.setOpacity(0)}if(!Ext.isEmpty(a)){this.el.addClass(a)}this.el.on("mousedown",this.onMouseDown,this);if(!c){this.el.on({scope:this,mouseover:this.onMouseOver,mouseout:this.onMouseOut})}},afterResize:function(a){},onMouseDown:function(a){this.rz.onMouseDown(this,a)},onMouseOver:function(a){this.rz.handleOver(this,a)},onMouseOut:function(a){this.rz.handleOut(this,a)},destroy:function(){Ext.destroy(this.el);this.el=null}});Ext.Window=Ext.extend(Ext.Panel,{baseCls:"x-window",resizable:true,draggable:true,closable:true,closeAction:"close",constrain:false,constrainHeader:false,plain:false,minimizable:false,maximizable:false,minHeight:100,minWidth:200,expandOnShow:true,showAnimDuration:0.25,hideAnimDuration:0.25,collapsible:false,initHidden:undefined,hidden:true,elements:"header,body",frame:true,floating:true,initComponent:function(){this.initTools();Ext.Window.superclass.initComponent.call(this);this.addEvents("resize","maximize","minimize","restore");if(Ext.isDefined(this.initHidden)){this.hidden=this.initHidden}if(this.hidden===false){this.hidden=true;this.show()}},getState:function(){return Ext.apply(Ext.Window.superclass.getState.call(this)||{},this.getBox(true))},onRender:function(b,a){Ext.Window.superclass.onRender.call(this,b,a);if(this.plain){this.el.addClass("x-window-plain")}this.focusEl=this.el.createChild({tag:"a",href:"#",cls:"x-dlg-focus",tabIndex:"-1",html:" "});this.focusEl.swallowEvent("click",true);this.proxy=this.el.createProxy("x-window-proxy");this.proxy.enableDisplayMode("block");if(this.modal){this.mask=this.container.createChild({cls:"ext-el-mask"},this.el.dom);this.mask.enableDisplayMode("block");this.mask.hide();this.mon(this.mask,"click",this.focus,this)}if(this.maximizable){this.mon(this.header,"dblclick",this.toggleMaximize,this)}},initEvents:function(){Ext.Window.superclass.initEvents.call(this);if(this.animateTarget){this.setAnimateTarget(this.animateTarget)}if(this.resizable){this.resizer=new Ext.Resizable(this.el,{minWidth:this.minWidth,minHeight:this.minHeight,handles:this.resizeHandles||"all",pinned:true,resizeElement:this.resizerAction,handleCls:"x-window-handle"});this.resizer.window=this;this.mon(this.resizer,"beforeresize",this.beforeResize,this)}if(this.draggable){this.header.addClass("x-window-draggable")}this.mon(this.el,"mousedown",this.toFront,this);this.manager=this.manager||Ext.WindowMgr;this.manager.register(this);if(this.maximized){this.maximized=false;this.maximize()}if(this.closable){var a=this.getKeyMap();a.on(27,this.onEsc,this);a.disable()}},initDraggable:function(){this.dd=new Ext.Window.DD(this)},onEsc:function(a,b){if(this.activeGhost){this.unghost()}b.stopEvent();this[this.closeAction]()},beforeDestroy:function(){if(this.rendered){this.hide();this.clearAnchor();Ext.destroy(this.focusEl,this.resizer,this.dd,this.proxy,this.mask)}Ext.Window.superclass.beforeDestroy.call(this)},onDestroy:function(){if(this.manager){this.manager.unregister(this)}Ext.Window.superclass.onDestroy.call(this)},initTools:function(){if(this.minimizable){this.addTool({id:"minimize",handler:this.minimize.createDelegate(this,[])})}if(this.maximizable){this.addTool({id:"maximize",handler:this.maximize.createDelegate(this,[])});this.addTool({id:"restore",handler:this.restore.createDelegate(this,[]),hidden:true})}if(this.closable){this.addTool({id:"close",handler:this[this.closeAction].createDelegate(this,[])})}},resizerAction:function(){var a=this.proxy.getBox();this.proxy.hide();this.window.handleResize(a);return a},beforeResize:function(){this.resizer.minHeight=Math.max(this.minHeight,this.getFrameHeight()+40);this.resizer.minWidth=Math.max(this.minWidth,this.getFrameWidth()+40);this.resizeBox=this.el.getBox()},updateHandles:function(){if(Ext.isIE&&this.resizer){this.resizer.syncHandleHeight();this.el.repaint()}},handleResize:function(b){var a=this.resizeBox;if(a.x!=b.x||a.y!=b.y){this.updateBox(b)}else{this.setSize(b);if(Ext.isIE6&&Ext.isStrict){this.doLayout()}}this.focus();this.updateHandles();this.saveState()},focus:function(){var e=this.focusEl,a=this.defaultButton,c=typeof a,d,b;if(Ext.isDefined(a)){if(Ext.isNumber(a)&&this.fbar){e=this.fbar.items.get(a)}else{if(Ext.isString(a)){e=Ext.getCmp(a)}else{e=a}}d=e.getEl();b=Ext.getDom(this.container);if(d&&b){if(b!=document.body&&!Ext.lib.Region.getRegion(b).contains(Ext.lib.Region.getRegion(d.dom))){return}}}e=e||this.focusEl;e.focus.defer(10,e)},setAnimateTarget:function(a){a=Ext.get(a);this.animateTarget=a},beforeShow:function(){delete this.el.lastXY;delete this.el.lastLT;if(this.x===undefined||this.y===undefined){var a=this.el.getAlignToXY(this.container,"c-c");var b=this.el.translatePoints(a[0],a[1]);this.x=this.x===undefined?b.left:this.x;this.y=this.y===undefined?b.top:this.y}this.el.setLeftTop(this.x,this.y);if(this.expandOnShow){this.expand(false)}if(this.modal){Ext.getBody().addClass("x-body-masked");this.mask.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.mask.show()}},show:function(c,a,b){if(!this.rendered){this.render(Ext.getBody())}if(this.hidden===false){this.toFront();return this}if(this.fireEvent("beforeshow",this)===false){return this}if(a){this.on("show",a,b,{single:true})}this.hidden=false;if(Ext.isDefined(c)){this.setAnimateTarget(c)}this.beforeShow();if(this.animateTarget){this.animShow()}else{this.afterShow()}return this},afterShow:function(b){if(this.isDestroyed){return false}this.proxy.hide();this.el.setStyle("display","block");this.el.show();if(this.maximized){this.fitContainer()}if(Ext.isMac&&Ext.isGecko2){this.cascade(this.setAutoScroll)}if(this.monitorResize||this.modal||this.constrain||this.constrainHeader){Ext.EventManager.onWindowResize(this.onWindowResize,this)}this.doConstrain();this.doLayout();if(this.keyMap){this.keyMap.enable()}this.toFront();this.updateHandles();if(b&&(Ext.isIE||Ext.isWebKit)){var a=this.getSize();this.onResize(a.width,a.height)}this.onShow();this.fireEvent("show",this)},animShow:function(){this.proxy.show();this.proxy.setBox(this.animateTarget.getBox());this.proxy.setOpacity(0);var a=this.getBox();this.el.setStyle("display","none");this.proxy.shift(Ext.apply(a,{callback:this.afterShow.createDelegate(this,[true],false),scope:this,easing:"easeNone",duration:this.showAnimDuration,opacity:0.5}))},hide:function(c,a,b){if(this.hidden||this.fireEvent("beforehide",this)===false){return this}if(a){this.on("hide",a,b,{single:true})}this.hidden=true;if(c!==undefined){this.setAnimateTarget(c)}if(this.modal){this.mask.hide();Ext.getBody().removeClass("x-body-masked")}if(this.animateTarget){this.animHide()}else{this.el.hide();this.afterHide()}return this},afterHide:function(){this.proxy.hide();if(this.monitorResize||this.modal||this.constrain||this.constrainHeader){Ext.EventManager.removeResizeListener(this.onWindowResize,this)}if(this.keyMap){this.keyMap.disable()}this.onHide();this.fireEvent("hide",this)},animHide:function(){this.proxy.setOpacity(0.5);this.proxy.show();var a=this.getBox(false);this.proxy.setBox(a);this.el.hide();this.proxy.shift(Ext.apply(this.animateTarget.getBox(),{callback:this.afterHide,scope:this,duration:this.hideAnimDuration,easing:"easeNone",opacity:0}))},onShow:Ext.emptyFn,onHide:Ext.emptyFn,onWindowResize:function(){if(this.maximized){this.fitContainer()}if(this.modal){this.mask.setSize("100%","100%");var a=this.mask.dom.offsetHeight;this.mask.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true))}this.doConstrain()},doConstrain:function(){if(this.constrain||this.constrainHeader){var b;if(this.constrain){b={right:this.el.shadowOffset,left:this.el.shadowOffset,bottom:this.el.shadowOffset}}else{var a=this.getSize();b={right:-(a.width-100),bottom:-(a.height-25+this.el.getConstrainOffset())}}var c=this.el.getConstrainToXY(this.container,true,b);if(c){this.setPosition(c[0],c[1])}}},ghost:function(a){var c=this.createGhost(a);var b=this.getBox(true);c.setLeftTop(b.x,b.y);c.setWidth(b.width);this.el.hide();this.activeGhost=c;return c},unghost:function(b,a){if(!this.activeGhost){return}if(b!==false){this.el.show();this.focus.defer(10,this);if(Ext.isMac&&Ext.isGecko2){this.cascade(this.setAutoScroll)}}if(a!==false){this.setPosition(this.activeGhost.getLeft(true),this.activeGhost.getTop(true))}this.activeGhost.hide();this.activeGhost.remove();delete this.activeGhost},minimize:function(){this.fireEvent("minimize",this);return this},close:function(){if(this.fireEvent("beforeclose",this)!==false){if(this.hidden){this.doClose()}else{this.hide(null,this.doClose,this)}}},doClose:function(){this.fireEvent("close",this);this.destroy()},maximize:function(){if(!this.maximized){this.expand(false);this.restoreSize=this.getSize();this.restorePos=this.getPosition(true);if(this.maximizable){this.tools.maximize.hide();this.tools.restore.show()}this.maximized=true;this.el.disableShadow();if(this.dd){this.dd.lock()}if(this.collapsible){this.tools.toggle.hide()}this.el.addClass("x-window-maximized");this.container.addClass("x-window-maximized-ct");this.setPosition(0,0);this.fitContainer();this.fireEvent("maximize",this)}return this},restore:function(){if(this.maximized){var a=this.tools;this.el.removeClass("x-window-maximized");if(a.restore){a.restore.hide()}if(a.maximize){a.maximize.show()}this.setPosition(this.restorePos[0],this.restorePos[1]);this.setSize(this.restoreSize.width,this.restoreSize.height);delete this.restorePos;delete this.restoreSize;this.maximized=false;this.el.enableShadow(true);if(this.dd){this.dd.unlock()}if(this.collapsible&&a.toggle){a.toggle.show()}this.container.removeClass("x-window-maximized-ct");this.doConstrain();this.fireEvent("restore",this)}return this},toggleMaximize:function(){return this[this.maximized?"restore":"maximize"]()},fitContainer:function(){var a=this.container.getViewSize(false);this.setSize(a.width,a.height)},setZIndex:function(a){if(this.modal){this.mask.setStyle("z-index",a)}this.el.setZIndex(++a);a+=5;if(this.resizer){this.resizer.proxy.setStyle("z-index",++a)}this.lastZIndex=a},alignTo:function(b,a,c){var d=this.el.getAlignToXY(b,a,c);this.setPagePosition(d[0],d[1]);return this},anchorTo:function(c,e,d,b){this.clearAnchor();this.anchorTarget={el:c,alignment:e,offsets:d};Ext.EventManager.onWindowResize(this.doAnchor,this);var a=typeof b;if(a!="undefined"){Ext.EventManager.on(window,"scroll",this.doAnchor,this,{buffer:a=="number"?b:50})}return this.doAnchor()},doAnchor:function(){var a=this.anchorTarget;this.alignTo(a.el,a.alignment,a.offsets);return this},clearAnchor:function(){if(this.anchorTarget){Ext.EventManager.removeResizeListener(this.doAnchor,this);Ext.EventManager.un(window,"scroll",this.doAnchor,this);delete this.anchorTarget}return this},toFront:function(a){if(this.manager.bringToFront(this)){if(!a||!a.getTarget().focus){this.focus()}}return this},setActive:function(a){if(a){if(!this.maximized){this.el.enableShadow(true)}this.fireEvent("activate",this)}else{this.el.disableShadow();this.fireEvent("deactivate",this)}},toBack:function(){this.manager.sendToBack(this);return this},center:function(){var a=this.el.getAlignToXY(this.container,"c-c");this.setPagePosition(a[0],a[1]);return this}});Ext.reg("window",Ext.Window);Ext.Window.DD=Ext.extend(Ext.dd.DD,{constructor:function(a){this.win=a;Ext.Window.DD.superclass.constructor.call(this,a.el.id,"WindowDD-"+a.id);this.setHandleElId(a.header.id);this.scroll=false},moveOnly:true,headerOffsets:[100,25],startDrag:function(){var a=this.win;this.proxy=a.ghost(a.initialConfig.cls);if(a.constrain!==false){var c=a.el.shadowOffset;this.constrainTo(a.container,{right:c,left:c,bottom:c})}else{if(a.constrainHeader!==false){var b=this.proxy.getSize();this.constrainTo(a.container,{right:-(b.width-this.headerOffsets[0]),bottom:-(b.height-this.headerOffsets[1])})}}},b4Drag:Ext.emptyFn,onDrag:function(a){this.alignElWithMouse(this.proxy,a.getPageX(),a.getPageY())},endDrag:function(a){this.win.unghost();this.win.saveState()}});Ext.WindowGroup=function(){var g={};var d=[];var e=null;var c=function(j,i){return(!j._lastAccess||j._lastAccess0){l.sort(c);var k=l[0].manager.zseed;for(var m=0;m=0;--j){if(!d[j].hidden){b(d[j]);return}}b(null)};return{zseed:9000,register:function(i){if(i.manager){i.manager.unregister(i)}i.manager=this;g[i.id]=i;d.push(i);i.on("hide",a)},unregister:function(i){delete i.manager;delete g[i.id];i.un("hide",a);d.remove(i)},get:function(i){return typeof i=="object"?i:g[i]},bringToFront:function(i){i=this.get(i);if(i!=e){i._lastAccess=new Date().getTime();h();return true}return false},sendToBack:function(i){i=this.get(i);i._lastAccess=-(new Date().getTime());h();return i},hideAll:function(){for(var i in g){if(g[i]&&typeof g[i]!="function"&&g[i].isVisible()){g[i].hide()}}},getActive:function(){return e},getBy:function(l,k){var m=[];for(var j=d.length-1;j>=0;--j){var n=d[j];if(l.call(k||n,n)!==false){m.push(n)}}return m},each:function(j,i){for(var k in g){if(g[k]&&typeof g[k]!="function"){if(j.call(i||g[k],g[k])===false){return}}}}}};Ext.WindowMgr=new Ext.WindowGroup();Ext.MessageBox=function(){var u,b,q,t,h,l,s,a,n,p,j,g,r,v,o,i="",d="",m=["ok","yes","no","cancel"];var c=function(x){r[x].blur();if(u.isVisible()){u.hide();w();Ext.callback(b.fn,b.scope||window,[x,v.dom.value,b],1)}};var w=function(){if(b&&b.cls){u.el.removeClass(b.cls)}n.reset()};var e=function(z,x,y){if(b&&b.closable!==false){u.hide();w()}if(y){y.stopEvent()}};var k=function(x){var z=0,y;if(!x){Ext.each(m,function(A){r[A].hide()});return z}u.footer.dom.style.display="";Ext.iterate(r,function(A,B){y=x[A];if(y){B.show();B.setText(Ext.isString(y)?y:Ext.MessageBox.buttonText[A]);z+=B.getEl().getWidth()+15}else{B.hide()}});return z};return{getDialog:function(x){if(!u){var z=[];r={};Ext.each(m,function(A){z.push(r[A]=new Ext.Button({text:this.buttonText[A],handler:c.createCallback(A),hideMode:"offsets"}))},this);u=new Ext.Window({autoCreate:true,title:x,resizable:false,constrain:true,constrainHeader:true,minimizable:false,maximizable:false,stateful:false,modal:true,shim:true,buttonAlign:"center",width:400,height:100,minHeight:80,plain:true,footer:true,closable:true,close:function(){if(b&&b.buttons&&b.buttons.no&&!b.buttons.cancel){c("no")}else{c("cancel")}},fbar:new Ext.Toolbar({items:z,enableOverflow:false})});u.render(document.body);u.getEl().addClass("x-window-dlg");q=u.mask;h=u.body.createChild({html:'

    '});j=Ext.get(h.dom.firstChild);var y=h.dom.childNodes[1];l=Ext.get(y.firstChild);s=Ext.get(y.childNodes[2].firstChild);s.enableDisplayMode();s.addKeyListener([10,13],function(){if(u.isVisible()&&b&&b.buttons){if(b.buttons.ok){c("ok")}else{if(b.buttons.yes){c("yes")}}}});a=Ext.get(y.childNodes[2].childNodes[1]);a.enableDisplayMode();n=new Ext.ProgressBar({renderTo:h});h.createChild({cls:"x-clear"})}return u},updateText:function(A){if(!u.isVisible()&&!b.width){u.setSize(this.maxWidth,100)}l.update(A?A+" ":" ");var y=d!=""?(j.getWidth()+j.getMargins("lr")):0,C=l.getWidth()+l.getMargins("lr"),z=u.getFrameWidth("lr"),B=u.body.getFrameWidth("lr"),x;x=Math.max(Math.min(b.width||y+C+z+B,b.maxWidth||this.maxWidth),Math.max(b.minWidth||this.minWidth,o||0));if(b.prompt===true){v.setWidth(x-y-z-B)}if(b.progress===true||b.wait===true){n.setSize(x-y-z-B)}if(Ext.isIE&&x==o){x+=4}l.update(A||" ");u.setSize(x,"auto").center();return this},updateProgress:function(y,x,z){n.updateProgress(y,x);if(z){this.updateText(z)}return this},isVisible:function(){return u&&u.isVisible()},hide:function(){var x=u?u.activeGhost:null;if(this.isVisible()||x){u.hide();w();if(x){u.unghost(false,false)}}return this},show:function(A){if(this.isVisible()){this.hide()}b=A;var B=this.getDialog(b.title||" ");B.setTitle(b.title||" ");var x=(b.closable!==false&&b.progress!==true&&b.wait!==true);B.tools.close.setDisplayed(x);v=s;b.prompt=b.prompt||(b.multiline?true:false);if(b.prompt){if(b.multiline){s.hide();a.show();a.setHeight(Ext.isNumber(b.multiline)?b.multiline:this.defaultTextHeight);v=a}else{s.show();a.hide()}}else{s.hide();a.hide()}v.dom.value=b.value||"";if(b.prompt){B.focusEl=v}else{var z=b.buttons;var y=null;if(z&&z.ok){y=r.ok}else{if(z&&z.yes){y=r.yes}}if(y){B.focusEl=y}}if(Ext.isDefined(b.iconCls)){B.setIconClass(b.iconCls)}this.setIcon(Ext.isDefined(b.icon)?b.icon:i);o=k(b.buttons);n.setVisible(b.progress===true||b.wait===true);this.updateProgress(0,b.progressText);this.updateText(b.msg);if(b.cls){B.el.addClass(b.cls)}B.proxyDrag=b.proxyDrag===true;B.modal=b.modal!==false;B.mask=b.modal!==false?q:false;if(!B.isVisible()){document.body.appendChild(u.el.dom);B.setAnimateTarget(b.animEl);B.on("show",function(){if(x===true){B.keyMap.enable()}else{B.keyMap.disable()}},this,{single:true});B.show(b.animEl)}if(b.wait===true){n.wait(b.waitConfig)}return this},setIcon:function(x){if(!u){i=x;return}i=undefined;if(x&&x!=""){j.removeClass("x-hidden");j.replaceClass(d,x);h.addClass("x-dlg-icon");d=x}else{j.replaceClass(d,"x-hidden");h.removeClass("x-dlg-icon");d=""}return this},progress:function(z,y,x){this.show({title:z,msg:y,buttons:false,progress:true,closable:false,minWidth:this.minProgressWidth,progressText:x});return this},wait:function(z,y,x){this.show({title:y,msg:z,buttons:false,closable:false,wait:true,modal:true,minWidth:this.minProgressWidth,waitConfig:x});return this},alert:function(A,z,y,x){this.show({title:A,msg:z,buttons:this.OK,fn:y,scope:x,minWidth:this.minWidth});return this},confirm:function(A,z,y,x){this.show({title:A,msg:z,buttons:this.YESNO,fn:y,scope:x,icon:this.QUESTION,minWidth:this.minWidth});return this},prompt:function(C,B,z,y,x,A){this.show({title:C,msg:B,buttons:this.OKCANCEL,fn:z,minWidth:this.minPromptWidth,scope:y,prompt:true,multiline:x,value:A});return this},OK:{ok:true},CANCEL:{cancel:true},OKCANCEL:{ok:true,cancel:true},YESNO:{yes:true,no:true},YESNOCANCEL:{yes:true,no:true,cancel:true},INFO:"ext-mb-info",WARNING:"ext-mb-warning",QUESTION:"ext-mb-question",ERROR:"ext-mb-error",defaultTextHeight:75,maxWidth:600,minWidth:100,minProgressWidth:250,minPromptWidth:250,buttonText:{ok:"OK",cancel:"Cancel",yes:"Yes",no:"No"}}}();Ext.Msg=Ext.MessageBox;Ext.dd.PanelProxy=Ext.extend(Object,{constructor:function(a,b){this.panel=a;this.id=this.panel.id+"-ddproxy";Ext.apply(this,b)},insertProxy:true,setStatus:Ext.emptyFn,reset:Ext.emptyFn,update:Ext.emptyFn,stop:Ext.emptyFn,sync:Ext.emptyFn,getEl:function(){return this.ghost},getGhost:function(){return this.ghost},getProxy:function(){return this.proxy},hide:function(){if(this.ghost){if(this.proxy){this.proxy.remove();delete this.proxy}this.panel.el.dom.style.display="";this.ghost.remove();delete this.ghost}},show:function(){if(!this.ghost){this.ghost=this.panel.createGhost(this.panel.initialConfig.cls,undefined,Ext.getBody());this.ghost.setXY(this.panel.el.getXY());if(this.insertProxy){this.proxy=this.panel.el.insertSibling({cls:"x-panel-dd-spacer"});this.proxy.setSize(this.panel.getSize())}this.panel.el.dom.style.display="none"}},repair:function(b,c,a){this.hide();if(typeof c=="function"){c.call(a||this)}},moveProxy:function(a,b){if(this.proxy){a.insertBefore(this.proxy.dom,b)}}});Ext.Panel.DD=Ext.extend(Ext.dd.DragSource,{constructor:function(b,a){this.panel=b;this.dragData={panel:b};this.proxy=new Ext.dd.PanelProxy(b,a);Ext.Panel.DD.superclass.constructor.call(this,b.el,a);var d=b.header,c=b.body;if(d){this.setHandleElId(d.id);c=b.header}c.setStyle("cursor","move");this.scroll=false},showFrame:Ext.emptyFn,startDrag:Ext.emptyFn,b4StartDrag:function(a,b){this.proxy.show()},b4MouseDown:function(b){var a=b.getPageX(),c=b.getPageY();this.autoOffset(a,c)},onInitDrag:function(a,b){this.onStartDrag(a,b);return true},createFrame:Ext.emptyFn,getDragEl:function(a){return this.proxy.ghost.dom},endDrag:function(a){this.proxy.hide();this.panel.saveState()},autoOffset:function(a,b){a-=this.startPageX;b-=this.startPageY;this.setDelta(a,b)}});Ext.state.Provider=Ext.extend(Ext.util.Observable,{constructor:function(){this.addEvents("statechange");this.state={};Ext.state.Provider.superclass.constructor.call(this)},get:function(b,a){return typeof this.state[b]=="undefined"?a:this.state[b]},clear:function(a){delete this.state[a];this.fireEvent("statechange",this,a,null)},set:function(a,b){this.state[a]=b;this.fireEvent("statechange",this,a,b)},decodeValue:function(b){var e=/^(a|n|d|b|s|o|e)\:(.*)$/,h=e.exec(unescape(b)),d,c,a,g;if(!h||!h[1]){return}c=h[1];a=h[2];switch(c){case"e":return null;case"n":return parseFloat(a);case"d":return new Date(Date.parse(a));case"b":return(a=="1");case"a":d=[];if(a!=""){Ext.each(a.split("^"),function(i){d.push(this.decodeValue(i))},this)}return d;case"o":d={};if(a!=""){Ext.each(a.split("^"),function(i){g=i.split("=");d[g[0]]=this.decodeValue(g[1])},this)}return d;default:return a}},encodeValue:function(c){var b,g="",e=0,a,d;if(c==null){return"e:1"}else{if(typeof c=="number"){b="n:"+c}else{if(typeof c=="boolean"){b="b:"+(c?"1":"0")}else{if(Ext.isDate(c)){b="d:"+c.toGMTString()}else{if(Ext.isArray(c)){for(a=c.length;e-1){var e=this.isSelected(b),c=this.all.elements[b],d=this.bufferRender([a],b)[0];this.all.replaceElement(b,d,true);if(e){this.selected.replaceElement(c,d);this.all.item(b).addClass(this.selectedClass)}this.updateIndexes(b,b)}},onAdd:function(g,d,e){if(this.all.getCount()===0){this.refresh();return}var c=this.bufferRender(d,e),h,b=this.all.elements;if(e0){if(!b){this.selected.removeClass(this.selectedClass)}this.selected.clear();this.last=false;if(!a){this.fireEvent("selectionchange",this,this.selected.elements)}}},isSelected:function(a){return this.selected.contains(this.getNode(a))},deselect:function(a){if(this.isSelected(a)){a=this.getNode(a);this.selected.removeElement(a);if(this.last==a.viewIndex){this.last=false}Ext.fly(a).removeClass(this.selectedClass);this.fireEvent("selectionchange",this,this.selected.elements)}},select:function(d,g,b){if(Ext.isArray(d)){if(!g){this.clearSelections(true)}for(var c=0,a=d.length;c=a&&d[c];c--){b.push(d[c])}}return b},indexOf:function(a){a=this.getNode(a);if(Ext.isNumber(a.viewIndex)){return a.viewIndex}return this.all.indexOf(a)},onBeforeLoad:function(){if(this.loadingText){this.clearSelections(false,true);this.getTemplateTarget().update('
    '+this.loadingText+"
    ");this.all.clear()}},onDestroy:function(){this.all.clear();this.selected.clear();Ext.DataView.superclass.onDestroy.call(this);this.bindStore(null)}});Ext.DataView.prototype.setStore=Ext.DataView.prototype.bindStore;Ext.reg("dataview",Ext.DataView);Ext.list.ListView=Ext.extend(Ext.DataView,{itemSelector:"dl",selectedClass:"x-list-selected",overClass:"x-list-over",scrollOffset:undefined,columnResize:true,columnSort:true,maxColumnWidth:Ext.isIE?99:100,initComponent:function(){if(this.columnResize){this.colResizer=new Ext.list.ColumnResizer(this.colResizer);this.colResizer.init(this)}if(this.columnSort){this.colSorter=new Ext.list.Sorter(this.columnSort);this.colSorter.init(this)}if(!this.internalTpl){this.internalTpl=new Ext.XTemplate('
    ','','
    ',"{header}","
    ","
    ",'
    ',"
    ",'
    ',"
    ")}if(!this.tpl){this.tpl=new Ext.XTemplate('',"
    ",'','
    ',' class="{cls}">',"{[values.tpl.apply(parent)]}","
    ","
    ",'
    ',"
    ","
    ")}var l=this.columns,h=0,k=0,m=l.length,b=[];for(var g=0;gthis.maxColumnWidth){n.width-=(h-this.maxColumnWidth)/100}k++}b.push(n)}l=this.columns=b;if(k10)){b.style.width=d;g.style.width=d}else{b.style.width=c+"px";g.style.width=c+"px";setTimeout(function(){if((a.offsetWidth-a.clientWidth)>10){b.style.width=d;g.style.width=d}},10)}}if(Ext.isNumber(e)){a.style.height=Math.max(0,e-g.parentNode.offsetHeight)+"px"}},updateIndexes:function(){Ext.list.ListView.superclass.updateIndexes.apply(this,arguments);this.verifyInternalSize()},findHeaderIndex:function(g){g=g.dom||g;var a=g.parentNode,d=a.parentNode.childNodes,b=0,e;for(;e=d[b];b++){if(e==a){return b}}return -1},setHdWidths:function(){var d=this.innerHd.dom.getElementsByTagName("div"),c=0,b=this.columns,a=b.length;for(;c','','{text}',"");d.disableFormats=true;d.compile();Ext.TabPanel.prototype.itemTpl=d}this.items.each(this.initTab,this)},afterRender:function(){Ext.TabPanel.superclass.afterRender.call(this);if(this.autoTabs){this.readTabs(false)}if(this.activeTab!==undefined){var a=Ext.isObject(this.activeTab)?this.activeTab:this.items.get(this.activeTab);delete this.activeTab;this.setActiveTab(a)}},initEvents:function(){Ext.TabPanel.superclass.initEvents.call(this);this.mon(this.strip,{scope:this,mousedown:this.onStripMouseDown,contextmenu:this.onStripContextMenu});if(this.enableTabScroll){this.mon(this.strip,"mousewheel",this.onWheel,this)}},findTargets:function(c){var b=null,a=c.getTarget("li:not(.x-tab-edge)",this.strip);if(a){b=this.getComponent(a.id.split(this.idDelimiter)[1]);if(b.disabled){return{close:null,item:null,el:null}}}return{close:c.getTarget(".x-tab-strip-close",this.strip),item:b,el:a}},onStripMouseDown:function(b){if(b.button!==0){return}b.preventDefault();var a=this.findTargets(b);if(a.close){if(a.item.fireEvent("beforeclose",a.item)!==false){a.item.fireEvent("close",a.item);this.remove(a.item)}return}if(a.item&&a.item!=this.activeTab){this.setActiveTab(a.item)}},onStripContextMenu:function(b){b.preventDefault();var a=this.findTargets(b);if(a.item){this.fireEvent("contextmenu",this,a.item,b)}},readTabs:function(d){if(d===true){this.items.each(function(h){this.remove(h)},this)}var c=this.el.query(this.autoTabSelector);for(var b=0,a=c.length;b0){this.setActiveTab(0)}else{this.setActiveTab(null)}}}if(!this.destroying){this.delegateUpdates()}},onBeforeShowItem:function(a){if(a!=this.activeTab){this.setActiveTab(a);return false}},onItemDisabled:function(b){var a=this.getTabEl(b);if(a){Ext.fly(a).addClass("x-item-disabled")}this.stack.remove(b)},onItemEnabled:function(b){var a=this.getTabEl(b);if(a){Ext.fly(a).removeClass("x-item-disabled")}},onItemTitleChanged:function(b){var a=this.getTabEl(b);if(a){Ext.fly(a).child("span.x-tab-strip-text",true).innerHTML=b.title}},onItemIconChanged:function(d,a,c){var b=this.getTabEl(d);if(b){b=Ext.get(b);b.child("span.x-tab-strip-text").replaceClass(c,a);b[Ext.isEmpty(a)?"removeClass":"addClass"]("x-tab-with-icon")}},getTabEl:function(a){var b=this.getComponent(a);return b?b.tabEl:null},onResize:function(){Ext.TabPanel.superclass.onResize.apply(this,arguments);this.delegateUpdates()},beginUpdate:function(){this.suspendUpdates=true},endUpdate:function(){this.suspendUpdates=false;this.delegateUpdates()},hideTabStripItem:function(b){b=this.getComponent(b);var a=this.getTabEl(b);if(a){a.style.display="none";this.delegateUpdates()}this.stack.remove(b)},unhideTabStripItem:function(b){b=this.getComponent(b);var a=this.getTabEl(b);if(a){a.style.display="";this.delegateUpdates()}},delegateUpdates:function(){var a=this.rendered;if(this.suspendUpdates){return}if(this.resizeTabs&&a){this.autoSizeTabs()}if(this.enableTabScroll&&a){this.autoScrollTabs()}},autoSizeTabs:function(){var h=this.items.length,b=this.tabPosition!="bottom"?"header":"footer",c=this[b].dom.offsetWidth,a=this[b].dom.clientWidth;if(!this.resizeTabs||h<1||!a){return}var k=Math.max(Math.min(Math.floor((a-4)/h)-this.tabMargin,this.tabWidth),this.minTabWidth);this.lastTabWidth=k;var m=this.strip.query("li:not(.x-tab-edge)");for(var e=0,j=m.length;e20?c:20);if(!this.scrolling){if(!this.scrollLeft){this.createScrollers()}else{this.scrollLeft.show();this.scrollRight.show()}}this.scrolling=true;if(i>(a-c)){e.scrollLeft=a-c}else{this.scrollToTab(this.activeTab,false)}this.updateScrollButtons()}},createScrollers:function(){this.pos.addClass("x-tab-scrolling-"+this.tabPosition);var c=this.stripWrap.dom.offsetHeight;var a=this.pos.insertFirst({cls:"x-tab-scroller-left"});a.setHeight(c);a.addClassOnOver("x-tab-scroller-left-over");this.leftRepeater=new Ext.util.ClickRepeater(a,{interval:this.scrollRepeatInterval,handler:this.onScrollLeft,scope:this});this.scrollLeft=a;var b=this.pos.insertFirst({cls:"x-tab-scroller-right"});b.setHeight(c);b.addClassOnOver("x-tab-scroller-right-over");this.rightRepeater=new Ext.util.ClickRepeater(b,{interval:this.scrollRepeatInterval,handler:this.onScrollRight,scope:this});this.scrollRight=b},getScrollWidth:function(){return this.edge.getOffsetsTo(this.stripWrap)[0]+this.getScrollPos()},getScrollPos:function(){return parseInt(this.stripWrap.dom.scrollLeft,10)||0},getScrollArea:function(){return parseInt(this.stripWrap.dom.clientWidth,10)||0},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this}},getScrollIncrement:function(){return this.scrollIncrement||(this.resizeTabs?this.lastTabWidth+2:100)},scrollToTab:function(e,a){if(!e){return}var c=this.getTabEl(e),h=this.getScrollPos(),d=this.getScrollArea(),g=Ext.fly(c).getOffsetsTo(this.stripWrap)[0]+h,b=g+c.offsetWidth;if(g(h+d)){this.scrollTo(b-d,a)}}},scrollTo:function(b,a){this.stripWrap.scrollTo("left",b,a?this.getScrollAnim():false);if(!a){this.updateScrollButtons()}},onWheel:function(g){var h=g.getWheelDelta()*this.wheelIncrement*-1;g.stopEvent();var i=this.getScrollPos(),c=i+h,a=this.getScrollWidth()-this.getScrollArea();var b=Math.max(0,Math.min(a,c));if(b!=i){this.scrollTo(b,false)}},onScrollRight:function(){var a=this.getScrollWidth()-this.getScrollArea(),c=this.getScrollPos(),b=Math.min(a,c+this.getScrollIncrement());if(b!=c){this.scrollTo(b,this.animScroll)}},onScrollLeft:function(){var b=this.getScrollPos(),a=Math.max(0,b-this.getScrollIncrement());if(a!=b){this.scrollTo(a,this.animScroll)}},updateScrollButtons:function(){var a=this.getScrollPos();this.scrollLeft[a===0?"addClass":"removeClass"]("x-tab-scroller-left-disabled");this.scrollRight[a>=(this.getScrollWidth()-this.getScrollArea())?"addClass":"removeClass"]("x-tab-scroller-right-disabled")},beforeDestroy:function(){Ext.destroy(this.leftRepeater,this.rightRepeater);this.deleteMembers("strip","edge","scrollLeft","scrollRight","stripWrap");this.activeTab=null;Ext.TabPanel.superclass.beforeDestroy.apply(this)}});Ext.reg("tabpanel",Ext.TabPanel);Ext.TabPanel.prototype.activate=Ext.TabPanel.prototype.setActiveTab;Ext.TabPanel.AccessStack=function(){var a=[];return{add:function(b){a.push(b);if(a.length>10){a.shift()}},remove:function(e){var d=[];for(var c=0,b=a.length;c','  ','  ','  ',"");Ext.Button.buttonTemplate.compile()}this.template=Ext.Button.buttonTemplate}var b,d=this.getTemplateArgs();if(a){b=this.template.insertBefore(a,d,true)}else{b=this.template.append(c,d,true)}this.btnEl=b.child(this.buttonSelector);this.mon(this.btnEl,{scope:this,focus:this.onFocus,blur:this.onBlur});this.initButtonEl(b,this.btnEl);Ext.ButtonToggleMgr.register(this)},initButtonEl:function(b,c){this.el=b;this.setIcon(this.icon);this.setText(this.text);this.setIconClass(this.iconCls);if(Ext.isDefined(this.tabIndex)){c.dom.tabIndex=this.tabIndex}if(this.tooltip){this.setTooltip(this.tooltip,true)}if(this.handleMouseEvents){this.mon(b,{scope:this,mouseover:this.onMouseOver,mousedown:this.onMouseDown})}if(this.menu){this.mon(this.menu,{scope:this,show:this.onMenuShow,hide:this.onMenuHide})}if(this.repeat){var a=new Ext.util.ClickRepeater(b,Ext.isObject(this.repeat)?this.repeat:{});this.mon(a,"click",this.onRepeatClick,this)}else{this.mon(b,this.clickEvent,this.onClick,this)}},afterRender:function(){Ext.Button.superclass.afterRender.call(this);this.useSetClass=true;this.setButtonClass();this.doc=Ext.getDoc();this.doAutoWidth()},setIconClass:function(a){this.iconCls=a;if(this.el){this.btnEl.dom.className="";this.btnEl.addClass(["x-btn-text",a||""]);this.setButtonClass()}return this},setTooltip:function(b,a){if(this.rendered){if(!a){this.clearTip()}if(Ext.isObject(b)){Ext.QuickTips.register(Ext.apply({target:this.btnEl.id},b));this.tooltip=b}else{this.btnEl.dom[this.tooltipType]=b}}else{this.tooltip=b}return this},clearTip:function(){if(Ext.isObject(this.tooltip)){Ext.QuickTips.unregister(this.btnEl)}},beforeDestroy:function(){if(this.rendered){this.clearTip()}if(this.menu&&this.destroyMenu!==false){Ext.destroy(this.btnEl,this.menu)}Ext.destroy(this.repeater)},onDestroy:function(){if(this.rendered){this.doc.un("mouseover",this.monitorMouseOver,this);this.doc.un("mouseup",this.onMouseUp,this);delete this.doc;delete this.btnEl;Ext.ButtonToggleMgr.unregister(this)}Ext.Button.superclass.onDestroy.call(this)},doAutoWidth:function(){if(this.autoWidth!==false&&this.el&&this.text&&this.width===undefined){this.el.setWidth("auto");if(Ext.isIE7&&Ext.isStrict){var a=this.btnEl;if(a&&a.getWidth()>20){a.clip();a.setWidth(Ext.util.TextMetrics.measure(a,this.text).width+a.getFrameWidth("lr"))}}if(this.minWidth){if(this.el.getWidth()a}else{return c.getPageY()>this.btnEl.getRegion().bottom}},onClick:function(b,a){b.preventDefault();if(!this.disabled){if(this.isClickOnArrow(b)){if(this.menu&&!this.menu.isVisible()&&!this.ignoreNextClick){this.showMenu()}this.fireEvent("arrowclick",this,b);if(this.arrowHandler){this.arrowHandler.call(this.scope||this,this,b)}}else{this.doToggle();this.fireEvent("click",this,b);if(this.handler){this.handler.call(this.scope||this,this,b)}}}},isMenuTriggerOver:function(a){return this.menu&&a.target.tagName==this.arrowSelector},isMenuTriggerOut:function(b,a){return this.menu&&b.target.tagName!=this.arrowSelector}});Ext.reg("splitbutton",Ext.SplitButton);Ext.CycleButton=Ext.extend(Ext.SplitButton,{getItemText:function(a){if(a&&this.showText===true){var b="";if(this.prependText){b+=this.prependText}b+=a.text;return b}return undefined},setActiveItem:function(c,a){if(!Ext.isObject(c)){c=this.menu.getComponent(c)}if(c){if(!this.rendered){this.text=this.getItemText(c);this.iconCls=c.iconCls}else{var b=this.getItemText(c);if(b){this.setText(b)}this.setIconClass(c.iconCls)}this.activeItem=c;if(!c.checked){c.setChecked(true,a)}if(this.forceIcon){this.setIconClass(this.forceIcon)}if(!a){this.fireEvent("change",this,c)}}},getActiveItem:function(){return this.activeItem},initComponent:function(){this.addEvents("change");if(this.changeHandler){this.on("change",this.changeHandler,this.scope||this);delete this.changeHandler}this.itemCount=this.items.length;this.menu={cls:"x-cycle-menu",items:[]};var a=0;Ext.each(this.items,function(c,b){Ext.apply(c,{group:c.group||this.id,itemIndex:b,checkHandler:this.checkHandler,scope:this,checked:c.checked||false});this.menu.items.push(c);if(c.checked){a=b}},this);Ext.CycleButton.superclass.initComponent.call(this);this.on("click",this.toggleSelected,this);this.setActiveItem(a,true)},checkHandler:function(a,b){if(b){this.setActiveItem(a)}},toggleSelected:function(){var a=this.menu;a.render();if(!a.hasLayout){a.doLayout()}var d,b;for(var c=1;c"){b=new a.Fill()}else{b=new a.TextItem(b)}}}this.applyDefaults(b)}else{if(b.isFormField||b.render){b=this.createComponent(b)}else{if(b.tag){b=new a.Item({autoEl:b})}else{if(b.tagName){b=new a.Item({el:b})}else{if(Ext.isObject(b)){b=b.xtype?this.createComponent(b):this.constructButton(b)}}}}}return b},applyDefaults:function(e){if(!Ext.isString(e)){e=Ext.Toolbar.superclass.applyDefaults.call(this,e);var b=this.internalDefaults;if(e.events){Ext.applyIf(e.initialConfig,b);Ext.apply(e,b)}else{Ext.applyIf(e,b)}}return e},addSeparator:function(){return this.add(new a.Separator())},addSpacer:function(){return this.add(new a.Spacer())},addFill:function(){this.add(new a.Fill())},addElement:function(b){return this.addItem(new a.Item({el:b}))},addItem:function(b){return this.add.apply(this,arguments)},addButton:function(c){if(Ext.isArray(c)){var e=[];for(var d=0,b=c.length;d");this.items.push(this.displayItem=new a.TextItem({}))}Ext.PagingToolbar.superclass.initComponent.call(this);this.addEvents("change","beforechange");this.on("afterlayout",this.onFirstLayout,this,{single:true});this.cursor=0;this.bindStore(this.store,true)},onFirstLayout:function(){if(this.dsLoaded){this.onLoad.apply(this,this.dsLoaded)}},updateInfo:function(){if(this.displayItem){var b=this.store.getCount();var c=b==0?this.emptyMsg:String.format(this.displayMsg,this.cursor+1,this.cursor+b,this.store.getTotalCount());this.displayItem.setText(c)}},onLoad:function(b,e,j){if(!this.rendered){this.dsLoaded=[b,e,j];return}var g=this.getParams();this.cursor=(j.params&&j.params[g.start])?j.params[g.start]:0;var i=this.getPageData(),c=i.activePage,h=i.pages;this.afterTextItem.setText(String.format(this.afterPageText,i.pages));this.inputItem.setValue(c);this.first.setDisabled(c==1);this.prev.setDisabled(c==1);this.next.setDisabled(c==h);this.last.setDisabled(c==h);this.refresh.enable();this.updateInfo();this.fireEvent("change",this,i)},getPageData:function(){var b=this.store.getTotalCount();return{total:b,activePage:Math.ceil((this.cursor+this.pageSize)/this.pageSize),pages:b=1&g<=j.pages){i.setValue(g)}}}}}},getParams:function(){return this.paramNames||this.store.paramNames},beforeLoad:function(){if(this.rendered&&this.refresh){this.refresh.disable()}},doLoad:function(d){var c={},b=this.getParams();c[b.start]=d;c[b.limit]=this.pageSize;if(this.fireEvent("beforechange",this,c)!==false){this.store.load({params:c})}},moveFirst:function(){this.doLoad(0)},movePrevious:function(){this.doLoad(Math.max(0,this.cursor-this.pageSize))},moveNext:function(){this.doLoad(this.cursor+this.pageSize)},moveLast:function(){var c=this.store.getTotalCount(),b=c%this.pageSize;this.doLoad(b?(c-b):c-this.pageSize)},doRefresh:function(){this.doLoad(this.cursor)},bindStore:function(c,d){var b;if(!d&&this.store){if(c!==this.store&&this.store.autoDestroy){this.store.destroy()}else{this.store.un("beforeload",this.beforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("exception",this.onLoadError,this)}if(!c){this.store=null}}if(c){c=Ext.StoreMgr.lookup(c);c.on({scope:this,beforeload:this.beforeLoad,load:this.onLoad,exception:this.onLoadError});b=true}this.store=c;if(b){this.onLoad(c,null,{})}},unbind:function(b){this.bindStore(null)},bind:function(b){this.bindStore(b)},onDestroy:function(){this.bindStore(null);Ext.PagingToolbar.superclass.onDestroy.call(this)}})})();Ext.reg("paging",Ext.PagingToolbar);Ext.History=(function(){var e,c;var k=false;var d;function g(){var l=location.href,m=l.indexOf("#"),n=m>=0?l.substr(m+1):null;if(Ext.isGecko){n=decodeURIComponent(n)}return n}function a(){c.value=d}function h(l){d=l;Ext.History.fireEvent("change",l)}function i(m){var l=['
    ',Ext.util.Format.htmlEncode(m),"
    "].join("");try{var o=e.contentWindow.document;o.open();o.write(l);o.close();return true}catch(n){return false}}function b(){if(!e.contentWindow||!e.contentWindow.document){setTimeout(b,10);return}var o=e.contentWindow.document;var m=o.getElementById("state");var l=m?m.innerText:null;var n=g();setInterval(function(){o=e.contentWindow.document;m=o.getElementById("state");var q=m?m.innerText:null;var p=g();if(q!==l){l=q;h(l);location.hash=l;n=l;a()}else{if(p!==n){n=p;i(p)}}},50);k=true;Ext.History.fireEvent("ready",Ext.History)}function j(){d=c.value?c.value:g();if(Ext.isIE){b()}else{var l=g();setInterval(function(){var m=g();if(m!==l){l=m;h(l);a()}},50);k=true;Ext.History.fireEvent("ready",Ext.History)}}return{fieldId:"x-history-field",iframeId:"x-history-frame",events:{},init:function(m,l){if(k){Ext.callback(m,l,[this]);return}if(!Ext.isReady){Ext.onReady(function(){Ext.History.init(m,l)});return}c=Ext.getDom(Ext.History.fieldId);if(Ext.isIE){e=Ext.getDom(Ext.History.iframeId)}this.addEvents("ready","change");if(m){this.on("ready",m,l,{single:true})}j()},add:function(l,m){if(m!==false){if(this.getToken()==l){return true}}if(Ext.isIE){return i(l)}else{location.hash=l;return true}},back:function(){history.go(-1)},forward:function(){history.go(1)},getToken:function(){return k?d:g()}}})();Ext.apply(Ext.History,new Ext.util.Observable());Ext.Tip=Ext.extend(Ext.Panel,{minWidth:40,maxWidth:300,shadow:"sides",defaultAlign:"tl-bl?",autoRender:true,quickShowInterval:250,frame:true,hidden:true,baseCls:"x-tip",floating:{shadow:true,shim:true,useDisplay:true,constrain:false},autoHeight:true,closeAction:"hide",initComponent:function(){Ext.Tip.superclass.initComponent.call(this);if(this.closable&&!this.title){this.elements+=",header"}},afterRender:function(){Ext.Tip.superclass.afterRender.call(this);if(this.closable){this.addTool({id:"close",handler:this[this.closeAction],scope:this})}},showAt:function(a){Ext.Tip.superclass.show.call(this);if(this.measureWidth!==false&&(!this.initialConfig||typeof this.initialConfig.width!="number")){this.doAutoWidth()}if(this.constrainPosition){a=this.el.adjustForConstraints(a)}this.setPagePosition(a[0],a[1])},doAutoWidth:function(a){a=a||0;var b=this.body.getTextWidth();if(this.title){b=Math.max(b,this.header.child("span").getTextWidth(this.title))}b+=this.getFrameWidth()+(this.closable?20:0)+this.body.getPadding("lr")+a;this.setWidth(b.constrain(this.minWidth,this.maxWidth));if(Ext.isIE7&&!this.repainted){this.el.repaint();this.repainted=true}},showBy:function(a,b){if(!this.rendered){this.render(Ext.getBody())}this.showAt(this.el.getAlignToXY(a,b||this.defaultAlign))},initDraggable:function(){this.dd=new Ext.Tip.DD(this,typeof this.draggable=="boolean"?null:this.draggable);this.header.addClass("x-tip-draggable")}});Ext.reg("tip",Ext.Tip);Ext.Tip.DD=function(b,a){Ext.apply(this,a);this.tip=b;Ext.Tip.DD.superclass.constructor.call(this,b.el.id,"WindowDD-"+b.id);this.setHandleElId(b.header.id);this.scroll=false};Ext.extend(Ext.Tip.DD,Ext.dd.DD,{moveOnly:true,scroll:false,headerOffsets:[100,25],startDrag:function(){this.tip.el.disableShadow()},endDrag:function(a){this.tip.el.enableShadow(true)}});Ext.ToolTip=Ext.extend(Ext.Tip,{showDelay:500,hideDelay:200,dismissDelay:5000,trackMouse:false,anchorToTarget:true,anchorOffset:0,targetCounter:0,constrainPosition:false,initComponent:function(){Ext.ToolTip.superclass.initComponent.call(this);this.lastActive=new Date();this.initTarget(this.target);this.origAnchor=this.anchor},onRender:function(b,a){Ext.ToolTip.superclass.onRender.call(this,b,a);this.anchorCls="x-tip-anchor-"+this.getAnchorPosition();this.anchorEl=this.el.createChild({cls:"x-tip-anchor "+this.anchorCls})},afterRender:function(){Ext.ToolTip.superclass.afterRender.call(this);this.anchorEl.setStyle("z-index",this.el.getZIndex()+1).setVisibilityMode(Ext.Element.DISPLAY)},initTarget:function(c){var a;if((a=Ext.get(c))){if(this.target){var b=Ext.get(this.target);this.mun(b,"mouseover",this.onTargetOver,this);this.mun(b,"mouseout",this.onTargetOut,this);this.mun(b,"mousemove",this.onMouseMove,this)}this.mon(a,{mouseover:this.onTargetOver,mouseout:this.onTargetOut,mousemove:this.onMouseMove,scope:this});this.target=a}if(this.anchor){this.anchorTarget=this.target}},onMouseMove:function(b){var a=this.delegate?b.getTarget(this.delegate):this.triggerElement=true;if(a){this.targetXY=b.getXY();if(a===this.triggerElement){if(!this.hidden&&this.trackMouse){this.setPagePosition(this.getTargetXY())}}else{this.hide();this.lastActive=new Date(0);this.onTargetOver(b)}}else{if(!this.closable&&this.isVisible()){this.hide()}}},getTargetXY:function(){if(this.delegate){this.anchorTarget=this.triggerElement}if(this.anchor){this.targetCounter++;var c=this.getOffsets(),l=(this.anchorToTarget&&!this.trackMouse)?this.el.getAlignToXY(this.anchorTarget,this.getAnchorAlign()):this.targetXY,a=Ext.lib.Dom.getViewWidth()-5,h=Ext.lib.Dom.getViewHeight()-5,i=document.documentElement,e=document.body,k=(i.scrollLeft||e.scrollLeft||0)+5,j=(i.scrollTop||e.scrollTop||0)+5,b=[l[0]+c[0],l[1]+c[1]],g=this.getSize();this.anchorEl.removeClass(this.anchorCls);if(this.targetCounter<2){if(b[0]a){if(this.anchorToTarget){this.defaultAlign="r-l";if(this.mouseOffset){this.mouseOffset[0]*=-1}}this.anchor="right";return this.getTargetXY()}if(b[1]h){if(this.anchorToTarget){this.defaultAlign="b-t";if(this.mouseOffset){this.mouseOffset[1]*=-1}}this.anchor="bottom";return this.getTargetXY()}}this.anchorCls="x-tip-anchor-"+this.getAnchorPosition();this.anchorEl.addClass(this.anchorCls);this.targetCounter=0;return b}else{var d=this.getMouseOffset();return[this.targetXY[0]+d[0],this.targetXY[1]+d[1]]}},getMouseOffset:function(){var a=this.anchor?[0,0]:[15,18];if(this.mouseOffset){a[0]+=this.mouseOffset[0];a[1]+=this.mouseOffset[1]}return a},getAnchorPosition:function(){if(this.anchor){this.tipAnchor=this.anchor.charAt(0)}else{var a=this.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/);if(!a){throw"AnchorTip.defaultAlign is invalid"}this.tipAnchor=a[1].charAt(0)}switch(this.tipAnchor){case"t":return"top";case"b":return"bottom";case"r":return"right"}return"left"},getAnchorAlign:function(){switch(this.anchor){case"top":return"tl-bl";case"left":return"tl-tr";case"right":return"tr-tl";default:return"bl-tl"}},getOffsets:function(){var b,a=this.getAnchorPosition().charAt(0);if(this.anchorToTarget&&!this.trackMouse){switch(a){case"t":b=[0,9];break;case"b":b=[0,-13];break;case"r":b=[-13,0];break;default:b=[9,0];break}}else{switch(a){case"t":b=[-15-this.anchorOffset,30];break;case"b":b=[-19-this.anchorOffset,-13-this.el.dom.offsetHeight];break;case"r":b=[-15-this.el.dom.offsetWidth,-13-this.anchorOffset];break;default:b=[25,-13-this.anchorOffset];break}}var c=this.getMouseOffset();b[0]+=c[0];b[1]+=c[1];return b},onTargetOver:function(b){if(this.disabled||b.within(this.target.dom,true)){return}var a=b.getTarget(this.delegate);if(a){this.triggerElement=a;this.clearTimer("hide");this.targetXY=b.getXY();this.delayShow()}},delayShow:function(){if(this.hidden&&!this.showTimer){if(this.lastActive.getElapsed()=c){d=c-b-5}}return{x:a,y:d}},beforeDestroy:function(){this.clearTimers();Ext.destroy(this.anchorEl);delete this.anchorEl;delete this.target;delete this.anchorTarget;delete this.triggerElement;Ext.ToolTip.superclass.beforeDestroy.call(this)},onDestroy:function(){Ext.getDoc().un("mousedown",this.onDocMouseDown,this);Ext.ToolTip.superclass.onDestroy.call(this)}});Ext.reg("tooltip",Ext.ToolTip);Ext.QuickTip=Ext.extend(Ext.ToolTip,{interceptTitles:false,tagConfig:{namespace:"ext",attribute:"qtip",width:"qwidth",target:"target",title:"qtitle",hide:"hide",cls:"qclass",align:"qalign",anchor:"anchor"},initComponent:function(){this.target=this.target||Ext.getDoc();this.targets=this.targets||{};Ext.QuickTip.superclass.initComponent.call(this)},register:function(e){var h=Ext.isArray(e)?e:arguments;for(var g=0,a=h.length;g1){var d=function(i,h){if(i&&h){var j=h.findChild(a,b);if(j){j.select();if(g){g(true,j)}}else{if(g){g(false,j)}}}else{if(g){g(false,j)}}};this.expandPath(c.join(this.pathSeparator),a,d)}else{this.root.select();if(g){g(true,this.root)}}},getTreeEl:function(){return this.body},onRender:function(b,a){Ext.tree.TreePanel.superclass.onRender.call(this,b,a);this.el.addClass("x-tree");this.innerCt=this.body.createChild({tag:"ul",cls:"x-tree-root-ct "+(this.useArrows?"x-tree-arrows":this.lines?"x-tree-lines":"x-tree-no-lines")})},initEvents:function(){Ext.tree.TreePanel.superclass.initEvents.call(this);if(this.containerScroll){Ext.dd.ScrollManager.register(this.body)}if((this.enableDD||this.enableDrop)&&!this.dropZone){this.dropZone=new Ext.tree.TreeDropZone(this,this.dropConfig||{ddGroup:this.ddGroup||"TreeDD",appendOnly:this.ddAppendOnly===true})}if((this.enableDD||this.enableDrag)&&!this.dragZone){this.dragZone=new Ext.tree.TreeDragZone(this,this.dragConfig||{ddGroup:this.ddGroup||"TreeDD",scroll:this.ddScroll})}this.getSelectionModel().init(this)},afterRender:function(){Ext.tree.TreePanel.superclass.afterRender.call(this);this.renderRoot()},beforeDestroy:function(){if(this.rendered){Ext.dd.ScrollManager.unregister(this.body);Ext.destroy(this.dropZone,this.dragZone)}this.destroyRoot();Ext.destroy(this.loader);this.nodeHash=this.root=this.loader=null;Ext.tree.TreePanel.superclass.beforeDestroy.call(this)},destroyRoot:function(){if(this.root&&this.root.destroy){this.root.destroy(true)}}});Ext.tree.TreePanel.nodeTypes={};Ext.reg("treepanel",Ext.tree.TreePanel);Ext.tree.TreeEventModel=function(a){this.tree=a;this.tree.on("render",this.initEvents,this)};Ext.tree.TreeEventModel.prototype={initEvents:function(){var a=this.tree;if(a.trackMouseOver!==false){a.mon(a.innerCt,{scope:this,mouseover:this.delegateOver,mouseout:this.delegateOut})}a.mon(a.getTreeEl(),{scope:this,click:this.delegateClick,dblclick:this.delegateDblClick,contextmenu:this.delegateContextMenu})},getNode:function(b){var a;if(a=b.getTarget(".x-tree-node-el",10)){var c=Ext.fly(a,"_treeEvents").getAttribute("tree-node-id","ext");if(c){return this.tree.getNodeById(c)}}return null},getNodeTarget:function(b){var a=b.getTarget(".x-tree-node-icon",1);if(!a){a=b.getTarget(".x-tree-node-el",6)}return a},delegateOut:function(b,a){if(!this.beforeEvent(b)){return}if(b.getTarget(".x-tree-ec-icon",1)){var c=this.getNode(b);this.onIconOut(b,c);if(c==this.lastEcOver){delete this.lastEcOver}}if((a=this.getNodeTarget(b))&&!b.within(a,true)){this.onNodeOut(b,this.getNode(b))}},delegateOver:function(b,a){if(!this.beforeEvent(b)){return}if(Ext.isGecko&&!this.trackingDoc){Ext.getBody().on("mouseover",this.trackExit,this);this.trackingDoc=true}if(this.lastEcOver){this.onIconOut(b,this.lastEcOver);delete this.lastEcOver}if(b.getTarget(".x-tree-ec-icon",1)){this.lastEcOver=this.getNode(b);this.onIconOver(b,this.lastEcOver)}if(a=this.getNodeTarget(b)){this.onNodeOver(b,this.getNode(b))}},trackExit:function(a){if(this.lastOverNode){if(this.lastOverNode.ui&&!a.within(this.lastOverNode.ui.getEl())){this.onNodeOut(a,this.lastOverNode)}delete this.lastOverNode;Ext.getBody().un("mouseover",this.trackExit,this);this.trackingDoc=false}},delegateClick:function(b,a){if(this.beforeEvent(b)){if(b.getTarget("input[type=checkbox]",1)){this.onCheckboxClick(b,this.getNode(b))}else{if(b.getTarget(".x-tree-ec-icon",1)){this.onIconClick(b,this.getNode(b))}else{if(this.getNodeTarget(b)){this.onNodeClick(b,this.getNode(b))}}}}else{this.checkContainerEvent(b,"click")}},delegateDblClick:function(b,a){if(this.beforeEvent(b)){if(this.getNodeTarget(b)){this.onNodeDblClick(b,this.getNode(b))}}else{this.checkContainerEvent(b,"dblclick")}},delegateContextMenu:function(b,a){if(this.beforeEvent(b)){if(this.getNodeTarget(b)){this.onNodeContextMenu(b,this.getNode(b))}}else{this.checkContainerEvent(b,"contextmenu")}},checkContainerEvent:function(b,a){if(this.disabled){b.stopEvent();return false}this.onContainerEvent(b,a)},onContainerEvent:function(b,a){this.tree.fireEvent("container"+a,this.tree,b)},onNodeClick:function(b,a){a.ui.onClick(b)},onNodeOver:function(b,a){this.lastOverNode=a;a.ui.onOver(b)},onNodeOut:function(b,a){a.ui.onOut(b)},onIconOver:function(b,a){a.ui.addClass("x-tree-ec-over")},onIconOut:function(b,a){a.ui.removeClass("x-tree-ec-over")},onIconClick:function(b,a){a.ui.ecClick(b)},onCheckboxClick:function(b,a){a.ui.onCheckChange(b)},onNodeDblClick:function(b,a){a.ui.onDblClick(b)},onNodeContextMenu:function(b,a){a.ui.onContextMenu(b)},beforeEvent:function(b){var a=this.getNode(b);if(this.disabled||!a||!a.ui){b.stopEvent();return false}return true},disable:function(){this.disabled=true},enable:function(){this.disabled=false}};Ext.tree.DefaultSelectionModel=Ext.extend(Ext.util.Observable,{constructor:function(a){this.selNode=null;this.addEvents("selectionchange","beforeselect");Ext.apply(this,a);Ext.tree.DefaultSelectionModel.superclass.constructor.call(this)},init:function(a){this.tree=a;a.mon(a.getTreeEl(),"keydown",this.onKeyDown,this);a.on("click",this.onNodeClick,this)},onNodeClick:function(a,b){this.select(a)},select:function(c,a){if(!Ext.fly(c.ui.wrap).isVisible()&&a){return a.call(this,c)}var b=this.selNode;if(c==b){c.ui.onSelectedChange(true)}else{if(this.fireEvent("beforeselect",this,c,b)!==false){if(b&&b.ui){b.ui.onSelectedChange(false)}this.selNode=c;c.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,c,b)}}return c},unselect:function(b,a){if(this.selNode==b){this.clearSelections(a)}},clearSelections:function(a){var b=this.selNode;if(b){b.ui.onSelectedChange(false);this.selNode=null;if(a!==true){this.fireEvent("selectionchange",this,null)}}return b},getSelectedNode:function(){return this.selNode},isSelected:function(a){return this.selNode==a},selectPrevious:function(a){if(!(a=a||this.selNode||this.lastSelNode)){return null}var c=a.previousSibling;if(c){if(!c.isExpanded()||c.childNodes.length<1){return this.select(c,this.selectPrevious)}else{var b=c.lastChild;while(b&&b.isExpanded()&&Ext.fly(b.ui.wrap).isVisible()&&b.childNodes.length>0){b=b.lastChild}return this.select(b,this.selectPrevious)}}else{if(a.parentNode&&(this.tree.rootVisible||!a.parentNode.isRoot)){return this.select(a.parentNode,this.selectPrevious)}}return null},selectNext:function(b){if(!(b=b||this.selNode||this.lastSelNode)){return null}if(b.firstChild&&b.isExpanded()&&Ext.fly(b.ui.wrap).isVisible()){return this.select(b.firstChild,this.selectNext)}else{if(b.nextSibling){return this.select(b.nextSibling,this.selectNext)}else{if(b.parentNode){var a=null;b.parentNode.bubble(function(){if(this.nextSibling){a=this.getOwnerTree().selModel.select(this.nextSibling,this.selectNext);return false}});return a}}}return null},onKeyDown:function(c){var b=this.selNode||this.lastSelNode;var d=this;if(!b){return}var a=c.getKey();switch(a){case c.DOWN:c.stopEvent();this.selectNext();break;case c.UP:c.stopEvent();this.selectPrevious();break;case c.RIGHT:c.preventDefault();if(b.hasChildNodes()){if(!b.isExpanded()){b.expand()}else{if(b.firstChild){this.select(b.firstChild,c)}}}break;case c.LEFT:c.preventDefault();if(b.hasChildNodes()&&b.isExpanded()){b.collapse()}else{if(b.parentNode&&(this.tree.rootVisible||b.parentNode!=this.tree.getRootNode())){this.select(b.parentNode,c)}}break}}});Ext.tree.MultiSelectionModel=Ext.extend(Ext.util.Observable,{constructor:function(a){this.selNodes=[];this.selMap={};this.addEvents("selectionchange");Ext.apply(this,a);Ext.tree.MultiSelectionModel.superclass.constructor.call(this)},init:function(a){this.tree=a;a.mon(a.getTreeEl(),"keydown",this.onKeyDown,this);a.on("click",this.onNodeClick,this)},onNodeClick:function(a,b){if(b.ctrlKey&&this.isSelected(a)){this.unselect(a)}else{this.select(a,b,b.ctrlKey)}},select:function(a,c,b){if(b!==true){this.clearSelections(true)}if(this.isSelected(a)){this.lastSelNode=a;return a}this.selNodes.push(a);this.selMap[a.id]=a;this.lastSelNode=a;a.ui.onSelectedChange(true);this.fireEvent("selectionchange",this,this.selNodes);return a},unselect:function(b){if(this.selMap[b.id]){b.ui.onSelectedChange(false);var c=this.selNodes;var a=c.indexOf(b);if(a!=-1){this.selNodes.splice(a,1)}delete this.selMap[b.id];this.fireEvent("selectionchange",this,this.selNodes)}},clearSelections:function(b){var d=this.selNodes;if(d.length>0){for(var c=0,a=d.length;c0},isExpandable:function(){return this.attributes.expandable||this.hasChildNodes()},appendChild:function(e){var g=false;if(Ext.isArray(e)){g=e}else{if(arguments.length>1){g=arguments}}if(g){for(var d=0,a=g.length;d0){var g=d?function(){e.apply(d,arguments)}:e;c.sort(g);for(var b=0;b
    ','',this.indentMarkup,"",'','',g?('':"/>")):"",'',e.text,"
    ",'',""].join("");if(l!==true&&e.nextSibling&&(b=e.nextSibling.ui.getEl())){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",b,d)}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",j,d)}this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var i=this.elNode.childNodes;this.indentNode=i[0];this.ecNode=i[1];this.iconNode=i[2];var h=3;if(g){this.checkbox=i[3];this.checkbox.defaultChecked=this.checkbox.checked;h++}this.anchor=i[h];this.textNode=i[h].firstChild},getHref:function(a){return Ext.isEmpty(a)?(Ext.isGecko?"":"#"):a},getAnchor:function(){return this.anchor},getTextEl:function(){return this.textNode},getIconEl:function(){return this.iconNode},isChecked:function(){return this.checkbox?this.checkbox.checked:false},updateExpandIcon:function(){if(this.rendered){var g=this.node,d,c,a=g.isLast()?"x-tree-elbow-end":"x-tree-elbow",e=g.hasChildNodes();if(e||g.attributes.expandable){if(g.expanded){a+="-minus";d="x-tree-node-collapsed";c="x-tree-node-expanded"}else{a+="-plus";d="x-tree-node-expanded";c="x-tree-node-collapsed"}if(this.wasLeaf){this.removeClass("x-tree-node-leaf");this.wasLeaf=false}if(this.c1!=d||this.c2!=c){Ext.fly(this.elNode).replaceClass(d,c);this.c1=d;this.c2=c}}else{if(!this.wasLeaf){Ext.fly(this.elNode).replaceClass("x-tree-node-expanded","x-tree-node-collapsed");delete this.c1;delete this.c2;this.wasLeaf=true}}var b="x-tree-ec-icon "+a;if(this.ecc!=b){this.ecNode.className=b;this.ecc=b}}},onIdChange:function(a){if(this.rendered){this.elNode.setAttribute("ext:tree-node-id",a)}},getChildIndent:function(){if(!this.childIndent){var a=[],b=this.node;while(b){if(!b.isRoot||(b.isRoot&&b.ownerTree.rootVisible)){if(!b.isLast()){a.unshift('')}else{a.unshift('')}}b=b.parentNode}this.childIndent=a.join("")}return this.childIndent},renderIndent:function(){if(this.rendered){var a="",b=this.node.parentNode;if(b){a=b.ui.getChildIndent()}if(this.indentMarkup!=a){this.indentNode.innerHTML=a;this.indentMarkup=a}this.updateExpandIcon()}},destroy:function(){if(this.elNode){Ext.dd.Registry.unregister(this.elNode.id)}Ext.each(["textnode","anchor","checkbox","indentNode","ecNode","iconNode","elNode","ctNode","wrap","holder"],function(a){if(this[a]){Ext.fly(this[a]).remove();delete this[a]}},this);delete this.node}});Ext.tree.RootTreeNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{render:function(){if(!this.rendered){var a=this.node.ownerTree.innerCt.dom;this.node.expanded=true;a.innerHTML='
    ';this.wrap=this.ctNode=a.firstChild}},collapse:Ext.emptyFn,expand:Ext.emptyFn});Ext.tree.TreeLoader=function(a){this.baseParams={};Ext.apply(this,a);this.addEvents("beforeload","load","loadexception");Ext.tree.TreeLoader.superclass.constructor.call(this);if(Ext.isString(this.paramOrder)){this.paramOrder=this.paramOrder.split(/[\s,|]/)}};Ext.extend(Ext.tree.TreeLoader,Ext.util.Observable,{uiProviders:{},clearOnLoad:true,paramOrder:undefined,paramsAsHash:false,nodeParameter:"node",directFn:undefined,load:function(b,c,a){if(this.clearOnLoad){while(b.firstChild){b.removeChild(b.firstChild)}}if(this.doPreload(b)){this.runCallback(c,a||b,[b])}else{if(this.directFn||this.dataUrl||this.url){this.requestData(b,c,a||b)}}},doPreload:function(d){if(d.attributes.children){if(d.childNodes.length<1){var c=d.attributes.children;d.beginUpdate();for(var b=0,a=c.length;b-1){c=[]}for(var d=0,a=b.length;dp){return e?-1:1}}return 0}},doSort:function(a){a.sort(this.sortFn)},updateSort:function(a,b){if(b.childrenRendered){this.doSort.defer(1,this,[b])}},updateSortParent:function(a){var b=a.parentNode;if(b&&b.childrenRendered){this.doSort.defer(1,this,[b])}}});if(Ext.dd.DropZone){Ext.tree.TreeDropZone=function(a,b){this.allowParentInsert=b.allowParentInsert||false;this.allowContainerDrop=b.allowContainerDrop||false;this.appendOnly=b.appendOnly||false;Ext.tree.TreeDropZone.superclass.constructor.call(this,a.getTreeEl(),b);this.tree=a;this.dragOverData={};this.lastInsertClass="x-tree-no-status"};Ext.extend(Ext.tree.TreeDropZone,Ext.dd.DropZone,{ddGroup:"TreeDD",expandDelay:1000,expandNode:function(a){if(a.hasChildNodes()&&!a.isExpanded()){a.expand(false,null,this.triggerCacheRefresh.createDelegate(this))}},queueExpand:function(a){this.expandProcId=this.expandNode.defer(this.expandDelay,this,[a])},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);this.expandProcId=false}},isValidDropPoint:function(a,k,i,d,c){if(!a||!c){return false}var g=a.node;var h=c.node;if(!(g&&g.isTarget&&k)){return false}if(k=="append"&&g.allowChildren===false){return false}if((k=="above"||k=="below")&&(g.parentNode&&g.parentNode.allowChildren===false)){return false}if(h&&(g==h||h.contains(g))){return false}var b=this.dragOverData;b.tree=this.tree;b.target=g;b.data=c;b.point=k;b.source=i;b.rawEvent=d;b.dropNode=h;b.cancel=false;var j=this.tree.fireEvent("nodedragover",b);return b.cancel===false&&j!==false},getDropPoint:function(h,g,l){var m=g.node;if(m.isRoot){return m.allowChildren!==false?"append":false}var c=g.ddel;var o=Ext.lib.Dom.getY(c),j=o+c.offsetHeight;var i=Ext.lib.Event.getPageY(h);var k=m.allowChildren===false||m.isLeaf();if(this.appendOnly||m.parentNode.allowChildren===false){return k?false:"append"}var d=false;if(!this.allowParentInsert){d=m.hasChildNodes()&&m.isExpanded()}var a=(j-o)/(k?2:3);if(i>=o&&i<(o+a)){return"above"}else{if(!d&&(k||i>=j-a&&i<=j)){return"below"}else{return"append"}}},onNodeEnter:function(d,a,c,b){this.cancelExpand()},onContainerOver:function(a,c,b){if(this.allowContainerDrop&&this.isValidDropPoint({ddel:this.tree.getRootNode().ui.elNode,node:this.tree.getRootNode()},"append",a,c,b)){return this.dropAllowed}return this.dropNotAllowed},onNodeOver:function(b,i,h,g){var k=this.getDropPoint(h,b,i);var c=b.node;if(!this.expandProcId&&k=="append"&&c.hasChildNodes()&&!b.node.isExpanded()){this.queueExpand(c)}else{if(k!="append"){this.cancelExpand()}}var d=this.dropNotAllowed;if(this.isValidDropPoint(b,k,i,h,g)){if(k){var a=b.ddel;var j;if(k=="above"){d=b.node.isFirst()?"x-tree-drop-ok-above":"x-tree-drop-ok-between";j="x-tree-drag-insert-above"}else{if(k=="below"){d=b.node.isLast()?"x-tree-drop-ok-below":"x-tree-drop-ok-between";j="x-tree-drag-insert-below"}else{d="x-tree-drop-ok-append";j="x-tree-drag-append"}}if(this.lastInsertClass!=j){Ext.fly(a).replaceClass(this.lastInsertClass,j);this.lastInsertClass=j}}}return d},onNodeOut:function(d,a,c,b){this.cancelExpand();this.removeDropIndicators(d)},onNodeDrop:function(i,b,h,d){var a=this.getDropPoint(h,i,b);var g=i.node;g.ui.startDrop();if(!this.isValidDropPoint(i,a,b,h,d)){g.ui.endDrop();return false}var c=d.node||(b.getTreeNode?b.getTreeNode(d,g,a,h):null);return this.processDrop(g,d,a,b,h,c)},onContainerDrop:function(a,g,c){if(this.allowContainerDrop&&this.isValidDropPoint({ddel:this.tree.getRootNode().ui.elNode,node:this.tree.getRootNode()},"append",a,g,c)){var d=this.tree.getRootNode();d.ui.startDrop();var b=c.node||(a.getTreeNode?a.getTreeNode(c,d,"append",g):null);return this.processDrop(d,c,"append",a,g,b)}return false},processDrop:function(j,h,b,a,i,d){var g={tree:this.tree,target:j,data:h,point:b,source:a,rawEvent:i,dropNode:d,cancel:!d,dropStatus:false};var c=this.tree.fireEvent("beforenodedrop",g);if(c===false||g.cancel===true||!g.dropNode){j.ui.endDrop();return g.dropStatus}j=g.target;if(b=="append"&&!j.isExpanded()){j.expand(false,null,function(){this.completeDrop(g)}.createDelegate(this))}else{this.completeDrop(g)}return true},completeDrop:function(h){var d=h.dropNode,e=h.point,c=h.target;if(!Ext.isArray(d)){d=[d]}var g;for(var b=0,a=d.length;bd.offsetLeft){e.scrollLeft=d.offsetLeft}var a=Math.min(this.maxWidth,(e.clientWidth>20?e.clientWidth:e.offsetWidth)-Math.max(0,d.offsetLeft-e.scrollLeft)-5);this.setSize(a,"")},triggerEdit:function(a,c){this.completeEdit();if(a.attributes.editable!==false){this.editNode=a;if(this.tree.autoScroll){Ext.fly(a.ui.getEl()).scrollIntoView(this.tree.body)}var b=a.text||"";if(!Ext.isGecko&&Ext.isEmpty(a.text)){a.setText(" ")}this.autoEditTimer=this.startEdit.defer(this.editDelay,this,[a.ui.textNode,b]);return false}},bindScroll:function(){this.tree.getTreeEl().on("scroll",this.cancelEdit,this)},beforeNodeClick:function(a,b){clearTimeout(this.autoEditTimer);if(this.tree.getSelectionModel().isSelected(a)){b.stopEvent();return this.triggerEdit(a)}},onNodeDblClick:function(a,b){clearTimeout(this.autoEditTimer)},updateNode:function(a,b){this.tree.getTreeEl().un("scroll",this.cancelEdit,this);this.editNode.setText(b)},onHide:function(){Ext.tree.TreeEditor.superclass.onHide.call(this);if(this.editNode){this.editNode.ui.focus.defer(50,this.editNode.ui)}},onSpecialKey:function(c,b){var a=b.getKey();if(a==b.ESC){b.stopEvent();this.cancelEdit()}else{if(a==b.ENTER&&!b.hasModifier()){b.stopEvent();this.completeEdit()}}},onDestroy:function(){clearTimeout(this.autoEditTimer);Ext.tree.TreeEditor.superclass.onDestroy.call(this);var a=this.tree;a.un("beforeclick",this.beforeNodeClick,this);a.un("dblclick",this.onNodeDblClick,this)}}); /* SWFObject v2.2 is released under the MIT License */ var swfobject=function(){var E="undefined",s="object",T="Shockwave Flash",X="ShockwaveFlash.ShockwaveFlash",r="application/x-shockwave-flash",S="SWFObjectExprInst",y="onreadystatechange",P=window,k=document,u=navigator,U=false,V=[i],p=[],O=[],J=[],m,R,F,C,K=false,a=false,o,H,n=true,N=function(){var ab=typeof k.getElementById!=E&&typeof k.getElementsByTagName!=E&&typeof k.createElement!=E,ai=u.userAgent.toLowerCase(),Z=u.platform.toLowerCase(),af=Z?(/win/).test(Z):/win/.test(ai),ad=Z?(/mac/).test(Z):/mac/.test(ai),ag=/webkit/.test(ai)?parseFloat(ai.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,Y=!+"\v1",ah=[0,0,0],ac=null;if(typeof u.plugins!=E&&typeof u.plugins[T]==s){ac=u.plugins[T].description;if(ac&&!(typeof u.mimeTypes!=E&&u.mimeTypes[r]&&!u.mimeTypes[r].enabledPlugin)){U=true;Y=false;ac=ac.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ah[0]=parseInt(ac.replace(/^(.*)\..*$/,"$1"),10);ah[1]=parseInt(ac.replace(/^.*\.(.*)\s.*$/,"$1"),10);ah[2]=/[a-zA-Z]/.test(ac)?parseInt(ac.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof P.ActiveXObject!=E){try{var ae=new ActiveXObject(X);if(ae){ac=ae.GetVariable("$version");if(ac){Y=true;ac=ac.split(" ")[1].split(",");ah=[parseInt(ac[0],10),parseInt(ac[1],10),parseInt(ac[2],10)]}}}catch(aa){}}}return{w3:ab,pv:ah,wk:ag,ie:Y,win:af,mac:ad}}(),l=function(){if(!N.w3){return}if((typeof k.readyState!=E&&k.readyState=="complete")||(typeof k.readyState==E&&(k.getElementsByTagName("body")[0]||k.body))){g()}if(!K){if(typeof k.addEventListener!=E){k.addEventListener("DOMContentLoaded",g,false)}if(N.ie&&N.win){k.attachEvent(y,function(){if(k.readyState=="complete"){k.detachEvent(y,arguments.callee);g()}});if(P==top){(function(){if(K){return}try{k.documentElement.doScroll("left")}catch(Y){setTimeout(arguments.callee,0);return}g()})()}}if(N.wk){(function(){if(K){return}if(!(/loaded|complete/).test(k.readyState)){setTimeout(arguments.callee,0);return}g()})()}t(g)}}();function g(){if(K){return}try{var aa=k.getElementsByTagName("body")[0].appendChild(D("span"));aa.parentNode.removeChild(aa)}catch(ab){return}K=true;var Y=V.length;for(var Z=0;Z0){for(var ag=0;ag0){var af=c(Z);if(af){if(G(p[ag].swfVersion)&&!(N.wk&&N.wk<312)){x(Z,true);if(ac){ab.success=true;ab.ref=A(Z);ac(ab)}}else{if(p[ag].expressInstall&&B()){var aj={};aj.data=p[ag].expressInstall;aj.width=af.getAttribute("width")||"0";aj.height=af.getAttribute("height")||"0";if(af.getAttribute("class")){aj.styleclass=af.getAttribute("class")}if(af.getAttribute("align")){aj.align=af.getAttribute("align")}var ai={};var Y=af.getElementsByTagName("param");var ad=Y.length;for(var ae=0;ae'}}ab.outerHTML='"+ag+"";O[O.length]=aj.id;Y=c(aj.id)}else{var aa=D(s);aa.setAttribute("type",r);for(var ad in aj){if(aj[ad]!=Object.prototype[ad]){if(ad.toLowerCase()=="styleclass"){aa.setAttribute("class",aj[ad])}else{if(ad.toLowerCase()!="classid"){aa.setAttribute(ad,aj[ad])}}}}for(var ac in ah){if(ah[ac]!=Object.prototype[ac]&&ac.toLowerCase()!="movie"){e(aa,ac,ah[ac])}}ab.parentNode.replaceChild(aa,ab);Y=aa}}return Y}function e(aa,Y,Z){var ab=D("param");ab.setAttribute("name",Y);ab.setAttribute("value",Z);aa.appendChild(ab)}function z(Z){var Y=c(Z);if(Y&&Y.nodeName=="OBJECT"){if(N.ie&&N.win){Y.style.display="none";(function(){if(Y.readyState==4){b(Z)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.removeChild(Y)}}}function b(aa){var Z=c(aa);if(Z){for(var Y in Z){if(typeof Z[Y]=="function"){Z[Y]=null}}Z.parentNode.removeChild(Z)}}function c(aa){var Y=null;try{Y=k.getElementById(aa)}catch(Z){}return Y}function D(Y){return k.createElement(Y)}function j(aa,Y,Z){aa.attachEvent(Y,Z);J[J.length]=[aa,Y,Z]}function G(aa){var Z=N.pv,Y=aa.split(".");Y[0]=parseInt(Y[0],10);Y[1]=parseInt(Y[1],10)||0;Y[2]=parseInt(Y[2],10)||0;return(Z[0]>Y[0]||(Z[0]==Y[0]&&Z[1]>Y[1])||(Z[0]==Y[0]&&Z[1]==Y[1]&&Z[2]>=Y[2]))?true:false}function w(ad,Z,ae,ac){if(N.ie&&N.mac){return}var ab=k.getElementsByTagName("head")[0];if(!ab){return}var Y=(ae&&typeof ae=="string")?ae:"screen";if(ac){o=null;H=null}if(!o||H!=Y){var aa=D("style");aa.setAttribute("type","text/css");aa.setAttribute("media",Y);o=ab.appendChild(aa);if(N.ie&&N.win&&typeof k.styleSheets!=E&&k.styleSheets.length>0){o=k.styleSheets[k.styleSheets.length-1]}H=Y}if(N.ie&&N.win){if(o&&typeof o.addRule==s){o.addRule(ad,Z)}}else{if(o&&typeof k.createTextNode!=E){o.appendChild(k.createTextNode(ad+" {"+Z+"}"))}}}function x(aa,Y){if(!n){return}var Z=Y?"visible":"hidden";if(K&&c(aa)){c(aa).style.visibility=Z}else{w("#"+aa,"visibility:"+Z)}}function M(Z){var aa=/[\\\"<>\.;]/;var Y=aa.exec(Z)!=null;return Y&&typeof encodeURIComponent!=E?encodeURIComponent(Z):Z}var d=function(){if(N.ie&&N.win){window.attachEvent("onunload",function(){var ad=J.length;for(var ac=0;ac0){for(h=0;h-1&&e.position=="left"){e.position="bottom"}return e},onDestroy:function(){Ext.chart.CartesianChart.superclass.onDestroy.call(this);Ext.each(this.labelFn,function(a){this.removeFnProxy(a)},this)}});Ext.reg("cartesianchart",Ext.chart.CartesianChart);Ext.chart.LineChart=Ext.extend(Ext.chart.CartesianChart,{type:"line"});Ext.reg("linechart",Ext.chart.LineChart);Ext.chart.ColumnChart=Ext.extend(Ext.chart.CartesianChart,{type:"column"});Ext.reg("columnchart",Ext.chart.ColumnChart);Ext.chart.StackedColumnChart=Ext.extend(Ext.chart.CartesianChart,{type:"stackcolumn"});Ext.reg("stackedcolumnchart",Ext.chart.StackedColumnChart);Ext.chart.BarChart=Ext.extend(Ext.chart.CartesianChart,{type:"bar"});Ext.reg("barchart",Ext.chart.BarChart);Ext.chart.StackedBarChart=Ext.extend(Ext.chart.CartesianChart,{type:"stackbar"});Ext.reg("stackedbarchart",Ext.chart.StackedBarChart);Ext.chart.Axis=function(a){Ext.apply(this,a)};Ext.chart.Axis.prototype={type:null,orientation:"horizontal",reverse:false,labelFunction:null,hideOverlappingLabels:true,labelSpacing:2};Ext.chart.NumericAxis=Ext.extend(Ext.chart.Axis,{type:"numeric",minimum:NaN,maximum:NaN,majorUnit:NaN,minorUnit:NaN,snapToUnits:true,alwaysShowZero:true,scale:"linear",roundMajorUnit:true,calculateByLabelSize:true,position:"left",adjustMaximumByMajorUnit:true,adjustMinimumByMajorUnit:true});Ext.chart.TimeAxis=Ext.extend(Ext.chart.Axis,{type:"time",minimum:null,maximum:null,majorUnit:NaN,majorTimeUnit:null,minorUnit:NaN,minorTimeUnit:null,snapToUnits:true,stackingEnabled:false,calculateByLabelSize:true});Ext.chart.CategoryAxis=Ext.extend(Ext.chart.Axis,{type:"category",categoryNames:null,calculateCategoryCount:false});Ext.chart.Series=function(a){Ext.apply(this,a)};Ext.chart.Series.prototype={type:null,displayName:null};Ext.chart.CartesianSeries=Ext.extend(Ext.chart.Series,{xField:null,yField:null,showInLegend:true,axis:"primary"});Ext.chart.ColumnSeries=Ext.extend(Ext.chart.CartesianSeries,{type:"column"});Ext.chart.LineSeries=Ext.extend(Ext.chart.CartesianSeries,{type:"line"});Ext.chart.BarSeries=Ext.extend(Ext.chart.CartesianSeries,{type:"bar"});Ext.chart.PieSeries=Ext.extend(Ext.chart.Series,{type:"pie",dataField:null,categoryField:null});Ext.menu.Menu=Ext.extend(Ext.Container,{minWidth:120,shadow:"sides",subMenuAlign:"tl-tr?",defaultAlign:"tl-bl?",allowOtherMenus:false,ignoreParentClicks:false,enableScrolling:true,maxHeight:null,scrollIncrement:24,showSeparator:true,defaultOffsets:[0,0],plain:false,floating:true,zIndex:15000,hidden:true,layout:"menu",hideMode:"offsets",scrollerHeight:8,autoLayout:true,defaultType:"menuitem",bufferResize:false,initComponent:function(){if(Ext.isArray(this.initialConfig)){Ext.apply(this,{items:this.initialConfig})}this.addEvents("click","mouseover","mouseout","itemclick");Ext.menu.MenuMgr.register(this);if(this.floating){Ext.EventManager.onWindowResize(this.hide,this)}else{if(this.initialConfig.hidden!==false){this.hidden=false}this.internalDefaults={hideOnClick:false}}Ext.menu.Menu.superclass.initComponent.call(this);if(this.autoLayout){var a=this.doLayout.createDelegate(this,[]);this.on({add:a,remove:a})}},getLayoutTarget:function(){return this.ul},onRender:function(b,a){if(!b){b=Ext.getBody()}var c={id:this.getId(),cls:"x-menu "+((this.floating)?"x-menu-floating x-layer ":"")+(this.cls||"")+(this.plain?" x-menu-plain":"")+(this.showSeparator?"":" x-menu-nosep"),style:this.style,cn:[{tag:"a",cls:"x-menu-focus",href:"#",onclick:"return false;",tabIndex:"-1"},{tag:"ul",cls:"x-menu-list"}]};if(this.floating){this.el=new Ext.Layer({shadow:this.shadow,dh:c,constrain:false,parentEl:b,zindex:this.zIndex})}else{this.el=b.createChild(c)}Ext.menu.Menu.superclass.onRender.call(this,b,a);if(!this.keyNav){this.keyNav=new Ext.menu.MenuNav(this)}this.focusEl=this.el.child("a.x-menu-focus");this.ul=this.el.child("ul.x-menu-list");this.mon(this.ul,{scope:this,click:this.onClick,mouseover:this.onMouseOver,mouseout:this.onMouseOut});if(this.enableScrolling){this.mon(this.el,{scope:this,delegate:".x-menu-scroller",click:this.onScroll,mouseover:this.deactivateActive})}},findTargetItem:function(b){var a=b.getTarget(".x-menu-list-item",this.ul,true);if(a&&a.menuItemId){return this.items.get(a.menuItemId)}},onClick:function(b){var a=this.findTargetItem(b);if(a){if(a.isFormField){this.setActiveItem(a)}else{if(a instanceof Ext.menu.BaseItem){if(a.menu&&this.ignoreParentClicks){a.expandMenu();b.preventDefault()}else{if(a.onClick){a.onClick(b);this.fireEvent("click",this,a,b)}}}}}},setActiveItem:function(a,b){if(a!=this.activeItem){this.deactivateActive();if((this.activeItem=a).isFormField){a.focus()}else{a.activate(b)}}else{if(b){a.expandMenu()}}},deactivateActive:function(){var b=this.activeItem;if(b){if(b.isFormField){if(b.collapse){b.collapse()}}else{b.deactivate()}delete this.activeItem}},tryActivate:function(g,e){var b=this.items;for(var c=g,a=b.length;c>=0&&c=a.scrollHeight){this.onScrollerOut(null,b)}},onScrollerIn:function(d,b){var a=this.ul.dom,c=Ext.fly(b).is(".x-menu-scroller-top");if(c?a.scrollTop>0:a.scrollTop+this.activeMaxc){b=c;a=i-h}else{if(bb&&b>0){this.activeMax=b-this.scrollerHeight*2-this.el.getFrameWidth("tb")-Ext.num(this.el.shadowOffset,0);this.ul.setHeight(this.activeMax);this.createScrollers();this.el.select(".x-menu-scroller").setDisplayed("")}else{this.ul.setHeight(d);this.el.select(".x-menu-scroller").setDisplayed("none")}this.ul.dom.scrollTop=0;return a},createScrollers:function(){if(!this.scroller){this.scroller={pos:0,top:this.el.insertFirst({tag:"div",cls:"x-menu-scroller x-menu-scroller-top",html:" "}),bottom:this.el.createChild({tag:"div",cls:"x-menu-scroller x-menu-scroller-bottom",html:" "})};this.scroller.top.hover(this.onScrollerIn,this.onScrollerOut,this);this.scroller.topRepeater=new Ext.util.ClickRepeater(this.scroller.top,{listeners:{click:this.onScroll.createDelegate(this,[null,this.scroller.top],false)}});this.scroller.bottom.hover(this.onScrollerIn,this.onScrollerOut,this);this.scroller.bottomRepeater=new Ext.util.ClickRepeater(this.scroller.bottom,{listeners:{click:this.onScroll.createDelegate(this,[null,this.scroller.bottom],false)}})}},onLayout:function(){if(this.isVisible()){if(this.enableScrolling){this.constrainScroll(this.el.getTop())}if(this.floating){this.el.sync()}}},focus:function(){if(!this.hidden){this.doFocus.defer(50,this)}},doFocus:function(){if(!this.hidden){this.focusEl.focus()}},hide:function(a){if(!this.isDestroyed){this.deepHide=a;Ext.menu.Menu.superclass.hide.call(this);delete this.deepHide}},onHide:function(){Ext.menu.Menu.superclass.onHide.call(this);this.deactivateActive();if(this.el&&this.floating){this.el.hide()}var a=this.parentMenu;if(this.deepHide===true&&a){if(a.floating){a.hide(true)}else{a.deactivateActive()}}},lookupComponent:function(a){if(Ext.isString(a)){a=(a=="separator"||a=="-")?new Ext.menu.Separator():new Ext.menu.TextItem(a);this.applyDefaults(a)}else{if(Ext.isObject(a)){a=this.getMenuItem(a)}else{if(a.tagName||a.el){a=new Ext.BoxComponent({el:a})}}}return a},applyDefaults:function(b){if(!Ext.isString(b)){b=Ext.menu.Menu.superclass.applyDefaults.call(this,b);var a=this.internalDefaults;if(a){if(b.events){Ext.applyIf(b.initialConfig,a);Ext.apply(b,a)}else{Ext.applyIf(b,a)}}}return b},getMenuItem:function(a){a.ownerCt=this;if(!a.isXType){if(!a.xtype&&Ext.isBoolean(a.checked)){return new Ext.menu.CheckItem(a)}return Ext.create(a,this.defaultType)}return a},addSeparator:function(){return this.add(new Ext.menu.Separator())},addElement:function(a){return this.add(new Ext.menu.BaseItem({el:a}))},addItem:function(a){return this.add(a)},addMenuItem:function(a){return this.add(this.getMenuItem(a))},addText:function(a){return this.add(new Ext.menu.TextItem(a))},onDestroy:function(){Ext.EventManager.removeResizeListener(this.hide,this);var a=this.parentMenu;if(a&&a.activeChild==this){delete a.activeChild}delete this.parentMenu;Ext.menu.Menu.superclass.onDestroy.call(this);Ext.menu.MenuMgr.unregister(this);if(this.keyNav){this.keyNav.disable()}var b=this.scroller;if(b){Ext.destroy(b.topRepeater,b.bottomRepeater,b.top,b.bottom)}Ext.destroy(this.el,this.focusEl,this.ul)}});Ext.reg("menu",Ext.menu.Menu);Ext.menu.MenuNav=Ext.extend(Ext.KeyNav,function(){function a(d,c){if(!c.tryActivate(c.items.indexOf(c.activeItem)-1,-1)){c.tryActivate(c.items.length-1,-1)}}function b(d,c){if(!c.tryActivate(c.items.indexOf(c.activeItem)+1,1)){c.tryActivate(0,1)}}return{constructor:function(c){Ext.menu.MenuNav.superclass.constructor.call(this,c.el);this.scope=this.menu=c},doRelay:function(g,d){var c=g.getKey();if(this.menu.activeItem&&this.menu.activeItem.isFormField&&c!=g.TAB){return false}if(!this.menu.activeItem&&g.isNavKeyPress()&&c!=g.SPACE&&c!=g.RETURN){this.menu.tryActivate(0,1);return false}return d.call(this.scope||this,g,this.menu)},tab:function(d,c){d.stopEvent();if(d.shiftKey){a(d,c)}else{b(d,c)}},up:a,down:b,right:function(d,c){if(c.activeItem){c.activeItem.expandMenu(true)}},left:function(d,c){c.hide();if(c.parentMenu&&c.parentMenu.activeItem){c.parentMenu.activeItem.activate()}},enter:function(d,c){if(c.activeItem){d.stopPropagation();c.activeItem.onClick(d);c.fireEvent("click",this,c.activeItem);return true}}}}());Ext.menu.MenuMgr=function(){var h,e,b,d={},a=false,l=new Date();function n(){h={};e=new Ext.util.MixedCollection();b=Ext.getDoc().addKeyListener(27,j);b.disable()}function j(){if(e&&e.length>0){var o=e.clone();o.each(function(p){p.hide()});return true}return false}function g(o){e.remove(o);if(e.length<1){b.disable();Ext.getDoc().un("mousedown",m);a=false}}function k(o){var p=e.last();l=new Date();e.add(o);if(!a){b.enable();Ext.getDoc().on("mousedown",m);a=true}if(o.parentMenu){o.getEl().setZIndex(parseInt(o.parentMenu.getEl().getStyle("z-index"),10)+3);o.parentMenu.activeChild=o}else{if(p&&!p.isDestroyed&&p.isVisible()){o.getEl().setZIndex(parseInt(p.getEl().getStyle("z-index"),10)+3)}}}function c(o){if(o.activeChild){o.activeChild.hide()}if(o.autoHideTimer){clearTimeout(o.autoHideTimer);delete o.autoHideTimer}}function i(o){var p=o.parentMenu;if(!p&&!o.allowOtherMenus){j()}else{if(p&&p.activeChild){p.activeChild.hide()}}}function m(o){if(l.getElapsed()>50&&e.length>0&&!o.getTarget(".x-menu")){j()}}return{hideAll:function(){return j()},register:function(o){if(!h){n()}h[o.id]=o;o.on({beforehide:c,hide:g,beforeshow:i,show:k})},get:function(o){if(typeof o=="string"){if(!h){return null}return h[o]}else{if(o.events){return o}else{if(typeof o.length=="number"){return new Ext.menu.Menu({items:o})}else{return Ext.create(o,"menu")}}}},unregister:function(o){delete h[o.id];o.un("beforehide",c);o.un("hide",g);o.un("beforeshow",i);o.un("show",k)},registerCheckable:function(o){var p=o.group;if(p){if(!d[p]){d[p]=[]}d[p].push(o)}},unregisterCheckable:function(o){var p=o.group;if(p){d[p].remove(o)}},onCheckChange:function(q,r){if(q.group&&r){var t=d[q.group],p=0,o=t.length,s;for(;p',' target="{hrefTarget}"',"",">",'{altText}','{text}',"")}var c=this.getTemplateArgs();this.el=b?this.itemTpl.insertBefore(b,c,true):this.itemTpl.append(d,c,true);this.iconEl=this.el.child("img.x-menu-item-icon");this.textEl=this.el.child(".x-menu-item-text");if(!this.href){this.mon(this.el,"click",Ext.emptyFn,null,{preventDefault:true})}Ext.menu.Item.superclass.onRender.call(this,d,b)},getTemplateArgs:function(){return{id:this.id,cls:this.itemCls+(this.menu?" x-menu-item-arrow":"")+(this.cls?" "+this.cls:""),href:this.href||"#",hrefTarget:this.hrefTarget,icon:this.icon||Ext.BLANK_IMAGE_URL,iconCls:this.iconCls||"",text:this.itemText||this.text||" ",altText:this.altText||""}},setText:function(a){this.text=a||" ";if(this.rendered){this.textEl.update(this.text);this.parentMenu.layout.doAutoSize()}},setIconClass:function(a){var b=this.iconCls;this.iconCls=a;if(this.rendered){this.iconEl.replaceClass(b,this.iconCls)}},beforeDestroy:function(){clearTimeout(this.showTimer);clearTimeout(this.hideTimer);if(this.menu){delete this.menu.ownerCt;this.menu.destroy()}Ext.menu.Item.superclass.beforeDestroy.call(this)},handleClick:function(a){if(!this.href){a.stopEvent()}Ext.menu.Item.superclass.handleClick.apply(this,arguments)},activate:function(a){if(Ext.menu.Item.superclass.activate.apply(this,arguments)){this.focus();if(a){this.expandMenu()}}return true},shouldDeactivate:function(a){if(Ext.menu.Item.superclass.shouldDeactivate.call(this,a)){if(this.menu&&this.menu.isVisible()){return !this.menu.getEl().getRegion().contains(a.getPoint())}return true}return false},deactivate:function(){Ext.menu.Item.superclass.deactivate.apply(this,arguments);this.hideMenu()},expandMenu:function(a){if(!this.disabled&&this.menu){clearTimeout(this.hideTimer);delete this.hideTimer;if(!this.menu.isVisible()&&!this.showTimer){this.showTimer=this.deferExpand.defer(this.showDelay,this,[a])}else{if(this.menu.isVisible()&&a){this.menu.tryActivate(0,1)}}}},deferExpand:function(a){delete this.showTimer;this.menu.show(this.container,this.parentMenu.subMenuAlign||"tl-tr?",this.parentMenu);if(a){this.menu.tryActivate(0,1)}},hideMenu:function(){clearTimeout(this.showTimer);delete this.showTimer;if(!this.hideTimer&&this.menu&&this.menu.isVisible()){this.hideTimer=this.deferHide.defer(this.hideDelay,this)}},deferHide:function(){delete this.hideTimer;if(this.menu.over){this.parentMenu.setActiveItem(this,false)}else{this.menu.hide()}}});Ext.reg("menuitem",Ext.menu.Item);Ext.menu.CheckItem=Ext.extend(Ext.menu.Item,{itemCls:"x-menu-item x-menu-check-item",groupClass:"x-menu-group-item",checked:false,ctype:"Ext.menu.CheckItem",initComponent:function(){Ext.menu.CheckItem.superclass.initComponent.call(this);this.addEvents("beforecheckchange","checkchange");if(this.checkHandler){this.on("checkchange",this.checkHandler,this.scope)}Ext.menu.MenuMgr.registerCheckable(this)},onRender:function(a){Ext.menu.CheckItem.superclass.onRender.apply(this,arguments);if(this.group){this.el.addClass(this.groupClass)}if(this.checked){this.checked=false;this.setChecked(true,true)}},destroy:function(){Ext.menu.MenuMgr.unregisterCheckable(this);Ext.menu.CheckItem.superclass.destroy.apply(this,arguments)},setChecked:function(b,a){var c=a===true;if(this.checked!=b&&(c||this.fireEvent("beforecheckchange",this,b)!==false)){Ext.menu.MenuMgr.onCheckChange(this,b);if(this.container){this.container[b?"addClass":"removeClass"]("x-menu-item-checked")}this.checked=b;if(!c){this.fireEvent("checkchange",this,b)}}},handleClick:function(a){if(!this.disabled&&!(this.checked&&this.group)){this.setChecked(!this.checked)}Ext.menu.CheckItem.superclass.handleClick.apply(this,arguments)}});Ext.reg("menucheckitem",Ext.menu.CheckItem);Ext.menu.DateMenu=Ext.extend(Ext.menu.Menu,{enableScrolling:false,hideOnClick:true,pickerId:null,cls:"x-date-menu",initComponent:function(){this.on("beforeshow",this.onBeforeShow,this);if(this.strict=(Ext.isIE7&&Ext.isStrict)){this.on("show",this.onShow,this,{single:true,delay:20})}Ext.apply(this,{plain:true,showSeparator:false,items:this.picker=new Ext.DatePicker(Ext.applyIf({internalRender:this.strict||!Ext.isIE,ctCls:"x-menu-date-item",id:this.pickerId},this.initialConfig))});this.picker.purgeListeners();Ext.menu.DateMenu.superclass.initComponent.call(this);this.relayEvents(this.picker,["select"]);this.on("show",this.picker.focus,this.picker);this.on("select",this.menuHide,this);if(this.handler){this.on("select",this.handler,this.scope||this)}},menuHide:function(){if(this.hideOnClick){this.hide(true)}},onBeforeShow:function(){if(this.picker){this.picker.hideMonthPicker(true)}},onShow:function(){var a=this.picker.getEl();a.setWidth(a.getWidth())}});Ext.reg("datemenu",Ext.menu.DateMenu);Ext.menu.ColorMenu=Ext.extend(Ext.menu.Menu,{enableScrolling:false,hideOnClick:true,cls:"x-color-menu",paletteId:null,initComponent:function(){Ext.apply(this,{plain:true,showSeparator:false,items:this.palette=new Ext.ColorPalette(Ext.applyIf({id:this.paletteId},this.initialConfig))});this.palette.purgeListeners();Ext.menu.ColorMenu.superclass.initComponent.call(this);this.relayEvents(this.palette,["select"]);this.on("select",this.menuHide,this);if(this.handler){this.on("select",this.handler,this.scope||this)}},menuHide:function(){if(this.hideOnClick){this.hide(true)}}});Ext.reg("colormenu",Ext.menu.ColorMenu);Ext.form.Field=Ext.extend(Ext.BoxComponent,{invalidClass:"x-form-invalid",invalidText:"The value in this field is invalid",focusClass:"x-form-focus",validationEvent:"keyup",validateOnBlur:true,validationDelay:250,defaultAutoCreate:{tag:"input",type:"text",size:"20",autocomplete:"off"},fieldClass:"x-form-field",msgTarget:"qtip",msgFx:"normal",readOnly:false,disabled:false,submitValue:true,isFormField:true,msgDisplay:"",hasFocus:false,initComponent:function(){Ext.form.Field.superclass.initComponent.call(this);this.addEvents("focus","blur","specialkey","change","invalid","valid")},getName:function(){return this.rendered&&this.el.dom.name?this.el.dom.name:this.name||this.id||""},onRender:function(c,a){if(!this.el){var b=this.getAutoCreate();if(!b.name){b.name=this.name||this.id}if(this.inputType){b.type=this.inputType}this.autoEl=b}Ext.form.Field.superclass.onRender.call(this,c,a);if(this.submitValue===false){this.el.dom.removeAttribute("name")}var d=this.el.dom.type;if(d){if(d=="password"){d="text"}this.el.addClass("x-form-"+d)}if(this.readOnly){this.setReadOnly(true)}if(this.tabIndex!==undefined){this.el.dom.setAttribute("tabIndex",this.tabIndex)}this.el.addClass([this.fieldClass,this.cls])},getItemCt:function(){return this.itemCt},initValue:function(){if(this.value!==undefined){this.setValue(this.value)}else{if(!Ext.isEmpty(this.el.dom.value)&&this.el.dom.value!=this.emptyText){this.setValue(this.el.dom.value)}}this.originalValue=this.getValue()},isDirty:function(){if(this.disabled||!this.rendered){return false}return String(this.getValue())!==String(this.originalValue)},setReadOnly:function(a){if(this.rendered){this.el.dom.readOnly=a}this.readOnly=a},afterRender:function(){Ext.form.Field.superclass.afterRender.call(this);this.initEvents();this.initValue()},fireKey:function(a){if(a.isSpecialKey()){this.fireEvent("specialkey",this,a)}},reset:function(){this.setValue(this.originalValue);this.clearInvalid()},initEvents:function(){this.mon(this.el,Ext.EventManager.getKeyEvent(),this.fireKey,this);this.mon(this.el,"focus",this.onFocus,this);this.mon(this.el,"blur",this.onBlur,this,this.inEditor?{buffer:10}:null)},preFocus:Ext.emptyFn,onFocus:function(){this.preFocus();if(this.focusClass){this.el.addClass(this.focusClass)}if(!this.hasFocus){this.hasFocus=true;this.startValue=this.getValue();this.fireEvent("focus",this)}},beforeBlur:Ext.emptyFn,onBlur:function(){this.beforeBlur();if(this.focusClass){this.el.removeClass(this.focusClass)}this.hasFocus=false;if(this.validationEvent!==false&&(this.validateOnBlur||this.validationEvent=="blur")){this.validate()}var a=this.getValue();if(String(a)!==String(this.startValue)){this.fireEvent("change",this,a,this.startValue)}this.fireEvent("blur",this);this.postBlur()},postBlur:Ext.emptyFn,isValid:function(a){if(this.disabled){return true}var c=this.preventMark;this.preventMark=a===true;var b=this.validateValue(this.processValue(this.getRawValue()),a);this.preventMark=c;return b},validate:function(){if(this.disabled||this.validateValue(this.processValue(this.getRawValue()))){this.clearInvalid();return true}return false},processValue:function(a){return a},validateValue:function(b){var a=this.getErrors(b)[0];if(a==undefined){return true}else{this.markInvalid(a);return false}},getErrors:function(){return[]},getActiveError:function(){return this.activeError||""},markInvalid:function(c){if(this.rendered&&!this.preventMark){c=c||this.invalidText;var a=this.getMessageHandler();if(a){a.mark(this,c)}else{if(this.msgTarget){this.el.addClass(this.invalidClass);var b=Ext.getDom(this.msgTarget);if(b){b.innerHTML=c;b.style.display=this.msgDisplay}}}}this.setActiveError(c)},clearInvalid:function(){if(this.rendered&&!this.preventMark){this.el.removeClass(this.invalidClass);var a=this.getMessageHandler();if(a){a.clear(this)}else{if(this.msgTarget){this.el.removeClass(this.invalidClass);var b=Ext.getDom(this.msgTarget);if(b){b.innerHTML="";b.style.display="none"}}}}this.unsetActiveError()},setActiveError:function(b,a){this.activeError=b;if(a!==true){this.fireEvent("invalid",this,b)}},unsetActiveError:function(a){delete this.activeError;if(a!==true){this.fireEvent("valid",this)}},getMessageHandler:function(){return Ext.form.MessageTargets[this.msgTarget]},getErrorCt:function(){return this.el.findParent(".x-form-element",5,true)||this.el.findParent(".x-form-field-wrap",5,true)},alignErrorEl:function(){this.errorEl.setWidth(this.getErrorCt().getWidth(true)-20)},alignErrorIcon:function(){this.errorIcon.alignTo(this.el,"tl-tr",[2,0])},getRawValue:function(){var a=this.rendered?this.el.getValue():Ext.value(this.value,"");if(a===this.emptyText){a=""}return a},getValue:function(){if(!this.rendered){return this.value}var a=this.el.getValue();if(a===this.emptyText||a===undefined){a=""}return a},setRawValue:function(a){return this.rendered?(this.el.dom.value=(Ext.isEmpty(a)?"":a)):""},setValue:function(a){this.value=a;if(this.rendered){this.el.dom.value=(Ext.isEmpty(a)?"":a);this.validate()}return this},append:function(a){this.setValue([this.getValue(),a].join(""))}});Ext.form.MessageTargets={qtip:{mark:function(a,b){a.el.addClass(a.invalidClass);a.el.dom.qtip=b;a.el.dom.qclass="x-form-invalid-tip";if(Ext.QuickTips){Ext.QuickTips.enable()}},clear:function(a){a.el.removeClass(a.invalidClass);a.el.dom.qtip=""}},title:{mark:function(a,b){a.el.addClass(a.invalidClass);a.el.dom.title=b},clear:function(a){a.el.dom.title=""}},under:{mark:function(b,c){b.el.addClass(b.invalidClass);if(!b.errorEl){var a=b.getErrorCt();if(!a){b.el.dom.title=c;return}b.errorEl=a.createChild({cls:"x-form-invalid-msg"});b.on("resize",b.alignErrorEl,b);b.on("destroy",function(){Ext.destroy(this.errorEl)},b)}b.alignErrorEl();b.errorEl.update(c);Ext.form.Field.msgFx[b.msgFx].show(b.errorEl,b)},clear:function(a){a.el.removeClass(a.invalidClass);if(a.errorEl){Ext.form.Field.msgFx[a.msgFx].hide(a.errorEl,a)}else{a.el.dom.title=""}}},side:{mark:function(b,c){b.el.addClass(b.invalidClass);if(!b.errorIcon){var a=b.getErrorCt();if(!a){b.el.dom.title=c;return}b.errorIcon=a.createChild({cls:"x-form-invalid-icon"});if(b.ownerCt){b.ownerCt.on("afterlayout",b.alignErrorIcon,b);b.ownerCt.on("expand",b.alignErrorIcon,b)}b.on("resize",b.alignErrorIcon,b);b.on("destroy",function(){Ext.destroy(this.errorIcon)},b)}b.alignErrorIcon();b.errorIcon.dom.qtip=c;b.errorIcon.dom.qclass="x-form-invalid-tip";b.errorIcon.show()},clear:function(a){a.el.removeClass(a.invalidClass);if(a.errorIcon){a.errorIcon.dom.qtip="";a.errorIcon.hide()}else{a.el.dom.title=""}}}};Ext.form.Field.msgFx={normal:{show:function(a,b){a.setDisplayed("block")},hide:function(a,b){a.setDisplayed(false).update("")}},slide:{show:function(a,b){a.slideIn("t",{stopFx:true})},hide:function(a,b){a.slideOut("t",{stopFx:true,useDisplay:true})}},slideRight:{show:function(a,b){a.fixDisplay();a.alignTo(b.el,"tl-tr");a.slideIn("l",{stopFx:true})},hide:function(a,b){a.slideOut("l",{stopFx:true,useDisplay:true})}}};Ext.reg("field",Ext.form.Field);Ext.form.TextField=Ext.extend(Ext.form.Field,{grow:false,growMin:30,growMax:800,vtype:null,maskRe:null,disableKeyFilter:false,allowBlank:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",selectOnFocus:false,blankText:"This field is required",validator:null,regex:null,regexText:"",emptyText:null,emptyClass:"x-form-empty-field",initComponent:function(){Ext.form.TextField.superclass.initComponent.call(this);this.addEvents("autosize","keydown","keyup","keypress")},initEvents:function(){Ext.form.TextField.superclass.initEvents.call(this);if(this.validationEvent=="keyup"){this.validationTask=new Ext.util.DelayedTask(this.validate,this);this.mon(this.el,"keyup",this.filterValidation,this)}else{if(this.validationEvent!==false&&this.validationEvent!="blur"){this.mon(this.el,this.validationEvent,this.validate,this,{buffer:this.validationDelay})}}if(this.selectOnFocus||this.emptyText){this.mon(this.el,"mousedown",this.onMouseDown,this);if(this.emptyText){this.applyEmptyText()}}if(this.maskRe||(this.vtype&&this.disableKeyFilter!==true&&(this.maskRe=Ext.form.VTypes[this.vtype+"Mask"]))){this.mon(this.el,"keypress",this.filterKeys,this)}if(this.grow){this.mon(this.el,"keyup",this.onKeyUpBuffered,this,{buffer:50});this.mon(this.el,"click",this.autoSize,this)}if(this.enableKeyEvents){this.mon(this.el,{scope:this,keyup:this.onKeyUp,keydown:this.onKeyDown,keypress:this.onKeyPress})}},onMouseDown:function(a){if(!this.hasFocus){this.mon(this.el,"mouseup",Ext.emptyFn,this,{single:true,preventDefault:true})}},processValue:function(a){if(this.stripCharsRe){var b=a.replace(this.stripCharsRe,"");if(b!==a){this.setRawValue(b);return b}}return a},filterValidation:function(a){if(!a.isNavKeyPress()){this.validationTask.delay(this.validationDelay)}},onDisable:function(){Ext.form.TextField.superclass.onDisable.call(this);if(Ext.isIE){this.el.dom.unselectable="on"}},onEnable:function(){Ext.form.TextField.superclass.onEnable.call(this);if(Ext.isIE){this.el.dom.unselectable=""}},onKeyUpBuffered:function(a){if(this.doAutoSize(a)){this.autoSize()}},doAutoSize:function(a){return !a.isNavKeyPress()},onKeyUp:function(a){this.fireEvent("keyup",this,a)},onKeyDown:function(a){this.fireEvent("keydown",this,a)},onKeyPress:function(a){this.fireEvent("keypress",this,a)},reset:function(){Ext.form.TextField.superclass.reset.call(this);this.applyEmptyText()},applyEmptyText:function(){if(this.rendered&&this.emptyText&&this.getRawValue().length<1&&!this.hasFocus){this.setRawValue(this.emptyText);this.el.addClass(this.emptyClass)}},preFocus:function(){var a=this.el,b;if(this.emptyText){if(a.dom.value==this.emptyText){this.setRawValue("");b=true}a.removeClass(this.emptyClass)}if(this.selectOnFocus||b){a.dom.select()}},postBlur:function(){this.applyEmptyText()},filterKeys:function(b){if(b.ctrlKey){return}var a=b.getKey();if(Ext.isGecko&&(b.isNavKeyPress()||a==b.BACKSPACE||(a==b.DELETE&&b.button==-1))){return}var c=String.fromCharCode(b.getCharCode());if(!Ext.isGecko&&b.isSpecialKey()&&!c){return}if(!this.maskRe.test(c)){b.stopEvent()}},setValue:function(a){if(this.emptyText&&this.el&&!Ext.isEmpty(a)){this.el.removeClass(this.emptyClass)}Ext.form.TextField.superclass.setValue.apply(this,arguments);this.applyEmptyText();this.autoSize();return this},getErrors:function(a){var d=Ext.form.TextField.superclass.getErrors.apply(this,arguments);a=Ext.isDefined(a)?a:this.processValue(this.getRawValue());if(Ext.isFunction(this.validator)){var c=this.validator(a);if(c!==true){d.push(c)}}if(a.length<1||a===this.emptyText){if(this.allowBlank){return d}else{d.push(this.blankText)}}if(!this.allowBlank&&(a.length<1||a===this.emptyText)){d.push(this.blankText)}if(a.lengththis.maxLength){d.push(String.format(this.maxLengthText,this.maxLength))}if(this.vtype){var b=Ext.form.VTypes;if(!b[this.vtype](a,this)){d.push(this.vtypeText||b[this.vtype+"Text"])}}if(this.regex&&!this.regex.test(a)){d.push(this.regexText)}return d},selectText:function(h,a){var c=this.getRawValue();var e=false;if(c.length>0){h=h===undefined?0:h;a=a===undefined?c.length:a;var g=this.el.dom;if(g.setSelectionRange){g.setSelectionRange(h,a)}else{if(g.createTextRange){var b=g.createTextRange();b.moveStart("character",h);b.moveEnd("character",a-c.length);b.select()}}e=Ext.isGecko||Ext.isOpera}else{e=true}if(e){this.focus()}},autoSize:function(){if(!this.grow||!this.rendered){return}if(!this.metrics){this.metrics=Ext.util.TextMetrics.createInstance(this.el)}var c=this.el;var b=c.dom.value;var e=document.createElement("div");e.appendChild(document.createTextNode(b));b=e.innerHTML;Ext.removeNode(e);e=null;b+=" ";var a=Math.min(this.growMax,Math.max(this.metrics.getWidth(b)+10,this.growMin));this.el.setWidth(a);this.fireEvent("autosize",this,a)},onDestroy:function(){if(this.validationTask){this.validationTask.cancel();this.validationTask=null}Ext.form.TextField.superclass.onDestroy.call(this)}});Ext.reg("textfield",Ext.form.TextField);Ext.form.TriggerField=Ext.extend(Ext.form.TextField,{defaultAutoCreate:{tag:"input",type:"text",size:"16",autocomplete:"off"},hideTrigger:false,editable:true,readOnly:false,wrapFocusClass:"x-trigger-wrap-focus",autoSize:Ext.emptyFn,monitorTab:true,deferHeight:true,mimicing:false,actionMode:"wrap",defaultTriggerWidth:17,onResize:function(a,c){Ext.form.TriggerField.superclass.onResize.call(this,a,c);var b=this.getTriggerWidth();if(Ext.isNumber(a)){this.el.setWidth(a-b)}this.wrap.setWidth(this.el.getWidth()+b)},getTriggerWidth:function(){var a=this.trigger.getWidth();if(!this.hideTrigger&&!this.readOnly&&a===0){a=this.defaultTriggerWidth}return a},alignErrorIcon:function(){if(this.wrap){this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0])}},onRender:function(b,a){this.doc=Ext.isIE?Ext.getBody():Ext.getDoc();Ext.form.TriggerField.superclass.onRender.call(this,b,a);this.wrap=this.el.wrap({cls:"x-form-field-wrap x-form-field-trigger-wrap"});this.trigger=this.wrap.createChild(this.triggerConfig||{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.triggerClass});this.initTrigger();if(!this.width){this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())}this.resizeEl=this.positionEl=this.wrap},getWidth:function(){return(this.el.getWidth()+this.trigger.getWidth())},updateEditState:function(){if(this.rendered){if(this.readOnly){this.el.dom.readOnly=true;this.el.addClass("x-trigger-noedit");this.mun(this.el,"click",this.onTriggerClick,this);this.trigger.setDisplayed(false)}else{if(!this.editable){this.el.dom.readOnly=true;this.el.addClass("x-trigger-noedit");this.mon(this.el,"click",this.onTriggerClick,this)}else{this.el.dom.readOnly=false;this.el.removeClass("x-trigger-noedit");this.mun(this.el,"click",this.onTriggerClick,this)}this.trigger.setDisplayed(!this.hideTrigger)}this.onResize(this.width||this.wrap.getWidth())}},setHideTrigger:function(a){if(a!=this.hideTrigger){this.hideTrigger=a;this.updateEditState()}},setEditable:function(a){if(a!=this.editable){this.editable=a;this.updateEditState()}},setReadOnly:function(a){if(a!=this.readOnly){this.readOnly=a;this.updateEditState()}},afterRender:function(){Ext.form.TriggerField.superclass.afterRender.call(this);this.updateEditState()},initTrigger:function(){this.mon(this.trigger,"click",this.onTriggerClick,this,{preventDefault:true});this.trigger.addClassOnOver("x-form-trigger-over");this.trigger.addClassOnClick("x-form-trigger-click")},onDestroy:function(){Ext.destroy(this.trigger,this.wrap);if(this.mimicing){this.doc.un("mousedown",this.mimicBlur,this)}delete this.doc;Ext.form.TriggerField.superclass.onDestroy.call(this)},onFocus:function(){Ext.form.TriggerField.superclass.onFocus.call(this);if(!this.mimicing){this.wrap.addClass(this.wrapFocusClass);this.mimicing=true;this.doc.on("mousedown",this.mimicBlur,this,{delay:10});if(this.monitorTab){this.on("specialkey",this.checkTab,this)}}},checkTab:function(a,b){if(b.getKey()==b.TAB){this.triggerBlur()}},onBlur:Ext.emptyFn,mimicBlur:function(a){if(!this.isDestroyed&&!this.wrap.contains(a.target)&&this.validateBlur(a)){this.triggerBlur()}},triggerBlur:function(){this.mimicing=false;this.doc.un("mousedown",this.mimicBlur,this);if(this.monitorTab&&this.el){this.un("specialkey",this.checkTab,this)}Ext.form.TriggerField.superclass.onBlur.call(this);if(this.wrap){this.wrap.removeClass(this.wrapFocusClass)}},beforeBlur:Ext.emptyFn,validateBlur:function(a){return true},onTriggerClick:Ext.emptyFn});Ext.form.TwinTriggerField=Ext.extend(Ext.form.TriggerField,{initComponent:function(){Ext.form.TwinTriggerField.superclass.initComponent.call(this);this.triggerConfig={tag:"span",cls:"x-form-twin-triggers",cn:[{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.trigger1Class},{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.trigger2Class}]}},getTrigger:function(a){return this.triggers[a]},afterRender:function(){Ext.form.TwinTriggerField.superclass.afterRender.call(this);var c=this.triggers,b=0,a=c.length;for(;b")}}d.innerHTML=a;b=Math.min(this.growMax,Math.max(d.offsetHeight,this.growMin));if(b!=this.lastHeight){this.lastHeight=b;this.el.setHeight(b);this.fireEvent("autosize",this,b)}}});Ext.reg("textarea",Ext.form.TextArea);Ext.form.NumberField=Ext.extend(Ext.form.TextField,{fieldClass:"x-form-field x-form-num-field",allowDecimals:true,decimalSeparator:".",decimalPrecision:2,allowNegative:true,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",baseChars:"0123456789",autoStripChars:false,initEvents:function(){var a=this.baseChars+"";if(this.allowDecimals){a+=this.decimalSeparator}if(this.allowNegative){a+="-"}a=Ext.escapeRe(a);this.maskRe=new RegExp("["+a+"]");if(this.autoStripChars){this.stripCharsRe=new RegExp("[^"+a+"]","gi")}Ext.form.NumberField.superclass.initEvents.call(this)},getErrors:function(b){var c=Ext.form.NumberField.superclass.getErrors.apply(this,arguments);b=Ext.isDefined(b)?b:this.processValue(this.getRawValue());if(b.length<1){return c}b=String(b).replace(this.decimalSeparator,".");if(isNaN(b)){c.push(String.format(this.nanText,b))}var a=this.parseValue(b);if(athis.maxValue){c.push(String.format(this.maxText,this.maxValue))}return c},getValue:function(){return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)))},setValue:function(a){a=Ext.isNumber(a)?a:parseFloat(String(a).replace(this.decimalSeparator,"."));a=this.fixPrecision(a);a=isNaN(a)?"":String(a).replace(".",this.decimalSeparator);return Ext.form.NumberField.superclass.setValue.call(this,a)},setMinValue:function(a){this.minValue=Ext.num(a,Number.NEGATIVE_INFINITY)},setMaxValue:function(a){this.maxValue=Ext.num(a,Number.MAX_VALUE)},parseValue:function(a){a=parseFloat(String(a).replace(this.decimalSeparator,"."));return isNaN(a)?"":a},fixPrecision:function(b){var a=isNaN(b);if(!this.allowDecimals||this.decimalPrecision==-1||a||!b){return a?"":b}return parseFloat(parseFloat(b).toFixed(this.decimalPrecision))},beforeBlur:function(){var a=this.parseValue(this.getRawValue());if(!Ext.isEmpty(a)){this.setValue(a)}}});Ext.reg("numberfield",Ext.form.NumberField);Ext.form.DateField=Ext.extend(Ext.form.TriggerField,{format:"m/d/Y",altFormats:"m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",disabledDaysText:"Disabled",disabledDatesText:"Disabled",minText:"The date in this field must be equal to or after {0}",maxText:"The date in this field must be equal to or before {0}",invalidText:"{0} is not a valid date - it must be in the format {1}",triggerClass:"x-form-date-trigger",showToday:true,startDay:0,defaultAutoCreate:{tag:"input",type:"text",size:"10",autocomplete:"off"},initTime:"12",initTimeFormat:"H",safeParse:function(b,c){if(Date.formatContainsHourInfo(c)){return Date.parseDate(b,c)}else{var a=Date.parseDate(b+" "+this.initTime,c+" "+this.initTimeFormat);if(a){return a.clearTime()}}},initComponent:function(){Ext.form.DateField.superclass.initComponent.call(this);this.addEvents("select");if(Ext.isString(this.minValue)){this.minValue=this.parseDate(this.minValue)}if(Ext.isString(this.maxValue)){this.maxValue=this.parseDate(this.maxValue)}this.disabledDatesRE=null;this.initDisabledDays()},initEvents:function(){Ext.form.DateField.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{down:function(a){this.onTriggerClick()},scope:this,forceKeyDown:true})},initDisabledDays:function(){if(this.disabledDates){var b=this.disabledDates,a=b.length-1,c="(?:";Ext.each(b,function(g,e){c+=Ext.isDate(g)?"^"+Ext.escapeRe(g.dateFormat(this.format))+"$":b[e];if(e!=a){c+="|"}},this);this.disabledDatesRE=new RegExp(c+")")}},setDisabledDates:function(a){this.disabledDates=a;this.initDisabledDays();if(this.menu){this.menu.picker.setDisabledDates(this.disabledDatesRE)}},setDisabledDays:function(a){this.disabledDays=a;if(this.menu){this.menu.picker.setDisabledDays(a)}},setMinValue:function(a){this.minValue=(Ext.isString(a)?this.parseDate(a):a);if(this.menu){this.menu.picker.setMinDate(this.minValue)}},setMaxValue:function(a){this.maxValue=(Ext.isString(a)?this.parseDate(a):a);if(this.menu){this.menu.picker.setMaxDate(this.maxValue)}},getErrors:function(e){var h=Ext.form.DateField.superclass.getErrors.apply(this,arguments);e=this.formatDate(e||this.processValue(this.getRawValue()));if(e.length<1){return h}var c=e;e=this.parseDate(e);if(!e){h.push(String.format(this.invalidText,c,this.format));return h}var g=e.getTime();if(this.minValue&&gthis.maxValue.clearTime().getTime()){h.push(String.format(this.maxText,this.formatDate(this.maxValue)))}if(this.disabledDays){var a=e.getDay();for(var b=0;b
    {'+this.displayField+"}
    "}this.view=new Ext.DataView({applyTo:this.innerList,tpl:this.tpl,singleSelect:true,selectedClass:this.selectedClass,itemSelector:this.itemSelector||"."+a+"-item",emptyText:this.listEmptyText,deferEmptyText:false});this.mon(this.view,{containerclick:this.onViewClick,click:this.onViewClick,scope:this});this.bindStore(this.store,true);if(this.resizable){this.resizer=new Ext.Resizable(this.list,{pinned:true,handles:"se"});this.mon(this.resizer,"resize",function(g,d,e){this.maxHeight=e-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight;this.listWidth=d;this.innerList.setWidth(d-this.list.getFrameWidth("lr"));this.restrictHeight()},this);this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px")}}},getListParent:function(){return document.body},getStore:function(){return this.store},bindStore:function(a,b){if(this.store&&!b){if(this.store!==a&&this.store.autoDestroy){this.store.destroy()}else{this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("load",this.onLoad,this);this.store.un("exception",this.collapse,this)}if(!a){this.store=null;if(this.view){this.view.bindStore(null)}if(this.pageTb){this.pageTb.bindStore(null)}}}if(a){if(!b){this.lastQuery=null;if(this.pageTb){this.pageTb.bindStore(a)}}this.store=Ext.StoreMgr.lookup(a);this.store.on({scope:this,beforeload:this.onBeforeLoad,load:this.onLoad,exception:this.collapse});if(this.view){this.view.bindStore(a)}}},reset:function(){if(this.clearFilterOnReset&&this.mode=="local"){this.store.clearFilter()}Ext.form.ComboBox.superclass.reset.call(this)},initEvents:function(){Ext.form.ComboBox.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{up:function(a){this.inKeyMode=true;this.selectPrev()},down:function(a){if(!this.isExpanded()){this.onTriggerClick()}else{this.inKeyMode=true;this.selectNext()}},enter:function(a){this.onViewClick()},esc:function(a){this.collapse()},tab:function(a){if(this.forceSelection===true){this.collapse()}else{this.onViewClick(false)}return true},scope:this,doRelay:function(c,b,a){if(a=="down"||this.scope.isExpanded()){var d=Ext.KeyNav.prototype.doRelay.apply(this,arguments);if(!Ext.isIE&&Ext.EventManager.useKeydown){this.scope.fireKey(c)}return d}return true},forceKeyDown:true,defaultEventAction:"stopEvent"});this.queryDelay=Math.max(this.queryDelay||10,this.mode=="local"?10:250);this.dqTask=new Ext.util.DelayedTask(this.initQuery,this);if(this.typeAhead){this.taTask=new Ext.util.DelayedTask(this.onTypeAhead,this)}if(!this.enableKeyEvents){this.mon(this.el,"keyup",this.onKeyUp,this)}},onDestroy:function(){if(this.dqTask){this.dqTask.cancel();this.dqTask=null}this.bindStore(null);Ext.destroy(this.resizer,this.view,this.pageTb,this.list);Ext.destroyMembers(this,"hiddenField");Ext.form.ComboBox.superclass.onDestroy.call(this)},fireKey:function(a){if(!this.isExpanded()){Ext.form.ComboBox.superclass.fireKey.call(this,a)}},onResize:function(a,b){Ext.form.ComboBox.superclass.onResize.apply(this,arguments);if(!isNaN(a)&&this.isVisible()&&this.list){this.doResize(a)}else{this.bufferSize=a}},doResize:function(a){if(!Ext.isDefined(this.listWidth)){var b=Math.max(a,this.minListWidth);this.list.setWidth(b);this.innerList.setWidth(b-this.list.getFrameWidth("lr"))}},onEnable:function(){Ext.form.ComboBox.superclass.onEnable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=false}},onDisable:function(){Ext.form.ComboBox.superclass.onDisable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=true}},onBeforeLoad:function(){if(!this.hasFocus){return}this.innerList.update(this.loadingText?'
    '+this.loadingText+"
    ":"");this.restrictHeight();this.selectedIndex=-1},onLoad:function(){if(!this.hasFocus){return}if(this.store.getCount()>0||this.listEmptyText){this.expand();this.restrictHeight();if(this.lastQuery==this.allQuery){if(this.editable){this.el.dom.select()}if(this.autoSelect!==false&&!this.selectByValue(this.value,true)){this.select(0,true)}}else{if(this.autoSelect!==false){this.selectNext()}if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE&&this.lastKey!=Ext.EventObject.DELETE){this.taTask.delay(this.typeAheadDelay)}}}else{this.collapse()}},onTypeAhead:function(){if(this.store.getCount()>0){var b=this.store.getAt(0);var c=b.data[this.displayField];var a=c.length;var d=this.getRawValue().length;if(d!=a){this.setRawValue(c);this.selectText(d,c.length)}}},assertValue:function(){var b=this.getRawValue(),a;if(this.valueField&&Ext.isDefined(this.value)){a=this.findRecord(this.valueField,this.value)}if(!a||a.get(this.displayField)!=b){a=this.findRecord(this.displayField,b)}if(!a&&this.forceSelection){if(b.length>0&&b!=this.emptyText){this.el.dom.value=Ext.value(this.lastSelectionText,"");this.applyEmptyText()}else{this.clearValue()}}else{if(a&&this.valueField){if(this.value==b){return}b=a.get(this.valueField||this.displayField)}this.setValue(b)}},onSelect:function(a,b){if(this.fireEvent("beforeselect",this,a,b)!==false){this.setValue(a.data[this.valueField||this.displayField]);this.collapse();this.fireEvent("select",this,a,b)}},getName:function(){var a=this.hiddenField;return a&&a.name?a.name:this.hiddenName||Ext.form.ComboBox.superclass.getName.call(this)},getValue:function(){if(this.valueField){return Ext.isDefined(this.value)?this.value:""}else{return Ext.form.ComboBox.superclass.getValue.call(this)}},clearValue:function(){if(this.hiddenField){this.hiddenField.value=""}this.setRawValue("");this.lastSelectionText="";this.applyEmptyText();this.value=""},setValue:function(a){var c=a;if(this.valueField){var b=this.findRecord(this.valueField,a);if(b){c=b.data[this.displayField]}else{if(Ext.isDefined(this.valueNotFoundText)){c=this.valueNotFoundText}}}this.lastSelectionText=c;if(this.hiddenField){this.hiddenField.value=Ext.value(a,"")}Ext.form.ComboBox.superclass.setValue.call(this,c);this.value=a;return this},findRecord:function(c,b){var a;if(this.store.getCount()>0){this.store.each(function(d){if(d.data[c]==b){a=d;return false}})}return a},onViewMove:function(b,a){this.inKeyMode=false},onViewOver:function(d,b){if(this.inKeyMode){return}var c=this.view.findItemFromChild(b);if(c){var a=this.view.indexOf(c);this.select(a,false)}},onViewClick:function(b){var a=this.view.getSelectedIndexes()[0],c=this.store,d=c.getAt(a);if(d){this.onSelect(d,a)}else{this.collapse()}if(b!==false){this.el.focus()}},restrictHeight:function(){this.innerList.dom.style.height="";var b=this.innerList.dom,e=this.list.getFrameWidth("tb")+(this.resizable?this.handleHeight:0)+this.assetHeight,c=Math.max(b.clientHeight,b.offsetHeight,b.scrollHeight),a=this.getPosition()[1]-Ext.getBody().getScroll().top,g=Ext.lib.Dom.getViewHeight()-a-this.getSize().height,d=Math.max(a,g,this.minHeight||0)-this.list.shadowOffset-e-5;c=Math.min(c,d,this.maxHeight);this.innerList.setHeight(c);this.list.beginUpdate();this.list.setHeight(c+e);this.list.alignTo.apply(this.list,[this.el].concat(this.listAlign));this.list.endUpdate()},isExpanded:function(){return this.list&&this.list.isVisible()},selectByValue:function(a,c){if(!Ext.isEmpty(a,true)){var b=this.findRecord(this.valueField||this.displayField,a);if(b){this.select(this.store.indexOf(b),c);return true}}return false},select:function(a,c){this.selectedIndex=a;this.view.select(a);if(c!==false){var b=this.view.getNode(a);if(b){this.innerList.scrollChildIntoView(b,false)}}},selectNext:function(){var a=this.store.getCount();if(a>0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex0){if(this.selectedIndex==-1){this.select(0)}else{if(this.selectedIndex!==0){this.select(this.selectedIndex-1)}}}},onKeyUp:function(b){var a=b.getKey();if(this.editable!==false&&this.readOnly!==true&&(a==b.BACKSPACE||!b.isSpecialKey())){this.lastKey=a;this.dqTask.delay(this.queryDelay)}Ext.form.ComboBox.superclass.onKeyUp.call(this,b)},validateBlur:function(){return !this.list||!this.list.isVisible()},initQuery:function(){this.doQuery(this.getRawValue())},beforeBlur:function(){this.assertValue()},postBlur:function(){Ext.form.ComboBox.superclass.postBlur.call(this);this.collapse();this.inKeyMode=false},doQuery:function(c,b){c=Ext.isEmpty(c)?"":c;var a={query:c,forceAll:b,combo:this,cancel:false};if(this.fireEvent("beforequery",a)===false||a.cancel){return false}c=a.query;b=a.forceAll;if(b===true||(c.length>=this.minChars)){if(this.lastQuery!==c){this.lastQuery=c;if(this.mode=="local"){this.selectedIndex=-1;if(b){this.store.clearFilter()}else{this.store.filter(this.displayField,c)}this.onLoad()}else{this.store.baseParams[this.queryParam]=c;this.store.load({params:this.getParams(c)});this.expand()}}else{this.selectedIndex=-1;this.onLoad()}}},getParams:function(a){var b={},c=this.store.paramNames;if(this.pageSize){b[c.start]=0;b[c.limit]=this.pageSize}return b},collapse:function(){if(!this.isExpanded()){return}this.list.hide();Ext.getDoc().un("mousewheel",this.collapseIf,this);Ext.getDoc().un("mousedown",this.collapseIf,this);this.fireEvent("collapse",this)},collapseIf:function(a){if(!this.isDestroyed&&!a.within(this.wrap)&&!a.within(this.list)){this.collapse()}},expand:function(){if(this.isExpanded()||!this.hasFocus){return}if(this.title||this.pageSize){this.assetHeight=0;if(this.title){this.assetHeight+=this.header.getHeight()}if(this.pageSize){this.assetHeight+=this.footer.getHeight()}}if(this.bufferSize){this.doResize(this.bufferSize);delete this.bufferSize}this.list.alignTo.apply(this.list,[this.el].concat(this.listAlign));this.list.setZIndex(this.getZIndex());this.list.show();if(Ext.isGecko2){this.innerList.setOverflow("auto")}this.mon(Ext.getDoc(),{scope:this,mousewheel:this.collapseIf,mousedown:this.collapseIf});this.fireEvent("expand",this)},onTriggerClick:function(){if(this.readOnly||this.disabled){return}if(this.isExpanded()){this.collapse();this.el.focus()}else{this.onFocus({});if(this.triggerAction=="all"){this.doQuery(this.allQuery,true)}else{this.doQuery(this.getRawValue())}this.el.focus()}}});Ext.reg("combo",Ext.form.ComboBox);Ext.form.Checkbox=Ext.extend(Ext.form.Field,{focusClass:undefined,fieldClass:"x-form-field",checked:false,boxLabel:" ",defaultAutoCreate:{tag:"input",type:"checkbox",autocomplete:"off"},actionMode:"wrap",initComponent:function(){Ext.form.Checkbox.superclass.initComponent.call(this);this.addEvents("check")},onResize:function(){Ext.form.Checkbox.superclass.onResize.apply(this,arguments);if(!this.boxLabel&&!this.fieldLabel){this.el.alignTo(this.wrap,"c-c")}},initEvents:function(){Ext.form.Checkbox.superclass.initEvents.call(this);this.mon(this.el,{scope:this,click:this.onClick,change:this.onClick})},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,onRender:function(b,a){Ext.form.Checkbox.superclass.onRender.call(this,b,a);if(this.inputValue!==undefined){this.el.dom.value=this.inputValue}this.wrap=this.el.wrap({cls:"x-form-check-wrap"});if(this.boxLabel){this.wrap.createChild({tag:"label",htmlFor:this.el.id,cls:"x-form-cb-label",html:this.boxLabel})}if(this.checked){this.setValue(true)}else{this.checked=this.el.dom.checked}if(Ext.isIE&&!Ext.isStrict){this.wrap.repaint()}this.resizeEl=this.positionEl=this.wrap},onDestroy:function(){Ext.destroy(this.wrap);Ext.form.Checkbox.superclass.onDestroy.call(this)},initValue:function(){this.originalValue=this.getValue()},getValue:function(){if(this.rendered){return this.el.dom.checked}return this.checked},onClick:function(){if(this.el.dom.checked!=this.checked){this.setValue(this.el.dom.checked)}},setValue:function(a){var c=this.checked,b=this.inputValue;if(a===false){this.checked=false}else{this.checked=(a===true||a==="true"||a=="1"||(b?a==b:String(a).toLowerCase()=="on"))}if(this.rendered){this.el.dom.checked=this.checked;this.el.dom.defaultChecked=this.checked}if(c!=this.checked){this.fireEvent("check",this,this.checked);if(this.handler){this.handler.call(this.scope||this,this,this.checked)}}return this}});Ext.reg("checkbox",Ext.form.Checkbox);Ext.form.CheckboxGroup=Ext.extend(Ext.form.Field,{columns:"auto",vertical:false,allowBlank:true,blankText:"You must select at least one item in this group",defaultType:"checkbox",groupCls:"x-form-check-group",initComponent:function(){this.addEvents("change");this.on("change",this.validate,this);Ext.form.CheckboxGroup.superclass.initComponent.call(this)},onRender:function(j,g){if(!this.el){var p={autoEl:{id:this.id},cls:this.groupCls,layout:"column",renderTo:j,bufferResize:false};var a={xtype:"container",defaultType:this.defaultType,layout:"form",defaults:{hideLabel:true,anchor:"100%"}};if(this.items[0].items){Ext.apply(p,{layoutConfig:{columns:this.items.length},defaults:this.defaults,items:this.items});for(var e=0,m=this.items.length;e0&&e%r==0){o++}if(this.items[e].fieldLabel){this.items[e].hideLabel=false}n[o].items.push(this.items[e])}}else{for(var e=0,m=this.items.length;e-1){b.setValue(true)}})},getBox:function(b){var a=null;this.eachItem(function(c){if(b==c||c.dataIndex==b||c.id==b||c.getName()==b){a=c;return false}});return a},getValue:function(){var a=[];this.eachItem(function(b){if(b.checked){a.push(b)}});return a},eachItem:function(b,a){if(this.items&&this.items.each){this.items.each(b,a||this)}},getRawValue:Ext.emptyFn,setRawValue:Ext.emptyFn});Ext.reg("checkboxgroup",Ext.form.CheckboxGroup);Ext.form.CompositeField=Ext.extend(Ext.form.Field,{defaultMargins:"0 5 0 0",skipLastItemMargin:true,isComposite:true,combineErrors:true,labelConnector:", ",initComponent:function(){var g=[],b=this.items,e;for(var d=0,c=b.length;d")},sortErrors:function(){var a=this.items;this.fieldErrors.sort("ASC",function(g,d){var c=function(b){return function(i){return i.getName()==b}};var h=a.findIndexBy(c(g.field)),e=a.findIndexBy(c(d.field));return h1){var a=this.getBox(c);if(a){a.setValue(b);if(a.checked){this.eachItem(function(d){if(d!==a){d.setValue(false)}})}}}else{this.setValueForItem(c)}},setValueForItem:function(a){a=String(a).split(",")[0];this.eachItem(function(b){b.setValue(a==b.inputValue)})},fireChecked:function(){if(!this.checkTask){this.checkTask=new Ext.util.DelayedTask(this.bufferChecked,this)}this.checkTask.delay(10)},bufferChecked:function(){var a=null;this.eachItem(function(b){if(b.checked){a=b;return false}});this.fireEvent("change",this,a)},onDestroy:function(){if(this.checkTask){this.checkTask.cancel();this.checkTask=null}Ext.form.RadioGroup.superclass.onDestroy.call(this)}});Ext.reg("radiogroup",Ext.form.RadioGroup);Ext.form.Hidden=Ext.extend(Ext.form.Field,{inputType:"hidden",shouldLayout:false,onRender:function(){Ext.form.Hidden.superclass.onRender.apply(this,arguments)},initEvents:function(){this.originalValue=this.getValue()},setSize:Ext.emptyFn,setWidth:Ext.emptyFn,setHeight:Ext.emptyFn,setPosition:Ext.emptyFn,setPagePosition:Ext.emptyFn,markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn});Ext.reg("hidden",Ext.form.Hidden);Ext.form.BasicForm=Ext.extend(Ext.util.Observable,{constructor:function(b,a){Ext.apply(this,a);if(Ext.isString(this.paramOrder)){this.paramOrder=this.paramOrder.split(/[\s,|]/)}this.items=new Ext.util.MixedCollection(false,function(c){return c.getItemId()});this.addEvents("beforeaction","actionfailed","actioncomplete");if(b){this.initEl(b)}Ext.form.BasicForm.superclass.constructor.call(this)},timeout:30,paramOrder:undefined,paramsAsHash:false,waitTitle:"Please Wait...",activeAction:null,trackResetOnLoad:false,initEl:function(a){this.el=Ext.get(a);this.id=this.el.id||Ext.id();if(!this.standardSubmit){this.el.on("submit",this.onSubmit,this)}this.el.addClass("x-form")},getEl:function(){return this.el},onSubmit:function(a){a.stopEvent()},destroy:function(a){if(a!==true){this.items.each(function(b){Ext.destroy(b)});Ext.destroy(this.el)}this.items.clear();this.purgeListeners()},isValid:function(){var a=true;this.items.each(function(b){if(!b.validate()){a=false}});return a},isDirty:function(){var a=false;this.items.each(function(b){if(b.isDirty()){a=true;return false}});return a},doAction:function(b,a){if(Ext.isString(b)){b=new Ext.form.Action.ACTION_TYPES[b](this,a)}if(this.fireEvent("beforeaction",this,b)!==false){this.beforeAction(b);b.run.defer(100,b)}return this},submit:function(b){b=b||{};if(this.standardSubmit){var a=b.clientValidation===false||this.isValid();if(a){var c=this.el.dom;if(this.url&&Ext.isEmpty(c.action)){c.action=this.url}c.submit()}return a}var d=String.format("{0}submit",this.api?"direct":"");this.doAction(d,b);return this},load:function(a){var b=String.format("{0}load",this.api?"direct":"");this.doAction(b,a);return this},updateRecord:function(b){b.beginEdit();var a=b.fields,d,c;a.each(function(e){d=this.findField(e.name);if(d){c=d.getValue();if(Ext.type(c)!==false&&c.getGroupValue){c=c.getGroupValue()}else{if(d.eachItem){c=[];d.eachItem(function(g){c.push(g.getValue())})}}b.set(e.name,c)}},this);b.endEdit();return this},loadRecord:function(a){this.setValues(a.data);return this},beforeAction:function(a){this.items.each(function(c){if(c.isFormField&&c.syncValue){c.syncValue()}});var b=a.options;if(b.waitMsg){if(this.waitMsgTarget===true){this.el.mask(b.waitMsg,"x-mask-loading")}else{if(this.waitMsgTarget){this.waitMsgTarget=Ext.get(this.waitMsgTarget);this.waitMsgTarget.mask(b.waitMsg,"x-mask-loading")}else{Ext.MessageBox.wait(b.waitMsg,b.waitTitle||this.waitTitle)}}}},afterAction:function(a,c){this.activeAction=null;var b=a.options;if(b.waitMsg){if(this.waitMsgTarget===true){this.el.unmask()}else{if(this.waitMsgTarget){this.waitMsgTarget.unmask()}else{Ext.MessageBox.updateProgress(1);Ext.MessageBox.hide()}}}if(c){if(b.reset){this.reset()}Ext.callback(b.success,b.scope,[this,a]);this.fireEvent("actioncomplete",this,a)}else{Ext.callback(b.failure,b.scope,[this,a]);this.fireEvent("actionfailed",this,a)}},findField:function(c){var b=this.items.get(c);if(!Ext.isObject(b)){var a=function(d){if(d.isFormField){if(d.dataIndex==c||d.id==c||d.getName()==c){b=d;return false}else{if(d.isComposite){return d.items.each(a)}else{if(d instanceof Ext.form.CheckboxGroup&&d.rendered){return d.eachItem(a)}}}}};this.items.each(a)}return b||null},markInvalid:function(h){if(Ext.isArray(h)){for(var c=0,a=h.length;c':">"),c,"")}return d.join("")},createToolbar:function(e){var c=[];var a=Ext.QuickTips&&Ext.QuickTips.isEnabled();function d(j,h,i){return{itemId:j,cls:"x-btn-icon",iconCls:"x-edit-"+j,enableToggle:h!==false,scope:e,handler:i||e.relayBtnCmd,clickEvent:"mousedown",tooltip:a?e.buttonTips[j]||undefined:undefined,overflowText:e.buttonTips[j].title||undefined,tabIndex:-1}}if(this.enableFont&&!Ext.isSafari2){var g=new Ext.Toolbar.Item({autoEl:{tag:"select",cls:"x-font-select",html:this.createFontOptions()}});c.push(g,"-")}if(this.enableFormat){c.push(d("bold"),d("italic"),d("underline"))}if(this.enableFontSize){c.push("-",d("increasefontsize",false,this.adjustFont),d("decreasefontsize",false,this.adjustFont))}if(this.enableColors){c.push("-",{itemId:"forecolor",cls:"x-btn-icon",iconCls:"x-edit-forecolor",clickEvent:"mousedown",tooltip:a?e.buttonTips.forecolor||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({allowReselect:true,focus:Ext.emptyFn,value:"000000",plain:true,listeners:{scope:this,select:function(i,h){this.execCmd("forecolor",Ext.isWebKit||Ext.isIE?"#"+h:h);this.deferFocus()}},clickEvent:"mousedown"})},{itemId:"backcolor",cls:"x-btn-icon",iconCls:"x-edit-backcolor",clickEvent:"mousedown",tooltip:a?e.buttonTips.backcolor||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({focus:Ext.emptyFn,value:"FFFFFF",plain:true,allowReselect:true,listeners:{scope:this,select:function(i,h){if(Ext.isGecko){this.execCmd("useCSS",false);this.execCmd("hilitecolor",h);this.execCmd("useCSS",true);this.deferFocus()}else{this.execCmd(Ext.isOpera?"hilitecolor":"backcolor",Ext.isWebKit||Ext.isIE?"#"+h:h);this.deferFocus()}}},clickEvent:"mousedown"})})}if(this.enableAlignments){c.push("-",d("justifyleft"),d("justifycenter"),d("justifyright"))}if(!Ext.isSafari2){if(this.enableLinks){c.push("-",d("createlink",false,this.createLink))}if(this.enableLists){c.push("-",d("insertorderedlist"),d("insertunorderedlist"))}if(this.enableSourceEdit){c.push("-",d("sourceedit",true,function(h){this.toggleSourceEdit(!this.sourceEditMode)}))}}var b=new Ext.Toolbar({renderTo:this.wrap.dom.firstChild,items:c});if(g){this.fontSelect=g.el;this.mon(this.fontSelect,"change",function(){var h=this.fontSelect.dom.value;this.relayCmd("fontname",h);this.deferFocus()},this)}this.mon(b.el,"click",function(h){h.preventDefault()});this.tb=b;this.tb.doLayout()},onDisable:function(){this.wrap.mask();Ext.form.HtmlEditor.superclass.onDisable.call(this)},onEnable:function(){this.wrap.unmask();Ext.form.HtmlEditor.superclass.onEnable.call(this)},setReadOnly:function(b){Ext.form.HtmlEditor.superclass.setReadOnly.call(this,b);if(this.initialized){if(Ext.isIE){this.getEditorBody().contentEditable=!b}else{this.setDesignMode(!b)}var a=this.getEditorBody();if(a){a.style.cursor=this.readOnly?"default":"text"}this.disableItems(b)}},getDocMarkup:function(){var a=Ext.fly(this.iframe).getHeight()-this.iframePad*2;return String.format('',this.iframePad,a)},getEditorBody:function(){var a=this.getDoc();return a.body||a.documentElement},getDoc:function(){return Ext.isIE?this.getWin().document:(this.iframe.contentDocument||this.getWin().document)},getWin:function(){return Ext.isIE?this.iframe.contentWindow:window.frames[this.iframe.name]},onRender:function(b,a){Ext.form.HtmlEditor.superclass.onRender.call(this,b,a);this.el.dom.style.border="0 none";this.el.dom.setAttribute("tabIndex",-1);this.el.addClass("x-hidden");if(Ext.isIE){this.el.applyStyles("margin-top:-1px;margin-bottom:-1px;")}this.wrap=this.el.wrap({cls:"x-html-editor-wrap",cn:{cls:"x-html-editor-tb"}});this.createToolbar(this);this.disableItems(true);this.tb.doLayout();this.createIFrame();if(!this.width){var c=this.el.getSize();this.setSize(c.width,this.height||c.height)}this.resizeEl=this.positionEl=this.wrap},createIFrame:function(){var a=document.createElement("iframe");a.name=Ext.id();a.frameBorder="0";a.style.overflow="auto";a.src=Ext.SSL_SECURE_URL;this.wrap.dom.appendChild(a);this.iframe=a;this.monitorTask=Ext.TaskMgr.start({run:this.checkDesignMode,scope:this,interval:100})},initFrame:function(){Ext.TaskMgr.stop(this.monitorTask);var b=this.getDoc();this.win=this.getWin();b.open();b.write(this.getDocMarkup());b.close();var a={run:function(){var c=this.getDoc();if(c.body||c.readyState=="complete"){Ext.TaskMgr.stop(a);this.setDesignMode(true);this.initEditor.defer(10,this)}},interval:10,duration:10000,scope:this};Ext.TaskMgr.start(a)},checkDesignMode:function(){if(this.wrap&&this.wrap.dom.offsetWidth){var a=this.getDoc();if(!a){return}if(!a.editorInitialized||this.getDesignMode()!="on"){this.initFrame()}}},setDesignMode:function(b){var a=this.getDoc();if(a){if(this.readOnly){b=false}a.designMode=(/on|true/i).test(String(b).toLowerCase())?"on":"off"}},getDesignMode:function(){var a=this.getDoc();if(!a){return""}return String(a.designMode).toLowerCase()},disableItems:function(a){if(this.fontSelect){this.fontSelect.dom.disabled=a}this.tb.items.each(function(b){if(b.getItemId()!="sourceedit"){b.setDisabled(a)}})},onResize:function(b,c){Ext.form.HtmlEditor.superclass.onResize.apply(this,arguments);if(this.el&&this.iframe){if(Ext.isNumber(b)){var e=b-this.wrap.getFrameWidth("lr");this.el.setWidth(e);this.tb.setWidth(e);this.iframe.style.width=Math.max(e,0)+"px"}if(Ext.isNumber(c)){var a=c-this.wrap.getFrameWidth("tb")-this.tb.el.getHeight();this.el.setHeight(a);this.iframe.style.height=Math.max(a,0)+"px";var d=this.getEditorBody();if(d){d.style.height=Math.max((a-(this.iframePad*2)),0)+"px"}}}},toggleSourceEdit:function(b){var d,a;if(b===undefined){b=!this.sourceEditMode}this.sourceEditMode=b===true;var c=this.tb.getComponent("sourceedit");if(c.pressed!==this.sourceEditMode){c.toggle(this.sourceEditMode);if(!c.xtbHidden){return}}if(this.sourceEditMode){this.previousSize=this.getSize();d=Ext.get(this.iframe).getHeight();this.disableItems(true);this.syncValue();this.iframe.className="x-hidden";this.el.removeClass("x-hidden");this.el.dom.removeAttribute("tabIndex");this.el.focus();this.el.dom.style.height=d+"px"}else{a=parseInt(this.el.dom.style.height,10);if(this.initialized){this.disableItems(this.readOnly)}this.pushValue();this.iframe.className="";this.el.addClass("x-hidden");this.el.dom.setAttribute("tabIndex",-1);this.deferFocus();this.setSize(this.previousSize);delete this.previousSize;this.iframe.style.height=a+"px"}this.fireEvent("editmodechange",this,this.sourceEditMode)},createLink:function(){var a=prompt(this.createLinkText,this.defaultLinkValue);if(a&&a!="http://"){this.relayCmd("createlink",a)}},initEvents:function(){this.originalValue=this.getValue()},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,setValue:function(a){Ext.form.HtmlEditor.superclass.setValue.call(this,a);this.pushValue();return this},cleanHtml:function(a){a=String(a);if(Ext.isWebKit){a=a.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,"")}if(a.charCodeAt(0)==this.defaultValue.replace(/\D/g,"")){a=a.substring(1)}return a},syncValue:function(){if(this.initialized){var d=this.getEditorBody();var c=d.innerHTML;if(Ext.isWebKit){var b=d.getAttribute("style");var a=b.match(/text-align:(.*?);/i);if(a&&a[1]){c='
    '+c+"
    "}}c=this.cleanHtml(c);if(this.fireEvent("beforesync",this,c)!==false){this.el.dom.value=c;this.fireEvent("sync",this,c)}}},getValue:function(){this[this.sourceEditMode?"pushValue":"syncValue"]();return Ext.form.HtmlEditor.superclass.getValue.call(this)},pushValue:function(){if(this.initialized){var a=this.el.dom.value;if(!this.activated&&a.length<1){a=this.defaultValue}if(this.fireEvent("beforepush",this,a)!==false){this.getEditorBody().innerHTML=a;if(Ext.isGecko){this.setDesignMode(false);this.setDesignMode(true)}this.fireEvent("push",this,a)}}},deferFocus:function(){this.focus.defer(10,this)},focus:function(){if(this.win&&!this.sourceEditMode){this.win.focus()}else{this.el.focus()}},initEditor:function(){try{var c=this.getEditorBody(),a=this.el.getStyles("font-size","font-family","background-image","background-repeat","background-color","color"),g,b;a["background-attachment"]="fixed";c.bgProperties="fixed";Ext.DomHelper.applyStyles(c,a);g=this.getDoc();if(g){try{Ext.EventManager.removeAll(g)}catch(d){}}b=this.onEditorEvent.createDelegate(this);Ext.EventManager.on(g,{mousedown:b,dblclick:b,click:b,keyup:b,buffer:100});if(Ext.isGecko){Ext.EventManager.on(g,"keypress",this.applyCommand,this)}if(Ext.isIE||Ext.isWebKit||Ext.isOpera){Ext.EventManager.on(g,"keydown",this.fixKeys,this)}g.editorInitialized=true;this.initialized=true;this.pushValue();this.setReadOnly(this.readOnly);this.fireEvent("initialize",this)}catch(d){}},beforeDestroy:function(){if(this.monitorTask){Ext.TaskMgr.stop(this.monitorTask)}if(this.rendered){Ext.destroy(this.tb);var b=this.getDoc();if(b){try{Ext.EventManager.removeAll(b);for(var c in b){delete b[c]}}catch(a){}}if(this.wrap){this.wrap.dom.innerHTML="";this.wrap.remove()}}Ext.form.HtmlEditor.superclass.beforeDestroy.call(this)},onFirstFocus:function(){this.activated=true;this.disableItems(this.readOnly);if(Ext.isGecko){this.win.focus();var a=this.win.getSelection();if(!a.focusNode||a.focusNode.nodeType!=3){var b=a.getRangeAt(0);b.selectNodeContents(this.getEditorBody());b.collapse(true);this.deferFocus()}try{this.execCmd("useCSS",true);this.execCmd("styleWithCSS",false)}catch(c){}}this.fireEvent("activate",this)},adjustFont:function(b){var d=b.getItemId()=="increasefontsize"?1:-1,c=this.getDoc(),a=parseInt(c.queryCommandValue("FontSize")||2,10);if((Ext.isSafari&&!Ext.isSafari2)||Ext.isChrome||Ext.isAir){if(a<=10){a=1+d}else{if(a<=13){a=2+d}else{if(a<=16){a=3+d}else{if(a<=18){a=4+d}else{if(a<=24){a=5+d}else{a=6+d}}}}}a=a.constrain(1,6)}else{if(Ext.isSafari){d*=2}a=Math.max(1,a+d)+(Ext.isSafari?"px":0)}this.execCmd("FontSize",a)},onEditorEvent:function(a){this.updateToolbar()},updateToolbar:function(){if(this.readOnly){return}if(!this.activated){this.onFirstFocus();return}var b=this.tb.items.map,c=this.getDoc();if(this.enableFont&&!Ext.isSafari2){var a=(c.queryCommandValue("FontName")||this.defaultFont).toLowerCase();if(a!=this.fontSelect.dom.value){this.fontSelect.dom.value=a}}if(this.enableFormat){b.bold.toggle(c.queryCommandState("bold"));b.italic.toggle(c.queryCommandState("italic"));b.underline.toggle(c.queryCommandState("underline"))}if(this.enableAlignments){b.justifyleft.toggle(c.queryCommandState("justifyleft"));b.justifycenter.toggle(c.queryCommandState("justifycenter"));b.justifyright.toggle(c.queryCommandState("justifyright"))}if(!Ext.isSafari2&&this.enableLists){b.insertorderedlist.toggle(c.queryCommandState("insertorderedlist"));b.insertunorderedlist.toggle(c.queryCommandState("insertunorderedlist"))}Ext.menu.MenuMgr.hideAll();this.syncValue()},relayBtnCmd:function(a){this.relayCmd(a.getItemId())},relayCmd:function(b,a){(function(){this.focus();this.execCmd(b,a);this.updateToolbar()}).defer(10,this)},execCmd:function(b,a){var c=this.getDoc();c.execCommand(b,false,a===undefined?null:a);this.syncValue()},applyCommand:function(b){if(b.ctrlKey){var d=b.getCharCode(),a;if(d>0){d=String.fromCharCode(d);switch(d){case"b":a="bold";break;case"i":a="italic";break;case"u":a="underline";break}if(a){this.win.focus();this.execCmd(a);this.deferFocus();b.preventDefault()}}}},insertAtCursor:function(c){if(!this.activated){return}if(Ext.isIE){this.win.focus();var b=this.getDoc(),a=b.selection.createRange();if(a){a.pasteHTML(c);this.syncValue();this.deferFocus()}}else{this.win.focus();this.execCmd("InsertHTML",c);this.deferFocus()}},fixKeys:function(){if(Ext.isIE){return function(g){var a=g.getKey(),d=this.getDoc(),b;if(a==g.TAB){g.stopEvent();b=d.selection.createRange();if(b){b.collapse(true);b.pasteHTML("    ");this.deferFocus()}}else{if(a==g.ENTER){b=d.selection.createRange();if(b){var c=b.parentElement();if(!c||c.tagName.toLowerCase()!="li"){g.stopEvent();b.pasteHTML("
    ");b.collapse(false);b.select()}}}}}}else{if(Ext.isOpera){return function(b){var a=b.getKey();if(a==b.TAB){b.stopEvent();this.win.focus();this.execCmd("InsertHTML","    ");this.deferFocus()}}}else{if(Ext.isWebKit){return function(b){var a=b.getKey();if(a==b.TAB){b.stopEvent();this.execCmd("InsertText","\t");this.deferFocus()}else{if(a==b.ENTER){b.stopEvent();this.execCmd("InsertHtml","

    ");this.deferFocus()}}}}}}}(),getToolbar:function(){return this.tb},buttonTips:{bold:{title:"Bold (Ctrl+B)",text:"Make the selected text bold.",cls:"x-html-editor-tip"},italic:{title:"Italic (Ctrl+I)",text:"Make the selected text italic.",cls:"x-html-editor-tip"},underline:{title:"Underline (Ctrl+U)",text:"Underline the selected text.",cls:"x-html-editor-tip"},increasefontsize:{title:"Grow Text",text:"Increase the font size.",cls:"x-html-editor-tip"},decreasefontsize:{title:"Shrink Text",text:"Decrease the font size.",cls:"x-html-editor-tip"},backcolor:{title:"Text Highlight Color",text:"Change the background color of the selected text.",cls:"x-html-editor-tip"},forecolor:{title:"Font Color",text:"Change the color of the selected text.",cls:"x-html-editor-tip"},justifyleft:{title:"Align Text Left",text:"Align text to the left.",cls:"x-html-editor-tip"},justifycenter:{title:"Center Text",text:"Center text in the editor.",cls:"x-html-editor-tip"},justifyright:{title:"Align Text Right",text:"Align text to the right.",cls:"x-html-editor-tip"},insertunorderedlist:{title:"Bullet List",text:"Start a bulleted list.",cls:"x-html-editor-tip"},insertorderedlist:{title:"Numbered List",text:"Start a numbered list.",cls:"x-html-editor-tip"},createlink:{title:"Hyperlink",text:"Make the selected text a hyperlink.",cls:"x-html-editor-tip"},sourceedit:{title:"Source Edit",text:"Switch to source editing mode.",cls:"x-html-editor-tip"}}});Ext.reg("htmleditor",Ext.form.HtmlEditor);Ext.form.TimeField=Ext.extend(Ext.form.ComboBox,{minValue:undefined,maxValue:undefined,minText:"The time in this field must be equal to or after {0}",maxText:"The time in this field must be equal to or before {0}",invalidText:"{0} is not a valid time",format:"g:i A",altFormats:"g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",increment:15,mode:"local",triggerAction:"all",typeAhead:false,initDate:"1/1/2008",initDateFormat:"j/n/Y",initComponent:function(){if(Ext.isDefined(this.minValue)){this.setMinValue(this.minValue,true)}if(Ext.isDefined(this.maxValue)){this.setMaxValue(this.maxValue,true)}if(!this.store){this.generateStore(true)}Ext.form.TimeField.superclass.initComponent.call(this)},setMinValue:function(b,a){this.setLimit(b,true,a);return this},setMaxValue:function(b,a){this.setLimit(b,false,a);return this},generateStore:function(b){var c=this.minValue||new Date(this.initDate).clearTime(),a=this.maxValue||new Date(this.initDate).clearTime().add("mi",(24*60)-1),d=[];while(c<=a){d.push(c.dateFormat(this.format));c=c.add("mi",this.increment)}this.bindStore(d,b)},setLimit:function(b,g,a){var e;if(Ext.isString(b)){e=this.parseDate(b)}else{if(Ext.isDate(b)){e=b}}if(e){var c=new Date(this.initDate).clearTime();c.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds());this[g?"minValue":"maxValue"]=c;if(!a){this.generateStore()}}},getValue:function(){var a=Ext.form.TimeField.superclass.getValue.call(this);return this.formatDate(this.parseDate(a))||""},setValue:function(a){return Ext.form.TimeField.superclass.setValue.call(this,this.formatDate(this.parseDate(a)))},validateValue:Ext.form.DateField.prototype.validateValue,formatDate:Ext.form.DateField.prototype.formatDate,parseDate:function(h){if(!h||Ext.isDate(h)){return h}var j=this.initDate+" ",g=this.initDateFormat+" ",b=Date.parseDate(j+h,g+this.format),c=this.altFormats;if(!b&&c){if(!this.altFormatsArray){this.altFormatsArray=c.split("|")}for(var e=0,d=this.altFormatsArray,a=d.length;e=0){if(!d){c=g-1}d=false;while(c>=0){if(e.call(j||this,k,c,i)===true){return[k,c]}c--}k--}}else{if(c>=g){k++;d=false}while(k','
    ','
    ','
    ','
    {header}
    ',"
    ",'
    ',"
    ",'
    ','
    {body}
    ','',"
    ","
    ",'
     
    ','
     
    ',""),headerTpl:new Ext.Template('',"",'{cells}',"","
    "),bodyTpl:new Ext.Template("{rows}"),cellTpl:new Ext.Template('','
    {value}
    ',""),initTemplates:function(){var c=this.templates||{},d,b,g=new Ext.Template('','
    ',this.grid.enableHdMenu?'':"","{value}",'',"
    ",""),a=['','','
    {body}
    ',"",""].join(""),e=['',"","{cells}",this.enableRowBody?a:"","","
    "].join("");Ext.applyIf(c,{hcell:g,cell:this.cellTpl,body:this.bodyTpl,header:this.headerTpl,master:this.masterTpl,row:new Ext.Template('
    '+e+"
    "),rowInner:new Ext.Template(e)});for(b in c){d=c[b];if(d&&Ext.isFunction(d.compile)&&!d.compiled){d.disableFormats=true;d.compile()}}this.templates=c;this.colRe=new RegExp("x-grid3-td-([^\\s]+)","")},fly:function(a){if(!this._flyweight){this._flyweight=new Ext.Element.Flyweight(document.body)}this._flyweight.dom=a;return this._flyweight},getEditorParent:function(){return this.scroller.dom},initElements:function(){var b=Ext.Element,d=Ext.get(this.grid.getGridEl().dom.firstChild),e=new b(d.child("div.x-grid3-viewport")),c=new b(e.child("div.x-grid3-header")),a=new b(e.child("div.x-grid3-scroller"));if(this.grid.hideHeaders){c.setDisplayed(false)}if(this.forceFit){a.setStyle("overflow-x","hidden")}Ext.apply(this,{el:d,mainWrap:e,scroller:a,mainHd:c,innerHd:c.child("div.x-grid3-header-inner").dom,mainBody:new b(b.fly(a).child("div.x-grid3-body")),focusEl:new b(b.fly(a).child("a")),resizeMarker:new b(d.child("div.x-grid3-resize-marker")),resizeProxy:new b(d.child("div.x-grid3-resize-proxy"))});this.focusEl.swallowEvent("click",true)},getRows:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},findCell:function(a){if(!a){return false}return this.fly(a).findParent(this.cellSelector,this.cellSelectorDepth)},findCellIndex:function(d,c){var b=this.findCell(d),a;if(b){a=this.fly(b).hasClass(c);if(!c||a){return this.getCellIndex(b)}}return false},getCellIndex:function(b){if(b){var a=b.className.match(this.colRe);if(a&&a[1]){return this.cm.getIndexById(a[1])}}return false},findHeaderCell:function(b){var a=this.findCell(b);return a&&this.fly(a).hasClass(this.hdCls)?a:null},findHeaderIndex:function(a){return this.findCellIndex(a,this.hdCls)},findRow:function(a){if(!a){return false}return this.fly(a).findParent(this.rowSelector,this.rowSelectorDepth)},findRowIndex:function(a){var b=this.findRow(a);return b?b.rowIndex:false},findRowBody:function(a){if(!a){return false}return this.fly(a).findParent(this.rowBodySelector,this.rowBodySelectorDepth)},getRow:function(a){return this.getRows()[a]},getCell:function(b,a){return Ext.fly(this.getRow(b)).query(this.cellSelector)[a]},getHeaderCell:function(a){return this.mainHd.dom.getElementsByTagName("td")[a]},addRowClass:function(b,a){var c=this.getRow(b);if(c){this.fly(c).addClass(a)}},removeRowClass:function(c,a){var b=this.getRow(c);if(b){this.fly(b).removeClass(a)}},removeRow:function(a){Ext.removeNode(this.getRow(a));this.syncFocusEl(a)},removeRows:function(c,a){var b=this.mainBody.dom,d;for(d=c;d<=a;d++){Ext.removeNode(b.childNodes[c])}this.syncFocusEl(c)},getScrollState:function(){var a=this.scroller.dom;return{left:a.scrollLeft,top:a.scrollTop}},restoreScroll:function(a){var b=this.scroller.dom;b.scrollLeft=a.left;b.scrollTop=a.top},scrollToTop:function(){var a=this.scroller.dom;a.scrollTop=0;a.scrollLeft=0},syncScroll:function(){this.syncHeaderScroll();var a=this.scroller.dom;this.grid.fireEvent("bodyscroll",a.scrollLeft,a.scrollTop)},syncHeaderScroll:function(){var a=this.innerHd,b=this.scroller.dom.scrollLeft;a.scrollLeft=b;a.scrollLeft=b},updateSortIcon:function(d,c){var a=this.sortClasses,b=a[c=="DESC"?1:0],e=this.mainHd.select("td").removeClass(a);e.item(d).addClass(b)},updateAllColumnWidths:function(){var e=this.getTotalWidth(),k=this.cm.getColumnCount(),m=this.getRows(),g=m.length,b=[],l,a,h,d,c;for(d=0;d=this.ds.getCount()){return null}d=(d!==undefined?d:0);var c=this.getRow(h),b=this.cm,e=b.getColumnCount(),a;if(!(g===false&&d===0)){while(dm){n.scrollTop=q-a}}if(e!==false){var l=parseInt(h.offsetLeft,10),j=l+h.offsetWidth,i=parseInt(n.scrollLeft,10),b=i+n.clientWidth;if(lb){n.scrollLeft=j-n.clientWidth}}}return this.getResolvedXY(r)},insertRows:function(a,i,e,h){var d=a.getCount()-1;if(!h&&i===0&&e>=d){this.fireEvent("beforerowsinserted",this,i,e);this.refresh();this.fireEvent("rowsinserted",this,i,e)}else{if(!h){this.fireEvent("beforerowsinserted",this,i,e)}var b=this.renderRows(i,e),g=this.getRow(i);if(g){if(i===0){Ext.fly(this.getRow(0)).removeClass(this.firstRowCls)}Ext.DomHelper.insertHtml("beforeBegin",g,b)}else{var c=this.getRow(d-1);if(c){Ext.fly(c).removeClass(this.lastRowCls)}Ext.DomHelper.insertHtml("beforeEnd",this.mainBody.dom,b)}if(!h){this.processRows(i);this.fireEvent("rowsinserted",this,i,e)}else{if(i===0||i>=d){Ext.fly(this.getRow(i)).addClass(i===0?this.firstRowCls:this.lastRowCls)}}}this.syncFocusEl(i)},deleteRows:function(a,c,b){if(a.getRowCount()<1){this.refresh()}else{this.fireEvent("beforerowsdeleted",this,c,b);this.removeRows(c,b);this.processRows(c);this.fireEvent("rowsdeleted",this,c,b)}},getColumnStyle:function(b,d){var a=this.cm,g=a.config,c=d?"":g[b].css||"",e=g[b].align;c+=String.format("width: {0};",this.getColumnWidth(b));if(a.isHidden(b)){c+="display: none; "}if(e){c+=String.format("text-align: {0};",e)}return c},getColumnWidth:function(b){var c=this.cm.getColumnWidth(b),a=this.borderWidth;if(Ext.isNumber(c)){if(Ext.isBorderBox||(Ext.isWebKit&&!Ext.isSafari2)){return c+"px"}else{return Math.max(c-a,0)+"px"}}else{return c}},getTotalWidth:function(){return this.cm.getTotalWidth()+"px"},fitColumns:function(g,j,h){var a=this.grid,l=this.cm,s=l.getTotalWidth(false),q=this.getGridInnerWidth(),r=q-s,c=[],o=0,n=0,u,d,p;if(q<20||r===0){return false}var e=l.getColumnCount(true),m=l.getColumnCount(false),b=e-(Ext.isNumber(h)?1:0);if(b===0){b=1;h=undefined}for(p=0;pq){var t=(b==e)?o:h,k=Math.max(1,l.getColumnWidth(t)-(s-q));l.setColumnWidth(t,k,true)}if(g!==true){this.updateAllColumnWidths()}return true},autoExpand:function(k){var a=this.grid,i=this.cm,e=this.getGridInnerWidth(),c=i.getTotalWidth(false),g=a.autoExpandColumn;if(!this.userResized&&g){if(e!=c){var j=i.getIndexById(g),b=i.getColumnWidth(j),h=e-c+b,d=Math.min(Math.max(h,a.autoExpandMin),a.autoExpandMax);if(b!=d){i.setColumnWidth(j,d,true);if(k!==true){this.updateColumnWidth(j,d)}}}}},getGridInnerWidth:function(){return this.grid.getGridEl().getWidth(true)-this.getScrollOffset()},getColumnData:function(){var e=[],c=this.cm,g=c.getColumnCount(),a=this.ds.fields,d,b;for(d=0;d'+this.emptyText+"")}},updateHeaderSortState:function(){var b=this.ds.getSortState();if(!b){return}if(!this.sortState||(this.sortState.field!=b.field||this.sortState.direction!=b.direction)){this.grid.fireEvent("sortchange",this.grid,b)}this.sortState=b;var c=this.cm.findColumnIndex(b.field);if(c!=-1){var a=b.direction;this.updateSortIcon(c,a)}},clearHeaderSortState:function(){if(!this.sortState){return}this.grid.fireEvent("sortchange",this.grid,null);this.mainHd.select("td").removeClass(this.sortClasses);delete this.sortState},destroy:function(){var j=this,a=j.grid,d=a.getGridEl(),i=j.dragZone,g=j.splitZone,h=j.columnDrag,e=j.columnDrop,k=j.scrollToTopTask,c,b;if(k&&k.cancel){k.cancel()}Ext.destroyMembers(j,"colMenu","hmenu");j.initData(null,null);j.purgeListeners();Ext.fly(j.innerHd).un("click",j.handleHdDown,j);if(a.enableColumnMove){c=h.dragData;b=h.proxy;Ext.destroy(h.el,b.ghost,b.el,e.el,e.proxyTop,e.proxyBottom,c.ddel,c.header);if(b.anim){Ext.destroy(b.anim)}delete b.ghost;delete c.ddel;delete c.header;h.destroy();delete Ext.dd.DDM.locationCache[h.id];delete h._domRef;delete e.proxyTop;delete e.proxyBottom;e.destroy();delete Ext.dd.DDM.locationCache["gridHeader"+d.id];delete e._domRef;delete Ext.dd.DDM.ids[e.ddGroup]}if(g){g.destroy();delete g._domRef;delete Ext.dd.DDM.ids["gridSplitters"+d.id]}Ext.fly(j.innerHd).removeAllListeners();Ext.removeNode(j.innerHd);delete j.innerHd;Ext.destroy(j.el,j.mainWrap,j.mainHd,j.scroller,j.mainBody,j.focusEl,j.resizeMarker,j.resizeProxy,j.activeHdBtn,j._flyweight,i,g);delete a.container;if(i){i.destroy()}Ext.dd.DDM.currentTarget=null;delete Ext.dd.DDM.locationCache[d.id];Ext.EventManager.removeResizeListener(j.onWindowResize,j)},onDenyColumnHide:function(){},render:function(){if(this.autoFill){var a=this.grid.ownerCt;if(a&&a.getLayout()){a.on("afterlayout",function(){this.fitColumns(true,true);this.updateHeaders();this.updateHeaderSortState()},this,{single:true})}}else{if(this.forceFit){this.fitColumns(true,false)}else{if(this.grid.autoExpandColumn){this.autoExpand(true)}}}this.grid.getGridEl().dom.innerHTML=this.renderUI();this.afterRenderUI()},initData:function(a,e){var b=this;if(b.ds){var d=b.ds;d.un("add",b.onAdd,b);d.un("load",b.onLoad,b);d.un("clear",b.onClear,b);d.un("remove",b.onRemove,b);d.un("update",b.onUpdate,b);d.un("datachanged",b.onDataChange,b);if(d!==a&&d.autoDestroy){d.destroy()}}if(a){a.on({scope:b,load:b.onLoad,add:b.onAdd,remove:b.onRemove,update:b.onUpdate,clear:b.onClear,datachanged:b.onDataChange})}if(b.cm){var c=b.cm;c.un("configchange",b.onColConfigChange,b);c.un("widthchange",b.onColWidthChange,b);c.un("headerchange",b.onHeaderChange,b);c.un("hiddenchange",b.onHiddenChange,b);c.un("columnmoved",b.onColumnMove,b)}if(e){delete b.lastViewWidth;e.on({scope:b,configchange:b.onColConfigChange,widthchange:b.onColWidthChange,headerchange:b.onHeaderChange,hiddenchange:b.onHiddenChange,columnmoved:b.onColumnMove})}b.ds=a;b.cm=e},onDataChange:function(){this.refresh(true);this.updateHeaderSortState();this.syncFocusEl(0)},onClear:function(){this.refresh();this.syncFocusEl(0)},onUpdate:function(b,a){this.refreshRow(a)},onAdd:function(b,a,c){this.insertRows(b,c,c+(a.length-1))},onRemove:function(b,a,c,d){if(d!==true){this.fireEvent("beforerowremoved",this,c,a)}this.removeRow(c);if(d!==true){this.processRows(c);this.applyEmptyText();this.fireEvent("rowremoved",this,c,a)}},onLoad:function(){if(Ext.isGecko){if(!this.scrollToTopTask){this.scrollToTopTask=new Ext.util.DelayedTask(this.scrollToTop,this)}this.scrollToTopTask.delay(1)}else{this.scrollToTop()}},onColWidthChange:function(a,b,c){this.updateColumnWidth(b,c)},onHeaderChange:function(a,b,c){this.updateHeaders()},onHiddenChange:function(a,b,c){this.updateColumnHidden(b,c)},onColumnMove:function(a,c,b){this.indexMap=null;this.refresh(true);this.restoreScroll(this.getScrollState());this.afterMove(b);this.grid.fireEvent("columnmove",c,b)},onColConfigChange:function(){delete this.lastViewWidth;this.indexMap=null;this.refresh(true)},initUI:function(a){a.on("headerclick",this.onHeaderClick,this)},initEvents:Ext.emptyFn,onHeaderClick:function(b,a){if(this.headersDisabled||!this.cm.isSortable(a)){return}b.stopEditing(true);b.store.sort(this.cm.getDataIndex(a))},onRowOver:function(b,a){var c=this.findRowIndex(a);if(c!==false){this.addRowClass(c,this.rowOverCls)}},onRowOut:function(b,a){var c=this.findRowIndex(a);if(c!==false&&!b.within(this.getRow(c),true)){this.removeRowClass(c,this.rowOverCls)}},onRowSelect:function(a){this.addRowClass(a,this.selectedRowClass)},onRowDeselect:function(a){this.removeRowClass(a,this.selectedRowClass)},onCellSelect:function(c,b){var a=this.getCell(c,b);if(a){this.fly(a).addClass("x-grid3-cell-selected")}},onCellDeselect:function(c,b){var a=this.getCell(c,b);if(a){this.fly(a).removeClass("x-grid3-cell-selected")}},handleWheel:function(a){a.stopPropagation()},onColumnSplitterMoved:function(a,b){this.userResized=true;this.grid.colModel.setColumnWidth(a,b,true);if(this.forceFit){this.fitColumns(true,false,a);this.updateAllColumnWidths()}else{this.updateColumnWidth(a,b);this.syncHeaderScroll()}this.grid.fireEvent("columnresize",a,b)},beforeColMenuShow:function(){var b=this.cm,d=b.getColumnCount(),a=this.colMenu,c;a.removeAll();for(c=0;c0){if(!this.cm.isHidden(a-1)){return a}a--}return undefined},handleHdOver:function(c,b){var d=this.findHeaderCell(b);if(d&&!this.headersDisabled){var a=this.fly(d);this.activeHdRef=b;this.activeHdIndex=this.getCellIndex(d);this.activeHdRegion=a.getRegion();if(!this.isMenuDisabled(this.activeHdIndex,a)){a.addClass("x-grid3-hd-over");this.activeHdBtn=a.child(".x-grid3-hd-btn");if(this.activeHdBtn){this.activeHdBtn.dom.style.height=(d.firstChild.offsetHeight-1)+"px"}}}},handleHdOut:function(b,a){var c=this.findHeaderCell(a);if(c&&(!Ext.isIE||!b.within(c,true))){this.activeHdRef=null;this.fly(c).removeClass("x-grid3-hd-over");c.style.cursor=""}},isMenuDisabled:function(a,b){return this.cm.isMenuDisabled(a)},hasRows:function(){var a=this.mainBody.dom.firstChild;return a&&a.nodeType==1&&a.className!="x-grid-empty"},isHideableColumn:function(a){return !a.hidden},bind:function(a,b){this.initData(a,b)}});Ext.grid.GridView.SplitDragZone=Ext.extend(Ext.dd.DDProxy,{constructor:function(a,b){this.grid=a;this.view=a.getView();this.marker=this.view.resizeMarker;this.proxy=this.view.resizeProxy;Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this,b,"gridSplitters"+this.grid.getGridEl().id,{dragElId:Ext.id(this.proxy.dom),resizeFrame:false});this.scroll=false;this.hw=this.view.splitHandleWidth||5},b4StartDrag:function(a,e){this.dragHeadersDisabled=this.view.headersDisabled;this.view.headersDisabled=true;var d=this.view.mainWrap.getHeight();this.marker.setHeight(d);this.marker.show();this.marker.alignTo(this.view.getHeaderCell(this.cellIndex),"tl-tl",[-2,0]);this.proxy.setHeight(d);var b=this.cm.getColumnWidth(this.cellIndex),c=Math.max(b-this.grid.minColumnWidth,0);this.resetConstraints();this.setXConstraint(c,1000);this.setYConstraint(0,0);this.minX=a-c;this.maxX=a+1000;this.startPos=a;Ext.dd.DDProxy.prototype.b4StartDrag.call(this,a,e)},allowHeaderDrag:function(a){return true},handleMouseDown:function(a){var h=this.view.findHeaderCell(a.getTarget());if(h&&this.allowHeaderDrag(a)){var k=this.view.fly(h).getXY(),c=k[0],i=a.getXY(),b=i[0],g=h.offsetWidth,d=false;if((b-c)<=this.hw){d=-1}else{if((c+g)-b<=this.hw){d=0}}if(d!==false){this.cm=this.grid.colModel;var j=this.view.getCellIndex(h);if(d==-1){if(j+d<0){return}while(this.cm.isHidden(j+d)){--d;if(j+d<0){return}}}this.cellIndex=j+d;this.split=h.dom;if(this.cm.isResizable(this.cellIndex)&&!this.cm.isFixed(this.cellIndex)){Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown.apply(this,arguments)}}else{if(this.view.columnDrag){this.view.columnDrag.callHandleMouseDown(a)}}}},endDrag:function(g){this.marker.hide();var a=this.view,c=Math.max(this.minX,g.getPageX()),d=c-this.startPos,b=this.dragHeadersDisabled;a.onColumnSplitterMoved(this.cellIndex,this.cm.getColumnWidth(this.cellIndex)+d);setTimeout(function(){a.headersDisabled=b},50)},autoOffset:function(){this.setDelta(0,0)}});Ext.grid.PivotGridView=Ext.extend(Ext.grid.GridView,{colHeaderCellCls:"grid-hd-group-cell",title:"",getColumnHeaders:function(){return this.grid.topAxis.buildHeaders()},getRowHeaders:function(){return this.grid.leftAxis.buildHeaders()},renderRows:function(a,t){var b=this.grid,o=b.extractData(),p=o.length,g=this.templates,s=b.renderer,h=typeof s=="function",w=this.getCellCls,n=typeof w=="function",d=g.cell,x=g.row,k=[],q={},c="width:"+this.getGridInnerWidth()+"px;",l,r,e,v,m;a=a||0;t=Ext.isDefined(t)?t:p-1;for(v=0;v','
    ','
    ','
    {title}
    ','
    ','
    ',"
    ",'
    ',"
    ",'
    ','
    ','
    {body}
    ','',"
    ","
    ",'
     
    ','
     
    ',""),initTemplates:function(){Ext.grid.PivotGridView.superclass.initTemplates.apply(this,arguments);var a=this.templates||{};if(!a.gcell){a.gcell=new Ext.XTemplate('','
    ',this.grid.enableHdMenu?'':"","{value}","
    ","")}this.templates=a;this.hrowRe=new RegExp("ux-grid-hd-group-row-(\\d+)","")},initElements:function(){Ext.grid.PivotGridView.superclass.initElements.apply(this,arguments);this.rowHeadersEl=new Ext.Element(this.scroller.child("div.x-grid3-row-headers"));this.headerTitleEl=new Ext.Element(this.mainHd.child("div.x-grid3-header-title"))},getGridInnerWidth:function(){var a=Ext.grid.PivotGridView.superclass.getGridInnerWidth.apply(this,arguments);return a-this.getTotalRowHeaderWidth()},getTotalRowHeaderWidth:function(){var d=this.getRowHeaders(),c=d.length,b=0,a;for(a=0;a0&&d>0){h=h||o.data[a[g-1].dataIndex]!=l[d-1].data[a[g-1].dataIndex]}if(h){s.push({header:q,span:p,start:b});b+=p;p=0}if(k){s.push({header:n,span:p+1,start:b});b+=p;p=0}q=n;p++}c.push({items:s,width:e.width||this.defaultHeaderWidth});q=undefined}return c}});Ext.grid.HeaderDragZone=Ext.extend(Ext.dd.DragZone,{maxDragWidth:120,constructor:function(a,c,b){this.grid=a;this.view=a.getView();this.ddGroup="gridHeader"+this.grid.getGridEl().id;Ext.grid.HeaderDragZone.superclass.constructor.call(this,c);if(b){this.setHandleElId(Ext.id(c));this.setOuterHandleElId(Ext.id(b))}this.scroll=false},getDragData:function(c){var a=Ext.lib.Event.getTarget(c),b=this.view.findHeaderCell(a);if(b){return{ddel:b.firstChild,header:b}}return false},onInitDrag:function(a){this.dragHeadersDisabled=this.view.headersDisabled;this.view.headersDisabled=true;var b=this.dragData.ddel.cloneNode(true);b.id=Ext.id();b.style.width=Math.min(this.dragData.header.offsetWidth,this.maxDragWidth)+"px";this.proxy.update(b);return true},afterValidDrop:function(){this.completeDrop()},afterInvalidDrop:function(){this.completeDrop()},completeDrop:function(){var a=this.view,b=this.dragHeadersDisabled;setTimeout(function(){a.headersDisabled=b},50)}});Ext.grid.HeaderDropZone=Ext.extend(Ext.dd.DropZone,{proxyOffsets:[-4,-9],fly:Ext.Element.fly,constructor:function(a,c,b){this.grid=a;this.view=a.getView();this.proxyTop=Ext.DomHelper.append(document.body,{cls:"col-move-top",html:" "},true);this.proxyBottom=Ext.DomHelper.append(document.body,{cls:"col-move-bottom",html:" "},true);this.proxyTop.hide=this.proxyBottom.hide=function(){this.setLeftTop(-100,-100);this.setStyle("visibility","hidden")};this.ddGroup="gridHeader"+this.grid.getGridEl().id;Ext.grid.HeaderDropZone.superclass.constructor.call(this,a.getGridEl().dom)},getTargetFromEvent:function(c){var a=Ext.lib.Event.getTarget(c),b=this.view.findCellIndex(a);if(b!==false){return this.view.getHeaderCell(b)}},nextVisible:function(c){var b=this.view,a=this.grid.colModel;c=c.nextSibling;while(c){if(!a.isHidden(b.getCellIndex(c))){return c}c=c.nextSibling}return null},prevVisible:function(c){var b=this.view,a=this.grid.colModel;c=c.prevSibling;while(c){if(!a.isHidden(b.getCellIndex(c))){return c}c=c.prevSibling}return null},positionIndicator:function(d,k,j){var a=Ext.lib.Event.getPageX(j),g=Ext.lib.Dom.getRegion(k.firstChild),c,i,b=g.top+this.proxyOffsets[1];if((g.right-a)<=(g.right-g.left)/2){c=g.right+this.view.borderWidth;i="after"}else{c=g.left;i="before"}if(this.grid.colModel.isFixed(this.view.getCellIndex(k))){return false}c+=this.proxyOffsets[0];this.proxyTop.setLeftTop(c,b);this.proxyTop.show();if(!this.bottomOffset){this.bottomOffset=this.view.mainHd.getHeight()}this.proxyBottom.setLeftTop(c,b+this.proxyTop.dom.offsetHeight+this.bottomOffset);this.proxyBottom.show();return i},onNodeEnter:function(d,a,c,b){if(b.header!=d){this.positionIndicator(b.header,d,c)}},onNodeOver:function(g,b,d,c){var a=false;if(c.header!=g){a=this.positionIndicator(c.header,g,d)}if(!a){this.proxyTop.hide();this.proxyBottom.hide()}return a?this.dropAllowed:this.dropNotAllowed},onNodeOut:function(d,a,c,b){this.proxyTop.hide();this.proxyBottom.hide()},onNodeDrop:function(b,m,g,c){var d=c.header;if(d!=b){var k=this.grid.colModel,j=Ext.lib.Event.getPageX(g),a=Ext.lib.Dom.getRegion(b.firstChild),o=(a.right-j)<=((a.right-a.left)/2)?"after":"before",i=this.view.getCellIndex(d),l=this.view.getCellIndex(b);if(o=="after"){l++}if(i=0&&this.config[a].resizable!==false&&this.config[a].fixed!==true},setHidden:function(a,b){var d=this.config[a];if(d.hidden!==b){d.hidden=b;this.totalWidth=null;this.fireEvent("hiddenchange",this,a,b)}},setEditor:function(a,b){this.config[a].setEditor(b)},destroy:function(){var b=this.config.length,a=0;for(;a0},isSelected:function(a){var b=Ext.isNumber(a)?this.grid.store.getAt(a):a;return(b&&this.selections.key(b.id)?true:false)},isIdSelected:function(a){return(this.selections.key(a)?true:false)},handleMouseDown:function(d,i,h){if(h.button!==0||this.isLocked()){return}var a=this.grid.getView();if(h.shiftKey&&!this.singleSelect&&this.last!==false){var c=this.last;this.selectRange(c,i,h.ctrlKey);this.last=c;a.focusRow(i)}else{var b=this.isSelected(i);if(h.ctrlKey&&b){this.deselectRow(i)}else{if(!b||this.getCount()>1){this.selectRow(i,h.ctrlKey||h.shiftKey);a.focusRow(i)}}}},selectRows:function(c,d){if(!d){this.clearSelections()}for(var b=0,a=c.length;b=a;c--){this.selectRow(c,true)}}},deselectRange:function(c,b,a){if(this.isLocked()){return}for(var d=c;d<=b;d++){this.deselectRow(d,a)}},selectRow:function(b,d,a){if(this.isLocked()||(b<0||b>=this.grid.store.getCount())||(d&&this.isSelected(b))){return}var c=this.grid.store.getAt(b);if(c&&this.fireEvent("beforerowselect",this,b,d,c)!==false){if(!d||this.singleSelect){this.clearSelections()}this.selections.add(c);this.last=this.lastActive=b;if(!a){this.grid.getView().onRowSelect(b)}if(!this.silent){this.fireEvent("rowselect",this,b,c);this.fireEvent("selectionchange",this)}}},deselectRow:function(b,a){if(this.isLocked()){return}if(this.last==b){this.last=false}if(this.lastActive==b){this.lastActive=false}var c=this.grid.store.getAt(b);if(c){this.selections.remove(c);if(!a){this.grid.getView().onRowDeselect(b)}this.fireEvent("rowdeselect",this,b,c);this.fireEvent("selectionchange",this)}},acceptsNav:function(c,b,a){return !a.isHidden(b)&&a.isCellEditable(b,c)},onEditorKey:function(n,l){var d=l.getKey(),h,i=this.grid,p=i.lastEdit,j=i.activeEditor,b=l.shiftKey,o,p,a,m;if(d==l.TAB){l.stopEvent();j.completeEdit();if(b){h=i.walkCells(j.row,j.col-1,-1,this.acceptsNav,this)}else{h=i.walkCells(j.row,j.col+1,1,this.acceptsNav,this)}}else{if(d==l.ENTER){if(this.moveEditorOnEnter!==false){if(b){h=i.walkCells(p.row-1,p.col,-1,this.acceptsNav,this)}else{h=i.walkCells(p.row+1,p.col,1,this.acceptsNav,this)}}}}if(h){a=h[0];m=h[1];this.onEditorSelect(a,p.row);if(i.isEditor&&i.editing){o=i.activeEditor;if(o&&o.field.triggerBlur){o.field.triggerBlur()}}i.startEditing(a,m)}},onEditorSelect:function(b,a){if(a!=b){this.selectRow(b)}},destroy:function(){Ext.destroy(this.rowNav);this.rowNav=null;Ext.grid.RowSelectionModel.superclass.destroy.call(this)}});Ext.grid.Column=Ext.extend(Ext.util.Observable,{isColumn:true,constructor:function(b){Ext.apply(this,b);if(Ext.isString(this.renderer)){this.renderer=Ext.util.Format[this.renderer]}else{if(Ext.isObject(this.renderer)){this.scope=this.renderer.scope;this.renderer=this.renderer.fn}}if(!this.scope){this.scope=this}var a=this.editor;delete this.editor;this.setEditor(a);this.addEvents("click","contextmenu","dblclick","mousedown");Ext.grid.Column.superclass.constructor.call(this)},processEvent:function(b,d,c,g,a){return this.fireEvent(b,this,c,g,d)},destroy:function(){if(this.setEditor){this.setEditor(null)}this.purgeListeners()},renderer:function(a){return a},getEditor:function(a){return this.editable!==false?this.editor:null},setEditor:function(b){var a=this.editor;if(a){if(a.gridEditor){a.gridEditor.destroy();delete a.gridEditor}else{a.destroy()}}this.editor=null;if(b){if(!b.isXType){b=Ext.create(b,"textfield")}this.editor=b}},getCellEditor:function(b){var a=this.getEditor(b);if(a){if(!a.startEdit){if(!a.gridEditor){a.gridEditor=new Ext.grid.GridEditor(a)}a=a.gridEditor}}return a}});Ext.grid.BooleanColumn=Ext.extend(Ext.grid.Column,{trueText:"true",falseText:"false",undefinedText:" ",constructor:function(a){Ext.grid.BooleanColumn.superclass.constructor.call(this,a);var c=this.trueText,d=this.falseText,b=this.undefinedText;this.renderer=function(e){if(e===undefined){return b}if(!e||e==="false"){return d}return c}}});Ext.grid.NumberColumn=Ext.extend(Ext.grid.Column,{format:"0,000.00",constructor:function(a){Ext.grid.NumberColumn.superclass.constructor.call(this,a);this.renderer=Ext.util.Format.numberRenderer(this.format)}});Ext.grid.DateColumn=Ext.extend(Ext.grid.Column,{format:"m/d/Y",constructor:function(a){Ext.grid.DateColumn.superclass.constructor.call(this,a);this.renderer=Ext.util.Format.dateRenderer(this.format)}});Ext.grid.TemplateColumn=Ext.extend(Ext.grid.Column,{constructor:function(a){Ext.grid.TemplateColumn.superclass.constructor.call(this,a);var b=(!Ext.isPrimitive(this.tpl)&&this.tpl.compile)?this.tpl:new Ext.XTemplate(this.tpl);this.renderer=function(d,e,c){return b.apply(c.data)};this.tpl=b}});Ext.grid.ActionColumn=Ext.extend(Ext.grid.Column,{header:" ",actionIdRe:/x-action-col-(\d+)/,altText:"",constructor:function(b){var g=this,c=b.items||(g.items=[g]),a=c.length,d,e;Ext.grid.ActionColumn.superclass.constructor.call(g,b);g.renderer=function(h,i){h=Ext.isFunction(b.renderer)?b.renderer.apply(this,arguments)||"":"";i.css+=" x-action-col-cell";for(d=0;d"}return h}},destroy:function(){delete this.items;delete this.renderer;return Ext.grid.ActionColumn.superclass.destroy.apply(this,arguments)},processEvent:function(c,i,d,j,b){var a=i.getTarget().className.match(this.actionIdRe),h,g;if(a&&(h=this.items[parseInt(a[1],10)])){if(c=="click"){(g=h.handler||this.handler)&&g.call(h.scope||this.scope||this,d,j,b,h,i)}else{if((c=="mousedown")&&(h.stopSelection!==false)){return false}}}return Ext.grid.ActionColumn.superclass.processEvent.apply(this,arguments)}});Ext.grid.Column.types={gridcolumn:Ext.grid.Column,booleancolumn:Ext.grid.BooleanColumn,numbercolumn:Ext.grid.NumberColumn,datecolumn:Ext.grid.DateColumn,templatecolumn:Ext.grid.TemplateColumn,actioncolumn:Ext.grid.ActionColumn};Ext.grid.RowNumberer=Ext.extend(Object,{header:"",width:23,sortable:false,constructor:function(a){Ext.apply(this,a);if(this.rowspan){this.renderer=this.renderer.createDelegate(this)}},fixed:true,hideable:false,menuDisabled:true,dataIndex:"",id:"numberer",rowspan:undefined,renderer:function(b,c,a,d){if(this.rowspan){c.cellAttr='rowspan="'+this.rowspan+'"'}return d+1}});Ext.grid.CheckboxSelectionModel=Ext.extend(Ext.grid.RowSelectionModel,{header:'
     
    ',width:20,sortable:false,menuDisabled:true,fixed:true,hideable:false,dataIndex:"",id:"checker",isColumn:true,constructor:function(){Ext.grid.CheckboxSelectionModel.superclass.constructor.apply(this,arguments);if(this.checkOnly){this.handleMouseDown=Ext.emptyFn}},initEvents:function(){Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);this.grid.on("render",function(){Ext.fly(this.grid.getView().innerHd).on("mousedown",this.onHdMouseDown,this)},this)},processEvent:function(b,d,c,g,a){if(b=="mousedown"){this.onMouseDown(d,d.getTarget());return false}else{return Ext.grid.Column.prototype.processEvent.apply(this,arguments)}},onMouseDown:function(c,b){if(c.button===0&&b.className=="x-grid3-row-checker"){c.stopEvent();var d=c.getTarget(".x-grid3-row");if(d){var a=d.rowIndex;if(this.isSelected(a)){this.deselectRow(a)}else{this.selectRow(a,true);this.grid.getView().focusRow(a)}}}},onHdMouseDown:function(c,a){if(a.className=="x-grid3-hd-checker"){c.stopEvent();var b=Ext.fly(a.parentNode);var d=b.hasClass("x-grid3-hd-checker-on");if(d){b.removeClass("x-grid3-hd-checker-on");this.clearSelections()}else{b.addClass("x-grid3-hd-checker-on");this.selectAll()}}},renderer:function(b,c,a){return'
     
    '},onEditorSelect:function(b,a){if(a!=b&&!this.checkOnly){this.selectRow(b)}}});Ext.grid.CellSelectionModel=Ext.extend(Ext.grid.AbstractSelectionModel,{constructor:function(a){Ext.apply(this,a);this.selection=null;this.addEvents("beforecellselect","cellselect","selectionchange");Ext.grid.CellSelectionModel.superclass.constructor.call(this)},initEvents:function(){this.grid.on("cellmousedown",this.handleMouseDown,this);this.grid.on(Ext.EventManager.getKeyEvent(),this.handleKeyDown,this);this.grid.getView().on({scope:this,refresh:this.onViewChange,rowupdated:this.onRowUpdated,beforerowremoved:this.clearSelections,beforerowsinserted:this.clearSelections});if(this.grid.isEditor){this.grid.on("beforeedit",this.beforeEdit,this)}},beforeEdit:function(a){this.select(a.row,a.column,false,true,a.record)},onRowUpdated:function(a,b,c){if(this.selection&&this.selection.record==c){a.onCellSelect(b,this.selection.cell[1])}},onViewChange:function(){this.clearSelections(true)},getSelectedCell:function(){return this.selection?this.selection.cell:null},clearSelections:function(b){var a=this.selection;if(a){if(b!==true){this.grid.view.onCellDeselect(a.cell[0],a.cell[1])}this.selection=null;this.fireEvent("selectionchange",this,null)}},hasSelection:function(){return this.selection?true:false},handleMouseDown:function(b,d,a,c){if(c.button!==0||this.isLocked()){return}this.select(d,a)},select:function(g,c,b,e,d){if(this.fireEvent("beforecellselect",this,g,c)!==false){this.clearSelections();d=d||this.grid.store.getAt(g);this.selection={record:d,cell:[g,c]};if(!b){var a=this.grid.getView();a.onCellSelect(g,c);if(e!==true){a.focusCell(g,c)}}this.fireEvent("cellselect",this,g,c);this.fireEvent("selectionchange",this,this.selection)}},isSelectable:function(c,b,a){return !a.isHidden(b)},onEditorKey:function(b,a){if(a.getKey()==a.TAB){this.handleKeyDown(a)}},handleKeyDown:function(j){if(!j.isNavKeyPress()){return}var d=j.getKey(),i=this.grid,p=this.selection,b=this,m=function(g,c,e){return i.walkCells(g,c,e,i.isEditor&&i.editing?b.acceptsNav:b.isSelectable,b)},o,h,a,l,n;switch(d){case j.ESC:case j.PAGE_UP:case j.PAGE_DOWN:break;default:j.stopEvent();break}if(!p){o=m(0,0,1);if(o){this.select(o[0],o[1])}return}o=p.cell;a=o[0];l=o[1];switch(d){case j.TAB:if(j.shiftKey){h=m(a,l-1,-1)}else{h=m(a,l+1,1)}break;case j.DOWN:h=m(a+1,l,1);break;case j.UP:h=m(a-1,l,-1);break;case j.RIGHT:h=m(a,l+1,1);break;case j.LEFT:h=m(a,l-1,-1);break;case j.ENTER:if(i.isEditor&&!i.editing){i.startEditing(a,l);return}break}if(h){a=h[0];l=h[1];this.select(a,l);if(i.isEditor&&i.editing){n=i.activeEditor;if(n&&n.field.triggerBlur){n.field.triggerBlur()}i.startEditing(a,l)}}},acceptsNav:function(c,b,a){return !a.isHidden(b)&&a.isCellEditable(b,c)}});Ext.grid.EditorGridPanel=Ext.extend(Ext.grid.GridPanel,{clicksToEdit:2,forceValidation:false,isEditor:true,detectEdit:false,autoEncode:false,trackMouseOver:false,initComponent:function(){Ext.grid.EditorGridPanel.superclass.initComponent.call(this);if(!this.selModel){this.selModel=new Ext.grid.CellSelectionModel()}this.activeEditor=null;this.addEvents("beforeedit","afteredit","validateedit")},initEvents:function(){Ext.grid.EditorGridPanel.superclass.initEvents.call(this);this.getGridEl().on("mousewheel",this.stopEditing.createDelegate(this,[true]),this);this.on("columnresize",this.stopEditing,this,[true]);if(this.clicksToEdit==1){this.on("cellclick",this.onCellDblClick,this)}else{var a=this.getView();if(this.clicksToEdit=="auto"&&a.mainBody){a.mainBody.on("mousedown",this.onAutoEditClick,this)}this.on("celldblclick",this.onCellDblClick,this)}},onResize:function(){Ext.grid.EditorGridPanel.superclass.onResize.apply(this,arguments);var a=this.activeEditor;if(this.editing&&a){a.realign(true)}},onCellDblClick:function(b,c,a){this.startEditing(c,a)},onAutoEditClick:function(c,b){if(c.button!==0){return}var g=this.view.findRowIndex(b),a=this.view.findCellIndex(b);if(g!==false&&a!==false){this.stopEditing();if(this.selModel.getSelectedCell){var d=this.selModel.getSelectedCell();if(d&&d[0]===g&&d[1]===a){this.startEditing(g,a)}}else{if(this.selModel.isSelected(g)){this.startEditing(g,a)}}}},onEditComplete:function(b,d,a){this.editing=false;this.lastActiveEditor=this.activeEditor;this.activeEditor=null;var c=b.record,h=this.colModel.getDataIndex(b.col);d=this.postEditValue(d,a,c,h);if(this.forceValidation===true||String(d)!==String(a)){var g={grid:this,record:c,field:h,originalValue:a,value:d,row:b.row,column:b.col,cancel:false};if(this.fireEvent("validateedit",g)!==false&&!g.cancel&&String(d)!==String(a)){c.set(h,g.value);delete g.cancel;this.fireEvent("afteredit",g)}}this.view.focusCell(b.row,b.col)},startEditing:function(i,c){this.stopEditing();if(this.colModel.isCellEditable(c,i)){this.view.ensureVisible(i,c,true);var d=this.store.getAt(i),h=this.colModel.getDataIndex(c),g={grid:this,record:d,field:h,value:d.data[h],row:i,column:c,cancel:false};if(this.fireEvent("beforeedit",g)!==false&&!g.cancel){this.editing=true;var b=this.colModel.getCellEditor(c,i);if(!b){return}if(!b.rendered){b.parentEl=this.view.getEditorParent(b);b.on({scope:this,render:{fn:function(e){e.field.focus(false,true)},single:true,scope:this},specialkey:function(k,j){this.getSelectionModel().onEditorKey(k,j)},complete:this.onEditComplete,canceledit:this.stopEditing.createDelegate(this,[true])})}Ext.apply(b,{row:i,col:c,record:d});this.lastEdit={row:i,col:c};this.activeEditor=b;b.selectSameEditor=(this.activeEditor==this.lastActiveEditor);var a=this.preEditValue(d,h);b.startEdit(this.view.getCell(i,c).firstChild,Ext.isDefined(a)?a:"");(function(){delete b.selectSameEditor}).defer(50)}}},preEditValue:function(a,c){var b=a.data[c];return this.autoEncode&&Ext.isString(b)?Ext.util.Format.htmlDecode(b):b},postEditValue:function(c,a,b,d){return this.autoEncode&&Ext.isString(c)?Ext.util.Format.htmlEncode(c):c},stopEditing:function(b){if(this.editing){var a=this.lastActiveEditor=this.activeEditor;if(a){a[b===true?"cancelEdit":"completeEdit"]();this.view.focusCell(a.row,a.col)}this.activeEditor=null}this.editing=false}});Ext.reg("editorgrid",Ext.grid.EditorGridPanel);Ext.grid.GridEditor=function(b,a){Ext.grid.GridEditor.superclass.constructor.call(this,b,a);b.monitorTab=false};Ext.extend(Ext.grid.GridEditor,Ext.Editor,{alignment:"tl-tl",autoSize:"width",hideEl:false,cls:"x-small-editor x-grid-editor",shim:false,shadow:false});Ext.grid.PropertyRecord=Ext.data.Record.create([{name:"name",type:"string"},"value"]);Ext.grid.PropertyStore=Ext.extend(Ext.util.Observable,{constructor:function(a,b){this.grid=a;this.store=new Ext.data.Store({recordType:Ext.grid.PropertyRecord});this.store.on("update",this.onUpdate,this);if(b){this.setSource(b)}Ext.grid.PropertyStore.superclass.constructor.call(this)},setSource:function(c){this.source=c;this.store.removeAll();var b=[];for(var a in c){if(this.isEditableValue(c[a])){b.push(new Ext.grid.PropertyRecord({name:a,value:c[a]},a))}}this.store.loadRecords({records:b},{},true)},onUpdate:function(e,a,d){if(d==Ext.data.Record.EDIT){var b=a.data.value;var c=a.modified.value;if(this.grid.fireEvent("beforepropertychange",this.source,a.id,b,c)!==false){this.source[a.id]=b;a.commit();this.grid.fireEvent("propertychange",this.source,a.id,b,c)}else{a.reject()}}},getProperty:function(a){return this.store.getAt(a)},isEditableValue:function(a){return Ext.isPrimitive(a)||Ext.isDate(a)},setValue:function(d,c,a){var b=this.getRec(d);if(b){b.set("value",c);this.source[d]=c}else{if(a){this.source[d]=c;b=new Ext.grid.PropertyRecord({name:d,value:c},d);this.store.add(b)}}},remove:function(b){var a=this.getRec(b);if(a){this.store.remove(a);delete this.source[b]}},getRec:function(a){return this.store.getById(a)},getSource:function(){return this.source}});Ext.grid.PropertyColumnModel=Ext.extend(Ext.grid.ColumnModel,{nameText:"Name",valueText:"Value",dateFormat:"m/j/Y",trueText:"true",falseText:"false",constructor:function(c,b){var d=Ext.grid,e=Ext.form;this.grid=c;d.PropertyColumnModel.superclass.constructor.call(this,[{header:this.nameText,width:50,sortable:true,dataIndex:"name",id:"name",menuDisabled:true},{header:this.valueText,width:50,resizable:false,dataIndex:"value",id:"value",menuDisabled:true}]);this.store=b;var a=new e.Field({autoCreate:{tag:"select",children:[{tag:"option",value:"true",html:this.trueText},{tag:"option",value:"false",html:this.falseText}]},getValue:function(){return this.el.dom.value=="true"}});this.editors={date:new d.GridEditor(new e.DateField({selectOnFocus:true})),string:new d.GridEditor(new e.TextField({selectOnFocus:true})),number:new d.GridEditor(new e.NumberField({selectOnFocus:true,style:"text-align:left;"})),"boolean":new d.GridEditor(a,{autoSize:"both"})};this.renderCellDelegate=this.renderCell.createDelegate(this);this.renderPropDelegate=this.renderProp.createDelegate(this)},renderDate:function(a){return a.dateFormat(this.dateFormat)},renderBool:function(a){return this[a?"trueText":"falseText"]},isCellEditable:function(a,b){return a==1},getRenderer:function(a){return a==1?this.renderCellDelegate:this.renderPropDelegate},renderProp:function(a){return this.getPropertyName(a)},renderCell:function(d,b,c){var a=this.grid.customRenderers[c.get("name")];if(a){return a.apply(this,arguments)}var e=d;if(Ext.isDate(d)){e=this.renderDate(d)}else{if(typeof d=="boolean"){e=this.renderBool(d)}}return Ext.util.Format.htmlEncode(e)},getPropertyName:function(b){var a=this.grid.propertyNames;return a&&a[b]?a[b]:b},getCellEditor:function(a,e){var b=this.store.getProperty(e),d=b.data.name,c=b.data.value;if(this.grid.customEditors[d]){return this.grid.customEditors[d]}if(Ext.isDate(c)){return this.editors.date}else{if(typeof c=="number"){return this.editors.number}else{if(typeof c=="boolean"){return this.editors["boolean"]}else{return this.editors.string}}}},destroy:function(){Ext.grid.PropertyColumnModel.superclass.destroy.call(this);this.destroyEditors(this.editors);this.destroyEditors(this.grid.customEditors)},destroyEditors:function(b){for(var a in b){Ext.destroy(b[a])}}});Ext.grid.PropertyGrid=Ext.extend(Ext.grid.EditorGridPanel,{enableColumnMove:false,stripeRows:false,trackMouseOver:false,clicksToEdit:1,enableHdMenu:false,viewConfig:{forceFit:true},initComponent:function(){this.customRenderers=this.customRenderers||{};this.customEditors=this.customEditors||{};this.lastEditRow=null;var b=new Ext.grid.PropertyStore(this);this.propStore=b;var a=new Ext.grid.PropertyColumnModel(this,b);b.store.sort("name","ASC");this.addEvents("beforepropertychange","propertychange");this.cm=a;this.ds=b.store;Ext.grid.PropertyGrid.superclass.initComponent.call(this);this.mon(this.selModel,"beforecellselect",function(e,d,c){if(c===0){this.startEditing.defer(200,this,[d,1]);return false}},this)},onRender:function(){Ext.grid.PropertyGrid.superclass.onRender.apply(this,arguments);this.getGridEl().addClass("x-props-grid")},afterRender:function(){Ext.grid.PropertyGrid.superclass.afterRender.apply(this,arguments);if(this.source){this.setSource(this.source)}},setSource:function(a){this.propStore.setSource(a)},getSource:function(){return this.propStore.getSource()},setProperty:function(c,b,a){this.propStore.setValue(c,b,a)},removeProperty:function(a){this.propStore.remove(a)}});Ext.reg("propertygrid",Ext.grid.PropertyGrid);Ext.grid.GroupingView=Ext.extend(Ext.grid.GridView,{groupByText:"Group By This Field",showGroupsText:"Show in Groups",hideGroupedColumn:false,showGroupName:true,startCollapsed:false,enableGrouping:true,enableGroupingMenu:true,enableNoGroups:true,emptyGroupText:"(None)",ignoreAdd:false,groupTextTpl:"{text}",groupMode:"value",cancelEditOnToggle:true,initTemplates:function(){Ext.grid.GroupingView.superclass.initTemplates.call(this);this.state={};var a=this.grid.getSelectionModel();a.on(a.selectRow?"beforerowselect":"beforecellselect",this.onBeforeRowSelect,this);if(!this.startGroup){this.startGroup=new Ext.XTemplate('
    ','
    ',this.groupTextTpl,"
    ",'
    ')}this.startGroup.compile();if(!this.endGroup){this.endGroup="
    "}},findGroup:function(a){return Ext.fly(a).up(".x-grid-group",this.mainBody.dom)},getGroups:function(){return this.hasRows()?this.mainBody.dom.childNodes:[]},onAdd:function(d,a,b){if(this.canGroup()&&!this.ignoreAdd){var c=this.getScrollState();this.fireEvent("beforerowsinserted",d,b,b+(a.length-1));this.refresh();this.restoreScroll(c);this.fireEvent("rowsinserted",d,b,b+(a.length-1))}else{if(!this.canGroup()){Ext.grid.GroupingView.superclass.onAdd.apply(this,arguments)}}},onRemove:function(e,a,b,d){Ext.grid.GroupingView.superclass.onRemove.apply(this,arguments);var c=document.getElementById(a._groupId);if(c&&c.childNodes[1].childNodes.length<1){Ext.removeNode(c)}this.applyEmptyText()},refreshRow:function(a){if(this.ds.getCount()==1){this.refresh()}else{this.isUpdating=true;Ext.grid.GroupingView.superclass.refreshRow.apply(this,arguments);this.isUpdating=false}},beforeMenuShow:function(){var c,a=this.hmenu.items,b=this.cm.config[this.hdCtxIndex].groupable===false;if((c=a.get("groupBy"))){c.setDisabled(b)}if((c=a.get("showGroups"))){c.setDisabled(b);c.setChecked(this.canGroup(),true)}},renderUI:function(){var a=Ext.grid.GroupingView.superclass.renderUI.call(this);if(this.enableGroupingMenu&&this.hmenu){this.hmenu.add("-",{itemId:"groupBy",text:this.groupByText,handler:this.onGroupByClick,scope:this,iconCls:"x-group-by-icon"});if(this.enableNoGroups){this.hmenu.add({itemId:"showGroups",text:this.showGroupsText,checked:true,checkHandler:this.onShowGroupsClick,scope:this})}this.hmenu.on("beforeshow",this.beforeMenuShow,this)}return a},processEvent:function(b,i){Ext.grid.GroupingView.superclass.processEvent.call(this,b,i);var h=i.getTarget(".x-grid-group-hd",this.mainBody);if(h){var g=this.getGroupField(),d=this.getPrefix(g),a=h.id.substring(d.length),c=new RegExp("gp-"+Ext.escapeRe(g)+"--hd");a=a.substr(0,a.length-3);if(a||c.test(h.id)){this.grid.fireEvent("group"+b,this.grid,g,a,i)}if(b=="mousedown"&&i.button==0){this.toggleGroup(h.parentNode)}}},onGroupByClick:function(){var a=this.grid;this.enableGrouping=true;a.store.groupBy(this.cm.getDataIndex(this.hdCtxIndex));a.fireEvent("groupchange",a,a.store.getGroupState());this.beforeMenuShow();this.refresh()},onShowGroupsClick:function(a,b){this.enableGrouping=b;if(b){this.onGroupByClick()}else{this.grid.store.clearGrouping();this.grid.fireEvent("groupchange",this,null)}},toggleRowIndex:function(c,a){if(!this.canGroup()){return}var b=this.getRow(c);if(b){this.toggleGroup(this.findGroup(b),a)}},toggleGroup:function(c,b){var a=Ext.get(c),d=Ext.util.Format.htmlEncode(a.id);b=Ext.isDefined(b)?b:a.hasClass("x-grid-group-collapsed");if(this.state[d]!==b){if(this.cancelEditOnToggle!==false){this.grid.stopEditing(true)}this.state[d]=b;a[b?"removeClass":"addClass"]("x-grid-group-collapsed")}},toggleAllGroups:function(c){var b=this.getGroups();for(var d=0,a=b.length;d