the Python server
No files matched your search
@@ -0,0 +1,260 @@
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright (c) 2006 Zope Foundation and Contributors.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# This software is subject to the provisions of the Zope Public License,
|
||||
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
|
||||
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
|
||||
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE.
|
||||
#
|
||||
##############################################################################
|
||||
"""Bootstrap a buildout-based project
|
||||
|
||||
Simply run this script in a directory containing a buildout.cfg.
|
||||
The script accepts buildout command-line options, so you can
|
||||
use the -c option to specify an alternate configuration file.
|
||||
"""
|
||||
|
||||
import os, shutil, sys, tempfile, textwrap, urllib, urllib2, subprocess
|
||||
from optparse import OptionParser
|
||||
|
||||
if sys.platform == 'win32':
|
||||
def quote(c):
|
||||
if ' ' in c:
|
||||
return '"%s"' % c # work around spawn lamosity on windows
|
||||
else:
|
||||
return c
|
||||
else:
|
||||
quote = str
|
||||
|
||||
# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
|
||||
stdout, stderr = subprocess.Popen(
|
||||
[sys.executable, '-Sc',
|
||||
'try:\n'
|
||||
' import ConfigParser\n'
|
||||
'except ImportError:\n'
|
||||
' print 1\n'
|
||||
'else:\n'
|
||||
' print 0\n'],
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
|
||||
has_broken_dash_S = bool(int(stdout.strip()))
|
||||
|
||||
# In order to be more robust in the face of system Pythons, we want to
|
||||
# run without site-packages loaded. This is somewhat tricky, in
|
||||
# particular because Python 2.6's distutils imports site, so starting
|
||||
# with the -S flag is not sufficient. However, we'll start with that:
|
||||
if not has_broken_dash_S and 'site' in sys.modules:
|
||||
# We will restart with python -S.
|
||||
args = sys.argv[:]
|
||||
args[0:0] = [sys.executable, '-S']
|
||||
args = map(quote, args)
|
||||
os.execv(sys.executable, args)
|
||||
# Now we are running with -S. We'll get the clean sys.path, import site
|
||||
# because distutils will do it later, and then reset the path and clean
|
||||
# out any namespace packages from site-packages that might have been
|
||||
# loaded by .pth files.
|
||||
clean_path = sys.path[:]
|
||||
import site
|
||||
sys.path[:] = clean_path
|
||||
for k, v in sys.modules.items():
|
||||
if k in ('setuptools', 'pkg_resources') or (
|
||||
hasattr(v, '__path__') and
|
||||
len(v.__path__)==1 and
|
||||
not os.path.exists(os.path.join(v.__path__[0],'__init__.py'))):
|
||||
# This is a namespace package. Remove it.
|
||||
sys.modules.pop(k)
|
||||
|
||||
is_jython = sys.platform.startswith('java')
|
||||
|
||||
setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py'
|
||||
distribute_source = 'http://python-distribute.org/distribute_setup.py'
|
||||
|
||||
# parsing arguments
|
||||
def normalize_to_url(option, opt_str, value, parser):
|
||||
if value:
|
||||
if '://' not in value: # It doesn't smell like a URL.
|
||||
value = 'file://%s' % (
|
||||
urllib.pathname2url(
|
||||
os.path.abspath(os.path.expanduser(value))),)
|
||||
if opt_str == '--download-base' and not value.endswith('/'):
|
||||
# Download base needs a trailing slash to make the world happy.
|
||||
value += '/'
|
||||
else:
|
||||
value = None
|
||||
name = opt_str[2:].replace('-', '_')
|
||||
setattr(parser.values, name, value)
|
||||
|
||||
usage = '''\
|
||||
[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
|
||||
|
||||
Bootstraps a buildout-based project.
|
||||
|
||||
Simply run this script in a directory containing a buildout.cfg, using the
|
||||
Python that you want bin/buildout to use.
|
||||
|
||||
Note that by using --setup-source and --download-base to point to
|
||||
local resources, you can keep this script from going over the network.
|
||||
'''
|
||||
|
||||
parser = OptionParser(usage=usage)
|
||||
parser.add_option("-v", "--version", dest="version",
|
||||
help="use a specific zc.buildout version")
|
||||
parser.add_option("-d", "--distribute",
|
||||
action="store_true", dest="use_distribute", default=False,
|
||||
help="Use Distribute rather than Setuptools.")
|
||||
parser.add_option("--setup-source", action="callback", dest="setup_source",
|
||||
callback=normalize_to_url, nargs=1, type="string",
|
||||
help=("Specify a URL or file location for the setup file. "
|
||||
"If you use Setuptools, this will default to " +
|
||||
setuptools_source + "; if you use Distribute, this "
|
||||
"will default to " + distribute_source +"."))
|
||||
parser.add_option("--download-base", action="callback", dest="download_base",
|
||||
callback=normalize_to_url, nargs=1, type="string",
|
||||
help=("Specify a URL or directory for downloading "
|
||||
"zc.buildout and either Setuptools or Distribute. "
|
||||
"Defaults to PyPI."))
|
||||
parser.add_option("--eggs",
|
||||
help=("Specify a directory for storing eggs. Defaults to "
|
||||
"a temporary directory that is deleted when the "
|
||||
"bootstrap script completes."))
|
||||
parser.add_option("-t", "--accept-buildout-test-releases",
|
||||
dest='accept_buildout_test_releases',
|
||||
action="store_true", default=False,
|
||||
help=("Normally, if you do not specify a --version, the "
|
||||
"bootstrap script and buildout gets the newest "
|
||||
"*final* versions of zc.buildout and its recipes and "
|
||||
"extensions for you. If you use this flag, "
|
||||
"bootstrap and buildout will get the newest releases "
|
||||
"even if they are alphas or betas."))
|
||||
parser.add_option("-c", None, action="store", dest="config_file",
|
||||
help=("Specify the path to the buildout configuration "
|
||||
"file to be used."))
|
||||
|
||||
options, args = parser.parse_args()
|
||||
|
||||
# if -c was provided, we push it back into args for buildout's main function
|
||||
if options.config_file is not None:
|
||||
args += ['-c', options.config_file]
|
||||
|
||||
if options.eggs:
|
||||
eggs_dir = os.path.abspath(os.path.expanduser(options.eggs))
|
||||
else:
|
||||
eggs_dir = tempfile.mkdtemp()
|
||||
|
||||
if options.setup_source is None:
|
||||
if options.use_distribute:
|
||||
options.setup_source = distribute_source
|
||||
else:
|
||||
options.setup_source = setuptools_source
|
||||
|
||||
if options.accept_buildout_test_releases:
|
||||
args.append('buildout:accept-buildout-test-releases=true')
|
||||
args.append('bootstrap')
|
||||
|
||||
try:
|
||||
import pkg_resources
|
||||
import setuptools # A flag. Sometimes pkg_resources is installed alone.
|
||||
if not hasattr(pkg_resources, '_distribute'):
|
||||
raise ImportError
|
||||
except ImportError:
|
||||
ez_code = urllib2.urlopen(
|
||||
options.setup_source).read().replace('\r\n', '\n')
|
||||
ez = {}
|
||||
exec ez_code in ez
|
||||
setup_args = dict(to_dir=eggs_dir, download_delay=0)
|
||||
if options.download_base:
|
||||
setup_args['download_base'] = options.download_base
|
||||
if options.use_distribute:
|
||||
setup_args['no_fake'] = True
|
||||
ez['use_setuptools'](**setup_args)
|
||||
if 'pkg_resources' in sys.modules:
|
||||
reload(sys.modules['pkg_resources'])
|
||||
import pkg_resources
|
||||
# This does not (always?) update the default working set. We will
|
||||
# do it.
|
||||
for path in sys.path:
|
||||
if path not in pkg_resources.working_set.entries:
|
||||
pkg_resources.working_set.add_entry(path)
|
||||
|
||||
cmd = [quote(sys.executable),
|
||||
'-c',
|
||||
quote('from setuptools.command.easy_install import main; main()'),
|
||||
'-mqNxd',
|
||||
quote(eggs_dir)]
|
||||
|
||||
if not has_broken_dash_S:
|
||||
cmd.insert(1, '-S')
|
||||
|
||||
find_links = options.download_base
|
||||
if not find_links:
|
||||
find_links = os.environ.get('bootstrap-testing-find-links')
|
||||
if find_links:
|
||||
cmd.extend(['-f', quote(find_links)])
|
||||
|
||||
if options.use_distribute:
|
||||
setup_requirement = 'distribute'
|
||||
else:
|
||||
setup_requirement = 'setuptools'
|
||||
ws = pkg_resources.working_set
|
||||
setup_requirement_path = ws.find(
|
||||
pkg_resources.Requirement.parse(setup_requirement)).location
|
||||
env = dict(
|
||||
os.environ,
|
||||
PYTHONPATH=setup_requirement_path)
|
||||
|
||||
requirement = 'zc.buildout'
|
||||
version = options.version
|
||||
if version is None and not options.accept_buildout_test_releases:
|
||||
# Figure out the most recent final version of zc.buildout.
|
||||
import setuptools.package_index
|
||||
_final_parts = '*final-', '*final'
|
||||
def _final_version(parsed_version):
|
||||
for part in parsed_version:
|
||||
if (part[:1] == '*') and (part not in _final_parts):
|
||||
return False
|
||||
return True
|
||||
index = setuptools.package_index.PackageIndex(
|
||||
search_path=[setup_requirement_path])
|
||||
if find_links:
|
||||
index.add_find_links((find_links,))
|
||||
req = pkg_resources.Requirement.parse(requirement)
|
||||
if index.obtain(req) is not None:
|
||||
best = []
|
||||
bestv = None
|
||||
for dist in index[req.project_name]:
|
||||
distv = dist.parsed_version
|
||||
if _final_version(distv):
|
||||
if bestv is None or distv > bestv:
|
||||
best = [dist]
|
||||
bestv = distv
|
||||
elif distv == bestv:
|
||||
best.append(dist)
|
||||
if best:
|
||||
best.sort()
|
||||
version = best[-1].version
|
||||
if version:
|
||||
requirement = '=='.join((requirement, version))
|
||||
cmd.append(requirement)
|
||||
|
||||
if is_jython:
|
||||
import subprocess
|
||||
exitcode = subprocess.Popen(cmd, env=env).wait()
|
||||
else: # Windows prefers this, apparently; otherwise we would prefer subprocess
|
||||
exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env]))
|
||||
if exitcode != 0:
|
||||
sys.stdout.flush()
|
||||
sys.stderr.flush()
|
||||
print ("An error occurred when trying to install zc.buildout. "
|
||||
"Look above this message for any errors that "
|
||||
"were output by easy_install.")
|
||||
sys.exit(exitcode)
|
||||
|
||||
ws.add_entry(eggs_dir)
|
||||
ws.require(requirement)
|
||||
import zc.buildout.buildout
|
||||
zc.buildout.buildout.main(args)
|
||||
if not options.eggs: # clean up temporary egg directory
|
||||
shutil.rmtree(eggs_dir)
|
||||
@@ -0,0 +1,106 @@
|
||||
[buildout]
|
||||
newest = false
|
||||
|
||||
parts =
|
||||
dirs
|
||||
py
|
||||
paster
|
||||
supervisor
|
||||
mongodb
|
||||
mongodb-client-config
|
||||
mongodb-master-config
|
||||
|
||||
develop =
|
||||
src/sailing.db
|
||||
src/sailing.connector
|
||||
src/sailing.web
|
||||
|
||||
eggs =
|
||||
PasteScript
|
||||
sailing.db
|
||||
sailing.connector
|
||||
sailing.web
|
||||
|
||||
[conf]
|
||||
db_home = ${buildout:directory}/data/
|
||||
log_home= ${buildout:directory}/data/logs
|
||||
mongodb_master = localhost
|
||||
mongodb_host = localhost
|
||||
mongodb_port = 10200
|
||||
supervisord_host_port = 0.0.0.0:10001
|
||||
|
||||
[supervisor]
|
||||
recipe = collective.recipe.supervisor
|
||||
logfile = ${conf:log_home}/supervisord.log
|
||||
port = 12456
|
||||
user = admin
|
||||
password = admin
|
||||
loglevel = info
|
||||
programs =
|
||||
10 mongod ${buildout:bin-directory}/mongod [--config ${buildout:directory}/etc/mongodb-master.cfg] ${buildout:directory}
|
||||
|
||||
[dirs]
|
||||
recipe = z3c.recipe.mkdir
|
||||
paths =
|
||||
|
||||
[py]
|
||||
recipe = zc.recipe.egg
|
||||
eggs = ${buildout:eggs}
|
||||
interpreter = py
|
||||
scripts =
|
||||
trac_listener
|
||||
|
||||
[paster]
|
||||
recipe = zc.recipe.egg
|
||||
eggs = ${buildout:eggs}
|
||||
interpreter = py
|
||||
scripts =
|
||||
paster
|
||||
|
||||
[test]
|
||||
recipe = zc.recipe.testrunner
|
||||
defaults = ['-v']
|
||||
eggs =
|
||||
${buildout:eggs}
|
||||
script = test
|
||||
|
||||
[mongodb]
|
||||
recipe = rod.recipe.mongodb
|
||||
linux2-32bit-url = http://downloads.mongodb.org/linux/mongodb-linux-i686-1.8.1.tgz
|
||||
linux2-64bit-url = http://downloads.mongodb.org/linux/mongodb-linux-x86_64-1.8.1.tgz
|
||||
|
||||
[mongodb-client-config]
|
||||
recipe = collective.recipe.template
|
||||
input = templates/db.ini
|
||||
output = ${buildout:directory}/etc/db.ini
|
||||
|
||||
[mongodb-master-config]
|
||||
recipe = collective.recipe.template
|
||||
input = templates/mongodb-master.cfg
|
||||
output = ${buildout:directory}/etc/mongodb-master.cfg
|
||||
|
||||
[webserver-dev-config]
|
||||
recipe = collective.recipe.template
|
||||
input = templates/webserver-dev.ini
|
||||
output = ${buildout:directory}/etc/webserver-development.ini
|
||||
|
||||
[webserver-dev-runner]
|
||||
recipe = collective.recipe.template
|
||||
input = templates/app_debug.sh
|
||||
output = ${buildout:directory}/bin/debug.sh
|
||||
|
||||
[webserver-prod-config]
|
||||
recipe = collective.recipe.template
|
||||
input = templates/webserver-prod.ini
|
||||
output = ${buildout:directory}/etc/webserver-production.ini
|
||||
|
||||
[webserver-prod-runner-start]
|
||||
recipe = collective.recipe.template
|
||||
input = templates/app_production_start.sh
|
||||
output = ${buildout:directory}/bin/start.sh
|
||||
|
||||
[webserver-prod-runner-stop]
|
||||
recipe = collective.recipe.template
|
||||
input = templates/app_production_stop.sh
|
||||
output = ${buildout:directory}/bin/stop.sh
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
[buildout]
|
||||
extends = buildout.cfg
|
||||
|
||||
parts +=
|
||||
test
|
||||
webserver-dev-config
|
||||
webserver-dev-runner
|
||||
@@ -0,0 +1,10 @@
|
||||
[buildout]
|
||||
extends = buildout.cfg
|
||||
|
||||
eggs +=
|
||||
pastegevent
|
||||
|
||||
parts +=
|
||||
webserver-prod-config
|
||||
webserver-prod-runner-start
|
||||
webserver-prod-runner-stop
|
||||
@@ -0,0 +1,6 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
|
||||
|
||||
This product may contain traces of nuts.
|
||||
@@ -0,0 +1,7 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
1.0dev (unreleased)
|
||||
-------------------
|
||||
|
||||
- Initial release
|
||||
@@ -0,0 +1,6 @@
|
||||
# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
|
||||
try:
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
||||
except ImportError:
|
||||
from pkgutil import extend_path
|
||||
__path__ = extend_path(__path__, __name__)
|
||||
@@ -0,0 +1,84 @@
|
||||
|
||||
import cjson
|
||||
import urllib, urllib2
|
||||
|
||||
from sailing.web.util import get_abspath
|
||||
|
||||
import logging
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class URIConfigurator(object):
|
||||
|
||||
def __init__(self, host, port):
|
||||
self.host = host
|
||||
self.port = port
|
||||
|
||||
def copy(self):
|
||||
inst = URIConfigurator(self.host, self.port)
|
||||
inst.__dict__ = self.__dict__.copy()
|
||||
return inst
|
||||
|
||||
def key(self):
|
||||
return '%s:%s' % (self.host, self.port)
|
||||
|
||||
def clear(self):
|
||||
try:
|
||||
del self.__dict__['parameters']
|
||||
del self.__dict__['_parameters']
|
||||
except:
|
||||
pass
|
||||
|
||||
def setContext(self, context):
|
||||
self.clear()
|
||||
self.context = context
|
||||
|
||||
def setCommand(self, command):
|
||||
self.command = command
|
||||
|
||||
def setRace(self, race):
|
||||
self.race = race
|
||||
|
||||
def setParameters(self, parameters={}):
|
||||
if hasattr(self, 'command'):
|
||||
parameters['action'] = self.command
|
||||
|
||||
if hasattr(self, 'race') and self.race:
|
||||
parameters['eventname'] = self.race.event
|
||||
parameters['racename'] = self.race.name
|
||||
|
||||
self.parameters = urllib.urlencode(parameters)
|
||||
self._parameters = parameters
|
||||
|
||||
def hasParameter(self, name):
|
||||
return self._parameters.has_key(name)
|
||||
|
||||
def URI(self):
|
||||
if not hasattr(self, 'parameters'):
|
||||
# ensure that parameters are set correctly
|
||||
self.setParameters()
|
||||
|
||||
uri = 'http://%s:%s/%s?%s' % (self.host, self.port, self.context, self.parameters)
|
||||
return uri
|
||||
|
||||
def trigger(self, request=None):
|
||||
log.info('Triggering URI %s' % self.URI())
|
||||
return urllib2.urlopen(self.URI())
|
||||
|
||||
def jsonByUrl(configurator):
|
||||
""" Connects to specified REST service and returns parsed data """
|
||||
|
||||
# small hack to make tests easier
|
||||
if configurator.port is None:
|
||||
handle = open(get_abspath('sailing.web:tests/data/%s' % configurator.host), 'r')
|
||||
data = handle.read()
|
||||
handle.close()
|
||||
|
||||
else:
|
||||
data = configurator.trigger().read()
|
||||
|
||||
if data.find('Exception')>0:
|
||||
raise Exception, 'Java triggered exception: %s' % data[:350]
|
||||
|
||||
return cjson.decode(data.strip())
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
|
||||
import sys, threading, datetime, time
|
||||
|
||||
import cjson
|
||||
import urllib, urllib2
|
||||
|
||||
from sailing.db import database
|
||||
from sailing.db import model
|
||||
from sailing.connector import jsonByUrl
|
||||
|
||||
from sailing.web import config
|
||||
from sailing.connector import URIConfigurator
|
||||
|
||||
import logging
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
log = logging.getLogger('sailing.connector.run#main')
|
||||
|
||||
class LiveDataReceiver(threading.Thread):
|
||||
|
||||
def __init__(self, host, port, eventname, racename):
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.eventname = eventname
|
||||
self.racename = racename
|
||||
|
||||
self.last_update = None
|
||||
self.updatecount = 0
|
||||
|
||||
self.running = False
|
||||
self.paused = True
|
||||
|
||||
threading.Thread.__init__(self)
|
||||
|
||||
def run(self):
|
||||
log.info('START listener for %s:%s (%s, %s)' % (self.host, self.port, self.eventname, self.racename))
|
||||
self.running = True
|
||||
|
||||
lock = threading.Lock()
|
||||
while self.running is True:
|
||||
|
||||
# make it possible to pause listener
|
||||
if self.paused is True:
|
||||
time.sleep(1)
|
||||
continue
|
||||
|
||||
conf = URIConfigurator(self.host, self.port)
|
||||
conf.setContext(config.MODERATOR)
|
||||
conf.setCommand(config.LIVE_EVENTS)
|
||||
conf.setRace(model.RaceImpl.queryOneBy(event=self.eventname, name=self.racename))
|
||||
|
||||
# blocking call by updatecount setting
|
||||
conf.setParameters(dict(eventname=self.eventname, racename=self.racename, sinceupdate=self.updatecount))
|
||||
|
||||
try:
|
||||
# need to lock because other threads could overwrite information
|
||||
with lock:
|
||||
updatecount = liveRaceInformation(conf)
|
||||
|
||||
self.last_update = datetime.datetime.now()
|
||||
self.updatecount = updatecount
|
||||
|
||||
except Exception, ex:
|
||||
# print error but do not kill thread as this could be recoverable
|
||||
log.error('Error in thread for %s %s' % (self.eventname, self.racename), exc_info=True)
|
||||
|
||||
# avoid filling console with errors
|
||||
time.sleep(2)
|
||||
|
||||
# avoid hammering java server - can occur if call does not block correctly
|
||||
time.sleep(1)
|
||||
|
||||
log.info('STOP listener for %s:%s (%s, %s)' % (self.host, self.port, self.eventname, self.racename))
|
||||
|
||||
def computeRank(newvalue, oldvalue):
|
||||
return newvalue
|
||||
|
||||
def eventConfiguration(configurator):
|
||||
""" Reads current event configuration from server """
|
||||
|
||||
# this can block if there are no tracked races available
|
||||
events = jsonByUrl(configurator)
|
||||
|
||||
for event in events:
|
||||
dbevent = model.EventImpl.queryOneBy(name=event['name'])
|
||||
if not dbevent:
|
||||
dbevent = model.EventImpl()
|
||||
|
||||
# create competitors for the whole event
|
||||
cpnames = []; cobjects = []
|
||||
for cp in event['competitors']:
|
||||
cpnames.append(cp['name'])
|
||||
|
||||
cfound = model.CompetitorImpl.queryOneBy(name=cp['name'], event=event['name'])
|
||||
if not cfound:
|
||||
competitor = model.CompetitorImpl()
|
||||
competitor.update(dict(name=cp['name'], nationality=cp['nationality'], event=event['name']))
|
||||
cobjects.append(competitor)
|
||||
else:
|
||||
cobjects.append(cfound)
|
||||
|
||||
# prepare race and mark names
|
||||
rcnames = []; rcmarks = []
|
||||
raceindex = 0;
|
||||
for rc in event['races']:
|
||||
rcnames.append( (rc['name'], rc['start']) )
|
||||
raceindex += 1
|
||||
|
||||
dbrace = model.RaceImpl.queryOneBy(event=event['name'], name=rc['name'])
|
||||
if not dbrace:
|
||||
dbrace = model.RaceImpl()
|
||||
dbrace.update(dict(event=event['name'], name=rc['name']))
|
||||
|
||||
# make sure to include start to enable sorting
|
||||
if rc.has_key('start'):
|
||||
dbrace.update(dict(start=rc['start']))
|
||||
|
||||
marknames = []
|
||||
for leg in rc['legs']:
|
||||
# including all legs where something ends into model
|
||||
# in this case we get the last mark that equals the
|
||||
# points for the whole race
|
||||
marknames.append(leg['end'])
|
||||
|
||||
rcmarks.append(marknames)
|
||||
|
||||
rcnames.sort(lambda x,y: cmp(x[1], y[1]))
|
||||
|
||||
# fill competitors with empty data
|
||||
for cp in cobjects:
|
||||
races = [0.0 for r in range(raceindex)]
|
||||
|
||||
marks = cp.marks; values = cp.values
|
||||
for r in range(raceindex):
|
||||
if len(races) < r+1:
|
||||
races.append(0.0)
|
||||
|
||||
if len(marks) < r+1:
|
||||
marks.append([])
|
||||
|
||||
if len(values) < r+1:
|
||||
values.append([])
|
||||
|
||||
for m in range(len(rcmarks[r])):
|
||||
if len(marks[r]) < m+1:
|
||||
marks[r].append(0.0)
|
||||
|
||||
if len(values[r]) < m+1:
|
||||
values[r].append([])
|
||||
|
||||
cp.update(dict(races=races, marks=marks))
|
||||
|
||||
# finally create or update event
|
||||
dbevent.update(dict(name=event['name'], boatclass=event['boatclass'], competitors=cpnames, races=[rname[0] for rname in rcnames], marks=rcmarks))
|
||||
|
||||
# return all received events
|
||||
return events
|
||||
|
||||
def liveRaceInformation(configurator):
|
||||
""" Reads live race information from provider. Should be called
|
||||
in a thread because execution can block until new data are available. """
|
||||
|
||||
data = jsonByUrl(configurator)
|
||||
|
||||
racename = configurator.race.name
|
||||
eventname = configurator.race.event
|
||||
|
||||
# it is important to know which position the race has
|
||||
# so we look it up in the Event itself
|
||||
event = model.EventImpl.queryOneBy(name=eventname)
|
||||
raceindex = event.races.index(racename)
|
||||
|
||||
# this should help us finding out which legs are still running
|
||||
# we assume that only one race at time is running so we stick
|
||||
# to the legs
|
||||
|
||||
lcount = 0; current_legs = {}
|
||||
for leg in data['legs']:
|
||||
for competitor in leg['competitors']:
|
||||
comp = model.CompetitorImpl.queryOneBy(name=competitor['name'], event=eventname)
|
||||
if not comp:
|
||||
raise Exception, 'Could not find competitor %s for event %s' % (competitor['name'], eventname)
|
||||
|
||||
c_races = comp.races
|
||||
c_marks = comp.marks
|
||||
c_values = comp.values
|
||||
c_total_rank = comp.total
|
||||
|
||||
# if competitor hasn't yet started we just ignore this leg
|
||||
if competitor.get('started', False) is False:
|
||||
continue
|
||||
|
||||
# we take to into account because this is the one we have saved before
|
||||
mark_name = leg['to']
|
||||
|
||||
# last mark in race?
|
||||
is_last_mark = event.marks[raceindex][-1] == mark_name
|
||||
|
||||
# competitor finished this leg?
|
||||
finished = competitor['finished']
|
||||
|
||||
# we are now in race[raceindex].legs[legcount] and need to map this
|
||||
# to competitor structures
|
||||
|
||||
if finished:
|
||||
# competitor has finished this leg so we need to save rank
|
||||
# to the next mark (e.g. mark_name is 'Mark 1' and finished
|
||||
# then competitor.marks[raceindex][lcount] = rank). This works
|
||||
# because leg[position] equals marks[position] in list
|
||||
if competitor.has_key('rank'):
|
||||
c_marks[raceindex][lcount] = computeRank(competitor['rank'], c_marks[raceindex][lcount])
|
||||
|
||||
# if finished and last mark then update race information
|
||||
if is_last_mark:
|
||||
c_races[raceindex] = computeRank(competitor['rank'], c_races[raceindex])
|
||||
|
||||
# for the last race just update total rank
|
||||
if raceindex+1 == len(c_races):
|
||||
c_total_rank = computeRank(competitor['rank'], c_total_rank)
|
||||
|
||||
else:
|
||||
c_marks[raceindex][lcount] = 0.0
|
||||
if is_last_mark:
|
||||
c_races[raceindex] = 0.0
|
||||
|
||||
if raceindex+1 == len(c_races):
|
||||
c_total_rank = 0.0
|
||||
|
||||
else:
|
||||
# leg not finished so put this leg into unfinished legs
|
||||
current_legs[lcount] = 1
|
||||
|
||||
# now update values for the current position
|
||||
for key in config.SORTED_LEG_VALUE_NAMES:
|
||||
|
||||
# dynamically extend this one
|
||||
attr = config.LEG_VALUE_DATA[key]
|
||||
if len(c_values[raceindex][lcount]) < attr[0]+1:
|
||||
c_values[raceindex][lcount].append(0.0)
|
||||
|
||||
k = competitor.get(key, None)
|
||||
if k in [None, 'null', 'Null', '']:
|
||||
k = 0.0
|
||||
|
||||
c_values[raceindex][lcount][attr[0]] = k
|
||||
|
||||
# compute total rank for competitor
|
||||
rank = competitor.get('rank', 0)
|
||||
if data.has_key('ranks'):
|
||||
for c in data['ranks']:
|
||||
if c['competitor'] == competitor['name']:
|
||||
rank = c['rank']
|
||||
break
|
||||
|
||||
comp.update(dict(current_rank=rank,races=c_races, marks=c_marks, values=c_values, total=c_total_rank))
|
||||
|
||||
# next leg
|
||||
lcount += 1
|
||||
|
||||
# update race with current information
|
||||
dbrace = model.RaceImpl.queryOneBy(event=eventname, name=racename)
|
||||
mdup = dict(startoftracking=data['startoftracking'],
|
||||
start=data['start'], finish=data['finish'],
|
||||
timeofnewestevent=data['timeofnewestevent'],
|
||||
updatecount=data['updatecount'])
|
||||
|
||||
if data.get('wind'):
|
||||
mdup['wind_source'] = data['wind']['source']
|
||||
mdup['wind_bearing'] = data['wind']['truebearingdeg']
|
||||
mdup['wind_speed'] = data['wind']['knowspeed']
|
||||
|
||||
mdup['current_legs'] = current_legs.keys()
|
||||
dbrace.update(mdup)
|
||||
|
||||
return data['updatecount']
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
from setuptools import setup, find_packages
|
||||
import os
|
||||
|
||||
version = '1.0'
|
||||
|
||||
setup(name='sailing.connector',
|
||||
version=version,
|
||||
description="Connector to TracTrac Application wrapped by Java",
|
||||
long_description=open("README.txt").read() + "\n" +
|
||||
open(os.path.join("docs", "HISTORY.txt")).read(),
|
||||
# Get more strings from
|
||||
# http://pypi.python.org/pypi?:action=list_classifiers
|
||||
classifiers=[
|
||||
"Programming Language :: Python",
|
||||
],
|
||||
keywords='',
|
||||
author='',
|
||||
author_email='',
|
||||
url='http://svn.plone.org/svn/collective/',
|
||||
license='GPL',
|
||||
packages=find_packages(exclude=['ez_setup']),
|
||||
namespace_packages=['sailing'],
|
||||
include_package_data=True,
|
||||
zip_safe=False,
|
||||
install_requires=[
|
||||
'setuptools',
|
||||
'pymongo',
|
||||
'mongokit',
|
||||
'python-cjson'
|
||||
],
|
||||
entry_points="""
|
||||
# -*- Entry points: -*-
|
||||
""",
|
||||
)
|
||||
@@ -0,0 +1,6 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
|
||||
|
||||
This product may contain traces of nuts.
|
||||
@@ -0,0 +1,7 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
1.0dev (unreleased)
|
||||
-------------------
|
||||
|
||||
- Initial release
|
||||
@@ -0,0 +1,6 @@
|
||||
# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
|
||||
try:
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
||||
except ImportError:
|
||||
from pkgutil import extend_path
|
||||
__path__ = extend_path(__path__, __name__)
|
||||
@@ -0,0 +1,45 @@
|
||||
|
||||
import os, logging
|
||||
from ConfigParser import ConfigParser
|
||||
|
||||
LOG = logging.getLogger('sailing.db')
|
||||
|
||||
ALL_KEYS = ('host', 'port', 'dbname', 'username', 'password', 'collections', 'master_host')
|
||||
MANDATORY_KEYS = ('host', 'port', 'dbname', 'collections')
|
||||
|
||||
def readDatabaseConfiguration(db_ini='db.ini'):
|
||||
""" Read the database configuration """
|
||||
|
||||
if not os.path.exists(db_ini):
|
||||
raise ConfigurationError('No database configuration found (%s)' % db_ini)
|
||||
|
||||
CP = ConfigParser()
|
||||
CP.read(db_ini)
|
||||
result = dict()
|
||||
for section in CP.sections():
|
||||
d = dict()
|
||||
for k in ALL_KEYS:
|
||||
v = None
|
||||
if CP.has_option(section, k):
|
||||
if k == 'port':
|
||||
v = CP.getint(section, k)
|
||||
elif k == 'collections':
|
||||
v = [x.strip() for x in CP.get(section, k).split(',') if x.strip()]
|
||||
else:
|
||||
v = CP.get(section, k)
|
||||
|
||||
if k in MANDATORY_KEYS and not v:
|
||||
raise ConfigurationError('Database configuration error: [%s]>%s in "%s" is mandatory' % (section, k, db_ini))
|
||||
d[k] = v
|
||||
result[section] = d
|
||||
return result
|
||||
|
||||
|
||||
# Read the database configuration either from $YSH_DATABASE_CONFIGURATION
|
||||
# or <BUILDOUT_DIR>/etc/db.ini
|
||||
|
||||
filename = os.environ.get('YSH_DATABASE_CONFIGURATION',
|
||||
os.path.join(os.getcwd(), 'etc', 'db.ini'))
|
||||
LOG.info('Reading database configuration from %s' % filename)
|
||||
DB_CONFIG = readDatabaseConfiguration(filename)
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
# format for dates
|
||||
# http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior
|
||||
# DATE_TIME_FORMAT = '%Y/%m/%d %H:%M'
|
||||
DATE_TIME_FORMAT = '%Y/%m/%d'
|
||||
DATE_FORMAT_STRING = '%b %d %Y'
|
||||
|
||||
# db backend sort identifier
|
||||
import pymongo
|
||||
ASCENDING = pymongo.ASCENDING
|
||||
DESCENDING = pymongo.DESCENDING
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
import logging
|
||||
|
||||
import mongokit
|
||||
import mongokit.master_slave_connection
|
||||
|
||||
from sailing.db import DB_CONFIG
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
LOG = logging.getLogger('sailing.db')
|
||||
|
||||
__all__ = ('getCollection',)
|
||||
|
||||
def setupDatabases():
|
||||
""" Setup MongoDB database connections and collections """
|
||||
|
||||
global collections, databases, connections, collection2database
|
||||
|
||||
for d in DB_CONFIG.values():
|
||||
|
||||
dbname = d['dbname']
|
||||
slave_configuration = dict(host=d['host'], port=d['port'])
|
||||
|
||||
if d['master_host']:
|
||||
# master and slaves share the same configuration - except
|
||||
# the hostname of the master host
|
||||
master_configuration = slave_configuration.copy()
|
||||
master_configuration['host'] = d['master_host']
|
||||
LOG.info('Setting up database as master-slave (database: %s, master: %s, slave: %s)' %
|
||||
(dbname, master_configuration, slave_configuration))
|
||||
conn = mongokit.master_slave_connection.MasterSlaveConnection(master_configuration, [slave_configuration])
|
||||
else:
|
||||
LOG.info('Setting up database (database:%s , master: %s)' % (dbname, slave_configuration))
|
||||
conn = mongokit.Connection(**slave_configuration)
|
||||
|
||||
db = mongokit.Database(conn, dbname)
|
||||
databases[dbname] = db
|
||||
connections[dbname] = conn
|
||||
|
||||
for collection in d['collections']:
|
||||
collections[collection] = mongokit.Collection(db, collection)
|
||||
collection2connection[collection] = conn
|
||||
|
||||
LOG.info('Attached collections: %s' % ', '.join(collections))
|
||||
|
||||
def getCollection(collection):
|
||||
""" Return a MongoDB collection by its name """
|
||||
coll = collections.get(collection)
|
||||
if not coll:
|
||||
raise ValueError('No collection %s configured' % collection)
|
||||
return coll
|
||||
|
||||
def getConnection(database):
|
||||
""" Return connection for a given database """
|
||||
conn = connections.get(database)
|
||||
if not conn:
|
||||
raise ValueError('No connection for database %s found' % database)
|
||||
return conn
|
||||
|
||||
def getConnectionByCollectionName(collection):
|
||||
""" Return connection object for a given collection name """
|
||||
db = collection2connection.get(collection)
|
||||
if not db:
|
||||
raise ValueError('No database for collection %s found' % collection)
|
||||
return db
|
||||
|
||||
collection2connection = dict()
|
||||
connections = dict()
|
||||
databases = dict()
|
||||
collections = dict()
|
||||
setupDatabases()
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
|
||||
import datetime
|
||||
|
||||
from base import ModelBase
|
||||
from util import registerClass, queryContent, createContent
|
||||
|
||||
from entities import *
|
||||
|
||||
class EventImpl(ModelBase):
|
||||
linked_model = Event
|
||||
|
||||
class RaceImpl(ModelBase):
|
||||
linked_model = Race
|
||||
|
||||
default_values = {
|
||||
'running': False,
|
||||
}
|
||||
|
||||
class CompetitorImpl(ModelBase):
|
||||
linked_model = Competitor
|
||||
|
||||
default_values = {
|
||||
'races': [],
|
||||
'marks': [[]]
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def sortedBy(cls, eventname, raceindex=None, markindex=None, valueindex=None):
|
||||
""" Returns competitors sorted by given index. If index
|
||||
is None no sorting is performed on this index. If all index
|
||||
params are None sorting is performed by total. """
|
||||
|
||||
def sorter(x, y):
|
||||
xval = x.total
|
||||
yval = y.total
|
||||
|
||||
if valueindex is not None:
|
||||
try:
|
||||
xval = x.values[raceindex][markindex][valueindex]
|
||||
yval = y.values[raceindex][markindex][valueindex]
|
||||
except IndexError:
|
||||
xval = 0.0
|
||||
yval = 0.0
|
||||
|
||||
elif markindex is not None:
|
||||
xval = x.marks[raceindex][markindex]
|
||||
yval = y.marks[raceindex][markindex]
|
||||
|
||||
elif raceindex is not None:
|
||||
xval = x.races[raceindex]
|
||||
yval = y.races[raceindex]
|
||||
|
||||
return cmp(xval, yval)
|
||||
|
||||
competitors = cls.queryBy(event=eventname)
|
||||
competitors.sort(sorter)
|
||||
return competitors
|
||||
|
||||
@@ -0,0 +1,277 @@
|
||||
|
||||
import datetime
|
||||
|
||||
import mongokit
|
||||
from pymongo.objectid import ObjectId
|
||||
|
||||
from sailing.db.model.util import queryContent, createContent
|
||||
from sailing.db import config
|
||||
|
||||
MARKER = object
|
||||
|
||||
class BaseDocument(mongokit.Document):
|
||||
skip_validation = True
|
||||
safe_mode = True
|
||||
|
||||
def _updateInternal(self, **kw):
|
||||
kw['safe'] = self.safe_mode
|
||||
if not hasattr(self, 'created') or \
|
||||
not kw.get('created', None):
|
||||
self['created'] = datetime.datetime.now()
|
||||
|
||||
if not hasattr(self, 'typename') or \
|
||||
not kw.get('typename', None):
|
||||
self['typename'] = self.__class__.__name__
|
||||
|
||||
return kw
|
||||
|
||||
def save(self, *args, **kw):
|
||||
kw = self._updateInternal(**kw)
|
||||
super(BaseDocument, self).save(*args, **kw)
|
||||
|
||||
def insert(self, *args, **kw):
|
||||
kw = self._updateInternal(**kw)
|
||||
super(BaseDocument, self).insert(*args, **kw)
|
||||
|
||||
def update(self, *args, **kw):
|
||||
kw = self._updateInternal(**kw)
|
||||
super(BaseDocument, self).update(*args, **kw)
|
||||
|
||||
class ModelBase(object):
|
||||
|
||||
@classmethod
|
||||
def collectionName(cls):
|
||||
return cls.linked_model._collection
|
||||
|
||||
@classmethod
|
||||
def query(cls, uid, wrap=True):
|
||||
uid = str(uid).strip()
|
||||
klass = queryContent(cls.linked_model.__name__)
|
||||
backend_instance = klass.get_from_id(ObjectId(uid))
|
||||
|
||||
if wrap is True:
|
||||
if backend_instance:
|
||||
if isinstance(backend_instance, list):
|
||||
backend_instance = backend_instance[0]
|
||||
return cls(backend_instance)
|
||||
else:
|
||||
return backend_instance
|
||||
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def queryRaw(cls, input, limit=0, sortby='created', sortorder=config.DESCENDING):
|
||||
klass = queryContent(cls.linked_model.__name__)
|
||||
backend_instance = klass.find(input).limit(limit).sort(sortby, sortorder)
|
||||
|
||||
if backend_instance:
|
||||
if backend_instance.count():
|
||||
return [cls(ba) for ba in backend_instance]
|
||||
|
||||
return []
|
||||
|
||||
@classmethod
|
||||
def queryBy(cls, limit=0, sortby='created', sortorder=config.DESCENDING, **fields):
|
||||
assert isinstance(limit, int)
|
||||
|
||||
klass = queryContent(cls.linked_model.__name__)
|
||||
|
||||
# update fields with typename
|
||||
if not fields.get('typename', None):
|
||||
fields['typename'] = cls.linked_model.__name__
|
||||
|
||||
# better would be to use fetch here because this includes structure but
|
||||
# because we have one type per collection this doesn't matter
|
||||
backend_instance = klass.find(fields).limit(limit).sort(sortby, direction=sortorder)
|
||||
|
||||
if backend_instance:
|
||||
if backend_instance.count():
|
||||
return [cls(ba) for ba in backend_instance]
|
||||
|
||||
return []
|
||||
|
||||
@classmethod
|
||||
def queryByCount(cls, limit=0, sortby='created', sortorder=config.DESCENDING, **fields):
|
||||
assert isinstance(limit, int)
|
||||
|
||||
# update fields with typename
|
||||
if not fields.get('typename', None):
|
||||
fields['typename'] = cls.linked_model.__name__
|
||||
|
||||
klass = queryContent(cls.linked_model.__name__)
|
||||
backend_instance = klass.find(fields).limit(limit).sort(sortby, direction=sortorder)
|
||||
return backend_instance.count()
|
||||
|
||||
@classmethod
|
||||
def queryCount(cls, limit=0, sortby='created', sortorder=config.DESCENDING, **fields):
|
||||
# update fields with typename
|
||||
if not fields.get('typename', None):
|
||||
fields['typename'] = cls.linked_model.__name__
|
||||
|
||||
klass = queryContent(cls.linked_model.__name__)
|
||||
backend_instance = klass.find(fields).limit(limit).sort(sortby, direction=sortorder)
|
||||
return backend_instance.count()
|
||||
|
||||
@classmethod
|
||||
def queryRawCount(cls, input, limit=0, sortby='created', sortorder=config.DESCENDING):
|
||||
klass = queryContent(cls.linked_model.__name__)
|
||||
backend_instance = klass.find(input).limit(limit).sort(sortby, direction=sortorder)
|
||||
return backend_instance.count()
|
||||
|
||||
@classmethod
|
||||
def queryOneBy(cls, **fields):
|
||||
# update fields with typename
|
||||
if not fields.get('typename', None):
|
||||
fields['typename'] = cls.linked_model.__name__
|
||||
|
||||
klass = queryContent(cls.linked_model.__name__)
|
||||
backend_instance = klass.find_one(fields)
|
||||
|
||||
if backend_instance:
|
||||
return cls(backend_instance)
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def removeAllBy(cls, **fields):
|
||||
if not fields.get('typename', None):
|
||||
fields['typename'] = cls.linked_model.__name__
|
||||
|
||||
fields['atomic'] = True
|
||||
klass = queryContent(cls.linked_model.__name__)
|
||||
klass.collection.remove(**fields)
|
||||
|
||||
# assuming that we clean all objects
|
||||
klass.collection.drop_indexes()
|
||||
|
||||
def __getstate__(self):
|
||||
# we need to return a state where there is no connection
|
||||
# to mongodb directly established - we just save the internal
|
||||
# UID so to be able to rebuild the state later on
|
||||
|
||||
dc = self.__dict__.copy()
|
||||
inst = dc['_instance']
|
||||
|
||||
if getattr(inst, '__dict__', None):
|
||||
# we preserve the instance to avoid reloading it
|
||||
# on unpickle - just preserving raw values
|
||||
idc = {}; footprint = inst.structure
|
||||
|
||||
for k in footprint.keys():
|
||||
# model changes can yield non-complete instances
|
||||
if inst.has_key(k):
|
||||
idc[str(k)] = inst[k]
|
||||
|
||||
idc['_id'] = dc['_instance']['_id']
|
||||
|
||||
del dc['_instance']
|
||||
dc['_instance'] = idc
|
||||
|
||||
return dc
|
||||
|
||||
def __setstate__(self, state):
|
||||
self.__dict__ = state
|
||||
|
||||
def __init__(self, instance = None, *args, **kw):
|
||||
self._instance = instance
|
||||
|
||||
def __getattr__(self, key):
|
||||
# instance attributes are held by backend
|
||||
value = self.get(key, default=object)
|
||||
|
||||
# make sure to fall back to this class
|
||||
if value is object:
|
||||
return getattr(self.__class__, key)
|
||||
|
||||
return value
|
||||
|
||||
def get(self, key, default=None):
|
||||
if key in self.__class__.linked_model.structure or key in ['_id', ]:
|
||||
inst = self.__dict__['_instance']
|
||||
if inst.has_key(key):
|
||||
return inst.get(key)
|
||||
return default
|
||||
|
||||
@property
|
||||
def uid(self):
|
||||
uid = getattr(self, '_id', None)
|
||||
if uid:
|
||||
return unicode(str(uid))
|
||||
return None
|
||||
|
||||
def _backend(self):
|
||||
return self.__class__.linked_model
|
||||
|
||||
def _instance_(self):
|
||||
# use this method only for direct operations (crud)
|
||||
inst = self.__dict__['_instance']
|
||||
if inst:
|
||||
# unpickling returns dict and not real mongokit instance
|
||||
if not hasattr(inst, '__dict__'):
|
||||
self.__dict__['_instance'] = self.query(inst['_id'], wrap=False)
|
||||
return self.__dict__['_instance']
|
||||
return inst
|
||||
|
||||
def getURL(self):
|
||||
raise Exception, 'NotImplementedHere'
|
||||
|
||||
def getTitle(self):
|
||||
raise Exception, 'NotImplementedHere'
|
||||
|
||||
def creationTime(self, pretty=False):
|
||||
if pretty is True:
|
||||
return pretty_date(self.created)
|
||||
return self.created
|
||||
|
||||
def reload(self):
|
||||
self._instance = self.query(self.uid, wrap=False)
|
||||
|
||||
def delete(self):
|
||||
uid = self.uid
|
||||
if not uid:
|
||||
return False
|
||||
|
||||
self._instance_().delete()
|
||||
return True
|
||||
|
||||
def update(self, dictionary=None, dosave=True):
|
||||
klassname = self._backend().__name__
|
||||
|
||||
# make sure to make a difference between new and update
|
||||
# new objects should always have empty uid field
|
||||
if self.uid is None:
|
||||
self._instance = createContent(klassname)
|
||||
iis = self._instance_()
|
||||
|
||||
if hasattr(self, '_before_update'):
|
||||
self._before_update(dictionary, creation=True)
|
||||
|
||||
# check that defaults are NOT set on backend
|
||||
if hasattr(iis.__class__, 'default_values'):
|
||||
if len(iis.__class__.default_values.keys())>0:
|
||||
raise Exception, 'Implementation error: instance can not have defaults! Set defaults in model! Model: %s' % self._instance.__class__
|
||||
|
||||
# make sure to activate defaults
|
||||
if hasattr(self.__class__, 'default_values'):
|
||||
for dk,dv in self.__class__.default_values.items():
|
||||
if dictionary is None \
|
||||
or not dk in dictionary:
|
||||
if callable(dv):
|
||||
dv = dv()
|
||||
|
||||
iis[dk] = dv
|
||||
else:
|
||||
if self._instance_() is None:
|
||||
self._instance = self.query(self.uid, wrap=False)
|
||||
|
||||
iis = self._instance_()
|
||||
if hasattr(self, '_before_update'):
|
||||
self._before_update(dictionary, creation=False)
|
||||
|
||||
if dictionary:
|
||||
for k,v in dictionary.items():
|
||||
iis[k] = v # need explicit set here
|
||||
|
||||
# save also works for update process
|
||||
if dosave is True:
|
||||
iis.save()
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
|
||||
import datetime
|
||||
|
||||
from base import BaseDocument
|
||||
from util import registerClass, queryContent, createContent
|
||||
|
||||
class Event(BaseDocument):
|
||||
_collection = 'events'
|
||||
skip_validation = True
|
||||
|
||||
structure = {
|
||||
'name': unicode,
|
||||
'boatclass': unicode,
|
||||
'competitors': [unicode, ],
|
||||
'races': [unicode, ],
|
||||
'marks': [[unicode, ]],
|
||||
'typename': unicode,
|
||||
'created': datetime.datetime
|
||||
}
|
||||
|
||||
indexes = [
|
||||
{
|
||||
'fields' : ['name'],
|
||||
'unique': True
|
||||
},
|
||||
]
|
||||
|
||||
registerClass(Event)
|
||||
|
||||
class Race(BaseDocument):
|
||||
_collection = 'races'
|
||||
skip_validation = True
|
||||
|
||||
structure = {
|
||||
'name': unicode,
|
||||
'event': unicode,
|
||||
'current_legs': [int, ], # holds a list of positions of current legs
|
||||
'startoftracking': float,
|
||||
'start': float,
|
||||
'finish' : float,
|
||||
'timeofnewestevent': float,
|
||||
'updatecount': float,
|
||||
'wind_source': unicode,
|
||||
'wind_bearing': float,
|
||||
'wind_speed': float,
|
||||
'typename': unicode,
|
||||
'created': datetime.datetime
|
||||
}
|
||||
|
||||
indexes = [
|
||||
{
|
||||
'fields' : ['name', 'event'],
|
||||
'unique': True
|
||||
},
|
||||
]
|
||||
|
||||
registerClass(Race)
|
||||
|
||||
class Competitor(BaseDocument):
|
||||
_collection = 'competitors'
|
||||
skip_validation = True
|
||||
|
||||
structure = {
|
||||
'name': unicode,
|
||||
'event': unicode,
|
||||
'nationality': unicode,
|
||||
|
||||
'total': float,
|
||||
'current_rank': int, # current rank for given time
|
||||
'races' : [float, ],
|
||||
'marks' : [[float, ], ],
|
||||
'values' : [[[float, ]]]
|
||||
}
|
||||
|
||||
indexes = [
|
||||
{
|
||||
'fields' : ['name', 'event'],
|
||||
'unique': True
|
||||
},
|
||||
]
|
||||
|
||||
registerClass(Competitor)
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
from sailing.db.database import getConnection, getCollection, getConnectionByCollectionName
|
||||
|
||||
classes = dict()
|
||||
|
||||
def registerClass(cls):
|
||||
""" Register class with MongoKit """
|
||||
|
||||
collection = cls._collection
|
||||
conn = getConnectionByCollectionName(collection)
|
||||
conn.register([cls])
|
||||
classes[cls.__name__] = cls
|
||||
|
||||
def createContent(cls_name, **kw):
|
||||
|
||||
try:
|
||||
collection = getCollection(classes[cls_name]._collection)
|
||||
except KeyError:
|
||||
raise ValueError('Class "%s" is not registered' % cls_name)
|
||||
|
||||
inst = getattr(collection, cls_name)()
|
||||
for k,v in kw.items():
|
||||
inst[k] = v
|
||||
return inst
|
||||
|
||||
def queryContent(cls_name):
|
||||
try:
|
||||
collection = getCollection(classes[cls_name]._collection)
|
||||
except KeyError:
|
||||
raise ValueError('Class "%s" is not registered' % cls_name)
|
||||
|
||||
return getattr(collection, cls_name)
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
from database import databases, collections
|
||||
|
||||
def dbStats():
|
||||
result = dict()
|
||||
for dbname in databases:
|
||||
db = databases[dbname]
|
||||
stats = db.command('dbstats')
|
||||
result[dbname] = stats
|
||||
return result
|
||||
|
||||
def serverStatus():
|
||||
db = databases[databases.keys()[0]]
|
||||
stats = db.command('serverStatus')
|
||||
return stats
|
||||
|
||||
|
||||
def collectionStats():
|
||||
result = dict()
|
||||
for dbname in databases:
|
||||
db = databases[dbname]
|
||||
for coll in db.collection_names():
|
||||
result[coll] = db.command({'collstats' : coll})
|
||||
result[coll]['dbname'] = dbname
|
||||
return result
|
||||
|
||||
def dropDB():
|
||||
""" Drops all database data """
|
||||
|
||||
from database import databases
|
||||
for k, db in databases.items():
|
||||
for name in db.collection_names():
|
||||
if name not in ('system.indexes',):
|
||||
db[name].drop_indexes()
|
||||
db.drop_collection(name)
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
from setuptools import setup, find_packages
|
||||
import os
|
||||
|
||||
version = '1.0'
|
||||
|
||||
setup(name='sailing.db',
|
||||
version=version,
|
||||
description="Connection to database for sailing",
|
||||
long_description=open("README.txt").read() + "\n" +
|
||||
open(os.path.join("docs", "HISTORY.txt")).read(),
|
||||
# Get more strings from
|
||||
# http://pypi.python.org/pypi?:action=list_classifiers
|
||||
classifiers=[
|
||||
"Programming Language :: Python",
|
||||
],
|
||||
keywords='',
|
||||
author='',
|
||||
author_email='',
|
||||
url='http://svn.plone.org/svn/collective/',
|
||||
license='GPL',
|
||||
packages=find_packages(exclude=['ez_setup']),
|
||||
namespace_packages=['sailing'],
|
||||
include_package_data=True,
|
||||
zip_safe=False,
|
||||
install_requires=[
|
||||
'setuptools',
|
||||
# -*- Extra requirements: -*-
|
||||
],
|
||||
entry_points=dict(console_scripts=(
|
||||
'trac_listener=sailing.connector.run:main',
|
||||
)),
|
||||
)
|
||||
@@ -0,0 +1,3 @@
|
||||
include *.ini *.cfg
|
||||
exclude .installed.cfg
|
||||
recursive-include src *.html
|
||||
@@ -0,0 +1,6 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
|
||||
|
||||
This product may contain traces of nuts.
|
||||
@@ -0,0 +1,7 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
1.0dev (unreleased)
|
||||
-------------------
|
||||
|
||||
- Initial release
|
||||
@@ -0,0 +1,6 @@
|
||||
# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
|
||||
try:
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
||||
except ImportError:
|
||||
from pkgutil import extend_path
|
||||
__path__ = extend_path(__path__, __name__)
|
||||
@@ -0,0 +1,29 @@
|
||||
|
||||
from pyramid.config import Configurator
|
||||
|
||||
from pyramid_beaker import BeakerSessionFactoryConfig,\
|
||||
session_factory_from_settings, set_cache_regions_from_settings
|
||||
|
||||
def init_app(request):
|
||||
return {}
|
||||
|
||||
def app(global_config, **settings):
|
||||
""" This function returns a pyramid.router.Router object.
|
||||
It is usually called by the PasteDeploy framework during ``paster serve``.
|
||||
"""
|
||||
|
||||
# paster app config callback
|
||||
import sailing.web
|
||||
|
||||
# beaker stuff for session and caching
|
||||
session_factory = session_factory_from_settings(settings)
|
||||
set_cache_regions_from_settings(settings)
|
||||
|
||||
from sailing.web.util import reloader_watch_files
|
||||
reloader_watch_files(global_config, **settings)
|
||||
|
||||
config = Configurator(settings=settings, root_factory=init_app, session_factory=session_factory)
|
||||
config.include('pyramid_zcml')
|
||||
config.load_zcml('configure.zcml')
|
||||
|
||||
return config.make_wsgi_app()
|
||||
@@ -0,0 +1,10 @@
|
||||
|
||||
<configure xmlns="http://pylonshq.com/pyramid">
|
||||
|
||||
<!--<adapter
|
||||
for="*"
|
||||
provides=".interfaces.ICatalogAdapter"
|
||||
factory=".catalog.CatalogAdapter"
|
||||
/>-->
|
||||
|
||||
</configure>
|
||||
@@ -0,0 +1,43 @@
|
||||
<configure xmlns="http://pylonshq.com/pyramid">
|
||||
|
||||
<route
|
||||
path=""
|
||||
name="startpage"
|
||||
view=".core.BaseView"
|
||||
renderer="templates/start.pt"
|
||||
/>
|
||||
|
||||
<route
|
||||
path="/++/:function"
|
||||
name="dynamic-function"
|
||||
view=".core.callFunction"
|
||||
/>
|
||||
|
||||
<route
|
||||
path="/@@/:template"
|
||||
name="dynamic-template"
|
||||
view=".core.renderTemplate"
|
||||
/>
|
||||
|
||||
<route
|
||||
path="/css/:template"
|
||||
name="catchall-semi-static"
|
||||
view=".core.renderCSS"
|
||||
/>
|
||||
|
||||
<static
|
||||
name="static"
|
||||
path="static"
|
||||
/>
|
||||
|
||||
<static
|
||||
name="moderator-static"
|
||||
path="moderator-static"
|
||||
/>
|
||||
|
||||
<static
|
||||
name="images"
|
||||
path="static/images"
|
||||
/>
|
||||
|
||||
</configure>
|
||||
@@ -0,0 +1,185 @@
|
||||
|
||||
import time, datetime
|
||||
|
||||
import urllib
|
||||
|
||||
from webob.exc import HTTPFound
|
||||
from pyramid.renderers import get_renderer, render_to_response
|
||||
|
||||
from sailing.connector import provider, URIConfigurator, jsonByUrl
|
||||
from sailing.db import model
|
||||
from sailing.db import monitoring
|
||||
|
||||
from sailing.web import config
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
logging.basicConfig()
|
||||
|
||||
current_leaderboard_event = None
|
||||
|
||||
class BaseView(object):
|
||||
|
||||
def __init__(self, context, request):
|
||||
self.context = context
|
||||
self.request = request
|
||||
|
||||
# don't forget to call save() if you changed s/th on the session
|
||||
self.session = request['beaker.session']
|
||||
|
||||
def __call__(self):
|
||||
return {'main': self.mainTemplate()}
|
||||
|
||||
def yieldMessage(self, message):
|
||||
parameters = urllib.urlencode(dict(message=message))
|
||||
return HTTPFound(location='/?%s' % parameters)
|
||||
|
||||
def mainTemplate(self):
|
||||
return get_renderer('templates/maintemplate.pt').implementation()
|
||||
|
||||
def eventUrlHistory(self):
|
||||
return self.session.get('event.url_history', ['No URLs to TracTrac events gathered until now'])
|
||||
|
||||
def raceUrlHistory(self):
|
||||
return self.session.get('race.url_history', ['No URLs to TracTrac races gathered until now'])
|
||||
|
||||
def dbDatabaseStats(self):
|
||||
return monitoring.dbStats()
|
||||
|
||||
def dbCollectionStats(self):
|
||||
return monitoring.collectionStats()
|
||||
|
||||
def dbServerStatus(self):
|
||||
return monitoring.serverStatus()
|
||||
|
||||
def millisToDatetime(self, millis, short=False):
|
||||
if millis is None or millis >= 9023372036854775807:
|
||||
return None
|
||||
|
||||
try:
|
||||
tm = time.gmtime(millis/1000)
|
||||
|
||||
if tm.tm_year >= 2000:
|
||||
dt = datetime.datetime(year=tm.tm_year, month=tm.tm_mon, day=tm.tm_mday, hour=tm.tm_hour, minute=tm.tm_min, second=tm.tm_sec)
|
||||
return dt
|
||||
except:
|
||||
log.error('Error', exc_info=True)
|
||||
|
||||
return None
|
||||
|
||||
def datetimeToMillis(self, dt):
|
||||
if dt:
|
||||
dtnew = datetime.datetime(year=dt.year, month=dt.month, day=dt.day, hour=dt.hour+2, minute=dt.minute, second=dt.second)
|
||||
return time.mktime(dtnew.timetuple())*1000
|
||||
return 0
|
||||
|
||||
def parseDatetime(self, dt, format='%m/%d/%Y %H:%M:%S'):
|
||||
return datetime.datetime.strptime(dt.strip(), format)
|
||||
|
||||
def listenerStarted(self):
|
||||
return self.session.get('listener-started', False)
|
||||
|
||||
def listenerConf(self):
|
||||
if self.listenerStarted():
|
||||
return self.session['listener-conf'].copy()
|
||||
return None
|
||||
|
||||
def currentRace(self):
|
||||
if not self.session.has_key('current-race'):
|
||||
raise Exception, 'No current race could be determined'
|
||||
|
||||
return model.RaceImpl.queryOneBy(event=self.session['current-event'], name=self.session['current-race'])
|
||||
|
||||
def currentEvent(self):
|
||||
return model.EventImpl.queryOneBy(name=self.session['current-event'])
|
||||
|
||||
def currentLeaderboardEvent(self):
|
||||
cev = model.EventImpl.queryOneBy(name=current_leaderboard_event)
|
||||
|
||||
# XXX remove this
|
||||
if not cev:
|
||||
return model.EventImpl.queryBy()[0]
|
||||
|
||||
return cev
|
||||
|
||||
def raceBy(self, event, name):
|
||||
return model.RaceImpl.queryOneBy(event=event, name=name)
|
||||
|
||||
def currentWind(self):
|
||||
conf = self.listenerConf()
|
||||
race = self.currentRace()
|
||||
|
||||
conf.setContext(config.ADMIN)
|
||||
conf.setCommand(config.SHOW_WIND)
|
||||
conf.setParameters(dict(eventname=race.event, racename=race.name))
|
||||
|
||||
return jsonByUrl(conf)
|
||||
|
||||
def allEvents(self):
|
||||
return model.EventImpl.queryBy()
|
||||
|
||||
def allRacesFor(self, event=None):
|
||||
if event is None:
|
||||
allevents = self.allEvents()
|
||||
|
||||
races = []
|
||||
for event in allevents:
|
||||
races += event.races
|
||||
|
||||
return races
|
||||
|
||||
return model.EventImpl.queryOneBy(name=event).races
|
||||
|
||||
def allCompetitorsFor(self, event):
|
||||
return model.CompetitorImpl.queryBy(event=event)
|
||||
|
||||
def competitorsSortedBy(self, eventname, sortparam):
|
||||
param = sortparam
|
||||
if param == 'name':
|
||||
competitors = model.CompetitorImpl.sortedBy(eventname=eventname)
|
||||
competitors.sort(lambda x,y: cmp(x.name, y.name))
|
||||
|
||||
elif param == 'total':
|
||||
competitors = model.CompetitorImpl.sortedBy(eventname=eventname)
|
||||
|
||||
elif param.find(',')>0:
|
||||
params = param.strip().split(',')
|
||||
|
||||
if len(params) == 2:
|
||||
competitors = model.CompetitorImpl.sortedBy(eventname=eventname, raceindex=int(params[0])-1, markindex=int(params[1])-1)
|
||||
elif len(params) == 3:
|
||||
competitors = model.CompetitorImpl.sortedBy(eventname=eventname, raceindex=int(params[0])-1, markindex=int(params[1])-1, valueindex=int(params[2])-1)
|
||||
|
||||
else:
|
||||
param = int(param.strip())
|
||||
competitors = model.CompetitorImpl.sortedBy(eventname=eventname, raceindex=param-1)
|
||||
|
||||
return competitors
|
||||
|
||||
def callFunction(context, request):
|
||||
""" Calls a function dynamically """
|
||||
|
||||
import functions
|
||||
return getattr(functions, request.matchdict.get('function'))(context, request)
|
||||
|
||||
def renderTemplate(context, request):
|
||||
""" Renders a template dynamically """
|
||||
|
||||
view = BaseView(context, request)
|
||||
return render_to_response('templates/%s.pt' % request.matchdict.get('template'),
|
||||
{'context' : context, 'view':view,
|
||||
'main' : view.mainTemplate()},
|
||||
request=request)
|
||||
|
||||
def renderCSS(context, request):
|
||||
""" Renders a CSS template dynamically """
|
||||
|
||||
response = render_to_response('static/css/%s.txt' % request.matchdict.get('template'),
|
||||
{'context' : context},
|
||||
request=request)
|
||||
|
||||
# could be more generic
|
||||
response.content_type = 'text/css'
|
||||
return response
|
||||
|
||||
|
||||
@@ -0,0 +1,481 @@
|
||||
|
||||
import urllib, urllib2
|
||||
import time
|
||||
import threading
|
||||
|
||||
from webob.exc import HTTPFound
|
||||
from webob import Response
|
||||
|
||||
from pyramid.exceptions import NotFound
|
||||
from pyramid.renderers import render_to_response
|
||||
|
||||
from sailing.db import model
|
||||
from sailing.db.monitoring import dropDB as realDropDB
|
||||
|
||||
from sailing.connector import provider, URIConfigurator, jsonByUrl
|
||||
|
||||
from sailing.web import config
|
||||
from sailing.web.util import jsonize
|
||||
|
||||
import core
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
logging.basicConfig()
|
||||
|
||||
# map holding association of host:port -> threads
|
||||
threaded_listener = {}
|
||||
|
||||
def dropDB(context, request):
|
||||
from sailing.db.monitoring import dropDB
|
||||
dropDB()
|
||||
return HTTPFound(location='/')
|
||||
|
||||
def startListenerThreads(conf, eventlist):
|
||||
# now we should have an event configuration
|
||||
# read this configuration and for each event and race
|
||||
# start a listener thread
|
||||
|
||||
lock = threading.Lock()
|
||||
with lock:
|
||||
for event in eventlist:
|
||||
event_impl = model.EventImpl.queryOneBy(name=event['name'])
|
||||
for racename in event_impl.races:
|
||||
key = hash('%s-%s-%s-%s' % (conf.host, conf.port, event['name'], racename))
|
||||
|
||||
# remove dead threads
|
||||
lstn = threaded_listener.get(key, None)
|
||||
if lstn and lstn.running is False and lstn.is_alive() is False:
|
||||
del threaded_listener[key]
|
||||
|
||||
# now there should be only running threads left
|
||||
if not threaded_listener.has_key(key):
|
||||
t = provider.LiveDataReceiver(conf.host, conf.port, event['name'], racename)
|
||||
threaded_listener[key] = t
|
||||
t.start()
|
||||
|
||||
# addEvent
|
||||
def configureListener(context, request):
|
||||
host = request.POST.get('host', 'localhost')
|
||||
port = request.POST.get('port', '8888')
|
||||
|
||||
lock = threading.Lock()
|
||||
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
conf = URIConfigurator(host, port)
|
||||
view.session['listener-conf'] = conf
|
||||
|
||||
if request.POST.get('listener-start', None):
|
||||
conf.setContext(config.ADMIN)
|
||||
|
||||
if request.POST.get('eventJSONURL'):
|
||||
conf.setCommand(config.ADD_EVENT)
|
||||
conf.setParameters(dict(eventJSONURL=request.POST.get('eventJSONURL'),
|
||||
liveURI=request.POST.get('liveURI'),
|
||||
storedURI=request.POST.get('storedURI')))
|
||||
|
||||
elif request.POST.get('paramURL'):
|
||||
conf.setCommand(config.ADD_RACE)
|
||||
conf.setParameters(dict(paramURL=request.POST.get('paramURL'),
|
||||
liveURI=request.POST.get('liveURI'),
|
||||
storedURI=request.POST.get('storedURI')))
|
||||
|
||||
if not view.session.get('race.url_history'):
|
||||
view.session['race.url_history'] = []
|
||||
|
||||
if request.POST.get('paramURL') not in view.session['race.url_history']:
|
||||
view.session['race.url_history'].append(request.POST.get('paramURL'))
|
||||
view.session.save()
|
||||
|
||||
else:
|
||||
return view.yieldMessage('Please specify an event or race URL!')
|
||||
|
||||
try:
|
||||
result = conf.trigger()
|
||||
except Exception, ex:
|
||||
return view.yieldMessage('Error: %s' % str(ex))
|
||||
|
||||
# can take a while until event data is ready
|
||||
if request.POST.get('drop_db'):
|
||||
realDropDB()
|
||||
|
||||
time.sleep(5)
|
||||
|
||||
# load event listing here
|
||||
with lock:
|
||||
eventlist = []
|
||||
try:
|
||||
conf.setContext(config.MODERATOR)
|
||||
conf.setCommand(config.LIST_EVENTS)
|
||||
eventlist = provider.eventConfiguration(conf)
|
||||
|
||||
# do not accept empty event list
|
||||
if len(eventlist) == 0:
|
||||
raise Exception, 'No events configured.'
|
||||
|
||||
except Exception, ex:
|
||||
return view.yieldMessage('Could not gather any data! Seems that Java listener is not ready yet. Please reconnect. Error: %s' % str(ex))
|
||||
|
||||
startListenerThreads(conf, eventlist)
|
||||
|
||||
# mark all stuff done and listener running
|
||||
view.session['listener-started'] = True
|
||||
view.session.save()
|
||||
|
||||
elif request.POST.get('disconnect-server', None):
|
||||
# disconnect does not stop listeners but just disconnects the
|
||||
# session of the user from server
|
||||
view.session['listener-started'] = False
|
||||
del view.session['listener-conf']
|
||||
view.session.save()
|
||||
|
||||
elif request.POST.get('listener-stop', None):
|
||||
|
||||
eventname = request.POST.get('event', None)
|
||||
racename = request.POST.get('race', None)
|
||||
|
||||
conf.setContext(config.ADMIN)
|
||||
|
||||
if racename:
|
||||
conf.setCommand(config.STOP_RACE)
|
||||
conf.setParameters(dict(eventname=eventname, racename=racename))
|
||||
else:
|
||||
conf.setCommand(config.STOP_EVENT)
|
||||
conf.setParameters(dict(eventname=eventname))
|
||||
|
||||
# remove listener started before any error can occur
|
||||
view.session['listener-started'] = False
|
||||
del view.session['listener-conf']
|
||||
view.session.save()
|
||||
|
||||
key = hash('%s-%s-%s-%s' % (conf.host, conf.port, eventname, racename))
|
||||
if threaded_listener.has_key(key):
|
||||
threaded_listener[key].running = False
|
||||
|
||||
try:
|
||||
conf.trigger()
|
||||
except Exception, ex:
|
||||
return view.yieldMessage('Error: %s' % str(ex))
|
||||
|
||||
elif request.POST.get('listener-event-refresh', None):
|
||||
with lock:
|
||||
conf.setContext(config.MODERATOR)
|
||||
conf.setCommand(config.LIST_EVENTS)
|
||||
eventlist = provider.eventConfiguration(conf)
|
||||
|
||||
if model.EventImpl.queryCount() == 0:
|
||||
return view.yieldMessage('Seems that there are no events that can be shown! Listener not started?')
|
||||
|
||||
# start listener thread if this is not yet active
|
||||
startListenerThreads(conf, eventlist)
|
||||
|
||||
view.session['listener-started'] = True
|
||||
view.session['listener-conf'] = conf
|
||||
view.session.save()
|
||||
|
||||
return view.yieldMessage('Event handler refreshed!')
|
||||
|
||||
elif request.POST.get('leaderboard-default-event', None):
|
||||
core.current_leaderboard_event = request.POST.get('event')
|
||||
|
||||
return HTTPFound(location='/')
|
||||
|
||||
@jsonize
|
||||
def configuredListeners(context, request):
|
||||
|
||||
out = []
|
||||
for key, listener in threaded_listener.items():
|
||||
out.append( {'host': listener.host, 'port': listener.port,
|
||||
'eventname': listener.eventname, 'last_update': listener.last_update and listener.last_update.strftime('%d.%m %H:%M:%S') or '-',
|
||||
'paused' : listener.paused, 'running': listener.running, 'id' : key,
|
||||
'racename': listener.racename} )
|
||||
|
||||
return out
|
||||
|
||||
@jsonize
|
||||
def pauseListener(context, request):
|
||||
tid = int(request.params.get('tid', 0))
|
||||
|
||||
if request.params.get('all'):
|
||||
for v in threaded_listener.values():
|
||||
v.paused = True
|
||||
else:
|
||||
if threaded_listener.has_key(tid):
|
||||
threaded_listener.get(tid).paused = True
|
||||
return True
|
||||
|
||||
@jsonize
|
||||
def unPauseListener(context, request):
|
||||
tid = int(request.params.get('tid', 0))
|
||||
|
||||
if request.params.get('all'):
|
||||
for v in threaded_listener.values():
|
||||
v.paused = False
|
||||
else:
|
||||
if threaded_listener.has_key(tid):
|
||||
threaded_listener.get(tid).paused = False
|
||||
return True
|
||||
|
||||
@jsonize
|
||||
def stopListener(context, request):
|
||||
tid = int(request.params.get('tid', 0))
|
||||
if threaded_listener.has_key(tid):
|
||||
threaded_listener.get(tid).running = False
|
||||
return True
|
||||
|
||||
def saveEventRace(context, request):
|
||||
eventname = request.params.get('eventname', request.params.get('event'))
|
||||
racename = request.params.get('racename', request.params.get('race'))
|
||||
|
||||
lock = threading.Lock()
|
||||
|
||||
view = core.BaseView(context, request)
|
||||
if not racename:
|
||||
racename = view.currentRace().name
|
||||
|
||||
view.session['current-event'] = eventname
|
||||
view.session['current-race'] = racename
|
||||
view.session.save()
|
||||
|
||||
if request.params.get('template'):
|
||||
return render_to_response('templates/%s.pt' % request.params.get('template'),
|
||||
{'view': view, 'additional': request.params.get('additional')}, request=request)
|
||||
|
||||
@jsonize
|
||||
def mapCompetitors(context, request):
|
||||
# returns competitors with their current rank at the given timepoint
|
||||
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
_at = request.params.get('at')
|
||||
at_millis = view.datetimeToMillis(view.parseDatetime(_at))
|
||||
|
||||
conf = view.listenerConf()
|
||||
conf.setContext(config.MODERATOR)
|
||||
conf.setCommand(config.LIVE_EVENTS)
|
||||
|
||||
race = view.currentRace()
|
||||
conf.setRace(race)
|
||||
conf.setParameters(dict(eventname=race.event, racename=race.name, timeasmillis='%.f' % at_millis))
|
||||
|
||||
data = jsonByUrl(conf)
|
||||
|
||||
if data.get('ranks'):
|
||||
data = data['ranks']
|
||||
data.sort(lambda x,y: cmp(x['rank'], y['rank']))
|
||||
|
||||
return data
|
||||
|
||||
@jsonize
|
||||
def windSettings(context, request):
|
||||
view = core.BaseView(context, request)
|
||||
conf = view.listenerConf()
|
||||
conf.setContext(config.ADMIN)
|
||||
conf.setRace(view.currentRace())
|
||||
|
||||
if request.POST.get('setsource'):
|
||||
conf.setCommand(config.SET_WIND_SOURCE)
|
||||
conf.setParameters(dict(sourcename=request.POST.get('windsource')))
|
||||
conf.trigger()
|
||||
|
||||
elif request.POST.get('setcustom'):
|
||||
conf.setCommand(config.SET_WIND)
|
||||
|
||||
dc = {}
|
||||
for k in ['truebearingdegrees', 'knotspeed', 'lngdeg', 'latdeg', 'timeasmillis']:
|
||||
if request.POST.get(k):
|
||||
dc[k] = request.POST.get(k)
|
||||
|
||||
conf.setParameters(dc)
|
||||
conf.trigger()
|
||||
|
||||
return True
|
||||
|
||||
@jsonize
|
||||
def readWind(context, request):
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
wind = view.currentWind()
|
||||
source = wind[wind['currentwindsource']]
|
||||
|
||||
if source and len(source) > 0:
|
||||
return source[0]
|
||||
return {}
|
||||
|
||||
@jsonize
|
||||
def readWaypoints(context, request):
|
||||
return readWaypointsImpl(context, request)
|
||||
|
||||
def readWaypointsImpl(context, request):
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
conf = view.listenerConf()
|
||||
conf.setContext(config.MODERATOR)
|
||||
conf.setCommand(config.SHOW_WAYPOINTS)
|
||||
conf.setRace(view.currentRace())
|
||||
|
||||
data = jsonByUrl(conf)
|
||||
|
||||
# we want to show unique buoys so lets iter thru data
|
||||
result = {}
|
||||
for wp in data:
|
||||
for by in wp['buoys']:
|
||||
result[by['name']] = by
|
||||
|
||||
return result.values()
|
||||
|
||||
@jsonize
|
||||
def loadTracks(context, request):
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
_at = request.POST.get('at')
|
||||
at_millis = view.datetimeToMillis(view.parseDatetime(_at))
|
||||
|
||||
# lets take 2 secs before and after given time
|
||||
from_millis = at_millis - 1000
|
||||
to_millis = at_millis + 1000
|
||||
|
||||
conf = view.listenerConf()
|
||||
conf.setContext(config.MODERATOR)
|
||||
conf.setCommand(config.SHOW_BOAT_POSITIONS)
|
||||
conf.setRace(view.currentRace())
|
||||
conf.setParameters(dict(sinceasmillis='%.f' % from_millis, toasmillis='%.f' % to_millis))
|
||||
|
||||
data = jsonByUrl(conf)
|
||||
|
||||
# filter out the position that is the most current one
|
||||
results = []
|
||||
for c in data['competitors']:
|
||||
if len(c['track'])>0:
|
||||
fix = c['track'][-1] or {}
|
||||
else: fix = {}
|
||||
results.append(dict(name=c['name'], **fix))
|
||||
|
||||
return results
|
||||
|
||||
@jsonize
|
||||
def determineWindDirection(context, request):
|
||||
""" Returns the wind for all known marks """
|
||||
|
||||
buoys = readWaypointsImpl(context, request)
|
||||
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
conf = view.listenerConf()
|
||||
conf.setContext(config.ADMIN)
|
||||
conf.setCommand(config.ADD_WIND)
|
||||
conf.setRace(view.currentRace())
|
||||
|
||||
_at = request.params.get('at')
|
||||
if _at:
|
||||
at_millis = view.datetimeToMillis(view.parseDatetime(_at))
|
||||
conf.setParameters(dict(timeasmillis='%.f' % at_millis))
|
||||
|
||||
else:
|
||||
# take start of race
|
||||
conf.setParameters(dict(timeasmillis='%.f' % view.currentRace().start))
|
||||
|
||||
params = []
|
||||
for buoy in buoys:
|
||||
if buoy.has_key('lat'):
|
||||
params.append('latdeg=%s' % buoy['lat'])
|
||||
params.append('lngdeg=%s' % buoy['lng'])
|
||||
|
||||
conf.parameters += '&%s' % '&'.join(params)
|
||||
|
||||
try:
|
||||
data = jsonByUrl(conf)
|
||||
except Exception, ex:
|
||||
log.error('Error', exc_info=True)
|
||||
return str(ex)
|
||||
|
||||
# simply return the list
|
||||
return data
|
||||
|
||||
@jsonize
|
||||
def listWindTrackers(context, request):
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
conf = view.listenerConf()
|
||||
conf.setContext(config.ADMIN)
|
||||
conf.setCommand(config.LIST_WIND_TRACKERS)
|
||||
|
||||
data = jsonByUrl(conf)
|
||||
return data
|
||||
|
||||
@jsonize
|
||||
def stopReceiver(context, request):
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
saveEventRace(context, request)
|
||||
|
||||
conf = view.listenerConf()
|
||||
conf.setContext(config.ADMIN)
|
||||
conf.setCommand(config.STOP_EXP_WIND)
|
||||
conf.setRace(view.currentRace())
|
||||
conf.trigger()
|
||||
|
||||
return 1
|
||||
|
||||
@jsonize
|
||||
def startWindTracker(context, request):
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
saveEventRace(context, request)
|
||||
|
||||
conf = view.listenerConf()
|
||||
conf.setContext(config.ADMIN)
|
||||
conf.setCommand(config.START_EXP_WIND)
|
||||
conf.setRace(view.currentRace())
|
||||
|
||||
correct = request.POST.get('declination', False) and 'true' or 'false'
|
||||
conf.setParameters(dict(port=request.POST.get('port'), correctexpeditionwindbearingbydeclination=correct))
|
||||
conf.trigger()
|
||||
|
||||
return 1
|
||||
|
||||
@jsonize
|
||||
def adminLiveData(context, request):
|
||||
# searches for all running races and displays information for all competitors
|
||||
|
||||
view = core.BaseView(context, request)
|
||||
|
||||
race = view.currentRace()
|
||||
event = model.EventImpl.queryOneBy(name=race.event)
|
||||
racepos = event.races.index(race.name)
|
||||
|
||||
competitors = model.CompetitorImpl.queryBy(event=event.name)
|
||||
currentlegs = race.current_legs
|
||||
|
||||
if currentlegs:
|
||||
if currentlegs[0] != 0:
|
||||
# always show the last leg
|
||||
currentlegs.insert(0, currentlegs[0]-1)
|
||||
|
||||
results = ''
|
||||
for pos in range(len(currentlegs)):
|
||||
legpos = currentlegs[pos]
|
||||
|
||||
results += '\nLEG: %s RACE-START: %s NEWEST: %s WIND: (%s %s %s)\n' % (legpos+1, view.millisToDatetime(race.start), view.millisToDatetime(race.timeofnewestevent), race.wind_source, race.wind_bearing, race.wind_speed)
|
||||
results += 'NAME'.ljust(16) + 'TOTAL'.ljust(7) + 'CRANK'.ljust(7) + 'RRANK'.ljust(7)
|
||||
results += 'MRANK'.ljust(7) + 'LRANK'.ljust(9) + 'SPD'.ljust(9) + 'DST'.ljust(9) + 'VMG'.ljust(9) + 'AVMG'.ljust(9) + 'SGAP'.ljust(9) + 'ETA'.ljust(9) + 'DSTGO'.ljust(9)
|
||||
results += '\n'
|
||||
|
||||
# sort competitors by rank in current leg
|
||||
competitors.sort(lambda x,y:cmp(x.values[racepos][legpos] and x.values[racepos][legpos][0] or 6000, y.values[racepos][legpos] and y.values[racepos][legpos][0] or 6000))
|
||||
|
||||
for c in competitors:
|
||||
results += '%s %s %s' % (c.name.ljust(15), str(c.total).ljust(6), str(c.current_rank).ljust(6))
|
||||
results += '%s %s' % (str(c.races[racepos]).ljust(7), str(c.marks[racepos][legpos]).ljust(7))
|
||||
|
||||
for v in c.values[racepos][legpos]:
|
||||
results += str('%.1f' % v).ljust(9)
|
||||
|
||||
results += '\n'
|
||||
|
||||
if not results:
|
||||
return 'This race seems to be finished!'
|
||||
|
||||
return results
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
$(document).ready(function() {
|
||||
var wHeight = $(window).height();
|
||||
|
||||
$("#rootwrapper").css("height", wHeight);
|
||||
$("#appinterface").css("height", wHeight-131);
|
||||
});
|
||||
|
After Width: | Height: | Size: 317 B |
|
After Width: | Height: | Size: 421 B |
|
After Width: | Height: | Size: 420 B |
|
After Width: | Height: | Size: 286 B |
|
After Width: | Height: | Size: 148 B |
|
After Width: | Height: | Size: 179 B |
|
After Width: | Height: | Size: 60 KiB |
@@ -0,0 +1,120 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>SAP Sailing Analytics</title>
|
||||
<meta content='width = device-width, initial-scale = 2.3, user-scalable = no' name='viewport'>
|
||||
<meta content='yes' name='apple-mobile-web-app-capable'>
|
||||
<meta content='black' name='apple-mobile-web-app-status-bar-style'>
|
||||
<link href='iphone-splash-screen.png' rel='apple-touch-startup-image'>
|
||||
<link href='sap-sailing-app-icon.png' rel='apple-touch-icon-precomposed'>
|
||||
<link href='mobile.css' media='screen' rel='stylesheet' type='text/css'>
|
||||
</head>
|
||||
<body>
|
||||
<ul class='overview'>
|
||||
<li class='event'>
|
||||
<h2>Event: Bla Event</h2>
|
||||
</li>
|
||||
<li class='current-race'>
|
||||
<p>Current Race 1</p>
|
||||
</li>
|
||||
<li class='current-leg'>
|
||||
<p>Current Leg M2</p>
|
||||
</li>
|
||||
</ul>
|
||||
<table class='race-table' id='r1-m1'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th colid='1'>
|
||||
<span>Rank</span>
|
||||
</th>
|
||||
<th colid='2'>
|
||||
<span>Name</span>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class='odd' rowid='1'>
|
||||
<td>1</td>
|
||||
<td>EVANS</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='2'>
|
||||
<td>2</td>
|
||||
<td>ALONSO</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='3'>
|
||||
<td>3</td>
|
||||
<td>ALONSO</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='4'>
|
||||
<td>4</td>
|
||||
<td>BROTHERTHOl</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='5'>
|
||||
<td>5</td>
|
||||
<td>ASQUITH</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='6'>
|
||||
<td>6</td>
|
||||
<td>CZAJKOWSKI</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='7'>
|
||||
<td>7</td>
|
||||
<td>NIELSEN</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='8'>
|
||||
<td>8</td>
|
||||
<td>NIELSEN</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='9'>
|
||||
<td>9</td>
|
||||
<td>PIASECKI</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='10'>
|
||||
<td>10</td>
|
||||
<td>FONSECA</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='11'>
|
||||
<td>11</td>
|
||||
<td>GRAEL</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='12'>
|
||||
<td>12</td>
|
||||
<td>NORREGAARD</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='13'>
|
||||
<td>13</td>
|
||||
<td>LANG</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='14'>
|
||||
<td>14</td>
|
||||
<td>KOSTOV</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='15'>
|
||||
<td>15</td>
|
||||
<td>CUPAC</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='16'>
|
||||
<td>16</td>
|
||||
<td>STORCK</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='17'>
|
||||
<td>17</td>
|
||||
<td>MOORE</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='18'>
|
||||
<td>18</td>
|
||||
<td>DELLE</td>
|
||||
</tr>
|
||||
<tr class='odd' rowid='19'>
|
||||
<td>19</td>
|
||||
<td>RESCH</td>
|
||||
</tr>
|
||||
<tr class='even' rowid='20'>
|
||||
<td>20</td>
|
||||
<td>DRAPER</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'></script>
|
||||
</html>
|
||||
@@ -0,0 +1,18 @@
|
||||
/*!
|
||||
* jQuery JavaScript Library v1.6.1
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Copyright 2011, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
* Copyright 2011, The Dojo Foundation
|
||||
* Released under the MIT, BSD, and GPL Licenses.
|
||||
*
|
||||
* Date: Thu May 12 15:04:36 2011 -0400
|
||||
*/
|
||||
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!cj[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),c.body.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write("<!doctype><html><body></body></html>");b=cl.createElement(a),cl.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ck)}cj[a]=d}return cj[a]}function cu(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function ct(){cq=b}function cs(){setTimeout(ct,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bF.test(a)?d(a,e):b_(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bU,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bQ),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bD(a,b,c){var d=b==="width"?bx:by,e=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return e;f.each(d,function(){c||(e-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?e+=parseFloat(f.css(a,"margin"+this))||0:e-=parseFloat(f.css(a,"border"+this+"Width"))||0});return e}function bn(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bm(a){f.nodeName(a,"input")?bl(a):a.getElementsByTagName&&f.grep(a.getElementsByTagName("input"),bl)}function bl(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bk(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bj(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bi(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bh(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function X(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(S.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function W(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function O(a,b){return(a&&a!=="*"?a+".":"")+b.replace(A,"`").replace(B,"&")}function N(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$Line truncated
|
||||
)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,O(a.origType,a.selector),f.extend({},a,{handler:N,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,O(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?F:E):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=F;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=F;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=F,this.stopPropagation()},isDefaultPrevented:E,isPropagationStopped:E,isImmediatePropagationStopped:E};var G=function(a){var b=a.relatedTarget;a.type=a.data;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&f.event.handle.apply(this,arguments)}catch(d){}},H=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?H:G,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?H:G)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&L("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&L("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var I,J=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},K=function(c){var d=c.target,e,g;if(!!z.test(d.nLine truncated
|
||||
b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bb.test(k))k=b.createTextNode(k);else{k=k.replace($,"<$1></$2>");var l=(_.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=ba.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Z.test(k)&&o.insertBefore(b.createTextNode(Z.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bm(k[i]);else bm(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bo=/alpha\([^)]*\)/i,bp=/opacity=([^)]*)/,bq=/-([a-z])/ig,br=/([A-Z]|^ms)/g,bs=/^-?\d+(?:px)?$/i,bt=/^-?\d/,bu=/^[+\-]=/,bv=/[^+\-\.\de]+/g,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB,bC=function(a,b){return b.toUpperCase()};f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0,widows:!0,orphans:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bu.test(d)&&(d=+d.replace(bv,"")+parseFloat(f.css(a,c))),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bq,bC)}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){a.offsetWidth!==0?e=bD(a,b,d):f.swap(a,bw,function(){e=bD(a,b,d)});if(e<=0){e=bz(a,b,b),e==="0px"&&bB&&(e=bB(a,b,b));if(e!=null)return e===""||e==="auto"?"0px":e}if(e<0||e==null){e=a.style[b];return e===""||e==="auto"?"0px":e}return typeof e=="string"?e:e+"px"}},set:function(a,b){if(!bs.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bp.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bo.test(g)?g.replace(bo,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,c){var d,e,g;c=c.replace(br,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bs.test(d)&&bt.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.displayLine truncated
|
||||
@@ -0,0 +1,112 @@
|
||||
.overall-blue {
|
||||
background: #008fcc !important; }
|
||||
|
||||
.c-race-1-orange {
|
||||
background: #de8a2e !important; }
|
||||
|
||||
.c-race-2-yellow {
|
||||
background: #fec631 !important; }
|
||||
|
||||
.c-race-3-lila {
|
||||
background: #9c277b !important; }
|
||||
|
||||
.c-race-4-green {
|
||||
background: #95aa31 !important; }
|
||||
|
||||
.c-race-5-red {
|
||||
background: #d83c3c !important; }
|
||||
|
||||
.c-table-odd {
|
||||
background: #484848 !important; }
|
||||
|
||||
.c-systeminfo {
|
||||
background: #e1e1e1 !important; }
|
||||
|
||||
.c-main-dark-bg {
|
||||
background: #151515 !important; }
|
||||
|
||||
.c-font-white {
|
||||
background: #ececec !important; }
|
||||
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline; }
|
||||
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block; }
|
||||
|
||||
body {
|
||||
line-height: 1; }
|
||||
|
||||
ol, ul {
|
||||
list-style: none; }
|
||||
|
||||
blockquote, q {
|
||||
quotes: none; }
|
||||
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: "";
|
||||
content: none; }
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.clear {
|
||||
clear: both;
|
||||
font-size: 1px;
|
||||
height: 0px;
|
||||
line-height: 0px;
|
||||
margin: -1px 0 0;
|
||||
width: 100%; }
|
||||
|
||||
.cover {
|
||||
left: -1000px;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
top: -1000px; }
|
||||
|
||||
body {
|
||||
background: #151515;
|
||||
color: #ececec;
|
||||
font-family: "Trebuchet MS"; }
|
||||
body a {
|
||||
text-decoration: none;
|
||||
color: #ececec; }
|
||||
body a:hover {
|
||||
text-decoration: none;
|
||||
color: #ececec; }
|
||||
|
||||
.overview li {
|
||||
padding: 10px; }
|
||||
.overview li.current-race {
|
||||
background: #484848; }
|
||||
|
||||
.race-table thead th {
|
||||
background: #008fcc;
|
||||
padding: 10px;
|
||||
text-align: left;
|
||||
vertical-align: top; }
|
||||
.race-table tbody tr td {
|
||||
padding: 10px; }
|
||||
.race-table tbody tr.odd td {
|
||||
background: #484848; }
|
||||
|
After Width: | Height: | Size: 735 B |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,452 @@
|
||||
.overall-blue {
|
||||
background: #008fcc !important; }
|
||||
|
||||
.c-race-1-orange {
|
||||
background: #de8a2e !important; }
|
||||
|
||||
.c-race-2-yellow {
|
||||
background: #fec631 !important; }
|
||||
|
||||
.c-race-3-lila {
|
||||
background: #9c277b !important; }
|
||||
|
||||
.c-race-4-green {
|
||||
background: #95aa31 !important; }
|
||||
|
||||
.c-race-5-red {
|
||||
background: #d83c3c !important; }
|
||||
|
||||
.c-table-odd {
|
||||
background: #484848 !important; }
|
||||
|
||||
.c-systeminfo {
|
||||
background: #e1e1e1 !important; }
|
||||
|
||||
.c-main-dark-bg {
|
||||
background: #151515 !important; }
|
||||
|
||||
.c-font-white {
|
||||
background: #ececec !important; }
|
||||
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline; }
|
||||
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block; }
|
||||
|
||||
body {
|
||||
line-height: 1; }
|
||||
|
||||
ol, ul {
|
||||
list-style: none; }
|
||||
|
||||
blockquote, q {
|
||||
quotes: none; }
|
||||
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: "";
|
||||
content: none; }
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0; }
|
||||
|
||||
.clear {
|
||||
clear: both;
|
||||
font-size: 1px;
|
||||
height: 0px;
|
||||
line-height: 0px;
|
||||
margin: -1px 0 0;
|
||||
width: 100%; }
|
||||
|
||||
.cover {
|
||||
left: -1000px;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
top: -1000px; }
|
||||
|
||||
body {
|
||||
background: #151515;
|
||||
font-family: "Trebuchet MS";
|
||||
color: #ececec; }
|
||||
body a {
|
||||
text-decoration: none;
|
||||
color: #ececec; }
|
||||
body a:hover {
|
||||
text-decoration: none;
|
||||
color: #ececec; }
|
||||
body td span {
|
||||
padding: 2px; }
|
||||
|
||||
#rootwrapper {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden; }
|
||||
|
||||
#appinterface {
|
||||
position: relative; }
|
||||
|
||||
#header {
|
||||
padding: 15px 0 0 0;
|
||||
height: 115px;
|
||||
background: url(/moderator-static/sap-logo.png) no-repeat 0 0;
|
||||
font-size: 14px;
|
||||
font-style: italic;
|
||||
font-weight: bold; }
|
||||
#header ul.systeminfo {
|
||||
float: right;
|
||||
color: #e1e1e1;
|
||||
padding: 0 5px 0 0;
|
||||
*display: inline-block; }
|
||||
#header ul.systeminfo li {
|
||||
padding: 10px 0 10px 30px;
|
||||
border-top: 1px solid #e1e1e1; }
|
||||
#header ul.systeminfo li.active {
|
||||
background: url(/moderator-static/refresh-icon.png) no-repeat left center; }
|
||||
#header ul.systeminfo li.message-0 {
|
||||
border: none; }
|
||||
#header ul.systeminfo:after {
|
||||
content: " ";
|
||||
display: block;
|
||||
height: 0;
|
||||
clear: both;
|
||||
visibility: hidden; }
|
||||
|
||||
span.race-count {
|
||||
padding: 102px 0 0 0;
|
||||
display: block;
|
||||
font-size: 18px; }
|
||||
span.race-count ul {
|
||||
text-align: center;
|
||||
margin: 0 0 10px 0;
|
||||
font-weight: bold; }
|
||||
span.race-count ul:last-child {
|
||||
margin: 0; }
|
||||
span.race-count ul li {
|
||||
padding: 5px; }
|
||||
|
||||
#left-systembar {
|
||||
width: 39px;
|
||||
background: #484848;
|
||||
height: 100%;
|
||||
float: left;
|
||||
margin: 0 10px 0 1px;
|
||||
position: relative;
|
||||
font-size: 18px; }
|
||||
#left-systembar div {
|
||||
width: 100%;
|
||||
position: absolute; }
|
||||
#left-systembar div.blue-table-btn {
|
||||
top: 0;
|
||||
left: 0; }
|
||||
#left-systembar div.blue-table-btn a {
|
||||
display: block;
|
||||
height: 92px;
|
||||
text-decoration: none;
|
||||
background: url(/moderator-static/arrow-right.png) left top no-repeat #008fcc; }
|
||||
#left-systembar div.blue-table-btn a:hover {
|
||||
text-decoration: none; }
|
||||
#left-systembar .slide-backward {
|
||||
background: url(/moderator-static/arrow-left.png) left bottom no-repeat #484848;
|
||||
display: block;
|
||||
height: 100%; }
|
||||
|
||||
#right-systembar {
|
||||
width: 39px;
|
||||
background: #484848;
|
||||
height: 100%;
|
||||
float: right;
|
||||
margin: 0 0 0 10px;
|
||||
position: relative;
|
||||
font-size: 18px; }
|
||||
#right-systembar .function-btn-wrapper {
|
||||
font-size: 24px;
|
||||
color: #ececec;
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%; }
|
||||
#right-systembar .function-btn-wrapper ul.function-btn {
|
||||
padding: 1px;
|
||||
*display: inline-block; }
|
||||
#right-systembar .function-btn-wrapper ul.function-btn:after {
|
||||
content: " ";
|
||||
display: block;
|
||||
height: 0;
|
||||
clear: both;
|
||||
visibility: hidden; }
|
||||
#right-systembar .function-btn-wrapper ul.function-btn li {
|
||||
background: #151515;
|
||||
padding: 5px 0; }
|
||||
#right-systembar .function-btn-wrapper ul.function-btn li:first-child {
|
||||
margin: 0 0 1px 0; }
|
||||
#right-systembar .slide-forward {
|
||||
background: url(/moderator-static/arrow-right.png) left bottom no-repeat #484848;
|
||||
display: block;
|
||||
height: 100%; }
|
||||
|
||||
#main-interface {
|
||||
float: left;
|
||||
height: 100%; }
|
||||
#main-interface .sort-asc {
|
||||
background: url(/moderator-static/sort-arrow-top.png) 0 0 no-repeat #151515; }
|
||||
#main-interface .sort-desc {
|
||||
background: url(/moderator-static/sort-arrow-bottom.png) 0 0 no-repeat #151515; }
|
||||
#main-interface .blue-table {
|
||||
padding: 0 10px 0 0;
|
||||
font-size: 14px;
|
||||
float: left; }
|
||||
#main-interface .blue-table .refresh-btn {
|
||||
display: block;
|
||||
height: 39px;
|
||||
background: url(/moderator-static/refresh-icon.png) right center no-repeat #484848; }
|
||||
#main-interface .blue-table .sort-rank {
|
||||
display: block;
|
||||
height: 39px; }
|
||||
#main-interface .blue-table #table-scrolling li {
|
||||
float: left;
|
||||
width: 94px;
|
||||
margin: 20px 0 0 0; }
|
||||
#main-interface .blue-table #table-scrolling li a {
|
||||
display: block;
|
||||
height: 24px; }
|
||||
#main-interface .blue-table #table-scrolling li a.table-scrolldown {
|
||||
background: url(/moderator-static/arrow-bottom.png) no-repeat left center #484848; }
|
||||
#main-interface .blue-table #table-scrolling li a.table-scrollup {
|
||||
background: url(/moderator-static/arrow-top.png) no-repeat right center #484848; }
|
||||
#main-interface #overall-clipping {
|
||||
border-collapse: collapse;
|
||||
width: 170px;
|
||||
text-align: left;
|
||||
vertical-align: middle;
|
||||
margin: 14px 0 0 0; }
|
||||
#main-interface #overall-clipping td {
|
||||
padding: 5px; }
|
||||
#main-interface #overall-clipping tr.odd td {
|
||||
background: #484848; }
|
||||
#main-interface .race {
|
||||
height: 100%;
|
||||
float: left;
|
||||
margin: 0 8px 0 0;
|
||||
font-size: 14px; }
|
||||
#main-interface .race div {
|
||||
color: #151515;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
height: 100%;
|
||||
display: block;
|
||||
float: left;
|
||||
margin: 0 2px 0 0;
|
||||
position: relative; }
|
||||
#main-interface .race div a {
|
||||
color: #151515; }
|
||||
#main-interface .race div a.main-box-sort {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: block;
|
||||
height: 92px;
|
||||
width: 100%; }
|
||||
#main-interface .race div a.leg-box-sort {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: block;
|
||||
height: 92px;
|
||||
width: 100%; }
|
||||
#main-interface .race div.main-box {
|
||||
width: 39px; }
|
||||
#main-interface .race div.main-box span {
|
||||
padding: 6px 0 0 6px;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0; }
|
||||
#main-interface .race div.main-box .sort-asc {
|
||||
background: url(/moderator-static/sort-arrow-top.png) center 40px no-repeat; }
|
||||
#main-interface .race div.main-box .sort-desc {
|
||||
background: url(/moderator-static/sort-arrow-bottom.png) center 40px no-repeat; }
|
||||
#main-interface .race div.leg-box {
|
||||
font-size: 14px;
|
||||
width: 39px; }
|
||||
#main-interface .race div.leg-box span {
|
||||
padding: 14px 0 0 10px;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0; }
|
||||
#main-interface .race div.leg-box .sort-asc {
|
||||
background: url(/moderator-static/sort-arrow-top.png) center 40px no-repeat; }
|
||||
#main-interface .race div.leg-box .sort-desc {
|
||||
background: url(/moderator-static/sort-arrow-bottom.png) center 40px no-repeat; }
|
||||
#main-interface .race div.table-box {
|
||||
width: 39px;
|
||||
margin: 0; }
|
||||
#main-interface .race div.table-box .table-box-sort {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 92px;
|
||||
width: 100%; }
|
||||
#main-interface .race div.table-box .sort-asc {
|
||||
background: url(/moderator-static/sort-arrow-top.png) center 40px no-repeat; }
|
||||
#main-interface .race div.table-box .sort-desc {
|
||||
background: url(/moderator-static/sort-arrow-bottom.png) center 40px no-repeat; }
|
||||
#main-interface .race div ul {
|
||||
font-size: 14px;
|
||||
margin: 92px 0 0 0;
|
||||
text-align: center; }
|
||||
#main-interface .race div ul li {
|
||||
padding: 5px; }
|
||||
#main-interface .race div.leg-wrap {
|
||||
background: none;
|
||||
margin: 0; }
|
||||
#main-interface .race table.race-table {
|
||||
border-collapse: collapse;
|
||||
text-align: left;
|
||||
vertical-align: middle;
|
||||
float: left;
|
||||
margin: 0 2px 0 0;
|
||||
font-size: 14px;
|
||||
color: #ececec;
|
||||
*display: inline-block; }
|
||||
#main-interface .race table.race-table:after {
|
||||
content: " ";
|
||||
display: block;
|
||||
height: 0;
|
||||
clear: both;
|
||||
visibility: hidden; }
|
||||
#main-interface .race table.race-table th {
|
||||
padding: 13px 10px;
|
||||
color: #151515;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold; }
|
||||
#main-interface .race table.race-table th.firstelement {
|
||||
width: 39px;
|
||||
padding: 0; }
|
||||
#main-interface .race table.race-table th:first-child {
|
||||
padding-left: 20px; }
|
||||
#main-interface .race table.race-table th:last-child {
|
||||
padding-right: 20px; }
|
||||
#main-interface .race table.race-table tr td {
|
||||
padding: 5px; }
|
||||
#main-interface .race table.race-table tr td span {
|
||||
padding: 2px 0; }
|
||||
#main-interface .race table.race-table tr td:first-child {
|
||||
padding-left: 20px; }
|
||||
#main-interface .race table.race-table tr td:last-child {
|
||||
padding-right: 20px; }
|
||||
#main-interface .race table.race-table tr td.table-sorting {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0; }
|
||||
#main-interface .race table.race-table tr td.table-sorting a {
|
||||
height: 51px;
|
||||
display: block; }
|
||||
#main-interface .race table.race-table tr.odd td {
|
||||
background: #484848; }
|
||||
#main-interface .race table.race-table tr.odd td span {
|
||||
background: #484848; }
|
||||
|
||||
#overall-wrap {
|
||||
background: #151515;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
left: 50px; }
|
||||
#overall-wrap #overall {
|
||||
border-collapse: collapse;
|
||||
text-align: left;
|
||||
vertical-align: middle;
|
||||
background: #151515; }
|
||||
#overall-wrap #overall th {
|
||||
padding: 11px;
|
||||
background: #008fcc;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold; }
|
||||
#overall-wrap #overall th:first-child {
|
||||
padding-left: 20px; }
|
||||
#overall-wrap #overall th:last-child {
|
||||
padding-right: 20px; }
|
||||
#overall-wrap #overall td {
|
||||
padding: 5px; }
|
||||
#overall-wrap #overall td:first-child {
|
||||
padding-left: 20px; }
|
||||
#overall-wrap #overall td:last-child {
|
||||
padding-right: 20px; }
|
||||
#overall-wrap #overall tr.odd td {
|
||||
background: #484848; }
|
||||
|
||||
#race-1 div {
|
||||
background: #de8a2e; }
|
||||
|
||||
#race-2 div {
|
||||
background: #fec631; }
|
||||
|
||||
#race-3 div {
|
||||
background: #9c277b; }
|
||||
|
||||
#race-4 div {
|
||||
background: #95aa31; }
|
||||
|
||||
#race-5 div {
|
||||
background: #d83c3c; }
|
||||
|
||||
body.race-1 #race-1 table th {
|
||||
background: #de8a2e; }
|
||||
body.race-1 #right-systembar ul.function-btn {
|
||||
background: #de8a2e; }
|
||||
body.race-1 #right-systembar ul.function-btn-active li {
|
||||
background: #de8a2e; }
|
||||
|
||||
body.race-2 #race-2 table th {
|
||||
background: #fec631; }
|
||||
body.race-2 #right-systembar ul.function-btn {
|
||||
background: #fec631; }
|
||||
body.race-2 #right-systembar ul.function-btn-active li {
|
||||
background: #fec631; }
|
||||
|
||||
body.race-3 #race-3 table th {
|
||||
background: #9c277b; }
|
||||
body.race-3 #right-systembar ul.function-btn {
|
||||
background: #9c277b; }
|
||||
body.race-3 #right-systembar ul.function-btn-active li {
|
||||
background: #9c277b; }
|
||||
|
||||
body.race-4 #race-4 table th {
|
||||
background: #95aa31; }
|
||||
body.race-4 #right-systembar ul.function-btn {
|
||||
background: #95aa31; }
|
||||
body.race-4 #right-systembar ul.function-btn-active li {
|
||||
background: #95aa31; }
|
||||
|
||||
body.race-5 #race-5 table th {
|
||||
background: #d83c3c; }
|
||||
body.race-5 #right-systembar ul.function-btn {
|
||||
background: #d83c3c; }
|
||||
body.race-5 #right-systembar ul.function-btn-active li {
|
||||
background: #d83c3c; }
|
||||
|
||||
.border-activity {
|
||||
background: url(/moderator-static/border-activity.png) 0 0 no-repeat; }
|
||||
|
After Width: | Height: | Size: 326 B |
|
After Width: | Height: | Size: 321 B |
@@ -0,0 +1,49 @@
|
||||
|
||||
var map;
|
||||
|
||||
function random() {
|
||||
return Math.floor(Math.random()*484887498739872)
|
||||
}
|
||||
|
||||
/**
|
||||
* General functionality
|
||||
**/
|
||||
var loader_whitebg = '<div class="loader"><img src="' + _base_url() + 'static/images/ajax-loader.gif"/></div>';
|
||||
|
||||
/**
|
||||
* format("i can speak {language} since i was {age}",{language:'javascript',age:10});
|
||||
*/
|
||||
var format = function (str, col) {
|
||||
col = typeof col === 'object' ? col : Array.prototype.slice.call(arguments, 1);
|
||||
|
||||
return str.replace(/\{([^}]+)\}/gm, function () {
|
||||
return col[arguments[1]];
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Renders the given template and invokes the callback with response
|
||||
*/
|
||||
function template(templatename, parameters, callback) {
|
||||
$.get(_base_url() + '@@/' + templatename, parameters, function(data) {
|
||||
callback(data);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the given function. Must return JSON
|
||||
*/
|
||||
function GET(name, parameters, callback) {
|
||||
$.get(_base_url() + '++/' + name, parameters, function(data) {
|
||||
if (callback)
|
||||
callback(data);
|
||||
})
|
||||
}
|
||||
|
||||
function displayLoader(element_desc) {
|
||||
$(element_desc).html(loader_whitebg);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
$.ajaxSetup({cache:false});
|
||||
});
|
||||
@@ -0,0 +1,502 @@
|
||||
/*
|
||||
* jQuery UI CSS Framework 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Theming/API
|
||||
*/
|
||||
|
||||
/* Layout helpers
|
||||
----------------------------------*/
|
||||
.ui-helper-hidden { display: none; }
|
||||
.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
|
||||
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
|
||||
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
|
||||
.ui-helper-clearfix { display: inline-block; }
|
||||
/* required comment for clearfix to work in Opera \*/
|
||||
* html .ui-helper-clearfix { height:1%; }
|
||||
.ui-helper-clearfix { display:block; }
|
||||
/* end clearfix */
|
||||
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
|
||||
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-disabled { cursor: default !important; }
|
||||
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||
|
||||
|
||||
/*
|
||||
* jQuery UI CSS Framework 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Theming/API
|
||||
*
|
||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
|
||||
*/
|
||||
|
||||
|
||||
/* Component containers
|
||||
----------------------------------*/
|
||||
.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
|
||||
.ui-widget .ui-widget { font-size: 1em; }
|
||||
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
|
||||
.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(${request.application_url}/images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
|
||||
.ui-widget-content a { color: #222222; }
|
||||
.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(${request.application_url}/images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
|
||||
.ui-widget-header a { color: #222222; }
|
||||
|
||||
/* Interaction states
|
||||
----------------------------------*/
|
||||
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(${request.application_url}/images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
|
||||
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
|
||||
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(${request.application_url}/images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
|
||||
.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
|
||||
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(${request.application_url}/images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
|
||||
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
|
||||
.ui-widget :active { outline: none; }
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(${request.application_url}/images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
|
||||
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
|
||||
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(${request.application_url}/images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
|
||||
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
|
||||
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
|
||||
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
|
||||
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
|
||||
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon { width: 16px; height: 16px; background-image: url(${request.application_url}/images/ui-icons_222222_256x240.png); }
|
||||
.ui-widget-content .ui-icon {background-image: url(${request.application_url}/images/ui-icons_222222_256x240.png); }
|
||||
.ui-widget-header .ui-icon {background-image: url(${request.application_url}/images/ui-icons_222222_256x240.png); }
|
||||
.ui-state-default .ui-icon { background-image: url(${request.application_url}/images/ui-icons_888888_256x240.png); }
|
||||
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(${request.application_url}/images/ui-icons_454545_256x240.png); }
|
||||
.ui-state-active .ui-icon {background-image: url(${request.application_url}/images/ui-icons_454545_256x240.png); }
|
||||
.ui-state-highlight .ui-icon {background-image: url(${request.application_url}/images/ui-icons_2e83ff_256x240.png); }
|
||||
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(${request.application_url}/images/ui-icons_cd0a0a_256x240.png); }
|
||||
|
||||
/* positioning */
|
||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||
.ui-icon-extlink { background-position: -32px -80px; }
|
||||
.ui-icon-newwin { background-position: -48px -80px; }
|
||||
.ui-icon-refresh { background-position: -64px -80px; }
|
||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||
.ui-icon-document { background-position: -32px -96px; }
|
||||
.ui-icon-document-b { background-position: -48px -96px; }
|
||||
.ui-icon-note { background-position: -64px -96px; }
|
||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||
.ui-icon-comment { background-position: -128px -96px; }
|
||||
.ui-icon-person { background-position: -144px -96px; }
|
||||
.ui-icon-print { background-position: -160px -96px; }
|
||||
.ui-icon-trash { background-position: -176px -96px; }
|
||||
.ui-icon-locked { background-position: -192px -96px; }
|
||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||
.ui-icon-tag { background-position: -240px -96px; }
|
||||
.ui-icon-home { background-position: 0 -112px; }
|
||||
.ui-icon-flag { background-position: -16px -112px; }
|
||||
.ui-icon-calendar { background-position: -32px -112px; }
|
||||
.ui-icon-cart { background-position: -48px -112px; }
|
||||
.ui-icon-pencil { background-position: -64px -112px; }
|
||||
.ui-icon-clock { background-position: -80px -112px; }
|
||||
.ui-icon-disk { background-position: -96px -112px; }
|
||||
.ui-icon-calculator { background-position: -112px -112px; }
|
||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||
.ui-icon-search { background-position: -160px -112px; }
|
||||
.ui-icon-wrench { background-position: -176px -112px; }
|
||||
.ui-icon-gear { background-position: -192px -112px; }
|
||||
.ui-icon-heart { background-position: -208px -112px; }
|
||||
.ui-icon-star { background-position: -224px -112px; }
|
||||
.ui-icon-link { background-position: -240px -112px; }
|
||||
.ui-icon-cancel { background-position: 0 -128px; }
|
||||
.ui-icon-plus { background-position: -16px -128px; }
|
||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||
.ui-icon-minus { background-position: -48px -128px; }
|
||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||
.ui-icon-close { background-position: -80px -128px; }
|
||||
.ui-icon-closethick { background-position: -96px -128px; }
|
||||
.ui-icon-key { background-position: -112px -128px; }
|
||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||
.ui-icon-scissors { background-position: -144px -128px; }
|
||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||
.ui-icon-copy { background-position: -176px -128px; }
|
||||
.ui-icon-contact { background-position: -192px -128px; }
|
||||
.ui-icon-image { background-position: -208px -128px; }
|
||||
.ui-icon-video { background-position: -224px -128px; }
|
||||
.ui-icon-script { background-position: -240px -128px; }
|
||||
.ui-icon-alert { background-position: 0 -144px; }
|
||||
.ui-icon-info { background-position: -16px -144px; }
|
||||
.ui-icon-notice { background-position: -32px -144px; }
|
||||
.ui-icon-help { background-position: -48px -144px; }
|
||||
.ui-icon-check { background-position: -64px -144px; }
|
||||
.ui-icon-bullet { background-position: -80px -144px; }
|
||||
.ui-icon-radio-off { background-position: -96px -144px; }
|
||||
.ui-icon-radio-on { background-position: -112px -144px; }
|
||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||
.ui-icon-play { background-position: 0 -160px; }
|
||||
.ui-icon-pause { background-position: -16px -160px; }
|
||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||
.ui-icon-stop { background-position: -96px -160px; }
|
||||
.ui-icon-eject { background-position: -112px -160px; }
|
||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||
.ui-icon-power { background-position: 0 -176px; }
|
||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||
.ui-icon-signal { background-position: -32px -176px; }
|
||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
|
||||
.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
||||
.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
||||
.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
||||
.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
||||
.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
||||
.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
||||
.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
||||
.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay { background: #aaaaaa url(${request.application_url}/images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
|
||||
.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(${request.application_url}/images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
|
||||
* jQuery UI Resizable 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Resizable#theming
|
||||
*/
|
||||
.ui-resizable { position: relative;}
|
||||
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
|
||||
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
|
||||
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
|
||||
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
|
||||
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
|
||||
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
|
||||
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
|
||||
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
|
||||
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
|
||||
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
|
||||
* jQuery UI Selectable 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Selectable#theming
|
||||
*/
|
||||
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
|
||||
/*
|
||||
* jQuery UI Accordion 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Accordion#theming
|
||||
*/
|
||||
/* IE/Win - Fix animation bug - #4615 */
|
||||
.ui-accordion { width: 100%; }
|
||||
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
|
||||
.ui-accordion .ui-accordion-li-fix { display: inline; }
|
||||
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
|
||||
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
|
||||
.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
|
||||
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
|
||||
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
|
||||
.ui-accordion .ui-accordion-content-active { display: block; }
|
||||
/*
|
||||
* jQuery UI Autocomplete 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Autocomplete#theming
|
||||
*/
|
||||
.ui-autocomplete { position: absolute; cursor: default; }
|
||||
|
||||
/* workarounds */
|
||||
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
|
||||
|
||||
/*
|
||||
* jQuery UI Menu 1.8.11
|
||||
*
|
||||
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Menu#theming
|
||||
*/
|
||||
.ui-menu {
|
||||
list-style:none;
|
||||
padding: 2px;
|
||||
margin: 0;
|
||||
display:block;
|
||||
float: left;
|
||||
}
|
||||
.ui-menu .ui-menu {
|
||||
margin-top: -3px;
|
||||
}
|
||||
.ui-menu .ui-menu-item {
|
||||
margin:0;
|
||||
padding: 0;
|
||||
zoom: 1;
|
||||
float: left;
|
||||
clear: left;
|
||||
width: 100%;
|
||||
}
|
||||
.ui-menu .ui-menu-item a {
|
||||
text-decoration:none;
|
||||
display:block;
|
||||
padding:.2em .4em;
|
||||
line-height:1.5;
|
||||
zoom:1;
|
||||
}
|
||||
.ui-menu .ui-menu-item a.ui-state-hover,
|
||||
.ui-menu .ui-menu-item a.ui-state-active {
|
||||
font-weight: normal;
|
||||
margin: -1px;
|
||||
}
|
||||
/*
|
||||
* jQuery UI Dialog 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Dialog#theming
|
||||
*/
|
||||
.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
|
||||
.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
|
||||
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
|
||||
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
|
||||
.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
|
||||
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
|
||||
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
|
||||
.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
|
||||
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
|
||||
.ui-draggable .ui-dialog-titlebar { cursor: move; }
|
||||
/*
|
||||
* jQuery UI Tabs 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Tabs#theming
|
||||
*/
|
||||
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
|
||||
.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
|
||||
.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
|
||||
.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
|
||||
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
|
||||
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
|
||||
.ui-tabs .ui-tabs-hide { display: none !important; }
|
||||
/*
|
||||
* jQuery UI Datepicker 1.8.11
|
||||
*
|
||||
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* http://docs.jquery.com/UI/Datepicker#theming
|
||||
*/
|
||||
.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
|
||||
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
|
||||
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
|
||||
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
|
||||
.ui-datepicker .ui-datepicker-prev { left:2px; }
|
||||
.ui-datepicker .ui-datepicker-next { right:2px; }
|
||||
.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
|
||||
.ui-datepicker .ui-datepicker-next-hover { right:1px; }
|
||||
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
|
||||
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
|
||||
.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
|
||||
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
|
||||
.ui-datepicker select.ui-datepicker-month,
|
||||
.ui-datepicker select.ui-datepicker-year { width: 49%;}
|
||||
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
|
||||
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
|
||||
.ui-datepicker td { border: 0; padding: 1px; }
|
||||
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
|
||||
|
||||
/* with multiple calendars */
|
||||
.ui-datepicker.ui-datepicker-multi { width:auto; }
|
||||
.ui-datepicker-multi .ui-datepicker-group { float:left; }
|
||||
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
|
||||
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
|
||||
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
|
||||
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
|
||||
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
|
||||
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
|
||||
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
|
||||
.ui-datepicker-row-break { clear:both; width:100%; }
|
||||
|
||||
/* RTL support */
|
||||
.ui-datepicker-rtl { direction: rtl; }
|
||||
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group { float:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
||||
|
||||
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
|
||||
.ui-datepicker-cover {
|
||||
display: none; /*sorry for IE5*/
|
||||
display/**/: block; /*sorry for IE5*/
|
||||
position: absolute; /*must have*/
|
||||
z-index: -1; /*must have*/
|
||||
filter: mask(); /*must have*/
|
||||
top: -4px; /*must have*/
|
||||
left: -4px; /*must have*/
|
||||
width: 200px; /*must have*/
|
||||
height: 200px; /*must have*/
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
.timeslider-container, div.timeslider-arrow,
|
||||
a.timeslider-slider, div.timeslider-slider-line,
|
||||
div.timeslider-labels, div.timeslider-label
|
||||
{
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
-moz-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.timeslider-container
|
||||
{
|
||||
position: relative;
|
||||
width: 146px;
|
||||
min-height: 40px;
|
||||
}
|
||||
|
||||
div.timeslider-container
|
||||
{
|
||||
display: -moz-inline-box;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
div.timeslider-arrow
|
||||
{
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
div.timeslider-down-arrow
|
||||
{
|
||||
left: 0;
|
||||
background: url("/static/images/pt_controls.png") -18px 0px;
|
||||
}
|
||||
|
||||
div.timeslider-up-arrow
|
||||
{
|
||||
left: 126px;
|
||||
background: url("/static/images/pt_controls.png") 0px 0px;
|
||||
}
|
||||
|
||||
div.timeslider-down-arrow.timeslider-disabled, div.timeslider-disabled div.timeslider-down-arrow
|
||||
{
|
||||
background: url("/static/images/pt_controls.png") -18px -20px;
|
||||
cursor: inherit;
|
||||
}
|
||||
|
||||
div.timeslider-up-arrow.timeslider-disabled, div.timeslider-disabled div.timeslider-up-arrow
|
||||
{
|
||||
background: url("/static/images/pt_controls.png") 0px -20px;
|
||||
cursor: inherit;
|
||||
}
|
||||
|
||||
div.timeslider-slider-line
|
||||
{
|
||||
position: absolute;
|
||||
left: 18px;
|
||||
width: 108px;
|
||||
height: 18px;
|
||||
background: url("/static/images/pt_controls.png") -52px 0px;
|
||||
}
|
||||
|
||||
div.timeslider-disabled div.timeslider-slider-line
|
||||
{
|
||||
background: url("/static/images/pt_controls.png") -52px -20px;
|
||||
}
|
||||
|
||||
div.timeslider-slider-line-clickable
|
||||
{
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a.timeslider-slider
|
||||
{
|
||||
display: none;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
width: 16px;
|
||||
height: 20px;
|
||||
background: url("/static/images/pt_controls.png") -36px 0px;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.timeslider-slider:hover
|
||||
{
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
div.timeslider-disabled a.timeslider-slider
|
||||
{
|
||||
background: url("/static/images/pt_controls.png") -36px -20px;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
div.timeslider-labels
|
||||
{
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
left: 18px;
|
||||
}
|
||||
|
||||
div.timeslider-label
|
||||
{
|
||||
position: absolute;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
div.timeslider-disabled div.timeslider-labels
|
||||
{
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
|
||||
body {
|
||||
font-family: Verdana, Helvetica, Arial, sans-serif;
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
color: #5A554E;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2.4em;
|
||||
margin: 3px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.6em;
|
||||
}
|
||||
|
||||
p, ul, ol {
|
||||
margin-top: 0;
|
||||
line-height: 200%;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: underline;
|
||||
color: #516C00;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
h2 a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
table {
|
||||
border-width: 1px;
|
||||
border-spacing: 0px;
|
||||
border-color: #ececec;
|
||||
border-style: solid;
|
||||
}
|
||||
|
||||
table td {
|
||||
border-width: 1px;
|
||||
padding: 2px;
|
||||
border-style: solid;
|
||||
border-color: #ececec;
|
||||
}
|
||||
|
||||
.clear {
|
||||
clear: both;
|
||||
font-size: 1px;
|
||||
line-height: 1px;
|
||||
}
|
||||
|
||||
div.help {
|
||||
margin: 2px 1px 6px 1px;
|
||||
padding: 10px;
|
||||
border: 1px solid #ececec;
|
||||
}
|
||||
|
||||
div.field {
|
||||
padding: 3px 0px 4px 2px;
|
||||
margin: 5px 3px 2px 2px;
|
||||
}
|
||||
|
||||
div.field span {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
||||
div.field input {
|
||||
border: 1px solid #8F8F8F;
|
||||
width: 234px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
div.field input.large {
|
||||
width: 687px;
|
||||
}
|
||||
|
||||
form input[type=submit] {
|
||||
padding: 5px 35px;
|
||||
margin: 5px 2px 2px 2px;
|
||||
border: 1px solid #c8c8c8;
|
||||
background-color: white;
|
||||
color: black;
|
||||
}
|
||||
|
||||
select {
|
||||
border: 1px solid #c8c8c8;
|
||||
padding: 3px 2px 3px 9px;
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.loader {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
padding: 5px;
|
||||
margin: 7px 0px 7px 0px;
|
||||
}
|
||||
|
||||
div.message {
|
||||
color: #a0522d;
|
||||
background-color: #ffffe0;
|
||||
margin: 10px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#tabs {
|
||||
margin: 3px !important;
|
||||
}
|
||||
|
||||
div.info {
|
||||
margin: 10px 2px 2px 2px;
|
||||
padding: 7px;
|
||||
border: 1px solid #ececec;
|
||||
}
|
||||
|
||||
.maplabel {
|
||||
color: red;
|
||||
background-color: white;
|
||||
font-family: "Lucida Grande", "Arial", sans-serif;
|
||||
font-size: 9px;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
width: 50px;
|
||||
border: 2px solid black;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
|
||||
.ui-timepicker-div .ui-widget-header{ margin-bottom: 8px; }
|
||||
.ui-timepicker-div dl{ text-align: left; }
|
||||
.ui-timepicker-div dl dt{ height: 25px; }
|
||||
.ui-timepicker-div dl dd{ margin: -25px 10px 10px 65px; }
|
||||
.ui-timepicker-div td { font-size: 90%; }
|
||||
|
||||
.ui-slider { position: relative; text-align: left; }
|
||||
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
|
||||
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
|
||||
.ui-slider-horizontal { height: .8em; }
|
||||
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
|
||||
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
|
||||
.ui-slider-horizontal .ui-slider-range-min { left: 0; }
|
||||
.ui-slider-horizontal .ui-slider-range-max { right: 0; }
|
||||
.ui-slider-vertical { width: .8em; height: 100px; }
|
||||
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
|
||||
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
|
||||
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
|
||||
.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
|
||||
|
||||
|
After Width: | Height: | Size: 723 B |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 88 B |
|
After Width: | Height: | Size: 86 B |
|
After Width: | Height: | Size: 89 B |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 263 B |
|
After Width: | Height: | Size: 252 B |
|
After Width: | Height: | Size: 282 B |
|
After Width: | Height: | Size: 260 B |
|
After Width: | Height: | Size: 251 B |
|
After Width: | Height: | Size: 180 B |
|
After Width: | Height: | Size: 178 B |
|
After Width: | Height: | Size: 120 B |
|
After Width: | Height: | Size: 105 B |
|
After Width: | Height: | Size: 111 B |
|
After Width: | Height: | Size: 110 B |
|
After Width: | Height: | Size: 119 B |
|
After Width: | Height: | Size: 101 B |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,167 @@
|
||||
/*!
|
||||
* jQuery JavaScript Library v1.4.4
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
* Copyright 2010, The Dojo Foundation
|
||||
* Released under the MIT, BSD, and GPL Licenses.
|
||||
*
|
||||
* Date: Thu Nov 11 19:04:53 2010 -0500
|
||||
*/
|
||||
(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
|
||||
h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
|
||||
h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
|
||||
"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
|
||||
e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
|
||||
"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
|
||||
a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
|
||||
C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
|
||||
s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
|
||||
j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
|
||||
toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
|
||||
-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
|
||||
if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
|
||||
if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
|
||||
b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
|
||||
!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
|
||||
l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
|
||||
z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
|
||||
s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
|
||||
s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
|
||||
[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
|
||||
false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
|
||||
k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
|
||||
scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
|
||||
false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
|
||||
1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
|
||||
"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
|
||||
c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
|
||||
else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
|
||||
a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
|
||||
c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
|
||||
a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
|
||||
colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
|
||||
1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
|
||||
l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
|
||||
"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
|
||||
if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
|
||||
a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
|
||||
attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
|
||||
b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
|
||||
c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
|
||||
arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
|
||||
d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
|
||||
c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
|
||||
w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
|
||||
8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
|
||||
"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
|
||||
d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
||||
fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
|
||||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
|
||||
Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
|
||||
c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
|
||||
var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
|
||||
"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
|
||||
xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
|
||||
B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
|
||||
"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
|
||||
0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
|
||||
a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
|
||||
1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
|
||||
"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
|
||||
c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
|
||||
(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
|
||||
[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
|
||||
break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
|
||||
q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
|
||||
l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
|
||||
return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
|
||||
B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
|
||||
POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
|
||||
i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
|
||||
i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
|
||||
"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
|
||||
m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
|
||||
true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
|
||||
g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
|
||||
0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
|
||||
"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
|
||||
i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
|
||||
if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
|
||||
g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
|
||||
for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
|
||||
i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
|
||||
n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
|
||||
function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
|
||||
p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
|
||||
t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
|
||||
function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
|
||||
c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
|
||||
not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
|
||||
h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
|
||||
c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
|
||||
2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
|
||||
b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
|
||||
e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
|
||||
"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
|
||||
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
|
||||
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
|
||||
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
|
||||
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
|
||||
else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
|
||||
c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
|
||||
b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
|
||||
this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
|
||||
prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
|
||||
b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
|
||||
1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
|
||||
d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
|
||||
jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
|
||||
zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
|
||||
h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
|
||||
if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
|
||||
d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
|
||||
e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
||||
ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
|
||||
"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
|
||||
!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
|
||||
getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
|
||||
script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
|
||||
!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
|
||||
false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
|
||||
A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
|
||||
b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
|
||||
c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
|
||||
c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
|
||||
encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
|
||||
[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
|
||||
e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
|
||||
if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
|
||||
3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
|
||||
d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
|
||||
d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
|
||||
"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
|
||||
1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
|
||||
d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
|
||||
Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
|
||||
var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
|
||||
this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
|
||||
this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
|
||||
c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
|
||||
b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
|
||||
h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
|
||||
for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
|
||||
parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
|
||||
height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
|
||||
f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
|
||||
"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
|
||||
e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
|
||||
c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
|
||||
c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
|
||||
b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
|
||||
@@ -0,0 +1,985 @@
|
||||
/*
|
||||
* jQuery timepicker addon
|
||||
* By: Trent Richardson [http://trentrichardson.com]
|
||||
* Version 0.9.5
|
||||
* Last Modified: 05/25/2011
|
||||
*
|
||||
* Copyright 2011 Trent Richardson
|
||||
* Dual licensed under the MIT and GPL licenses.
|
||||
* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
|
||||
* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
|
||||
*
|
||||
* HERES THE CSS:
|
||||
* .ui-timepicker-div .ui-widget-header{ margin-bottom: 8px; }
|
||||
* .ui-timepicker-div dl{ text-align: left; }
|
||||
* .ui-timepicker-div dl dt{ height: 25px; }
|
||||
* .ui-timepicker-div dl dd{ margin: -25px 10px 10px 65px; }
|
||||
* .ui-timepicker-div td { font-size: 90%; }
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
$.extend($.ui, { timepicker: { version: "0.9.5" } });
|
||||
|
||||
/* Time picker manager.
|
||||
Use the singleton instance of this class, $.timepicker, to interact with the time picker.
|
||||
Settings for (groups of) time pickers are maintained in an instance object,
|
||||
allowing multiple different settings on the same page. */
|
||||
|
||||
function Timepicker() {
|
||||
this.regional = []; // Available regional settings, indexed by language code
|
||||
this.regional[''] = { // Default regional settings
|
||||
currentText: 'Now',
|
||||
closeText: 'Done',
|
||||
ampm: false,
|
||||
timeFormat: 'hh:mm:ss tt',
|
||||
timeOnlyTitle: 'Choose Time',
|
||||
timeText: 'Time',
|
||||
hourText: 'Hour',
|
||||
minuteText: 'Minute',
|
||||
secondText: 'Second',
|
||||
timezoneText: 'Time Zone'
|
||||
};
|
||||
this._defaults = { // Global defaults for all the datetime picker instances
|
||||
showButtonPanel: true,
|
||||
timeOnly: false,
|
||||
showHour: true,
|
||||
showMinute: true,
|
||||
showSecond: true,
|
||||
showTimezone: false,
|
||||
showTime: true,
|
||||
stepHour: 0.05,
|
||||
stepMinute: 0.05,
|
||||
stepSecond: 0.05,
|
||||
hour: 0,
|
||||
minute: 0,
|
||||
second: 0,
|
||||
timezone: '+0000',
|
||||
hourMin: 0,
|
||||
minuteMin: 0,
|
||||
secondMin: 0,
|
||||
hourMax: 23,
|
||||
minuteMax: 59,
|
||||
secondMax: 59,
|
||||
minDateTime: null,
|
||||
maxDateTime: null,
|
||||
hourGrid: 0,
|
||||
minuteGrid: 0,
|
||||
secondGrid: 0,
|
||||
alwaysSetTime: true,
|
||||
separator: ' ',
|
||||
altFieldTimeOnly: true,
|
||||
showTimepicker: true,
|
||||
timezoneList: ["-1100", "-1000", "-0900", "-0800", "-0700", "-0600",
|
||||
"-0500", "-0400", "-0300", "-0200", "-0100", "+0000",
|
||||
"+0100", "+0200", "+0300", "+0400", "+0500", "+0600",
|
||||
"+0700", "+0800", "+0900", "+1000", "+1100", "+1200"]
|
||||
};
|
||||
$.extend(this._defaults, this.regional['']);
|
||||
}
|
||||
|
||||
$.extend(Timepicker.prototype, {
|
||||
$input: null,
|
||||
$altInput: null,
|
||||
$timeObj: null,
|
||||
inst: null,
|
||||
hour_slider: null,
|
||||
minute_slider: null,
|
||||
second_slider: null,
|
||||
timezone_select: null,
|
||||
hour: 0,
|
||||
minute: 0,
|
||||
second: 0,
|
||||
timezone: '+0000',
|
||||
hourMinOriginal: null,
|
||||
minuteMinOriginal: null,
|
||||
secondMinOriginal: null,
|
||||
hourMaxOriginal: null,
|
||||
minuteMaxOriginal: null,
|
||||
secondMaxOriginal: null,
|
||||
ampm: '',
|
||||
formattedDate: '',
|
||||
formattedTime: '',
|
||||
formattedDateTime: '',
|
||||
timezoneList: ["-1100", "-1000", "-0900", "-0800", "-0700", "-0600",
|
||||
"-0500", "-0400", "-0300", "-0200", "-0100", "+0000",
|
||||
"+0100", "+0200", "+0300", "+0400", "+0500", "+0600",
|
||||
"+0700", "+0800", "+0900", "+1000", "+1100", "+1200"],
|
||||
|
||||
/* Override the default settings for all instances of the time picker.
|
||||
@param settings object - the new settings to use as defaults (anonymous object)
|
||||
@return the manager object */
|
||||
setDefaults: function(settings) {
|
||||
extendRemove(this._defaults, settings || {});
|
||||
return this;
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// Create a new Timepicker instance
|
||||
//########################################################################
|
||||
_newInst: function($input, o) {
|
||||
var tp_inst = new Timepicker(),
|
||||
inlineSettings = {};
|
||||
|
||||
for (var attrName in this._defaults) {
|
||||
var attrValue = $input.attr('time:' + attrName);
|
||||
if (attrValue) {
|
||||
try {
|
||||
inlineSettings[attrName] = eval(attrValue);
|
||||
} catch (err) {
|
||||
inlineSettings[attrName] = attrValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, {
|
||||
beforeShow: function(input, dp_inst) {
|
||||
if ($.isFunction(o.beforeShow))
|
||||
o.beforeShow(input, dp_inst, tp_inst);
|
||||
},
|
||||
onChangeMonthYear: function(year, month, dp_inst) {
|
||||
// Update the time as well : this prevents the time from disappearing from the $input field.
|
||||
tp_inst._updateDateTime(dp_inst);
|
||||
if ($.isFunction(o.onChangeMonthYear))
|
||||
o.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
|
||||
},
|
||||
onClose: function(dateText, dp_inst) {
|
||||
if (tp_inst.timeDefined === true && $input.val() != '')
|
||||
tp_inst._updateDateTime(dp_inst);
|
||||
if ($.isFunction(o.onClose))
|
||||
o.onClose.call($input[0], dateText, dp_inst, tp_inst);
|
||||
},
|
||||
timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
|
||||
});
|
||||
|
||||
tp_inst.hour = tp_inst._defaults.hour;
|
||||
tp_inst.minute = tp_inst._defaults.minute;
|
||||
tp_inst.second = tp_inst._defaults.second;
|
||||
tp_inst.ampm = '';
|
||||
tp_inst.$input = $input;
|
||||
|
||||
if (o.altField)
|
||||
tp_inst.$altInput = $(o.altField)
|
||||
.css({ cursor: 'pointer' })
|
||||
.focus(function(){ $input.trigger("focus"); });
|
||||
|
||||
// datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
|
||||
if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date)
|
||||
tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
|
||||
if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date)
|
||||
tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
|
||||
if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date)
|
||||
tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
|
||||
if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date)
|
||||
tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
|
||||
|
||||
return tp_inst;
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// add our sliders to the calendar
|
||||
//########################################################################
|
||||
_addTimePicker: function(dp_inst) {
|
||||
var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ?
|
||||
this.$input.val() + ' ' + this.$altInput.val() :
|
||||
this.$input.val();
|
||||
|
||||
this.timeDefined = this._parseTime(currDT);
|
||||
this._limitMinMaxDateTime(dp_inst, false);
|
||||
this._injectTimePicker();
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// parse the time string from input value or _setTime
|
||||
//########################################################################
|
||||
_parseTime: function(timeString, withDate) {
|
||||
var regstr = this._defaults.timeFormat.toString()
|
||||
.replace(/h{1,2}/ig, '(\\d?\\d)')
|
||||
.replace(/m{1,2}/ig, '(\\d?\\d)')
|
||||
.replace(/s{1,2}/ig, '(\\d?\\d)')
|
||||
.replace(/t{1,2}/ig, '(am|pm|a|p)?')
|
||||
.replace(/z{1}/ig, '((\\+|-)\\d\\d\\d\\d)?')
|
||||
.replace(/\s/g, '\\s?') + '$',
|
||||
order = this._getFormatPositions(),
|
||||
treg;
|
||||
|
||||
if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);
|
||||
|
||||
if (withDate || !this._defaults.timeOnly) {
|
||||
// the time should come after x number of characters and a space.
|
||||
// x = at least the length of text specified by the date format
|
||||
var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');
|
||||
// escape special regex characters in the seperator
|
||||
var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g");
|
||||
regstr = '.{' + dp_dateFormat.length + ',}' + this._defaults.separator.replace(specials, "\\$&") + regstr;
|
||||
}
|
||||
|
||||
treg = timeString.match(new RegExp(regstr, 'i'));
|
||||
|
||||
if (treg) {
|
||||
if (order.t !== -1)
|
||||
this.ampm = ((treg[order.t] === undefined || treg[order.t].length === 0) ?
|
||||
'' :
|
||||
(treg[order.t].charAt(0).toUpperCase() == 'A') ? 'AM' : 'PM').toUpperCase();
|
||||
|
||||
if (order.h !== -1) {
|
||||
if (this.ampm == 'AM' && treg[order.h] == '12')
|
||||
this.hour = 0; // 12am = 0 hour
|
||||
else if (this.ampm == 'PM' && treg[order.h] != '12')
|
||||
this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12
|
||||
else this.hour = Number(treg[order.h]);
|
||||
}
|
||||
|
||||
if (order.m !== -1) this.minute = Number(treg[order.m]);
|
||||
if (order.s !== -1) this.second = Number(treg[order.s]);
|
||||
if (order.z !== -1) this.timezone = treg[order.z];
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// figure out position of time elements.. cause js cant do named captures
|
||||
//########################################################################
|
||||
_getFormatPositions: function() {
|
||||
var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|t{1,2}|z)/g),
|
||||
orders = { h: -1, m: -1, s: -1, t: -1, z: -1 };
|
||||
|
||||
if (finds)
|
||||
for (var i = 0; i < finds.length; i++)
|
||||
if (orders[finds[i].toString().charAt(0)] == -1)
|
||||
orders[finds[i].toString().charAt(0)] = i + 1;
|
||||
|
||||
return orders;
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// generate and inject html for timepicker into ui datepicker
|
||||
//########################################################################
|
||||
_injectTimePicker: function() {
|
||||
var $dp = this.inst.dpDiv,
|
||||
o = this._defaults,
|
||||
tp_inst = this,
|
||||
// Added by Peter Medeiros:
|
||||
// - Figure out what the hour/minute/second max should be based on the step values.
|
||||
// - Example: if stepMinute is 15, then minMax is 45.
|
||||
hourMax = (o.hourMax - (o.hourMax % o.stepHour)).toFixed(0),
|
||||
minMax = (o.minuteMax - (o.minuteMax % o.stepMinute)).toFixed(0),
|
||||
secMax = (o.secondMax - (o.secondMax % o.stepSecond)).toFixed(0),
|
||||
dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, '');
|
||||
|
||||
// Prevent displaying twice
|
||||
//if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) {
|
||||
if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) {
|
||||
var noDisplay = ' style="display:none;"',
|
||||
html = '<div class="ui-timepicker-div" id="ui-timepicker-div-' + dp_id + '"><dl>' +
|
||||
'<dt class="ui_tpicker_time_label" id="ui_tpicker_time_label_' + dp_id + '"' +
|
||||
((o.showTime) ? '' : noDisplay) + '>' + o.timeText + '</dt>' +
|
||||
'<dd class="ui_tpicker_time" id="ui_tpicker_time_' + dp_id + '"' +
|
||||
((o.showTime) ? '' : noDisplay) + '></dd>' +
|
||||
'<dt class="ui_tpicker_hour_label" id="ui_tpicker_hour_label_' + dp_id + '"' +
|
||||
((o.showHour) ? '' : noDisplay) + '>' + o.hourText + '</dt>',
|
||||
hourGridSize = 0,
|
||||
minuteGridSize = 0,
|
||||
secondGridSize = 0,
|
||||
size;
|
||||
|
||||
if (o.showHour && o.hourGrid > 0) {
|
||||
html += '<dd class="ui_tpicker_hour">' +
|
||||
'<div id="ui_tpicker_hour_' + dp_id + '"' + ((o.showHour) ? '' : noDisplay) + '></div>' +
|
||||
'<div style="padding-left: 1px"><table><tr>';
|
||||
|
||||
for (var h = o.hourMin; h < hourMax; h += o.hourGrid) {
|
||||
hourGridSize++;
|
||||
var tmph = (o.ampm && h > 12) ? h-12 : h;
|
||||
if (tmph < 10) tmph = '0' + tmph;
|
||||
if (o.ampm) {
|
||||
if (h == 0) tmph = 12 +'a';
|
||||
else if (h < 12) tmph += 'a';
|
||||
else tmph += 'p';
|
||||
}
|
||||
html += '<td>' + tmph + '</td>';
|
||||
}
|
||||
|
||||
html += '</tr></table></div>' +
|
||||
'</dd>';
|
||||
} else html += '<dd class="ui_tpicker_hour" id="ui_tpicker_hour_' + dp_id + '"' +
|
||||
((o.showHour) ? '' : noDisplay) + '></dd>';
|
||||
|
||||
html += '<dt class="ui_tpicker_minute_label" id="ui_tpicker_minute_label_' + dp_id + '"' +
|
||||
((o.showMinute) ? '' : noDisplay) + '>' + o.minuteText + '</dt>';
|
||||
|
||||
if (o.showMinute && o.minuteGrid > 0) {
|
||||
html += '<dd class="ui_tpicker_minute ui_tpicker_minute_' + o.minuteGrid + '">' +
|
||||
'<div id="ui_tpicker_minute_' + dp_id + '"' +
|
||||
((o.showMinute) ? '' : noDisplay) + '></div>' +
|
||||
'<div style="padding-left: 1px"><table><tr>';
|
||||
|
||||
for (var m = o.minuteMin; m < minMax; m += o.minuteGrid) {
|
||||
minuteGridSize++;
|
||||
html += '<td>' + ((m < 10) ? '0' : '') + m + '</td>';
|
||||
}
|
||||
|
||||
html += '</tr></table></div>' +
|
||||
'</dd>';
|
||||
} else html += '<dd class="ui_tpicker_minute" id="ui_tpicker_minute_' + dp_id + '"' +
|
||||
((o.showMinute) ? '' : noDisplay) + '></dd>';
|
||||
|
||||
html += '<dt class="ui_tpicker_second_label" id="ui_tpicker_second_label_' + dp_id + '"' +
|
||||
((o.showSecond) ? '' : noDisplay) + '>' + o.secondText + '</dt>';
|
||||
|
||||
if (o.showSecond && o.secondGrid > 0) {
|
||||
html += '<dd class="ui_tpicker_second ui_tpicker_second_' + o.secondGrid + '">' +
|
||||
'<div id="ui_tpicker_second_' + dp_id + '"' +
|
||||
((o.showSecond) ? '' : noDisplay) + '></div>' +
|
||||
'<div style="padding-left: 1px"><table><tr>';
|
||||
|
||||
for (var s = o.secondMin; s < secMax; s += o.secondGrid) {
|
||||
secondGridSize++;
|
||||
html += '<td>' + ((s < 10) ? '0' : '') + s + '</td>';
|
||||
}
|
||||
|
||||
html += '</tr></table></div>' +
|
||||
'</dd>';
|
||||
} else html += '<dd class="ui_tpicker_second" id="ui_tpicker_second_' + dp_id + '"' +
|
||||
((o.showSecond) ? '' : noDisplay) + '></dd>';
|
||||
|
||||
html += '<dt class="ui_tpicker_timezone_label" id="ui_tpicker_timezone_label_' + dp_id + '"' +
|
||||
((o.showTimezone) ? '' : noDisplay) + '>' + o.timezoneText + '</dt>';
|
||||
html += '<dd class="ui_tpicker_timezone" id="ui_tpicker_timezone_' + dp_id + '"' +
|
||||
((o.showTimezone) ? '' : noDisplay) + '></dd>';
|
||||
|
||||
html += '</dl></div>';
|
||||
$tp = $(html);
|
||||
|
||||
// if we only want time picker...
|
||||
if (o.timeOnly === true) {
|
||||
$tp.prepend(
|
||||
'<div class="ui-widget-header ui-helper-clearfix ui-corner-all">' +
|
||||
'<div class="ui-datepicker-title">' + o.timeOnlyTitle + '</div>' +
|
||||
'</div>');
|
||||
$dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();
|
||||
}
|
||||
|
||||
this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({
|
||||
orientation: "horizontal",
|
||||
value: this.hour,
|
||||
min: o.hourMin,
|
||||
max: hourMax,
|
||||
step: o.stepHour,
|
||||
slide: function(event, ui) {
|
||||
tp_inst.hour_slider.slider( "option", "value", ui.value);
|
||||
tp_inst._onTimeChange();
|
||||
}
|
||||
});
|
||||
|
||||
// Updated by Peter Medeiros:
|
||||
// - Pass in Event and UI instance into slide function
|
||||
this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({
|
||||
orientation: "horizontal",
|
||||
value: this.minute,
|
||||
min: o.minuteMin,
|
||||
max: minMax,
|
||||
step: o.stepMinute,
|
||||
slide: function(event, ui) {
|
||||
// update the global minute slider instance value with the current slider value
|
||||
tp_inst.minute_slider.slider( "option", "value", ui.value);
|
||||
tp_inst._onTimeChange();
|
||||
}
|
||||
});
|
||||
|
||||
this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({
|
||||
orientation: "horizontal",
|
||||
value: this.second,
|
||||
min: o.secondMin,
|
||||
max: secMax,
|
||||
step: o.stepSecond,
|
||||
slide: function(event, ui) {
|
||||
tp_inst.second_slider.slider( "option", "value", ui.value);
|
||||
tp_inst._onTimeChange();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('<select></select>').find("select");
|
||||
$.fn.append.apply(this.timezone_select,
|
||||
$.map(o.timezoneList, function(val, idx) {
|
||||
return $("<option />")
|
||||
.val(typeof val == "object" ? val.value : val)
|
||||
.text(typeof val == "object" ? val.label : val);
|
||||
})
|
||||
);
|
||||
this.timezone_select.val((typeof this.timezone != "undefined" && this.timezone != null && this.timezone != "") ? this.timezone : o.timezone);
|
||||
this.timezone_select.change(function() {
|
||||
tp_inst._onTimeChange();
|
||||
});
|
||||
|
||||
// Add grid functionality
|
||||
if (o.showHour && o.hourGrid > 0) {
|
||||
size = 100 * hourGridSize * o.hourGrid / (hourMax - o.hourMin);
|
||||
|
||||
$tp.find(".ui_tpicker_hour table").css({
|
||||
width: size + "%",
|
||||
marginLeft: (size / (-2 * hourGridSize)) + "%",
|
||||
borderCollapse: 'collapse'
|
||||
}).find("td").each( function(index) {
|
||||
$(this).click(function() {
|
||||
var h = $(this).html();
|
||||
if(o.ampm) {
|
||||
var ap = h.substring(2).toLowerCase(),
|
||||
aph = parseInt(h.substring(0,2));
|
||||
if (ap == 'a') {
|
||||
if (aph == 12) h = 0;
|
||||
else h = aph;
|
||||
} else if (aph == 12) h = 12;
|
||||
else h = aph + 12;
|
||||
}
|
||||
tp_inst.hour_slider.slider("option", "value", h);
|
||||
tp_inst._onTimeChange();
|
||||
tp_inst._onSelectHandler();
|
||||
}).css({
|
||||
cursor: 'pointer',
|
||||
width: (100 / hourGridSize) + '%',
|
||||
textAlign: 'center',
|
||||
overflow: 'hidden'
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (o.showMinute && o.minuteGrid > 0) {
|
||||
size = 100 * minuteGridSize * o.minuteGrid / (minMax - o.minuteMin);
|
||||
$tp.find(".ui_tpicker_minute table").css({
|
||||
width: size + "%",
|
||||
marginLeft: (size / (-2 * minuteGridSize)) + "%",
|
||||
borderCollapse: 'collapse'
|
||||
}).find("td").each(function(index) {
|
||||
$(this).click(function() {
|
||||
tp_inst.minute_slider.slider("option", "value", $(this).html());
|
||||
tp_inst._onTimeChange();
|
||||
tp_inst._onSelectHandler();
|
||||
}).css({
|
||||
cursor: 'pointer',
|
||||
width: (100 / minuteGridSize) + '%',
|
||||
textAlign: 'center',
|
||||
overflow: 'hidden'
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (o.showSecond && o.secondGrid > 0) {
|
||||
$tp.find(".ui_tpicker_second table").css({
|
||||
width: size + "%",
|
||||
marginLeft: (size / (-2 * secondGridSize)) + "%",
|
||||
borderCollapse: 'collapse'
|
||||
}).find("td").each(function(index) {
|
||||
$(this).click(function() {
|
||||
tp_inst.second_slider.slider("option", "value", $(this).html());
|
||||
tp_inst._onTimeChange();
|
||||
tp_inst._onSelectHandler();
|
||||
}).css({
|
||||
cursor: 'pointer',
|
||||
width: (100 / secondGridSize) + '%',
|
||||
textAlign: 'center',
|
||||
overflow: 'hidden'
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');
|
||||
if ($buttonPanel.length) $buttonPanel.before($tp);
|
||||
else $dp.append($tp);
|
||||
|
||||
this.$timeObj = $tp.find('#ui_tpicker_time_'+ dp_id);
|
||||
|
||||
if (this.inst !== null) {
|
||||
var timeDefined = this.timeDefined;
|
||||
this._onTimeChange();
|
||||
this.timeDefined = timeDefined;
|
||||
}
|
||||
|
||||
//Emulate datepicker onSelect behavior. Call on slidestop.
|
||||
var onSelectDelegate = function() {
|
||||
tp_inst._onSelectHandler();
|
||||
};
|
||||
this.hour_slider.bind('slidestop',onSelectDelegate);
|
||||
this.minute_slider.bind('slidestop',onSelectDelegate);
|
||||
this.second_slider.bind('slidestop',onSelectDelegate);
|
||||
}
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// This function tries to limit the ability to go outside the
|
||||
// min/max date range
|
||||
//########################################################################
|
||||
_limitMinMaxDateTime: function(dp_inst, adjustSliders){
|
||||
var o = this._defaults,
|
||||
dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);
|
||||
|
||||
if(!this._defaults.showTimepicker) return; // No time so nothing to check here
|
||||
|
||||
if(this._defaults.minDateTime !== null && dp_date){
|
||||
var minDateTime = this._defaults.minDateTime,
|
||||
minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
|
||||
|
||||
if(this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null){
|
||||
this.hourMinOriginal = o.hourMin;
|
||||
this.minuteMinOriginal = o.minuteMin;
|
||||
this.secondMinOriginal = o.secondMin;
|
||||
}
|
||||
|
||||
if(dp_inst.settings.timeOnly || minDateTimeDate.getTime() == dp_date.getTime()) {
|
||||
this._defaults.hourMin = minDateTime.getHours();
|
||||
if (this.hour <= this._defaults.hourMin) {
|
||||
this.hour = this._defaults.hourMin;
|
||||
this._defaults.minuteMin = minDateTime.getMinutes();
|
||||
if (this.minute <= this._defaults.minuteMin) {
|
||||
this.minute = this._defaults.minuteMin;
|
||||
this._defaults.secondMin = minDateTime.getSeconds();
|
||||
} else {
|
||||
if(this.second < this._defaults.secondMin) this.second = this._defaults.secondMin;
|
||||
this._defaults.secondMin = this.secondMinOriginal;
|
||||
}
|
||||
} else {
|
||||
this._defaults.minuteMin = this.minuteMinOriginal;
|
||||
this._defaults.secondMin = this.secondMinOriginal;
|
||||
}
|
||||
}else{
|
||||
this._defaults.hourMin = this.hourMinOriginal;
|
||||
this._defaults.minuteMin = this.minuteMinOriginal;
|
||||
this._defaults.secondMin = this.secondMinOriginal;
|
||||
}
|
||||
}
|
||||
|
||||
if(this._defaults.maxDateTime !== null && dp_date){
|
||||
var maxDateTime = this._defaults.maxDateTime,
|
||||
maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
|
||||
|
||||
if(this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null){
|
||||
this.hourMaxOriginal = o.hourMax;
|
||||
this.minuteMaxOriginal = o.minuteMax;
|
||||
this.secondMaxOriginal = o.secondMax;
|
||||
}
|
||||
|
||||
if(dp_inst.settings.timeOnly || maxDateTimeDate.getTime() == dp_date.getTime()){
|
||||
this._defaults.hourMax = maxDateTime.getHours();
|
||||
if (this.hour >= this._defaults.hourMax) {
|
||||
this.hour = this._defaults.hourMax;
|
||||
this._defaults.minuteMax = maxDateTime.getMinutes();
|
||||
if (this.minute >= this._defaults.minuteMax) {
|
||||
this.minute = this._defaults.minuteMax;
|
||||
this._defaults.secondMin = maxDateTime.getSeconds();
|
||||
} else {
|
||||
if(this.second > this._defaults.secondMax) this.second = this._defaults.secondMax;
|
||||
this._defaults.secondMax = this.secondMaxOriginal;
|
||||
}
|
||||
} else {
|
||||
this._defaults.minuteMax = this.minuteMaxOriginal;
|
||||
this._defaults.secondMax = this.secondMaxOriginal;
|
||||
}
|
||||
}else{
|
||||
this._defaults.hourMax = this.hourMaxOriginal;
|
||||
this._defaults.minuteMax = this.minuteMaxOriginal;
|
||||
this._defaults.secondMax = this.secondMaxOriginal;
|
||||
}
|
||||
}
|
||||
|
||||
if(adjustSliders !== undefined && adjustSliders === true){
|
||||
this.hour_slider.slider("option", { min: this._defaults.hourMin, max: this._defaults.hourMax }).slider('value', this.hour);
|
||||
this.minute_slider.slider("option", { min: this._defaults.minuteMin, max: this._defaults.minuteMax }).slider('value', this.minute);
|
||||
this.second_slider.slider("option", { min: this._defaults.secondMin, max: this._defaults.secondMax }).slider('value', this.second);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
|
||||
//########################################################################
|
||||
// when a slider moves, set the internal time...
|
||||
// on time change is also called when the time is updated in the text field
|
||||
//########################################################################
|
||||
_onTimeChange: function() {
|
||||
var hour = (this.hour_slider) ? this.hour_slider.slider('value') : false,
|
||||
minute = (this.minute_slider) ? this.minute_slider.slider('value') : false,
|
||||
second = (this.second_slider) ? this.second_slider.slider('value') : false,
|
||||
timezone = (this.timezone_select) ? this.timezone_select.val() : false;
|
||||
|
||||
if (hour !== false) hour = parseInt(hour,10);
|
||||
if (minute !== false) minute = parseInt(minute,10);
|
||||
if (second !== false) second = parseInt(second,10);
|
||||
|
||||
var ampm = (hour < 12) ? 'AM' : 'PM';
|
||||
|
||||
// If the update was done in the input field, the input field should not be updated.
|
||||
// If the update was done using the sliders, update the input field.
|
||||
var hasChanged = (hour != this.hour || minute != this.minute || second != this.second || (this.ampm.length > 0 && this.ampm != ampm) || timezone != this.timezone);
|
||||
|
||||
if (hasChanged) {
|
||||
|
||||
if (hour !== false)this.hour = hour;
|
||||
if (minute !== false) this.minute = minute;
|
||||
if (second !== false) this.second = second;
|
||||
if (timezone !== false) this.timezone = timezone;
|
||||
this._limitMinMaxDateTime(this.inst, true);
|
||||
}
|
||||
if (this._defaults.ampm) this.ampm = ampm;
|
||||
|
||||
this._formatTime();
|
||||
if (this.$timeObj) this.$timeObj.text(this.formattedTime);
|
||||
this.timeDefined = true;
|
||||
if (hasChanged) this._updateDateTime();
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// call custom onSelect.
|
||||
// bind to sliders slidestop, and grid click.
|
||||
//########################################################################
|
||||
_onSelectHandler: function() {
|
||||
var onSelect = this._defaults['onSelect'];
|
||||
var inputEl = this.$input ? this.$input[0] : null;
|
||||
if (onSelect && inputEl) {
|
||||
onSelect.apply(inputEl, [this.formattedDateTime, this]);
|
||||
}
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// format the time all pretty...
|
||||
//########################################################################
|
||||
_formatTime: function(time, format, ampm) {
|
||||
if (ampm == undefined) ampm = this._defaults.ampm;
|
||||
time = time || { hour: this.hour, minute: this.minute, second: this.second, ampm: this.ampm, timezone: this.timezone };
|
||||
var tmptime = format || this._defaults.timeFormat.toString();
|
||||
|
||||
if (ampm) {
|
||||
var hour12 = ((time.ampm == 'AM') ? (time.hour) : (time.hour % 12));
|
||||
hour12 = (Number(hour12) === 0) ? 12 : hour12;
|
||||
tmptime = tmptime.toString()
|
||||
.replace(/hh/g, ((hour12 < 10) ? '0' : '') + hour12)
|
||||
.replace(/h/g, hour12)
|
||||
.replace(/mm/g, ((time.minute < 10) ? '0' : '') + time.minute)
|
||||
.replace(/m/g, time.minute)
|
||||
.replace(/ss/g, ((time.second < 10) ? '0' : '') + time.second)
|
||||
.replace(/s/g, time.second)
|
||||
.replace(/TT/g, time.ampm.toUpperCase())
|
||||
.replace(/Tt/g, time.ampm.toUpperCase())
|
||||
.replace(/tT/g, time.ampm.toLowerCase())
|
||||
.replace(/tt/g, time.ampm.toLowerCase())
|
||||
.replace(/T/g, time.ampm.charAt(0).toUpperCase())
|
||||
.replace(/t/g, time.ampm.charAt(0).toLowerCase())
|
||||
.replace(/z/g, time.timezone);
|
||||
} else {
|
||||
tmptime = tmptime.toString()
|
||||
.replace(/hh/g, ((time.hour < 10) ? '0' : '') + time.hour)
|
||||
.replace(/h/g, time.hour)
|
||||
.replace(/mm/g, ((time.minute < 10) ? '0' : '') + time.minute)
|
||||
.replace(/m/g, time.minute)
|
||||
.replace(/ss/g, ((time.second < 10) ? '0' : '') + time.second)
|
||||
.replace(/s/g, time.second)
|
||||
.replace(/z/g, time.timezone);
|
||||
tmptime = $.trim(tmptime.replace(/t/gi, ''));
|
||||
}
|
||||
|
||||
if (arguments.length) return tmptime;
|
||||
else this.formattedTime = tmptime;
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// update our input with the new date time..
|
||||
//########################################################################
|
||||
_updateDateTime: function(dp_inst) {
|
||||
dp_inst = this.inst || dp_inst,
|
||||
dt = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay),
|
||||
dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),
|
||||
formatCfg = $.datepicker._getFormatConfig(dp_inst),
|
||||
timeAvailable = dt !== null && this.timeDefined;
|
||||
this.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);
|
||||
var formattedDateTime = this.formattedDate;
|
||||
if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0))
|
||||
return;
|
||||
|
||||
if (this._defaults.timeOnly === true) {
|
||||
formattedDateTime = this.formattedTime;
|
||||
} else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) {
|
||||
formattedDateTime += this._defaults.separator + this.formattedTime;
|
||||
}
|
||||
|
||||
this.formattedDateTime = formattedDateTime;
|
||||
|
||||
if(!this._defaults.showTimepicker) {
|
||||
this.$input.val(this.formattedDate);
|
||||
} else if (this.$altInput && this._defaults.altFieldTimeOnly === true) {
|
||||
this.$altInput.val(this.formattedTime);
|
||||
this.$input.val(this.formattedDate);
|
||||
} else if(this.$altInput) {
|
||||
this.$altInput.val(formattedDateTime);
|
||||
this.$input.val(formattedDateTime);
|
||||
} else {
|
||||
this.$input.val(formattedDateTime);
|
||||
}
|
||||
|
||||
this.$input.trigger("change");
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
$.fn.extend({
|
||||
//########################################################################
|
||||
// shorthand just to use timepicker..
|
||||
//########################################################################
|
||||
timepicker: function(o) {
|
||||
o = o || {};
|
||||
var tmp_args = arguments;
|
||||
|
||||
if (typeof o == 'object') tmp_args[0] = $.extend(o, { timeOnly: true });
|
||||
|
||||
return $(this).each(function() {
|
||||
$.fn.datetimepicker.apply($(this), tmp_args);
|
||||
});
|
||||
},
|
||||
|
||||
//########################################################################
|
||||
// extend timepicker to datepicker
|
||||
//########################################################################
|
||||
datetimepicker: function(o) {
|
||||
o = o || {};
|
||||
var $input = this,
|
||||
tmp_args = arguments;
|
||||
|
||||
if (typeof(o) == 'string'){
|
||||
if(o == 'getDate')
|
||||
return $.fn.datepicker.apply($(this[0]), tmp_args);
|
||||
else
|
||||
return this.each(function() {
|
||||
var $t = $(this);
|
||||
$t.datepicker.apply($t, tmp_args);
|
||||
});
|
||||
}
|
||||
else
|
||||
return this.each(function() {
|
||||
var $t = $(this);
|
||||
$t.datepicker($.timepicker._newInst($t, o)._defaults);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//########################################################################
|
||||
// the bad hack :/ override datepicker so it doesnt close on select
|
||||
// inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
|
||||
//########################################################################
|
||||
$.datepicker._base_selectDate = $.datepicker._selectDate;
|
||||
$.datepicker._selectDate = function (id, dateStr) {
|
||||
var inst = this._getInst($(id)[0]),
|
||||
tp_inst = this._get(inst, 'timepicker');
|
||||
|
||||
if (tp_inst) {
|
||||
tp_inst._limitMinMaxDateTime(inst, true);
|
||||
inst.inline = inst.stay_open = true;
|
||||
//This way the onSelect handler called from calendarpicker get the full dateTime
|
||||
this._base_selectDate(id, dateStr + tp_inst._defaults.separator + tp_inst.formattedTime);
|
||||
inst.inline = inst.stay_open = false;
|
||||
this._notifyChange(inst);
|
||||
this._updateDatepicker(inst);
|
||||
}
|
||||
else this._base_selectDate(id, dateStr);
|
||||
};
|
||||
|
||||
//#############################################################################################
|
||||
// second bad hack :/ override datepicker so it triggers an event when changing the input field
|
||||
// and does not redraw the datepicker on every selectDate event
|
||||
//#############################################################################################
|
||||
$.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
|
||||
$.datepicker._updateDatepicker = function(inst) {
|
||||
if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
|
||||
|
||||
this._base_updateDatepicker(inst);
|
||||
|
||||
// Reload the time control when changing something in the input text field.
|
||||
var tp_inst = this._get(inst, 'timepicker');
|
||||
if(tp_inst) tp_inst._addTimePicker(inst);
|
||||
}
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// third bad hack :/ override datepicker so it allows spaces and colan in the input field
|
||||
//#######################################################################################
|
||||
$.datepicker._base_doKeyPress = $.datepicker._doKeyPress;
|
||||
$.datepicker._doKeyPress = function(event) {
|
||||
var inst = $.datepicker._getInst(event.target),
|
||||
tp_inst = $.datepicker._get(inst, 'timepicker');
|
||||
|
||||
if (tp_inst) {
|
||||
if ($.datepicker._get(inst, 'constrainInput')) {
|
||||
var ampm = tp_inst._defaults.ampm,
|
||||
datetimeChars = tp_inst._defaults.timeFormat.toString()
|
||||
.replace(/[hms]/g, '')
|
||||
.replace(/TT/g, ampm ? 'APM' : '')
|
||||
.replace(/Tt/g, ampm ? 'AaPpMm' : '')
|
||||
.replace(/tT/g, ampm ? 'AaPpMm' : '')
|
||||
.replace(/T/g, ampm ? 'AP' : '')
|
||||
.replace(/tt/g, ampm ? 'apm' : '')
|
||||
.replace(/t/g, ampm ? 'ap' : '') +
|
||||
" " +
|
||||
tp_inst._defaults.separator +
|
||||
$.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),
|
||||
chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);
|
||||
return event.ctrlKey || (chr < ' ' || !datetimeChars || datetimeChars.indexOf(chr) > -1);
|
||||
}
|
||||
}
|
||||
|
||||
return $.datepicker._base_doKeyPress(event);
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// Override key up event to sync manual input changes.
|
||||
//#######################################################################################
|
||||
$.datepicker._base_doKeyUp = $.datepicker._doKeyUp;
|
||||
$.datepicker._doKeyUp = function (event) {
|
||||
var inst = $.datepicker._getInst(event.target),
|
||||
tp_inst = $.datepicker._get(inst, 'timepicker');
|
||||
|
||||
if (tp_inst) {
|
||||
if (tp_inst._defaults.timeOnly && (inst.input.val() != inst.lastVal)) {
|
||||
try {
|
||||
$.datepicker._updateDatepicker(inst);
|
||||
}
|
||||
catch (err) {
|
||||
$.datepicker.log(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $.datepicker._base_doKeyUp(event);
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// override "Today" button to also grab the time.
|
||||
//#######################################################################################
|
||||
$.datepicker._base_gotoToday = $.datepicker._gotoToday;
|
||||
$.datepicker._gotoToday = function(id) {
|
||||
this._base_gotoToday(id);
|
||||
this._setTime(this._getInst($(id)[0]), new Date());
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// Disable & enable the Time in the datetimepicker
|
||||
//#######################################################################################
|
||||
$.datepicker._disableTimepickerDatepicker = function(target, date, withDate) {
|
||||
var inst = this._getInst(target),
|
||||
tp_inst = this._get(inst, 'timepicker');
|
||||
$(target).datepicker('getDate'); // Init selected[Year|Month|Day]
|
||||
if (tp_inst) {
|
||||
tp_inst._defaults.showTimepicker = false;
|
||||
tp_inst._updateDateTime(inst);
|
||||
}
|
||||
};
|
||||
|
||||
$.datepicker._enableTimepickerDatepicker = function(target, date, withDate) {
|
||||
var inst = this._getInst(target),
|
||||
tp_inst = this._get(inst, 'timepicker');
|
||||
$(target).datepicker('getDate'); // Init selected[Year|Month|Day]
|
||||
if (tp_inst) {
|
||||
tp_inst._defaults.showTimepicker = true;
|
||||
tp_inst._addTimePicker(inst); // Could be disabled on page load
|
||||
tp_inst._updateDateTime(inst);
|
||||
}
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// Create our own set time function
|
||||
//#######################################################################################
|
||||
$.datepicker._setTime = function(inst, date) {
|
||||
var tp_inst = this._get(inst, 'timepicker');
|
||||
if (tp_inst) {
|
||||
var defaults = tp_inst._defaults,
|
||||
// calling _setTime with no date sets time to defaults
|
||||
hour = date ? date.getHours() : defaults.hour,
|
||||
minute = date ? date.getMinutes() : defaults.minute,
|
||||
second = date ? date.getSeconds() : defaults.second;
|
||||
|
||||
//check if within min/max times..
|
||||
if ((hour < defaults.hourMin || hour > defaults.hourMax) || (minute < defaults.minuteMin || minute > defaults.minuteMax) || (second < defaults.secondMin || second > defaults.secondMax)) {
|
||||
hour = defaults.hourMin;
|
||||
minute = defaults.minuteMin;
|
||||
second = defaults.secondMin;
|
||||
}
|
||||
|
||||
if (tp_inst.hour_slider) tp_inst.hour_slider.slider('value', hour);
|
||||
else tp_inst.hour = hour;
|
||||
if (tp_inst.minute_slider) tp_inst.minute_slider.slider('value', minute);
|
||||
else tp_inst.minute = minute;
|
||||
if (tp_inst.second_slider) tp_inst.second_slider.slider('value', second);
|
||||
else tp_inst.second = second;
|
||||
|
||||
tp_inst._onTimeChange();
|
||||
tp_inst._updateDateTime(inst);
|
||||
}
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// Create new public method to set only time, callable as $().datepicker('setTime', date)
|
||||
//#######################################################################################
|
||||
$.datepicker._setTimeDatepicker = function(target, date, withDate) {
|
||||
var inst = this._getInst(target),
|
||||
tp_inst = this._get(inst, 'timepicker');
|
||||
|
||||
if (tp_inst) {
|
||||
this._setDateFromField(inst);
|
||||
var tp_date;
|
||||
if (date) {
|
||||
if (typeof date == "string") {
|
||||
tp_inst._parseTime(date, withDate);
|
||||
tp_date = new Date();
|
||||
tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second);
|
||||
}
|
||||
else tp_date = new Date(date.getTime());
|
||||
if (tp_date.toString() == 'Invalid Date') tp_date = undefined;
|
||||
this._setTime(inst, tp_date);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// override setDate() to allow setting time too within Date object
|
||||
//#######################################################################################
|
||||
$.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;
|
||||
$.datepicker._setDateDatepicker = function(target, date) {
|
||||
var inst = this._getInst(target),
|
||||
tp_date = (date instanceof Date) ? new Date(date.getTime()) : date;
|
||||
|
||||
this._updateDatepicker(inst);
|
||||
this._base_setDateDatepicker.apply(this, arguments);
|
||||
this._setTimeDatepicker(target, tp_date, true);
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// override getDate() to allow getting time too within Date object
|
||||
//#######################################################################################
|
||||
$.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
|
||||
$.datepicker._getDateDatepicker = function(target, noDefault) {
|
||||
var inst = this._getInst(target),
|
||||
tp_inst = this._get(inst, 'timepicker');
|
||||
|
||||
if (tp_inst) {
|
||||
this._setDateFromField(inst, noDefault);
|
||||
var date = this._getDate(inst);
|
||||
if (date && tp_inst._parseTime($(target).val(), tp_inst.timeOnly)) date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second);
|
||||
return date;
|
||||
}
|
||||
return this._base_getDateDatepicker(target, noDefault);
|
||||
};
|
||||
|
||||
//#######################################################################################
|
||||
// jQuery extend now ignores nulls!
|
||||
//#######################################################################################
|
||||
function extendRemove(target, props) {
|
||||
$.extend(target, props);
|
||||
for (var name in props)
|
||||
if (props[name] === null || props[name] === undefined)
|
||||
target[name] = props[name];
|
||||
return target;
|
||||
}
|
||||
|
||||
$.timepicker = new Timepicker(); // singleton instance
|
||||
$.timepicker.version = "0.9.5";
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,23 @@
|
||||
/* Afrikaans initialisation for the jQuery UI date picker plugin. */
|
||||
/* Written by Renier Pretorius. */
|
||||
jQuery(function($){
|
||||
$.datepicker.regional['af'] = {
|
||||
closeText: 'Selekteer',
|
||||
prevText: 'Vorige',
|
||||
nextText: 'Volgende',
|
||||
currentText: 'Vandag',
|
||||
monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
|
||||
'Julie','Augustus','September','Oktober','November','Desember'],
|
||||
monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
|
||||
'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
|
||||
dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
|
||||
dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
|
||||
dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
|
||||
weekHeader: 'Wk',
|
||||
dateFormat: 'dd/mm/yy',
|
||||
firstDay: 1,
|
||||
isRTL: false,
|
||||
showMonthAfterYear: false,
|
||||
yearSuffix: ''};
|
||||
$.datepicker.setDefaults($.datepicker.regional['af']);
|
||||
});
|
||||
@@ -0,0 +1,23 @@
|
||||
/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
|
||||
/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
|
||||
|
||||
jQuery(function($){
|
||||
$.datepicker.regional['ar-DZ'] = {
|
||||
closeText: 'إغلاق',
|
||||
prevText: '<السابق',
|
||||
nextText: 'التالي>',
|
||||
currentText: 'اليوم',
|
||||
monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
|
||||
'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
|
||||
monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
|
||||
dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
|
||||
dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
|
||||
dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
|
||||
weekHeader: 'أسبوع',
|
||||
dateFormat: 'dd/mm/yy',
|
||||
firstDay: 6,
|
||||
isRTL: true,
|
||||
showMonthAfterYear: false,
|
||||
yearSuffix: ''};
|
||||
$.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
|
||||
});
|
||||
@@ -0,0 +1,23 @@
|
||||
/* Arabic Translation for jQuery UI date picker plugin. */
|
||||
/* Khaled Alhourani -- me@khaledalhourani.com */
|
||||
/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
|
||||
jQuery(function($){
|
||||
$.datepicker.regional['ar'] = {
|
||||
closeText: 'إغلاق',
|
||||
prevText: '<السابق',
|
||||
nextText: 'التالي>',
|
||||
currentText: 'اليوم',
|
||||
monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
|
||||
'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
|
||||
monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
|
||||
dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
|
||||
dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
|
||||
dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
|
||||
weekHeader: 'أسبوع',
|
||||
dateFormat: 'dd/mm/yy',
|
||||
firstDay: 6,
|
||||
isRTL: true,
|
||||
showMonthAfterYear: false,
|
||||
yearSuffix: ''};
|
||||
$.datepicker.setDefaults($.datepicker.regional['ar']);
|
||||
});
|
||||