From 47be643eac2e212e214bb3519c9926277973ccb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez?= Date: Sun, 17 Nov 2013 03:48:05 +0000 Subject: [PATCH] * Added responsive tables to admin * Added language selection over REST API * Added "renderers" so we can add icons or whatever to cells before rendering * Lots of improvements --- server/.project | 5 + .../com.eclipsesource.jshint.ui.prefs | 3 + server/requirements.txt | 1 + server/src/uds/REST/__init__.py | 13 +- server/src/uds/REST/methods/authenticators.py | 2 +- server/src/uds/REST/methods/login_logout.py | 9 +- server/src/uds/REST/methods/networks.py | 2 +- server/src/uds/REST/methods/osmanagers.py | 2 +- server/src/uds/REST/methods/providers.py | 2 +- server/src/uds/REST/methods/transports.py | 2 +- server/src/uds/REST/methods/users.py | 31 +- server/src/uds/REST/mixins.py | 2 +- server/src/uds/REST/processors.py | 8 +- server/src/uds/core/util/State.py | 12 +- .../src/uds/locale/de/LC_MESSAGES/django.mo | Bin 34293 -> 35116 bytes .../src/uds/locale/de/LC_MESSAGES/django.po | 236 +- .../src/uds/locale/de/LC_MESSAGES/djangojs.mo | Bin 1437 -> 2002 bytes .../src/uds/locale/de/LC_MESSAGES/djangojs.po | 206 +- .../src/uds/locale/es/LC_MESSAGES/django.mo | Bin 34279 -> 35085 bytes .../src/uds/locale/es/LC_MESSAGES/django.po | 234 +- .../src/uds/locale/es/LC_MESSAGES/djangojs.mo | Bin 1448 -> 2008 bytes .../src/uds/locale/es/LC_MESSAGES/djangojs.po | 206 +- .../src/uds/locale/fr/LC_MESSAGES/django.mo | Bin 34980 -> 35818 bytes .../src/uds/locale/fr/LC_MESSAGES/django.po | 236 +- .../src/uds/locale/fr/LC_MESSAGES/djangojs.mo | Bin 1483 -> 2018 bytes .../src/uds/locale/fr/LC_MESSAGES/djangojs.po | 206 +- .../src/uds/locale/it/LC_MESSAGES/django.mo | Bin 33938 -> 34729 bytes .../src/uds/locale/it/LC_MESSAGES/django.po | 236 +- .../src/uds/locale/it/LC_MESSAGES/djangojs.mo | Bin 1436 -> 2007 bytes .../src/uds/locale/it/LC_MESSAGES/djangojs.po | 206 +- .../src/uds/locale/pt/LC_MESSAGES/django.mo | Bin 34161 -> 34957 bytes .../src/uds/locale/pt/LC_MESSAGES/django.po | 234 +- .../src/uds/locale/pt/LC_MESSAGES/djangojs.mo | Bin 1455 -> 2049 bytes .../src/uds/locale/pt/LC_MESSAGES/djangojs.po | 206 +- server/src/uds/static/adm/js/api.js | 345 +- server/src/uds/static/adm/js/gui-elements.js | 138 +- server/src/uds/static/adm/js/gui.js | 738 +- server/src/uds/static/adm/js/strftime.js | 345 + server/src/uds/static/adm/js/templating.js | 1 - server/src/uds/static/js/jquery-1.7.1.js | 9266 ----------------- server/src/uds/templates/uds/admin/index.html | 15 +- .../templates/uds/admin/snippets/navbar.html | 3 +- server/src/uds/urls.py | 4 +- server/src/uds/web/views.py | 2 + 44 files changed, 2556 insertions(+), 10601 deletions(-) create mode 100644 server/.settings/com.eclipsesource.jshint.ui.prefs create mode 100644 server/src/uds/static/adm/js/strftime.js delete mode 100644 server/src/uds/static/adm/js/templating.js delete mode 100644 server/src/uds/static/js/jquery-1.7.1.js diff --git a/server/.project b/server/.project index c72ed172e..a9d009baf 100644 --- a/server/.project +++ b/server/.project @@ -10,6 +10,11 @@ + + com.eclipsesource.jshint.ui.builder + + + org.python.pydev.pythonNature diff --git a/server/.settings/com.eclipsesource.jshint.ui.prefs b/server/.settings/com.eclipsesource.jshint.ui.prefs new file mode 100644 index 000000000..b581e4150 --- /dev/null +++ b/server/.settings/com.eclipsesource.jshint.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +excluded=//*.min.js\://PluginDetect_Java.js +included=//*.js diff --git a/server/requirements.txt b/server/requirements.txt index e69de29bb..26a5d2814 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -0,0 +1 @@ +ujson diff --git a/server/src/uds/REST/__init__.py b/server/src/uds/REST/__init__.py index 66291841a..0a620c235 100644 --- a/server/src/uds/REST/__init__.py +++ b/server/src/uds/REST/__init__.py @@ -39,6 +39,7 @@ from django.utils.translation import ugettext as _, activate from django.conf import settings from handlers import Handler, HandlerError, AccessDenied +import time import logging logger = logging.getLogger(__name__) @@ -136,10 +137,14 @@ class Dispatcher(View): # Invokes the handler's operation, add headers to response and returns try: - if handler.raw: # Raw handlers will return an HttpResponse Object - response = operation() - else: - response = processor.getResponse(operation()) + start = time.time(); + response = operation() + logger.debug('Execution time for method: {0}'.format(time.time() - start)) + + if not handler.raw: # Raw handlers will return an HttpResponse Object + start = time.time() + response = processor.getResponse(response) + logger.debug('Execution time for encoding: {0}'.format(time.time() - start)) for k, v in handler.headers().iteritems(): response[k] = v return response diff --git a/server/src/uds/REST/methods/authenticators.py b/server/src/uds/REST/methods/authenticators.py index 828439760..717df8a14 100644 --- a/server/src/uds/REST/methods/authenticators.py +++ b/server/src/uds/REST/methods/authenticators.py @@ -72,7 +72,7 @@ class TableInfo(ModelTableHandlerMixin, Handler): title = _('Current authenticators') fields = [ - { 'name': {'title': _('Name'), 'visible': True } }, + { 'name': {'title': _('Name'), 'visible': True, 'type': 'iconType' } }, { 'comments': {'title': _('Comments')}}, { 'users_count': {'title': _('Users'), 'type': 'numeric', 'width': '5em'}} ] diff --git a/server/src/uds/REST/methods/login_logout.py b/server/src/uds/REST/methods/login_logout.py index de2ddb51c..9376f226b 100644 --- a/server/src/uds/REST/methods/login_logout.py +++ b/server/src/uds/REST/methods/login_logout.py @@ -81,7 +81,6 @@ class Login(Handler): class Logout(Handler): path = 'auth' authenticated = True # By default, all handlers needs authentication - needs_staff = True # By default, staff def get(self): # Remove auth token @@ -103,4 +102,10 @@ class Auths(Handler): def get(self): return list(self.auths()) - \ No newline at end of file +class Locale(Handler): + authenticated = True + + def get(self): + if len(self._args) > 0: + self.setValue('locale', self._args[1]) + return '' diff --git a/server/src/uds/REST/methods/networks.py b/server/src/uds/REST/methods/networks.py index a38259d1f..2686d103a 100644 --- a/server/src/uds/REST/methods/networks.py +++ b/server/src/uds/REST/methods/networks.py @@ -65,7 +65,7 @@ class TableInfo(ModelTableHandlerMixin, Handler): path = 'networks' title = _('Current Networks') fields = [ - { 'name': {'title': _('Name'), 'visible': True } }, + { 'name': {'title': _('Name'), 'visible': True, 'type': 'icon', 'icon': 'fa fa-globe text-success' } }, { 'net_string': {'title': _('Networks')}}, { 'networks_count': {'title': _('Used by'), 'type': 'numeric', 'width': '8em'}} ] diff --git a/server/src/uds/REST/methods/osmanagers.py b/server/src/uds/REST/methods/osmanagers.py index 2903b9839..5ad814082 100644 --- a/server/src/uds/REST/methods/osmanagers.py +++ b/server/src/uds/REST/methods/osmanagers.py @@ -68,7 +68,7 @@ class TableInfo(ModelTableHandlerMixin, Handler): path = 'osmanagers' title = _('Current OS Managers') fields = [ - { 'name': {'title': _('Name'), 'visible': True } }, + { 'name': {'title': _('Name'), 'visible': True, 'type': 'iconType' } }, { 'comments': {'title': _('Comments')}}, { 'deployed_count': {'title': _('Used by'), 'type': 'numeric', 'width': '8em'}} ] diff --git a/server/src/uds/REST/methods/providers.py b/server/src/uds/REST/methods/providers.py index 82fd88600..ad0585312 100644 --- a/server/src/uds/REST/methods/providers.py +++ b/server/src/uds/REST/methods/providers.py @@ -66,7 +66,7 @@ class TableInfo(ModelTableHandlerMixin, Handler): path = 'providers' title = _('Current service providers') fields = [ - { 'name': {'title': _('Name') } }, + { 'name': {'title': _('Name'), 'type': 'iconType' } }, { 'comments': {'title': _('Comments')}}, { 'services_count': {'title': _('Services'), 'type': 'numeric', 'width': '5em'}} ] diff --git a/server/src/uds/REST/methods/transports.py b/server/src/uds/REST/methods/transports.py index ada0bc394..4db113f7e 100644 --- a/server/src/uds/REST/methods/transports.py +++ b/server/src/uds/REST/methods/transports.py @@ -68,7 +68,7 @@ class TableInfo(ModelTableHandlerMixin, Handler): path = 'transports' title = _('Current Transports') fields = [ - { 'name': {'title': _('Name'), 'visible': True } }, + { 'name': {'title': _('Name'), 'visible': True, 'type': 'iconType' } }, { 'comments': {'title': _('Comments')}}, { 'deployed_count': {'title': _('Used by'), 'type': 'numeric', 'width': '8em'}} ] diff --git a/server/src/uds/REST/methods/users.py b/server/src/uds/REST/methods/users.py index 88dc12f40..700d47e67 100644 --- a/server/src/uds/REST/methods/users.py +++ b/server/src/uds/REST/methods/users.py @@ -32,8 +32,10 @@ ''' from __future__ import unicode_literals +import time from django.utils.translation import ugettext as _ from django.utils import formats +from uds.core.util.State import State from uds.models import Authenticator, User @@ -47,19 +49,6 @@ logger = logging.getLogger(__name__) class Users(DetailHandler): - def user_as_dict(self, user): - return { - 'id': user.id, - 'name': user.name, - 'real_name': user.real_name, - 'comments': user.comments, - 'state': user.state, - 'staff_member': user.staff_member, - 'is_admin': user.is_admin, - 'last_access': formats.date_format(user.last_access, 'DATETIME_FORMAT'), - 'parent': user.parent - } - def get(self): logger.debug(self._parent) logger.debug(self._kwargs) @@ -69,12 +58,9 @@ class Users(DetailHandler): try: if len(self._args) == 0: - res = [] - for u in auth.users.all(): - res.append(self.user_as_dict(u)) - return res + return list(auth.users.all().values('id','name','real_name','comments','state','staff_member','is_admin','last_access','parent')) else: - return self.user_as_dict(auth.get(pk=self._args[0])) + return auth.get(pk=self._args[0]).values('id','name','real_name','comments','state','staff_member','is_admin','last_access','parent') except: logger.exception('En users') return { 'error': 'not found' } @@ -87,12 +73,11 @@ class Users(DetailHandler): def getFields(self): return [ - { 'name': {'title': _('User Id'), 'visible': True } }, + { 'name': {'title': _('User Id'), 'visible': True, 'type': 'icon', 'icon': 'fa fa-user text-success' } }, { 'real_name': { 'title': _('Name') } }, { 'comments': { 'title': _('Comments') } }, - { 'state': { 'title': _('state') } }, - { 'last_access': { 'title': _('Last access') } }, + { 'state': { 'title': _('state'), 'type': 'dict', 'dict': State.dictionary() } }, + { 'last_access': { 'title': _('Last access'), 'type': 'datetime' } }, ] - - + \ No newline at end of file diff --git a/server/src/uds/REST/mixins.py b/server/src/uds/REST/mixins.py index a2bee6e87..ae1ba3629 100644 --- a/server/src/uds/REST/mixins.py +++ b/server/src/uds/REST/mixins.py @@ -173,7 +173,7 @@ class ModelTableHandlerMixin(object): for k1, v1 in f.iteritems(): dct = {} for k2, v2 in v1.iteritems(): - if type(v2) in (bool, int, long, float, unicode): + if type(v2) in (bool, int, long, float, unicode, list, tuple, dict): dct[k2] = v2 else: dct[k2] = unicode(v2) diff --git a/server/src/uds/REST/processors.py b/server/src/uds/REST/processors.py index a97d0909e..65bd40694 100644 --- a/server/src/uds/REST/processors.py +++ b/server/src/uds/REST/processors.py @@ -32,13 +32,15 @@ ''' from __future__ import unicode_literals -from django.utils import simplejson +#from django.utils import simplejson +import ujson as json from django import http import logging logger = logging.getLogger(__name__) + class ParametersException(Exception): pass @@ -69,7 +71,7 @@ class JsonProcessor(ContentProcessor): try: if len(self._request.body) == 0: return {} - res = simplejson.loads(self._request.body) + res = json.loads(self._request.body) logger.debug(res) return res except Exception as e: @@ -77,7 +79,7 @@ class JsonProcessor(ContentProcessor): raise ParametersException(unicode(e)) def render(self, obj): - return simplejson.dumps(obj) + return json.dumps(obj) # --------------- # Json Processor diff --git a/server/src/uds/core/util/State.py b/server/src/uds/core/util/State.py index 19d6257ff..036d19df5 100644 --- a/server/src/uds/core/util/State.py +++ b/server/src/uds/core/util/State.py @@ -32,7 +32,7 @@ ''' -from django.utils.translation import ugettext_noop as _ +from django.utils.translation import ugettext_noop as _, ugettext # States for different objects. Not all objects supports all States class State(object): @@ -134,4 +134,14 @@ class State(object): return State.string[state] except Exception: return '' + + @staticmethod + def dictionary(): + ''' + Returns a dictionary with current active locale translation of States to States String + ''' + res = {} + for k, v in State.string.iteritems(): + res[k] = ugettext(v) + return res diff --git a/server/src/uds/locale/de/LC_MESSAGES/django.mo b/server/src/uds/locale/de/LC_MESSAGES/django.mo index 23cc365e010f8c9584d1d79cd4e46380a2df702f..cd0352db23b6bdd8df89879807b3ea147a23c1f7 100644 GIT binary patch delta 9158 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 bznUe#I_zKb;ICu-f(O~}}`aPfZtEt\n" "Language-Team: LANGUAGE \n" @@ -42,35 +42,86 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: REST/methods/authenticators.py:72 +#: REST/methods/authenticators.py:73 msgid "Current authenticators" msgstr "Aktuelle Authentifikatoren" -#: REST/methods/authenticators.py:74 REST/methods/providers.py:71 +#: REST/methods/authenticators.py:75 REST/methods/networks.py:68 +#: REST/methods/osmanagers.py:71 REST/methods/providers.py:69 +#: REST/methods/transports.py:71 REST/methods/users.py:77 msgid "Name" msgstr "Name" -#: REST/methods/authenticators.py:75 REST/methods/providers.py:72 +#: REST/methods/authenticators.py:76 REST/methods/osmanagers.py:72 +#: REST/methods/providers.py:70 REST/methods/transports.py:72 +#: REST/methods/users.py:78 msgid "Comments" msgstr "Kommentare" -#: REST/methods/authenticators.py:76 +#: REST/methods/authenticators.py:77 msgid "Users" msgstr "Benutzer" -#: REST/methods/providers.py:69 +#: REST/methods/networks.py:66 +msgid "Current Networks" +msgstr "Aktuellen Netze" + +#: REST/methods/networks.py:69 templates/uds/index.html:79 +#: templates/uds/html5/index.html:127 +msgid "Networks" +msgstr "Netzwerke" + +#: REST/methods/networks.py:70 REST/methods/osmanagers.py:73 +#: REST/methods/transports.py:73 +msgid "Used by" +msgstr "Von verwendet" + +#: REST/methods/osmanagers.py:69 +msgid "Current OS Managers" +msgstr "Aktuelle OS-Manager" + +#: REST/methods/providers.py:67 msgid "Current service providers" msgstr "Aktuelle Service-Provider" -#: REST/methods/providers.py:73 templates/uds/index.html:51 +#: REST/methods/providers.py:71 templates/uds/index.html:51 #: templates/uds/html5/index.html:68 msgid "Services" msgstr "Dienstleistungen" -#: admin/views.py:53 admin/views.py:61 web/views.py:422 +#: REST/methods/transports.py:69 +msgid "Current Transports" +msgstr "Aktuelle Transporte" + +#: REST/methods/users.py:70 +#, python-brace-format +msgid "Users of {0}" +msgstr "Benutzer von {0}" + +#: REST/methods/users.py:72 +msgid "Current users" +msgstr "Momentane Benutzer" + +#: REST/methods/users.py:76 +msgid "User Id" +msgstr "Benutzer-Id" + +#: REST/methods/users.py:79 +msgid "state" +msgstr "Zustand" + +#: REST/methods/users.py:80 +msgid "Last access" +msgstr "Zuletzt online" + +#: admin/views.py:55 admin/views.py:63 admin/views.py:76 web/views.py:422 msgid "Forbidden" msgstr "Verboten" +#: admin/views.py:69 +msgid "requested a template that do not exists" +msgstr "gefordert, dass eine Vorlage, die nicht vorhanden ist" + #: auths/IP/Authenticator.py:48 auths/IP/Authenticator.py:50 msgid "IP Authenticator" msgstr "IP-Authenticator" @@ -162,8 +213,9 @@ msgstr "Benutzernamen mit lesen Berechtigungen auf der Basis ausgewählt" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 #: services/OVirt/OVirtProvider.py:94 services/Sample/SampleService.py:131 #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:70 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 +#: web/forms/LoginForm.py:70 msgid "Password" msgstr "Passwort" @@ -231,9 +283,9 @@ msgstr "Reguläre Ausdrücke LDAP-Authentifizierungsserver" #: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 #: services/OVirt/OVirtProvider.py:93 transports/HTML5RDP/HTML5RDP.py:64 -#: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:59 -#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 -#: web/forms/LoginForm.py:69 +#: transports/NX/NXTransport.py:61 transports/NX/TSNXTransport.py:66 +#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 +#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:69 msgid "Username" msgstr "Benutzername" @@ -1093,10 +1145,6 @@ msgstr "und Browser neu starten" msgid "Ip" msgstr "IP" -#: templates/uds/index.html:79 templates/uds/html5/index.html:127 -msgid "Networks" -msgstr "Netzwerke" - #: templates/uds/index.html:80 templates/uds/html5/index.html:128 msgid "Transports" msgstr "Transporte" @@ -1153,35 +1201,44 @@ msgstr "" msgid "toggle navigation" msgstr "Toggle navigation" -#: templates/uds/admin/snippets/navbar.html:17 +#: templates/uds/admin/snippets/navbar.html:18 msgid "Service providers" msgstr "Service-Provider" -#: templates/uds/admin/snippets/navbar.html:18 +#: templates/uds/admin/snippets/navbar.html:19 +#: templates/uds/admin/tmpl/authenticators.html:4 msgid "Authenticators" msgstr "Authentifikatoren" -#: templates/uds/admin/snippets/navbar.html:20 +#: templates/uds/admin/snippets/navbar.html:21 msgid "Connectivity" msgstr "Konnektivität" -#: templates/uds/admin/snippets/navbar.html:21 +#: templates/uds/admin/snippets/navbar.html:22 msgid "Deployed services" msgstr "Bereitgestellten Dienste" -#: templates/uds/admin/snippets/navbar.html:25 +#: templates/uds/admin/snippets/navbar.html:26 msgid "Configuration" msgstr "Konfiguration" -#: templates/uds/admin/snippets/navbar.html:57 +#: templates/uds/admin/snippets/navbar.html:56 msgid "Exit dashboard" msgstr "Ausfahrt dashboard" -#: templates/uds/admin/snippets/navbar.html:58 +#: templates/uds/admin/snippets/navbar.html:57 #: templates/uds/html5/snippets/navbar.html:47 msgid "logout" msgstr "Logout" +#: templates/uds/admin/tmpl/authenticators.html:4 +msgid "administration of authenticators" +msgstr "Verwaltung von Authentifikatoren" + +#: templates/uds/admin/tmpl/dashboard.html:4 +msgid "overview" +msgstr "Übersicht" + #: templates/uds/html5/detectJava.html:4 msgid "Login redirection to UDS" msgstr "Login-Umleitung zu UDS" @@ -1273,7 +1330,7 @@ msgstr "Über" msgid "Dashboard" msgstr "Dashboard" -#: templates/uds/html5/templates/base.html:51 +#: templates/uds/html5/templates/base.html:52 msgid "" "Your browser is supported only partially. Please, upgrade it to a modern " "html5 browser like Firefox, Chrome, Opera, ... (IE must be 10 or better)" @@ -1311,30 +1368,30 @@ msgstr "" "zugänglich von Benutzern" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "Empty creds" msgstr "Leere creds" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "If checked, the credentials used to connect will be emtpy" msgstr "" "Wenn diese Option aktiviert, werden die Anmeldeinformationen zum Herstellen " "einer leer sein." #: transports/HTML5RDP/HTML5RDP.py:64 transports/NX/NXTransport.py:61 -#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 -#: transports/TSNX/TSNXTransport.py:66 +#: transports/NX/TSNXTransport.py:66 transports/RDP/RDPTransport.py:59 +#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 msgid "If not empty, this username will be always used as credential" msgstr "" "Wenn nicht leer ist, dieser Benutzername wird immer als verwendet " "Anmeldeinformationen" #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 msgid "If not empty, this password will be always used as credential" msgstr "" "Wenn nicht leer ist, dieses Kennwort immer verwendet werden als " @@ -1389,46 +1446,98 @@ msgstr "NX Transport (direkt)" msgid "NX Transport for direct connection" msgstr "NX-Transport für den direkten Anschluss" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listen port" msgstr "-Listenanschluss" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listening port of NX (ssh) at client machine" msgstr "Hören Port des NX (ssh) bei Client-Rechner" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection" msgstr "Verbindung" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection speed for this transport (quality)" msgstr "Verbindungsgeschwindigkeit für diesen Transport (Qualität)" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Session" msgstr "Sitzung" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Desktop session" msgstr "Desktop-Sitzung" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Disk Cache" msgstr "Festplatten-Cache" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Cache size en Mb stored at disk" msgstr "Cache-Größe de Mb auf der Festplatte gespeichert" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Memory Cache" msgstr "Memory-Caches" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Cache size en Mb keept at memory" msgstr "Cache Größe de Mb Keept auf Speicher" +#: transports/NX/TSNXTransport.py:55 transports/TSNX/TSNXTransport.py:55 +msgid "NX Transport (tunneled)" +msgstr "NX-Transport (Tunneling)" + +#: transports/NX/TSNXTransport.py:57 transports/TSNX/TSNXTransport.py:57 +msgid "NX Transport for tunneled connection" +msgstr "NX-Transport für getunnelte Verbindung" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "Tunnel server" +msgstr "Tunnel-server" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "" +"IP or Hostname of tunnel server send to client device (\"public\" ip) and " +"port. (use HOST:PORT format)" +msgstr "" +"IP-Adresse oder Hostname des Tunnel-Server senden an Client-Gerät " +"(\"öffentliche\" IP-Adresse) und Port. (verwenden Sie HOST: PORT-Format)" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "Tunnel host check" +msgstr "Tunnel Host-Prüfung" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "" +"If not empty, this server will be used to check if service is running before " +"assigning it to user. (use HOST:PORT format)" +msgstr "" +"Wenn nicht leer ist, wird dieser Server zu überprüfen, ob der Dienst " +"ausgeführt wird, bevor Sie verwendet werden Benutzer zuweisen. (verwenden " +"Sie HOST: PORT-Format)" + +#: transports/NX/TSNXTransport.py:103 transports/RDP/TSRDPTransport.py:75 +#: transports/TSNX/TSNXTransport.py:103 +msgid "Must use HOST:PORT in Tunnel Server Field" +msgstr "HOST: PORT muss in Feld der Tunnel-Server verwendet werden." + #: transports/NX/__init__.py:45 transports/TSNX/__init__.py:44 msgid "NX Protocol" msgstr "NX-Protokoll" @@ -1525,35 +1634,6 @@ msgstr "RDP-Verkehr (Tunneling)" msgid "RDP Transport for tunneled connection" msgstr "RDP-Verkehr für getunnelte Verbindung" -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "Tunnel server" -msgstr "Tunnel-server" - -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "" -"IP or Hostname of tunnel server send to client device (\"public\" ip) and " -"port. (use HOST:PORT format)" -msgstr "" -"IP-Adresse oder Hostname des Tunnel-Server senden an Client-Gerät " -"(\"öffentliche\" IP-Adresse) und Port. (verwenden Sie HOST: PORT-Format)" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "Tunnel host check" -msgstr "Tunnel Host-Prüfung" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "" -"If not empty, this server will be used to check if service is running before " -"assigning it to user. (use HOST:PORT format)" -msgstr "" -"Wenn nicht leer ist, wird dieser Server zu überprüfen, ob der Dienst " -"ausgeführt wird, bevor Sie verwendet werden Benutzer zuweisen. (verwenden " -"Sie HOST: PORT-Format)" - -#: transports/RDP/TSRDPTransport.py:75 transports/TSNX/TSNXTransport.py:103 -msgid "Must use HOST:PORT in Tunnel Server Field" -msgstr "HOST: PORT muss in Feld der Tunnel-Server verwendet werden." - #: transports/RDP/__init__.py:39 msgid "Remote Desktop Protocol" msgstr "Remote Desktop-Protokoll" @@ -1570,14 +1650,6 @@ msgstr "Erhalten Sie es aus" msgid "CoRD Website" msgstr "CoRD-Website" -#: transports/TSNX/TSNXTransport.py:55 -msgid "NX Transport (tunneled)" -msgstr "NX-Transport (Tunneling)" - -#: transports/TSNX/TSNXTransport.py:57 -msgid "NX Transport for tunneled connection" -msgstr "NX-Transport für getunnelte Verbindung" - #: web/errors.py:60 msgid "Unknown error" msgstr "Unbekannter Fehler" @@ -1639,6 +1711,10 @@ msgstr "" msgid "Authenticator do not provides information" msgstr "Authentifikator informiert nicht" +#: web/forms/LoginForm.py:50 +msgid "Select authenticator" +msgstr "Wählen Sie Authentifikator" + #: web/forms/LoginForm.py:54 msgid "authenticator" msgstr "Authentifikator" diff --git a/server/src/uds/locale/de/LC_MESSAGES/djangojs.mo b/server/src/uds/locale/de/LC_MESSAGES/djangojs.mo index e2b582e2a60a3b4ee64cb34803fc3254df933571..18143dc3be7dcb388fdfa2f4267785b641e2af29 100644 GIT binary patch literal 2002 zcmZXTO>7%Q6vwB~@?oGrfbtDfN~N^T7CQw|IStAt-jp<6+p?XM_F`@97kkKh$IQ;A zB$r+|AaMW*kT@VD)TkGFLMq~b5F!VJ#HAM`gak-P9C|}YocTX{(nMvnZ+`RfX6C)O z@BKEm|6_r66!HwDv`>gv!1xYyXft;TaRl_i10aESfotIXpaJgzFT3@3!G|$_AKVXq z4)VFHAnRQN`TTXa{*9Y|58jRSA3;8M!|`XwUqQa-4-lXD3mxBc6J-6r!5sK6$nWgK zBHxz-9|y-kUOx^V0Z+O8^KQKb-i!4f$o3nM?|;YbzX$StAAzj*DaiL;1=kR>Z^6Tu zAIBlKvkdb2I=X}41(4tGIlcuxf%zuLc7F)s3h^1p?_2@#i7(LceP6ouuig50AnX6& z_>|X)oI8A{MfGrT8=%eHP z415T@?AAX3*^f^^e&>qgHIVb_I*2gcYGb!Xqqy-K&$~6Yj~mC0-(tJ&gYZ2sKn_8; zv7gUE*iVkdqmbtycxu?#{wLj-ZR7v-2!!L#jq~^R#SydgiC{c zXFtXGs){Wc>c~~2`?3}KZ?vS)(E)2}z#S=kCIrIysIvem3M{c;OBtA^5^Xhb$M{A_~;cJxkTS9QGEtebjGU6i?6wdu_niYyL!rN~lIPUZ`zyh6b%yejiA z7bgoR@`ZdJie4R_^W{$OLg3fEubF%Go70`AoSy6RVTjba!=NYPb*vyZ#kU z=5xp)O9`Ia7{G3eU;5G@j#M%w+r7x7WT%&!^WN!QJvM8Vj29$r-ND~1%F`>#=4x?f zqS%|)rk@sNG8j(N>B%WM8cvTV^6<1Q9Gl9C@pYZJ^yY9S>Gqc0B-y1=0odEpe38?9 zZJ6dzL}G7_et&uUtF+ytM9iXSl!A^KUD_kzW5rpoaKvt+9!0plWj2xciW8qTE8AP`9v@vKm5|)y!=4&g8`Z$9vX)E0 zz=#Qn)EZfop$wL_>5)-LzKf*Vy@c#eAxyY37{&;S4c literal 1437 zcmYk5O>Y}T7{>=%C^heuP!TWUNqb3XCbiQd6(>R6#G7K(Z?ZR0>BZWtAFrp`>{v6i z4h|$r7 zjKS;RGw@Z=fj-|i;D_LM;HTho(AWDNJVdR(!6iI5QN+h<(ChjZd>{NC^m?CzUeB-K zHSjmk*ZmXpI$nSufd7JC$4vy6z$MV{TgCDYxDFDy1FnJt@OAJ95OQWQKCkb=kGJQT ztyli{+voPf@AZ28coWn2;Oj%i><)lgeY80nzBk|h#aJGy%(3AC4UImcelvK|C#PMU zk>Ny}fn58nY!lK8qNk+g-0CkL>r~yN0Z={cX<}w<>qK8-(OMMZPW`Y|>-*q- z)Q*BiU-XK^S0|m*E!5Y~(7db<^u%0g|r`bd-Zm!)a9`@PBv|-26DSd zt&DV)N}YBjcMQi4n`A9^T&4AL<({lmWaU0pD%Hxqw$(xPF!%VGdlU~L^YO~%9FZ-*kl}osE2M@?-I)-kCi@S?kR`~`cqu5w> zTYJ&2d~g}(WewTLFi-RVw@{@A2g;Q?Sz+Q#?rL*ntCWvtk9KQ)gXTZCmUCL#qRPrf zNi0urCB-z^e4c%c@*qqKUyjoIqPM>ut<4s*=^;p z`#3hJvr2GBYz~mHfNS@)8L>f95gv_)xC?Caz8dklZRNRbMX)FjvmPjm)t^F{E|fx6 h$_F`Kb@>n<=!JJriiLM)$F?wUXofmVDK3V$#D8@_Z9xD4 diff --git a/server/src/uds/locale/de/LC_MESSAGES/djangojs.po b/server/src/uds/locale/de/LC_MESSAGES/djangojs.po index cf1906ea4..87a724040 100644 --- a/server/src/uds/locale/de/LC_MESSAGES/djangojs.po +++ b/server/src/uds/locale/de/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-14 11:59+0100\n" +"POT-Creation-Date: 2013-11-17 04:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,70 +18,146 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: static/adm/js/api.js:23 -msgid "Success on \"" -msgstr "Erfolg auf\"" - -#: static/adm/js/api.js:24 -msgid "Received " -msgstr "Empfangen " - -#: static/adm/js/gui.js:17 -msgid "Display _MENU_ records per page" -msgstr "_MENU_-Einträge pro Seite anzeigen" - -#: static/adm/js/gui.js:18 -msgid "Nothing found - sorry" -msgstr "Nichts gefunden - sorry" - -#: static/adm/js/gui.js:19 -msgid "Showing record _START_ to _END_ of _TOTAL_" -msgstr "Ergebnis Rekord _START_ zu _END_ von _TOTAL_" - -#: static/adm/js/gui.js:20 -msgid "Showing 0 to 0 of 0 records" -msgstr "Anzeigen 0 bis 0 von 0 Einträge" - -#: static/adm/js/gui.js:21 -msgid "(filtered from _MAX_ total records)" -msgstr "(von _MAX_ Datensätze gefiltert)" - -#: static/adm/js/gui.js:22 -msgid "Please wait, processing" -msgstr "Bitte warten, Verarbeitung" - -#: static/adm/js/gui.js:23 -msgid "Search" -msgstr "Suche" - -#: static/adm/js/gui.js:26 -msgid "First" -msgstr "Erste" - -#: static/adm/js/gui.js:27 -msgid "Last" -msgstr "Letzter" - -#: static/adm/js/gui.js:28 -msgid "Next" -msgstr "Nächste" - -#: static/adm/js/gui.js:29 -msgid "Previous" -msgstr "Vorherige" - -#: static/adm/js/gui.js:83 -msgid "Connectivity" -msgstr "Konnektivität" - -#: static/adm/js/gui.js:88 -msgid "Deployed services" -msgstr "Bereitgestellten Dienste" - -#: static/adm/js/gui.js:181 +#: static/adm/js/gui-elements.js:7 msgid "Service Providers" msgstr "Service-Provider" -#: static/adm/js/gui.js:191 -msgid "Authenticators" -msgstr "Authentifikatoren" +#: static/adm/js/gui-elements.js:81 +msgid "Connectivity" +msgstr "Konnektivität" + +#: static/adm/js/gui.js:18 +msgid "_MENU_ records per page" +msgstr "_MENU_ Datensätze pro Seite" + +#: static/adm/js/gui.js:19 +msgid "Empty" +msgstr "Leer" + +#: static/adm/js/gui.js:20 +msgid "Records _START_ to _END_ of _TOTAL_" +msgstr "Zeichnet _START_, _END_ von _TOTAL_" + +#: static/adm/js/gui.js:21 +msgid "No records" +msgstr "Keine Datensätze" + +#: static/adm/js/gui.js:22 +msgid "(filtered from _MAX_ total records)" +msgstr "(von _MAX_ Datensätze gefiltert)" + +#: static/adm/js/gui.js:23 +msgid "Please wait, processing" +msgstr "Bitte warten, Verarbeitung" + +#: static/adm/js/gui.js:24 +msgid "Filter" +msgstr "Filter" + +#: static/adm/js/gui.js:27 +msgid "First" +msgstr "Erste" + +#: static/adm/js/gui.js:28 +msgid "Last" +msgstr "Letzter" + +#: static/adm/js/gui.js:29 +msgid "Next" +msgstr "Nächste" + +#: static/adm/js/gui.js:30 +msgid "Previous" +msgstr "Vorherige" + +#: static/adm/js/gui.js:80 +msgid "Deployed services" +msgstr "Bereitgestellten Dienste" + +#: static/adm/js/gui.js:349 +msgid "Edit" +msgstr "Bearbeiten" + +#: static/adm/js/gui.js:358 +msgid "Delete" +msgstr "Löschen" + +#: static/adm/js/gui.js:367 +msgid "Refresh" +msgstr "Aktualisieren" + +#: static/adm/js/strftime.js:30 +msgid "Sunday" +msgstr "Sonntag" + +#: static/adm/js/strftime.js:30 +msgid "Monday" +msgstr "Montag" + +#: static/adm/js/strftime.js:30 +msgid "Tuesday" +msgstr "Dienstag" + +#: static/adm/js/strftime.js:31 +msgid "Wednesday" +msgstr "Mittwoch" + +#: static/adm/js/strftime.js:31 +msgid "Thursday" +msgstr "Donnerstag" + +#: static/adm/js/strftime.js:31 +msgid "Friday" +msgstr "Freitag" + +#: static/adm/js/strftime.js:31 +msgid "Saturday" +msgstr "Samstag" + +#: static/adm/js/strftime.js:32 +msgid "January" +msgstr "Januar" + +#: static/adm/js/strftime.js:32 +msgid "February" +msgstr "Februar" + +#: static/adm/js/strftime.js:32 +msgid "March" +msgstr "März" + +#: static/adm/js/strftime.js:33 +msgid "April" +msgstr "April" + +#: static/adm/js/strftime.js:33 +msgid "May" +msgstr "Mai" + +#: static/adm/js/strftime.js:33 +msgid "June" +msgstr "Juni" + +#: static/adm/js/strftime.js:33 +msgid "July" +msgstr "Juli" + +#: static/adm/js/strftime.js:34 +msgid "August" +msgstr "August" + +#: static/adm/js/strftime.js:34 +msgid "September" +msgstr "September" + +#: static/adm/js/strftime.js:34 +msgid "October" +msgstr "Oktober" + +#: static/adm/js/strftime.js:34 +msgid "November" +msgstr "November" + +#: static/adm/js/strftime.js:35 +msgid "December" +msgstr "Dezember" diff --git a/server/src/uds/locale/es/LC_MESSAGES/django.mo b/server/src/uds/locale/es/LC_MESSAGES/django.mo index 5fb87eb136a59979f64fa9159ceffb84ba50c7f4..a6b8f7dde5c9828235dc3f1a951c53ebe2a0b5b5 100644 GIT binary patch delta 9145 zcmY+}34G0GzQ^$=u_Pf&6HDwli3G8RT0;Mg;`!zjg;W|Yp)LsLM}2I8@i+iA0Jp6dVQ1=Vu_7Ku4eU79 z!1EY^x3MDrjB)q?YhrAQ^I}aT&o}KT#9$BGF&tggC! zOyM=_;w02S=A$yP0X3VSTdyNYHl{K8uY*Yx)R2L?U@~%!c@^8?XIL43!5$de#7T8; z)SC`QP03hnhWXeWpT{sfh#J^2)RbOB-S3Ac=T zUfI`0)B#IFks3lXk=$F7cZg~ zU5{4A499uc36CSwY$~Pk_Sg!w4Oe0pJb+rf4^WFVgLIC=r8o>Ppw>k5HtYIGiFSbPmNklm=c{s$^^QM^?( zY>3*99dL;D|4<4_%{J6(-i`zCV~oZstT4@aZLEQfP^-C%bu4NCe$-Sg#s;_spTM_J z_uYqD3ujOtwo4e8OyM4d-Z+}C$WYvZWYK(&TJ;S&8Z!~QptjS?I2bQln=?NN)E8nc zd!LjO;`$ z);*~64x;AxBnBVI0?~Q#SQC>`nd^+o(3sBTUmbI3Xo4l!6#s-Q3v(IuX4P2;b+IjK ztqesyU;%1MR-sb51(R?OCgYc=7yA|UoDfE*>uRBK}}I6j>Co5naXl zcnkGLk=>mECZpQBVggRYMz{zy!0o6P`3q{`mr-we4fW>#L`_{prgMH0rfC27q2QvU z0F~krREpn5UGO*5gKnY*RIP_|<7TLVcR;O~KByNMZ2QO9b~iSleFi4sTGW8w#p>Gs zrzynHa1G<|o;9MUvu*03R&fW^8}&mix{+8Nb5H}HYwM+`fxd-Ww4Wl$G=H`AxL$Vd zF`DO_78LXbU97!OsT_#Pz*OYrO~CdaK)yxhC??@=$g~<4drp~}j4oVd-HE!-5!BpY z#yo7>hkI(DZ>69ceU5x3%^lR@XxP`eVF7lcUWyv%No;~=u@OE%U7x~58hAfcMsrYK zydu>0T!qTqCJcTl`;mV&?53dteu7F>Id;biSxs5i;N2rR%9oP+gn3u*xSkR51FVK_z) zaMn&d>bubtE8!$mhTW(KKWE!tM`d7VfPzxA&w3K|pv$P${Q#R_)Ietr+oMuE1U1ln z)PSC~{oAnv_5GNGcX1Pr8RSgKcj%)2GwQj4I)j}QwnQ~_!OA!kwHwA@B2GuG>Ss}_ z{Y~tMpQ1AOGb$6c`O3&7Y>drNnHYh3<8fF8XCUVV%p3}O!vN-mux(It8#~Ogwlxto zuvFC4q+txE+xGs*Z(1|V)>ok(T!K2U6g8mjs24kq&9(n8QRqxVRrW?K_C;l49O}ZE zs1L|u^xziMb_yNgylGuz2byF|#(Yf0_1GFeLjE&1_z{U+M>=a{0H*MKvxI`?^i5QX zKgMW0hkEc;erxNWIgJB+fW~{kFY8pwf$!?pzU*= zLNojkmD_WwZCV)P-)z`TGp@hWPq{EEs*t+CGU zkRI5U`joNczc+>FX=sCAp|(r(I48B;kZVmp)WEi(-t-;R1NLGIJb}v4ebm}%H{RK{ z8K_LSQEQI+P=6OSmq$=@d=~k< zo3M$_To1s8)L%p0ryOxdIg8X=sNo9E2KiAu6RyZU1)E4gQQ8@G*2@ z)KiWvu@m(nSOeEsU$gytQEz?@wLPz4D-7JGpp+#{=I=jjjLN_g)S_998qmwAf$lw0KoI1><{sZcF%GhkjiCB&L6x7uDah3M}G74IR;W^G?8;paf??A2g zyU2g0lbc`3xCQg@JIuo2JWc0s!P$5NXW>MTbNxvyr5-oc*&RDDnfi~I!1GO=Y0f{F z)3Gb{X*dOUAnV11@ifg{F6xc_7>)~3bG-u7aWgi>v$oyjJG-PN)~CG%F2Dg8iia_v zj-wRV`sO++@d@#!1=AU6&q7Oi%QvVs0?hH>C|r_*)_`xo&9|sUDTtz&J?snt%XGxiJMRZ zdKI;Z-$#9C4j_xq-1U)2VOyC z(QtOY((vntymZLq88I> zY=ZYtQJ2*EN{uJg*~OL&ZAQL3+nvXg?vLW1#4jmM&J(AegBA>y3a76)%rOFop{lD z5A&$UEOP$9n1>yxzlfTuFR&ZlLuIc0VrL-JtZT3i?YodqiaBgeTjKoVbu;RF@#PZo z-<`sJ8b+Z0Ij)Wk*a<&CEy|l%5AR~|4VOA=AqAC@VW>rzkIKXX)S}*qakvE&@O@kV z0xM9zvXmS4pm2=_nYxU>*|7liz+_`<5RXb>Dr(N#pa$CA_V=^xr7 z4b+EhBx-l$qB1oDHK3=lHU>6R&;a(JQhN?N;||5`f=0LqgCoNf>YFhMKec{?>C`K)cK&k7 z#4zf!QByM?b=^wT{dS=S`ho5L43**2sPDix7^40EKUDbY27e<>3USih9Chf%e#(`I zaNG79Z54@G!~{Zz-b_aqq6X)=@B>1})6~nHqRFxMP<1fTm*)o$FCCSMWyB)e_691I zjS20JOGK~7Za_77%(Py%ihH(P#QFbW%bTzbk!0^NhjL(|trVgbS|eMh7(D*O&*ns5 z+OJ`@?H^8A3y*J3@Go32pAmKGA56TX278ReFxo~E(G)3b{~U$dbm;g4p}Bi_ zT%j<9z9Q_8;~#e5_rx4~U9xTe8rRSkK`bRk+xDJ#)Rx6sdtIdFzY~>;#NX(6>ammR zQ~riXB=!*FIcGnz)66W&pCfB1xc|YN)enwCL~HtU2{w^=o%n^AL0x;loM=e-I_ml6 zIPq8FM?%MJI={uW#9Yb`k0&Xgq*4oSVK3qnVz@mgf^t6Pwzf{yETO!>)*E0RZHbsh zbS3os;PLPLTw}}ZOA|w9e{4%MBRs?y+E(I9)KTIP{D(wC%AXQZ^tHC_6RksOdz11m zq95fCF_kC|?mr59iKWEDV;_ZSL@FmY#oL6NvW|S>NU+3rpSFM4@6CxQ zXxql`HM5l%Wb48ApHF2Vq0i;xM=_PJhzxu354Q8JbsFvQw$C;Nf61u)gl#XSyn*l& zRR|p}+t(R8DgTQo%)s`Mf=kt`aDE|{*Ai5HViOGbHZbW_hGx2>Q zgz|3GahmWFal}tVccM2jnscJ@MMB3+>NP`x@9#9Upe8?z39=Bu+pV9HZygp)en(5}7)|9#tsk*?J4ie%OKQ zs8=P%*|td-Mog#eci4{@MR`5y=uIgFpn>1#qfdjBajrV)Q3;^^o@G@`tj*iQ7O z-kq3AjHRA}f5!>fp3u>R7(o0NQIEDz!cF;K#52SQ>gO>Qs}UT|^9NG;eX#EQs6gjy z6w`^8l(%3OkxaR%b0Ib7c=QHTV~J2AoajL;CmtRh?R9V2h8;n$@tWbTA-_qkN8@QrvNcZ6$ zU-3*&p>cZ)NvF?KzB}9ayaoC0e1CbFtGF=RMVgqff`V)p*&|I(mOO?`GMLhJD<}Rh DyvmY- delta 8374 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 ZtEW%X*-OeQ%Zn>Y{_<3D?Nh&=_Frfiy(s_y diff --git a/server/src/uds/locale/es/LC_MESSAGES/django.po b/server/src/uds/locale/es/LC_MESSAGES/django.po index 8b351356f..3a5ee1b84 100644 --- a/server/src/uds/locale/es/LC_MESSAGES/django.po +++ b/server/src/uds/locale/es/LC_MESSAGES/django.po @@ -31,7 +31,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-14 11:59+0100\n" +"POT-Creation-Date: 2013-11-17 04:20+0100\n" "PO-Revision-Date: 2013-04-22 06:24+0200\n" "Last-Translator: \n" "Language-Team: Spanish \n" @@ -42,35 +42,86 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Lokalize 1.4\n" -#: REST/methods/authenticators.py:72 +#: REST/methods/authenticators.py:73 msgid "Current authenticators" msgstr "Autenticadores actuales" -#: REST/methods/authenticators.py:74 REST/methods/providers.py:71 +#: REST/methods/authenticators.py:75 REST/methods/networks.py:68 +#: REST/methods/osmanagers.py:71 REST/methods/providers.py:69 +#: REST/methods/transports.py:71 REST/methods/users.py:77 msgid "Name" msgstr "Nombre" -#: REST/methods/authenticators.py:75 REST/methods/providers.py:72 +#: REST/methods/authenticators.py:76 REST/methods/osmanagers.py:72 +#: REST/methods/providers.py:70 REST/methods/transports.py:72 +#: REST/methods/users.py:78 msgid "Comments" msgstr "Comentarios" -#: REST/methods/authenticators.py:76 +#: REST/methods/authenticators.py:77 msgid "Users" msgstr "Usuarios" -#: REST/methods/providers.py:69 +#: REST/methods/networks.py:66 +msgid "Current Networks" +msgstr "Redes actuales" + +#: REST/methods/networks.py:69 templates/uds/index.html:79 +#: templates/uds/html5/index.html:127 +msgid "Networks" +msgstr "Redes" + +#: REST/methods/networks.py:70 REST/methods/osmanagers.py:73 +#: REST/methods/transports.py:73 +msgid "Used by" +msgstr "Utilizado por" + +#: REST/methods/osmanagers.py:69 +msgid "Current OS Managers" +msgstr "Actual OS administradores" + +#: REST/methods/providers.py:67 msgid "Current service providers" msgstr "Proveedores de servicio actuales" -#: REST/methods/providers.py:73 templates/uds/index.html:51 +#: REST/methods/providers.py:71 templates/uds/index.html:51 #: templates/uds/html5/index.html:68 msgid "Services" msgstr "Servicios" -#: admin/views.py:53 admin/views.py:61 web/views.py:422 +#: REST/methods/transports.py:69 +msgid "Current Transports" +msgstr "Transportes actuales" + +#: REST/methods/users.py:70 +#, python-brace-format +msgid "Users of {0}" +msgstr "Usuarios de {0}" + +#: REST/methods/users.py:72 +msgid "Current users" +msgstr "Usuarios actuales" + +#: REST/methods/users.py:76 +msgid "User Id" +msgstr "Id de usuario" + +#: REST/methods/users.py:79 +msgid "state" +msgstr "estado" + +#: REST/methods/users.py:80 +msgid "Last access" +msgstr "Último acceso" + +#: admin/views.py:55 admin/views.py:63 admin/views.py:76 web/views.py:422 msgid "Forbidden" msgstr "Prohibido" +#: admin/views.py:69 +msgid "requested a template that do not exists" +msgstr "solicitó una plantilla que no existe" + #: auths/IP/Authenticator.py:48 auths/IP/Authenticator.py:50 msgid "IP Authenticator" msgstr "Autenticador por IP" @@ -160,8 +211,9 @@ msgstr "Usuario con privilegios de lectura en la base elegida" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 #: services/OVirt/OVirtProvider.py:94 services/Sample/SampleService.py:131 #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:70 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 +#: web/forms/LoginForm.py:70 msgid "Password" msgstr "Contraseña" @@ -230,9 +282,9 @@ msgstr "Autenticador LDAP de expresiones regulares" #: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 #: services/OVirt/OVirtProvider.py:93 transports/HTML5RDP/HTML5RDP.py:64 -#: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:59 -#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 -#: web/forms/LoginForm.py:69 +#: transports/NX/NXTransport.py:61 transports/NX/TSNXTransport.py:66 +#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 +#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:69 msgid "Username" msgstr "Usuario" @@ -1079,10 +1131,6 @@ msgstr "y reinicie el navegador" msgid "Ip" msgstr "IP" -#: templates/uds/index.html:79 templates/uds/html5/index.html:127 -msgid "Networks" -msgstr "Redes" - #: templates/uds/index.html:80 templates/uds/html5/index.html:128 msgid "Transports" msgstr "Transportes" @@ -1139,35 +1187,44 @@ msgstr "" msgid "toggle navigation" msgstr "Toggle navegación" -#: templates/uds/admin/snippets/navbar.html:17 +#: templates/uds/admin/snippets/navbar.html:18 msgid "Service providers" msgstr "Proveedores de servicios" -#: templates/uds/admin/snippets/navbar.html:18 +#: templates/uds/admin/snippets/navbar.html:19 +#: templates/uds/admin/tmpl/authenticators.html:4 msgid "Authenticators" msgstr "Autenticadores" -#: templates/uds/admin/snippets/navbar.html:20 +#: templates/uds/admin/snippets/navbar.html:21 msgid "Connectivity" msgstr "Conectividad" -#: templates/uds/admin/snippets/navbar.html:21 +#: templates/uds/admin/snippets/navbar.html:22 msgid "Deployed services" msgstr "Servicios desplegados" -#: templates/uds/admin/snippets/navbar.html:25 +#: templates/uds/admin/snippets/navbar.html:26 msgid "Configuration" msgstr "Configuración" -#: templates/uds/admin/snippets/navbar.html:57 +#: templates/uds/admin/snippets/navbar.html:56 msgid "Exit dashboard" msgstr "Tablero de salida" -#: templates/uds/admin/snippets/navbar.html:58 +#: templates/uds/admin/snippets/navbar.html:57 #: templates/uds/html5/snippets/navbar.html:47 msgid "logout" msgstr "logout" +#: templates/uds/admin/tmpl/authenticators.html:4 +msgid "administration of authenticators" +msgstr "Administración de autenticadores" + +#: templates/uds/admin/tmpl/dashboard.html:4 +msgid "overview" +msgstr "Resumen" + #: templates/uds/html5/detectJava.html:4 msgid "Login redirection to UDS" msgstr "Redirección de inicio de sesión para UDS" @@ -1259,7 +1316,7 @@ msgstr "Acerca de" msgid "Dashboard" msgstr "Tablero de instrumentos" -#: templates/uds/html5/templates/base.html:51 +#: templates/uds/html5/templates/base.html:52 msgid "" "Your browser is supported only partially. Please, upgrade it to a modern " "html5 browser like Firefox, Chrome, Opera, ... (IE must be 10 or better)" @@ -1297,28 +1354,28 @@ msgstr "" "accesible de los usuarios" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "Empty creds" msgstr "Sin credenciales" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "If checked, the credentials used to connect will be emtpy" msgstr "" "Si está activada, las credenciales utilizadas para conectar estarán vacías" #: transports/HTML5RDP/HTML5RDP.py:64 transports/NX/NXTransport.py:61 -#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 -#: transports/TSNX/TSNXTransport.py:66 +#: transports/NX/TSNXTransport.py:66 transports/RDP/RDPTransport.py:59 +#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 msgid "If not empty, this username will be always used as credential" msgstr "" "Si no está vacio, este nombre de usuario será utilizado como credencial fija" #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 msgid "If not empty, this password will be always used as credential" msgstr "Si no está vacio, este password será utiizado como credencial fija" @@ -1371,46 +1428,97 @@ msgstr "Transporte NX (directo)" msgid "NX Transport for direct connection" msgstr "Transporte NX para conexión directa" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listen port" msgstr "Puerto de escucha" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listening port of NX (ssh) at client machine" msgstr "Puerto de escucha de NX (ssh) en el equipo cliente" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection" msgstr "Conexión" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection speed for this transport (quality)" msgstr "Velocidad de conexión de este transporte (calidad)" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Session" msgstr "Sesiones" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Desktop session" msgstr "Sesión de escritorio" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Disk Cache" msgstr "Caché de disco" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Cache size en Mb stored at disk" msgstr "Tamaño de ca Caché en MB almacenada en disco" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Memory Cache" msgstr "Memoria Caché" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Cache size en Mb keept at memory" msgstr "Tamaño del Caché en Mb a mantener en memoria" +#: transports/NX/TSNXTransport.py:55 transports/TSNX/TSNXTransport.py:55 +msgid "NX Transport (tunneled)" +msgstr "Transporte NX (vía túnel)" + +#: transports/NX/TSNXTransport.py:57 transports/TSNX/TSNXTransport.py:57 +msgid "NX Transport for tunneled connection" +msgstr "Transporte NX para conexión vía túnel" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "Tunnel server" +msgstr "Servidor de túnel" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "" +"IP or Hostname of tunnel server send to client device (\"public\" ip) and " +"port. (use HOST:PORT format)" +msgstr "" +"IP o nombre de host del servidor de túnel enviar a dispositivo de cliente " +"(ip \"pública\") y puerto. (utilice el formato HOST: puerto)" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "Tunnel host check" +msgstr "Verificación de host de túnel" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "" +"If not empty, this server will be used to check if service is running before " +"assigning it to user. (use HOST:PORT format)" +msgstr "" +"Si no vacía, este servidor se utilizará para comprobar si el servicio se " +"ejecuta antes de asignarle al usuario. (utilice el formato HOST: puerto)" + +#: transports/NX/TSNXTransport.py:103 transports/RDP/TSRDPTransport.py:75 +#: transports/TSNX/TSNXTransport.py:103 +msgid "Must use HOST:PORT in Tunnel Server Field" +msgstr "Debe utilizar HOST: puerto en el campo servidor de túnel" + #: transports/NX/__init__.py:45 transports/TSNX/__init__.py:44 msgid "NX Protocol" msgstr "Protocolo NX" @@ -1504,34 +1612,6 @@ msgstr "Transporte RDP (vía túnel)" msgid "RDP Transport for tunneled connection" msgstr "Transporte RDP para conexión vía túnel" -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "Tunnel server" -msgstr "Servidor de túnel" - -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "" -"IP or Hostname of tunnel server send to client device (\"public\" ip) and " -"port. (use HOST:PORT format)" -msgstr "" -"IP o nombre de host del servidor de túnel enviar a dispositivo de cliente " -"(ip \"pública\") y puerto. (utilice el formato HOST: puerto)" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "Tunnel host check" -msgstr "Verificación de host de túnel" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "" -"If not empty, this server will be used to check if service is running before " -"assigning it to user. (use HOST:PORT format)" -msgstr "" -"Si no vacía, este servidor se utilizará para comprobar si el servicio se " -"ejecuta antes de asignarle al usuario. (utilice el formato HOST: puerto)" - -#: transports/RDP/TSRDPTransport.py:75 transports/TSNX/TSNXTransport.py:103 -msgid "Must use HOST:PORT in Tunnel Server Field" -msgstr "Debe utilizar HOST: puerto en el campo servidor de túnel" - #: transports/RDP/__init__.py:39 msgid "Remote Desktop Protocol" msgstr "Protocolo de Escritorio remoto (RDP)" @@ -1548,14 +1628,6 @@ msgstr "Puede obtenerlo de" msgid "CoRD Website" msgstr "Sitio Web de CoRD" -#: transports/TSNX/TSNXTransport.py:55 -msgid "NX Transport (tunneled)" -msgstr "Transporte NX (vía túnel)" - -#: transports/TSNX/TSNXTransport.py:57 -msgid "NX Transport for tunneled connection" -msgstr "Transporte NX para conexión vía túnel" - #: web/errors.py:60 msgid "Unknown error" msgstr "Error desconocido" @@ -1619,6 +1691,10 @@ msgstr "" msgid "Authenticator do not provides information" msgstr "El autenticador no proporciona información alguna" +#: web/forms/LoginForm.py:50 +msgid "Select authenticator" +msgstr "Seleccione autenticador" + #: web/forms/LoginForm.py:54 msgid "authenticator" msgstr "autenticador" diff --git a/server/src/uds/locale/es/LC_MESSAGES/djangojs.mo b/server/src/uds/locale/es/LC_MESSAGES/djangojs.mo index 6897a5b59bd66ba9a16f2e9df9946330c4809338..1148695f7b9b6b26e012a727565283872d81c653 100644 GIT binary patch literal 2008 zcmZ9LO^6&t6vrzXKQex1{r;{PgZZ%6nT?V#o0aYC^u~?z#Z2$UkHb*gT{Barr>m*% z9y7U!;6d<^i+T_}tY9DzL5Q9V9x@lb2!eP}P%nD$Ab9br|JPHS1&e<5tEztW>b+O5 zewo|-K0`YIc@$FH#n|&;bOSoH54zw@pagFQ&w{su2D}w~)2_b*?#289xEtI8 zY2QVV^e%(6|4X}m)y}Vhw_yESkoJ9V`J?5}Aldm1#K-Jx9$ITL9+KANO~WEWcMO?7CHMGB)f;P ziTrGWwBJWZd3p^j?Avt%-iP&xonNs00Hkw1w)0Qz{Ica2AlbiadCl@0%kM0I0O1n* z$xdh_7Z;4$z{um|E}F*?fg7<>?X%dUS2!W8?& z@)AgTpMzxgD-dbA-sY~47~6;O9grvN8s(oFol8DG47m+LcAkXX51~eRcnpFoFJiqH zd>n$KibnVGkR6jRbYJ&C$Zu+NFaK{81GT##bU#l)9)VCh0O1gN8k9rI6Fb;fQ6`NH zdEe*}?={?)dpy&bh`5n~Heq^*xrtE`bMrx-W^6^ru?#XbR@sErWFSYI(qItDOae)y zCoq;uGgg62nHQ>zd7}i%t8&xi!eCGw2^iR0H7XPnc3Q;6zteeyNghj97x>!{CK#fh zu!fFFuPM)Etf{x1!*D$FpcQ1AJZVQ#q>{fORQ3!{jD{1biU+K1r)obD_#-ZpxyLTOUg%?r=`VQx~= z^>bP9j11%1sMqkC>%DECc_Ix@#6ZF){W@~#tcA`7EGZpVdD~ri$vx%q4X@K(Yc)$9 znP`(ajdY+w=VU%e9bZ>@sonCO6(dE4O-@Z@vdS0Am7`9j;#7|D@^jUN%8_!VT!y04 zLF8oI>b>H*9jDQ9YA%1VRc)*td9~H_N|bKLHzH0Wk!e%qtLybTZ@LYSpYR&)T7B8A z)jD3c`vO$sK@R^NUy4zc*WKo+b#nPcy}lf&d2I$eI&ihI*6?=XtIU^6sG&^8IBt@_ z?+jP^Y!V3-FY;h0Oe(Xbb$``4zN1HO^`&vVIM5+(v&xTes;tzGaw8&VRhv;-<#AF> z)1`$)J{v9_jQPGLUOBW_niaYcq2{5)O$=0;8J*fvFUlT;zF8FdK&P3eLZ8)nC_+|K zfx`V8$xdoxgh4@2fh$-DWtv2C0L!y#$IlHBOh3~_!Ak?8-hsAJBbsg~X;2ud>C1l9deOm@7d>bGv8{Bv@ztqt#sF?zU#cfI`v zL>y}7BJD3U%w>A-H@fz&8^bDj7HJ%G4 qcJ}U(7FN?ETogqn$A|$zWdt?7WC9&wxZ{I;9;kDkOt%Iq7VJOf4#c(q literal 1448 zcmYk5y^kA37{&(@2$-)BDGG?MmqbXpgt>SV5Ml2QWpmyOR=l=l??pgkO?Jojg!PUy zGj`6Rp`}PkNr9-4C_r?yS5YE?=nzQ!1GK4lW^LbPq?zA-%)IaO?)&UtXHI_2FwS7U zj`;)T8<^WqV8Qqiya4_Lz6kySJ`es2z6|~cz6G9mlCh`23*bp`W5rGIEbgy?=fEcT z3@E^7!F%A-paXrpFTmHphu|gfd(h|m9sC@*{sFz71WCM}`=EdSCFt`!1m6L_15bg! zf?n5epwIg!_$v4}=<9v7dVUU@ydDC5yi4FK;0NHFU>D?|25aCqAmp&qm_Dwr!H<`g zsMZsYUHdbBJcsFZ`SAj#ui58?jH(Afr59yZ!`JBb9F2=ZRXAy6PD7(7G)SUP2IRC8 z1sR!XliLjz&D>a)PG!PrW7)1QOPM(}S8l-?a$4vGj$3KwDwCEql${o0flzUKf3S{1 zQ)y@_Mw0C*V;yS=ENyv!MZ2*oM>N#4GAB+}8?#{DLJBMCfl%&Uni`GB7Q0y2$hp!p z%X%`CYL3LLFNMj*KqY{>M$c6)A+$f%4}9c03c{j?SXMrQPTcD^JMCIePPK77u_Kl9 zo3oMSsSc^u?WBCyNa1jZH-wWRU9AV#co6X5Jqm*G{SPnKgL)ksc@I_k;H!O~#!-(a z9o~rO<4%|~FMrl)$2I>Ad1^#y3*VWL_V!yXYDY;-+i?;#TQ{OcqZjx4A7N`bn&Ip7 zREkMRt*Cu#-%H+ZwQdw@Q=8H89!O1^Nqk&iuvxF6=?)&?>0%1q4vo8lE~|2jvav8$ zx}E)Wk6%CD=VcA0;c=Pi99;x{N5cUDfVyt%Yyt_{ownM-TtB40T|;YcpwNjX9&%etb3y9;q_ z&~;#Rji!g+j#MeoXEl*Vvj*grxI6s$KurY9N)iQ?u9C&6&}0<^Xx7Eyp_pSuF8oky z*NQUNEW*b#N*nK5byuMxcJuHTdw(W#0dd|{b1AD5e67oW3Bp;TQL_&L>k3S~^d4R* ce(d%7*^!e`Uu9&RSR489s{;jt=kh%J9~8H6jQ{`u diff --git a/server/src/uds/locale/es/LC_MESSAGES/djangojs.po b/server/src/uds/locale/es/LC_MESSAGES/djangojs.po index a1da24831..6f194c046 100644 --- a/server/src/uds/locale/es/LC_MESSAGES/djangojs.po +++ b/server/src/uds/locale/es/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-14 11:59+0100\n" +"POT-Creation-Date: 2013-11-17 04:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,70 +18,146 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: static/adm/js/api.js:23 -msgid "Success on \"" -msgstr "Éxito de\"" - -#: static/adm/js/api.js:24 -msgid "Received " -msgstr "Recibido " - -#: static/adm/js/gui.js:17 -msgid "Display _MENU_ records per page" -msgstr "Pantalla _MENU_ registros por página" - -#: static/adm/js/gui.js:18 -msgid "Nothing found - sorry" -msgstr "No encontrado - lo siento" - -#: static/adm/js/gui.js:19 -msgid "Showing record _START_ to _END_ of _TOTAL_" -msgstr "Mostrando registro _START_ a _END_ de _TOTAL_" - -#: static/adm/js/gui.js:20 -msgid "Showing 0 to 0 of 0 records" -msgstr "Mostrando 0 a 0 de 0 registros" - -#: static/adm/js/gui.js:21 -msgid "(filtered from _MAX_ total records)" -msgstr "(filtrado de registros total _MAX_)" - -#: static/adm/js/gui.js:22 -msgid "Please wait, processing" -msgstr "Por favor espere, procesando" - -#: static/adm/js/gui.js:23 -msgid "Search" -msgstr "Búsqueda de" - -#: static/adm/js/gui.js:26 -msgid "First" -msgstr "Primero" - -#: static/adm/js/gui.js:27 -msgid "Last" -msgstr "Duran" - -#: static/adm/js/gui.js:28 -msgid "Next" -msgstr "Próxima" - -#: static/adm/js/gui.js:29 -msgid "Previous" -msgstr "Anterior" - -#: static/adm/js/gui.js:83 -msgid "Connectivity" -msgstr "Conectividad" - -#: static/adm/js/gui.js:88 -msgid "Deployed services" -msgstr "Servicios desplegados" - -#: static/adm/js/gui.js:181 +#: static/adm/js/gui-elements.js:7 msgid "Service Providers" msgstr "Proveedores de servicios" -#: static/adm/js/gui.js:191 -msgid "Authenticators" -msgstr "Autenticadores" +#: static/adm/js/gui-elements.js:81 +msgid "Connectivity" +msgstr "Conectividad" + +#: static/adm/js/gui.js:18 +msgid "_MENU_ records per page" +msgstr "Registros _MENU_ por página" + +#: static/adm/js/gui.js:19 +msgid "Empty" +msgstr "Vacío" + +#: static/adm/js/gui.js:20 +msgid "Records _START_ to _END_ of _TOTAL_" +msgstr "Registros de _START_ a _END_ de _TOTAL_" + +#: static/adm/js/gui.js:21 +msgid "No records" +msgstr "No hay registros" + +#: static/adm/js/gui.js:22 +msgid "(filtered from _MAX_ total records)" +msgstr "(filtrado de registros total _MAX_)" + +#: static/adm/js/gui.js:23 +msgid "Please wait, processing" +msgstr "Por favor espere, procesando" + +#: static/adm/js/gui.js:24 +msgid "Filter" +msgstr "Filtro" + +#: static/adm/js/gui.js:27 +msgid "First" +msgstr "Primero" + +#: static/adm/js/gui.js:28 +msgid "Last" +msgstr "Duran" + +#: static/adm/js/gui.js:29 +msgid "Next" +msgstr "Próxima" + +#: static/adm/js/gui.js:30 +msgid "Previous" +msgstr "Anterior" + +#: static/adm/js/gui.js:80 +msgid "Deployed services" +msgstr "Servicios desplegados" + +#: static/adm/js/gui.js:349 +msgid "Edit" +msgstr "Editar" + +#: static/adm/js/gui.js:358 +msgid "Delete" +msgstr "Borrar" + +#: static/adm/js/gui.js:367 +msgid "Refresh" +msgstr "Actualización" + +#: static/adm/js/strftime.js:30 +msgid "Sunday" +msgstr "Domingo" + +#: static/adm/js/strftime.js:30 +msgid "Monday" +msgstr "Lunes" + +#: static/adm/js/strftime.js:30 +msgid "Tuesday" +msgstr "Martes" + +#: static/adm/js/strftime.js:31 +msgid "Wednesday" +msgstr "Miércoles" + +#: static/adm/js/strftime.js:31 +msgid "Thursday" +msgstr "Jueves" + +#: static/adm/js/strftime.js:31 +msgid "Friday" +msgstr "Viernes" + +#: static/adm/js/strftime.js:31 +msgid "Saturday" +msgstr "Sábado" + +#: static/adm/js/strftime.js:32 +msgid "January" +msgstr "Enero" + +#: static/adm/js/strftime.js:32 +msgid "February" +msgstr "Febrero" + +#: static/adm/js/strftime.js:32 +msgid "March" +msgstr "Marzo" + +#: static/adm/js/strftime.js:33 +msgid "April" +msgstr "Abril" + +#: static/adm/js/strftime.js:33 +msgid "May" +msgstr "Mayo" + +#: static/adm/js/strftime.js:33 +msgid "June" +msgstr "Junio" + +#: static/adm/js/strftime.js:33 +msgid "July" +msgstr "Julio" + +#: static/adm/js/strftime.js:34 +msgid "August" +msgstr "Agosto" + +#: static/adm/js/strftime.js:34 +msgid "September" +msgstr "Septiembre" + +#: static/adm/js/strftime.js:34 +msgid "October" +msgstr "Octubre" + +#: static/adm/js/strftime.js:34 +msgid "November" +msgstr "Noviembre" + +#: static/adm/js/strftime.js:35 +msgid "December" +msgstr "Diciembre" diff --git a/server/src/uds/locale/fr/LC_MESSAGES/django.mo b/server/src/uds/locale/fr/LC_MESSAGES/django.mo index 843a2159c0c43d72477a4b7a34bb278c3185e128..a3f006c8518f3df889abcfe0ee588f215456b7b8 100644 GIT binary patch delta 9204 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 diff --git a/server/src/uds/locale/fr/LC_MESSAGES/django.po b/server/src/uds/locale/fr/LC_MESSAGES/django.po index fdf3f8246..2dccee346 100644 --- a/server/src/uds/locale/fr/LC_MESSAGES/django.po +++ b/server/src/uds/locale/fr/LC_MESSAGES/django.po @@ -32,7 +32,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-14 11:59+0100\n" +"POT-Creation-Date: 2013-11-17 04:20+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -42,35 +42,86 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: REST/methods/authenticators.py:72 +#: REST/methods/authenticators.py:73 msgid "Current authenticators" msgstr "Authentificateurs actuels" -#: REST/methods/authenticators.py:74 REST/methods/providers.py:71 +#: REST/methods/authenticators.py:75 REST/methods/networks.py:68 +#: REST/methods/osmanagers.py:71 REST/methods/providers.py:69 +#: REST/methods/transports.py:71 REST/methods/users.py:77 msgid "Name" msgstr "Nom" -#: REST/methods/authenticators.py:75 REST/methods/providers.py:72 +#: REST/methods/authenticators.py:76 REST/methods/osmanagers.py:72 +#: REST/methods/providers.py:70 REST/methods/transports.py:72 +#: REST/methods/users.py:78 msgid "Comments" msgstr "Commentaires" -#: REST/methods/authenticators.py:76 +#: REST/methods/authenticators.py:77 msgid "Users" msgstr "Utilisateurs" -#: REST/methods/providers.py:69 +#: REST/methods/networks.py:66 +msgid "Current Networks" +msgstr "Réseaux actuels" + +#: REST/methods/networks.py:69 templates/uds/index.html:79 +#: templates/uds/html5/index.html:127 +msgid "Networks" +msgstr "Réseaux" + +#: REST/methods/networks.py:70 REST/methods/osmanagers.py:73 +#: REST/methods/transports.py:73 +msgid "Used by" +msgstr "Utilisé par" + +#: REST/methods/osmanagers.py:69 +msgid "Current OS Managers" +msgstr "Dirigeants de OS actuels" + +#: REST/methods/providers.py:67 msgid "Current service providers" msgstr "Fournisseurs de services actuels" -#: REST/methods/providers.py:73 templates/uds/index.html:51 +#: REST/methods/providers.py:71 templates/uds/index.html:51 #: templates/uds/html5/index.html:68 msgid "Services" msgstr "Services" -#: admin/views.py:53 admin/views.py:61 web/views.py:422 +#: REST/methods/transports.py:69 +msgid "Current Transports" +msgstr "Transports actuels" + +#: REST/methods/users.py:70 +#, python-brace-format +msgid "Users of {0}" +msgstr "Utilisateurs de {0}" + +#: REST/methods/users.py:72 +msgid "Current users" +msgstr "Utilisateurs actuels" + +#: REST/methods/users.py:76 +msgid "User Id" +msgstr "Id de l'utilisateur" + +#: REST/methods/users.py:79 +msgid "state" +msgstr "État" + +#: REST/methods/users.py:80 +msgid "Last access" +msgstr "Dernier accès" + +#: admin/views.py:55 admin/views.py:63 admin/views.py:76 web/views.py:422 msgid "Forbidden" msgstr "Interdit" +#: admin/views.py:69 +msgid "requested a template that do not exists" +msgstr "demandé un modèle qui ne sont pas existe" + #: auths/IP/Authenticator.py:48 auths/IP/Authenticator.py:50 msgid "IP Authenticator" msgstr "Authentificateur IP" @@ -161,8 +212,9 @@ msgstr "" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 #: services/OVirt/OVirtProvider.py:94 services/Sample/SampleService.py:131 #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:70 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 +#: web/forms/LoginForm.py:70 msgid "Password" msgstr "Mot de passe" @@ -232,9 +284,9 @@ msgstr "Authentificateur de LDAP d'Expressions régulière" #: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 #: services/OVirt/OVirtProvider.py:93 transports/HTML5RDP/HTML5RDP.py:64 -#: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:59 -#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 -#: web/forms/LoginForm.py:69 +#: transports/NX/NXTransport.py:61 transports/NX/TSNXTransport.py:66 +#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 +#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:69 msgid "Username" msgstr "Nom d'utilisateur" @@ -1091,10 +1143,6 @@ msgstr "Redémarrez le navigateur" msgid "Ip" msgstr "IP" -#: templates/uds/index.html:79 templates/uds/html5/index.html:127 -msgid "Networks" -msgstr "Réseaux" - #: templates/uds/index.html:80 templates/uds/html5/index.html:128 msgid "Transports" msgstr "Transports" @@ -1151,35 +1199,44 @@ msgstr "" msgid "toggle navigation" msgstr "activer/désactiver navigation" -#: templates/uds/admin/snippets/navbar.html:17 +#: templates/uds/admin/snippets/navbar.html:18 msgid "Service providers" msgstr "Fournisseurs de services" -#: templates/uds/admin/snippets/navbar.html:18 +#: templates/uds/admin/snippets/navbar.html:19 +#: templates/uds/admin/tmpl/authenticators.html:4 msgid "Authenticators" msgstr "Authentificateurs" -#: templates/uds/admin/snippets/navbar.html:20 +#: templates/uds/admin/snippets/navbar.html:21 msgid "Connectivity" msgstr "Connectivité" -#: templates/uds/admin/snippets/navbar.html:21 +#: templates/uds/admin/snippets/navbar.html:22 msgid "Deployed services" msgstr "Services déployés" -#: templates/uds/admin/snippets/navbar.html:25 +#: templates/uds/admin/snippets/navbar.html:26 msgid "Configuration" msgstr "Configuration" -#: templates/uds/admin/snippets/navbar.html:57 +#: templates/uds/admin/snippets/navbar.html:56 msgid "Exit dashboard" msgstr "Tableau de bord de sortie" -#: templates/uds/admin/snippets/navbar.html:58 +#: templates/uds/admin/snippets/navbar.html:57 #: templates/uds/html5/snippets/navbar.html:47 msgid "logout" msgstr "logout" +#: templates/uds/admin/tmpl/authenticators.html:4 +msgid "administration of authenticators" +msgstr "administration des authentificateurs" + +#: templates/uds/admin/tmpl/dashboard.html:4 +msgid "overview" +msgstr "vue d'ensemble" + #: templates/uds/html5/detectJava.html:4 msgid "Login redirection to UDS" msgstr "Redirection de connexion à l'UDS" @@ -1271,7 +1328,7 @@ msgstr "Sur" msgid "Dashboard" msgstr "Tableau de bord" -#: templates/uds/html5/templates/base.html:51 +#: templates/uds/html5/templates/base.html:52 msgid "" "Your browser is supported only partially. Please, upgrade it to a modern " "html5 browser like Firefox, Chrome, Opera, ... (IE must be 10 or better)" @@ -1309,30 +1366,30 @@ msgstr "" "si nécessaire) des utilisateurs" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "Empty creds" msgstr "Références vide" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "If checked, the credentials used to connect will be emtpy" msgstr "" "Si coché, les informations d'identification utilisées pour se connecter sera " "vide" #: transports/HTML5RDP/HTML5RDP.py:64 transports/NX/NXTransport.py:61 -#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 -#: transports/TSNX/TSNXTransport.py:66 +#: transports/NX/TSNXTransport.py:66 transports/RDP/RDPTransport.py:59 +#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 msgid "If not empty, this username will be always used as credential" msgstr "" "Si ce n'est vide, ce nom d'utilisateur sera toujours utilisé comme des " "titres de compétences" #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 msgid "If not empty, this password will be always used as credential" msgstr "" "Si ce n'est vide, ce mot de passe sera toujours utilisé comme des titres de " @@ -1387,46 +1444,98 @@ msgstr "NX Transport (direct)" msgid "NX Transport for direct connection" msgstr "NX Transport pour une connexion directe" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listen port" msgstr "Écouter le port" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listening port of NX (ssh) at client machine" msgstr "Écoute le port de NX (ssh) à la machine client" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection" msgstr "Connexion" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection speed for this transport (quality)" msgstr "Vitesse de connexion pour ce transport (qualité)" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Session" msgstr "Session" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Desktop session" msgstr "Session de bureau" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Disk Cache" msgstr "Cache disque" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Cache size en Mb stored at disk" msgstr "Cache en taille que Mo stocké à disque" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Memory Cache" msgstr "Mémoire Cache" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Cache size en Mb keept at memory" msgstr "Taille en Mb montagne à la mémoire de cache." +#: transports/NX/TSNXTransport.py:55 transports/TSNX/TSNXTransport.py:55 +msgid "NX Transport (tunneled)" +msgstr "Transport NX (tunnel)" + +#: transports/NX/TSNXTransport.py:57 transports/TSNX/TSNXTransport.py:57 +msgid "NX Transport for tunneled connection" +msgstr "Transport NX pour connexion tunnelée" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "Tunnel server" +msgstr "Serveur de tunnel" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "" +"IP or Hostname of tunnel server send to client device (\"public\" ip) and " +"port. (use HOST:PORT format)" +msgstr "" +"IP ou nom d'hôte du serveur de tunnel envoyer à la machine cliente (« public " +"» ip) et port. (utilisez le format de l'hôte : PORT)" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "Tunnel host check" +msgstr "Tunnel hôte cocher" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "" +"If not empty, this server will be used to check if service is running before " +"assigning it to user. (use HOST:PORT format)" +msgstr "" +"Si ce n'est vide, ce serveur sera utilisé pour vérifier si le service " +"s'exécute avant assignant à l'utilisateur. (utilisez le format de l'hôte : " +"PORT)" + +#: transports/NX/TSNXTransport.py:103 transports/RDP/TSRDPTransport.py:75 +#: transports/TSNX/TSNXTransport.py:103 +msgid "Must use HOST:PORT in Tunnel Server Field" +msgstr "Devez utiliser HOST : PORT dans le champ serveur Tunnel" + #: transports/NX/__init__.py:45 transports/TSNX/__init__.py:44 msgid "NX Protocol" msgstr "Protocole de NX" @@ -1518,35 +1627,6 @@ msgstr "Transport de RDP (tunnel)" msgid "RDP Transport for tunneled connection" msgstr "Transport de RDP de connexion tunnelée" -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "Tunnel server" -msgstr "Serveur de tunnel" - -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "" -"IP or Hostname of tunnel server send to client device (\"public\" ip) and " -"port. (use HOST:PORT format)" -msgstr "" -"IP ou nom d'hôte du serveur de tunnel envoyer à la machine cliente (« public " -"» ip) et port. (utilisez le format de l'hôte : PORT)" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "Tunnel host check" -msgstr "Tunnel hôte cocher" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "" -"If not empty, this server will be used to check if service is running before " -"assigning it to user. (use HOST:PORT format)" -msgstr "" -"Si ce n'est vide, ce serveur sera utilisé pour vérifier si le service " -"s'exécute avant assignant à l'utilisateur. (utilisez le format de l'hôte : " -"PORT)" - -#: transports/RDP/TSRDPTransport.py:75 transports/TSNX/TSNXTransport.py:103 -msgid "Must use HOST:PORT in Tunnel Server Field" -msgstr "Devez utiliser HOST : PORT dans le champ serveur Tunnel" - #: transports/RDP/__init__.py:39 msgid "Remote Desktop Protocol" msgstr "Protocole Bureau distant" @@ -1563,14 +1643,6 @@ msgstr "Vous pouvez l'obtenir de" msgid "CoRD Website" msgstr "Site Web du cordon" -#: transports/TSNX/TSNXTransport.py:55 -msgid "NX Transport (tunneled)" -msgstr "Transport NX (tunnel)" - -#: transports/TSNX/TSNXTransport.py:57 -msgid "NX Transport for tunneled connection" -msgstr "Transport NX pour connexion tunnelée" - #: web/errors.py:60 msgid "Unknown error" msgstr "Erreur inconnue" @@ -1633,6 +1705,10 @@ msgstr "" msgid "Authenticator do not provides information" msgstr "Authentificateur ne fournit pas d'informations" +#: web/forms/LoginForm.py:50 +msgid "Select authenticator" +msgstr "Sélectionnez authentificateur" + #: web/forms/LoginForm.py:54 msgid "authenticator" msgstr "authentificateur" diff --git a/server/src/uds/locale/fr/LC_MESSAGES/djangojs.mo b/server/src/uds/locale/fr/LC_MESSAGES/djangojs.mo index 58874aa77d3856157522963f7866e2f4ca6ee2db..6e99e4d72354cfab4128d7180aea9242438dad2c 100644 GIT binary patch literal 2018 zcmZ9MONbmr7{@CbU*j|DJHE=qVAf5?nT=wY&4z7vdg8A0VrF*Z<1qAg*Unb#>1wL0 zN5_kTf`SJT6fZfLOUMK-A|527;CN8*B8VV@2!e=s(Ss)s{=c5uU1BlSzpCo5zE^+W z{5-SwJ%(`z^Ipu#9>yLAqbu;hSh|w2gP;pu1q$$L@CEP&P=nWkuh{c9!F|}j4ekZc zfpqUYNOB*7bpI23{+Zo>30{NqZ$P^Do#hXfKY^s@7Z5-88y=+R50K>l0t?_jAlcc2 zL(*3O?*wN+I)4N_2p+TVPuuezcpc8SK=NOMr2lpM{wf#4k#{)0jBan-y{*)!k=$+$iHmT#G>IFr8&?qGiO~te>TZEvq;dfssRLMyw(N zG1w3qi%1v&B#|0HSt|5U1|nr%C=K%l352U+LubCmA~y+W=&NcO`XjdL$N9U}EW##> z1*`dZTlaOah3AOXRZMaX@seQ;we1|1!>I?&z$o&h6$w8T{6$}yBRtUxPNXvKvz8V^ zsj`%{r(yA4r|Y)66fEy~jY^NJP2TG^yKb!qnN2OyE!Oc(rpataBxY)-GmVV5v>M7# z=#+J`+_Uahrc;vbW+LZl5ysP1ukJP0dfPtpL};G)eF2};8RXJg37vIlk}59qmb?74 zd&=YMUc0l>Y!uoeQQA25v@b*F$*i9`T~+3VRxP#gjaW0YD;dV()K!?lMs#j8T@y;!XK1*&25}oBbQIqYD2Cmju>fUaA zrK80HYRHHf=0*wpHu$8ECXp}W1s-hqIu&Mdty^`D@5+%|n?gHY9H6s`MZ&^Ek=3>EiqXpDq^<$NVHO%`OzCb*?94!9!u|JA7EgTJ&XVv>3phbXxtW z_hDY|YI5naa-WP@WiqCM*8(3sL01e=aJC>)9!|zo{gbh+`gN2Ct4_wy1~Dpn+(Q`- zmm-(calnfND`}=jL=2I7@ef!sT^7$MF&V$L!C*g86-)fLEJ3JVt#oHwjZEA z?}yw>uJ&bAoRNr9=p)={bVnXD)FGtFIK&%PQD_y^;ZAEzKCrEUoNc#;8<@XRF05`ygpv(Vg z%|F)s8+1DU1>XnHLG(HB3g~ov3|7E>@NMu8==u-A9q=2_>G>6e9QGQf>&JcT#`zMf z^~@8`E~gu=)(fkrQn%~D>4cos9k^FW&Cup*xHEV4PR7PqCRS(>(^#t+jXK`vBeKed z326~29h*(&<#sAkE2GdVZP4Wd|Ii@8*} zVFM8fIY(hO6rql$z)Ar1wVKOVK zG@lqAs5({py?`HR5n6o28=)0-x?Zi_;I$gBeMq%h{i9E|s~YR zJP_fmPHnGy`_M_=YqxJDa$D)iX$+)xS{?tizuI=Sf=jpX01p-!bX#29HQcgHcPW~N z+6cRU7&Q6LX`GWa7MlBMq+;Acop$a@Tj?jc4inx~dS>dBW~;5)zrIW5tL{ zTVX3}>S8G<7Hdn!mqn_@L>jBb4023q*i(y+ok>Ohv`dTSV{;gai={Jcu{6vZBYFy3 zuATb-)LFQ8EIc=p#RDzicAb__@Btc^sbB*sQnFg*^I{46Hjr8+D0w7unIz&XxZWZJ zf3m9xgP&K*VWeUi70VcJ;N{|{oSda0$4%B$IVu_BT5;{4{JTogxJmbGm5Lv+m|SCx hRg|yJWZhU9W9aF&PMnS}OQ$2xlTI%l7?\n" "Language-Team: LANGUAGE \n" @@ -18,70 +18,146 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: static/adm/js/api.js:23 -msgid "Success on \"" -msgstr "Succès sur\"" - -#: static/adm/js/api.js:24 -msgid "Received " -msgstr "Reçu " - -#: static/adm/js/gui.js:17 -msgid "Display _MENU_ records per page" -msgstr "Afficher _MENU_ enregistrements par page" - -#: static/adm/js/gui.js:18 -msgid "Nothing found - sorry" -msgstr "Rien trouvé - Désolé" - -#: static/adm/js/gui.js:19 -msgid "Showing record _START_ to _END_ of _TOTAL_" -msgstr "Affichage des enregistrement _START_ à _END_ de _TOTAL_" - -#: static/adm/js/gui.js:20 -msgid "Showing 0 to 0 of 0 records" -msgstr "Affichage de 0 à 0 sur 0 documents" - -#: static/adm/js/gui.js:21 -msgid "(filtered from _MAX_ total records)" -msgstr "(filtrée de total d'enregistrements _MAX_)" - -#: static/adm/js/gui.js:22 -msgid "Please wait, processing" -msgstr "Veuillez patienter, traitement" - -#: static/adm/js/gui.js:23 -msgid "Search" -msgstr "Rechercher" - -#: static/adm/js/gui.js:26 -msgid "First" -msgstr "Première" - -#: static/adm/js/gui.js:27 -msgid "Last" -msgstr "Dernière" - -#: static/adm/js/gui.js:28 -msgid "Next" -msgstr "Prochaine" - -#: static/adm/js/gui.js:29 -msgid "Previous" -msgstr "Précédent" - -#: static/adm/js/gui.js:83 -msgid "Connectivity" -msgstr "Connectivité" - -#: static/adm/js/gui.js:88 -msgid "Deployed services" -msgstr "Services déployés" - -#: static/adm/js/gui.js:181 +#: static/adm/js/gui-elements.js:7 msgid "Service Providers" msgstr "Fournisseurs de services" -#: static/adm/js/gui.js:191 -msgid "Authenticators" -msgstr "Authentificateurs" +#: static/adm/js/gui-elements.js:81 +msgid "Connectivity" +msgstr "Connectivité" + +#: static/adm/js/gui.js:18 +msgid "_MENU_ records per page" +msgstr "Documents _MENU_ par page" + +#: static/adm/js/gui.js:19 +msgid "Empty" +msgstr "Vide" + +#: static/adm/js/gui.js:20 +msgid "Records _START_ to _END_ of _TOTAL_" +msgstr "Dossiers _START_ à _END_ de _TOTAL_" + +#: static/adm/js/gui.js:21 +msgid "No records" +msgstr "Aucun enregistrement" + +#: static/adm/js/gui.js:22 +msgid "(filtered from _MAX_ total records)" +msgstr "(filtrée de total d'enregistrements _MAX_)" + +#: static/adm/js/gui.js:23 +msgid "Please wait, processing" +msgstr "Veuillez patienter, traitement" + +#: static/adm/js/gui.js:24 +msgid "Filter" +msgstr "Filtre" + +#: static/adm/js/gui.js:27 +msgid "First" +msgstr "Première" + +#: static/adm/js/gui.js:28 +msgid "Last" +msgstr "Dernière" + +#: static/adm/js/gui.js:29 +msgid "Next" +msgstr "Prochaine" + +#: static/adm/js/gui.js:30 +msgid "Previous" +msgstr "Précédent" + +#: static/adm/js/gui.js:80 +msgid "Deployed services" +msgstr "Services déployés" + +#: static/adm/js/gui.js:349 +msgid "Edit" +msgstr "Edit" + +#: static/adm/js/gui.js:358 +msgid "Delete" +msgstr "Supprimer" + +#: static/adm/js/gui.js:367 +msgid "Refresh" +msgstr "Actualisation" + +#: static/adm/js/strftime.js:30 +msgid "Sunday" +msgstr "Dimanche" + +#: static/adm/js/strftime.js:30 +msgid "Monday" +msgstr "Lundi" + +#: static/adm/js/strftime.js:30 +msgid "Tuesday" +msgstr "Mardi" + +#: static/adm/js/strftime.js:31 +msgid "Wednesday" +msgstr "Mercredi" + +#: static/adm/js/strftime.js:31 +msgid "Thursday" +msgstr "Jeudi" + +#: static/adm/js/strftime.js:31 +msgid "Friday" +msgstr "Vendredi" + +#: static/adm/js/strftime.js:31 +msgid "Saturday" +msgstr "Samedi" + +#: static/adm/js/strftime.js:32 +msgid "January" +msgstr "Janvier" + +#: static/adm/js/strftime.js:32 +msgid "February" +msgstr "Février" + +#: static/adm/js/strftime.js:32 +msgid "March" +msgstr "Mars" + +#: static/adm/js/strftime.js:33 +msgid "April" +msgstr "Avril" + +#: static/adm/js/strftime.js:33 +msgid "May" +msgstr "Mai" + +#: static/adm/js/strftime.js:33 +msgid "June" +msgstr "Juin" + +#: static/adm/js/strftime.js:33 +msgid "July" +msgstr "Juillet" + +#: static/adm/js/strftime.js:34 +msgid "August" +msgstr "Août" + +#: static/adm/js/strftime.js:34 +msgid "September" +msgstr "Septembre" + +#: static/adm/js/strftime.js:34 +msgid "October" +msgstr "Octobre" + +#: static/adm/js/strftime.js:34 +msgid "November" +msgstr "Novembre" + +#: static/adm/js/strftime.js:35 +msgid "December" +msgstr "Décembre" diff --git a/server/src/uds/locale/it/LC_MESSAGES/django.mo b/server/src/uds/locale/it/LC_MESSAGES/django.mo index e0845e5907423e81d08cc4ea9bb14299bc935c91..4af52991c4f64de1038d1c06544bce502c4e2e94 100644 GIT binary patch delta 9139 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 oIL%Fp^b|*VsiVYGbpQYW delta 8380 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\n" "Language-Team: LANGUAGE \n" @@ -18,35 +18,86 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: REST/methods/authenticators.py:72 +#: REST/methods/authenticators.py:73 msgid "Current authenticators" msgstr "Autenticatori correnti" -#: REST/methods/authenticators.py:74 REST/methods/providers.py:71 +#: REST/methods/authenticators.py:75 REST/methods/networks.py:68 +#: REST/methods/osmanagers.py:71 REST/methods/providers.py:69 +#: REST/methods/transports.py:71 REST/methods/users.py:77 msgid "Name" msgstr "Nome" -#: REST/methods/authenticators.py:75 REST/methods/providers.py:72 +#: REST/methods/authenticators.py:76 REST/methods/osmanagers.py:72 +#: REST/methods/providers.py:70 REST/methods/transports.py:72 +#: REST/methods/users.py:78 msgid "Comments" msgstr "Commenti" -#: REST/methods/authenticators.py:76 +#: REST/methods/authenticators.py:77 msgid "Users" msgstr "Utenti" -#: REST/methods/providers.py:69 +#: REST/methods/networks.py:66 +msgid "Current Networks" +msgstr "Reti attuali" + +#: REST/methods/networks.py:69 templates/uds/index.html:79 +#: templates/uds/html5/index.html:127 +msgid "Networks" +msgstr "Reti" + +#: REST/methods/networks.py:70 REST/methods/osmanagers.py:73 +#: REST/methods/transports.py:73 +msgid "Used by" +msgstr "Utilizzato da" + +#: REST/methods/osmanagers.py:69 +msgid "Current OS Managers" +msgstr "Attuale OS Manager" + +#: REST/methods/providers.py:67 msgid "Current service providers" msgstr "Attuali fornitori di servizi" -#: REST/methods/providers.py:73 templates/uds/index.html:51 +#: REST/methods/providers.py:71 templates/uds/index.html:51 #: templates/uds/html5/index.html:68 msgid "Services" msgstr "Servizi" -#: admin/views.py:53 admin/views.py:61 web/views.py:422 +#: REST/methods/transports.py:69 +msgid "Current Transports" +msgstr "Trasporti correnti" + +#: REST/methods/users.py:70 +#, python-brace-format +msgid "Users of {0}" +msgstr "Utenti di {0}" + +#: REST/methods/users.py:72 +msgid "Current users" +msgstr "Utenti correnti" + +#: REST/methods/users.py:76 +msgid "User Id" +msgstr "Id utente" + +#: REST/methods/users.py:79 +msgid "state" +msgstr "stato" + +#: REST/methods/users.py:80 +msgid "Last access" +msgstr "Ultimo accesso" + +#: admin/views.py:55 admin/views.py:63 admin/views.py:76 web/views.py:422 msgid "Forbidden" msgstr "Vietato" +#: admin/views.py:69 +msgid "requested a template that do not exists" +msgstr "richiesto da un modello che non esiste" + #: auths/IP/Authenticator.py:48 auths/IP/Authenticator.py:50 msgid "IP Authenticator" msgstr "IP autenticatore" @@ -136,8 +187,9 @@ msgstr "Nome utente con privilegi di lettura sulla base selezionata" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 #: services/OVirt/OVirtProvider.py:94 services/Sample/SampleService.py:131 #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:70 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 +#: web/forms/LoginForm.py:70 msgid "Password" msgstr "Password" @@ -205,9 +257,9 @@ msgstr "Autenticatore di LDAP di espressioni regolari" #: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 #: services/OVirt/OVirtProvider.py:93 transports/HTML5RDP/HTML5RDP.py:64 -#: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:59 -#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 -#: web/forms/LoginForm.py:69 +#: transports/NX/NXTransport.py:61 transports/NX/TSNXTransport.py:66 +#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 +#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:69 msgid "Username" msgstr "Nome utente" @@ -1059,10 +1111,6 @@ msgstr "e riavviare il browser" msgid "Ip" msgstr "IP" -#: templates/uds/index.html:79 templates/uds/html5/index.html:127 -msgid "Networks" -msgstr "Reti" - #: templates/uds/index.html:80 templates/uds/html5/index.html:128 msgid "Transports" msgstr "Trasporti" @@ -1119,35 +1167,44 @@ msgstr "" msgid "toggle navigation" msgstr "navigazione Toggle" -#: templates/uds/admin/snippets/navbar.html:17 +#: templates/uds/admin/snippets/navbar.html:18 msgid "Service providers" msgstr "Fornitori di servizi" -#: templates/uds/admin/snippets/navbar.html:18 +#: templates/uds/admin/snippets/navbar.html:19 +#: templates/uds/admin/tmpl/authenticators.html:4 msgid "Authenticators" msgstr "Autenticatori" -#: templates/uds/admin/snippets/navbar.html:20 +#: templates/uds/admin/snippets/navbar.html:21 msgid "Connectivity" msgstr "Connettività" -#: templates/uds/admin/snippets/navbar.html:21 +#: templates/uds/admin/snippets/navbar.html:22 msgid "Deployed services" msgstr "Servizi distribuiti" -#: templates/uds/admin/snippets/navbar.html:25 +#: templates/uds/admin/snippets/navbar.html:26 msgid "Configuration" msgstr "Configurazione" -#: templates/uds/admin/snippets/navbar.html:57 +#: templates/uds/admin/snippets/navbar.html:56 msgid "Exit dashboard" msgstr "Cruscotto di uscita" -#: templates/uds/admin/snippets/navbar.html:58 +#: templates/uds/admin/snippets/navbar.html:57 #: templates/uds/html5/snippets/navbar.html:47 msgid "logout" msgstr "logout" +#: templates/uds/admin/tmpl/authenticators.html:4 +msgid "administration of authenticators" +msgstr "amministrazione di autenticatori" + +#: templates/uds/admin/tmpl/dashboard.html:4 +msgid "overview" +msgstr "Panoramica" + #: templates/uds/html5/detectJava.html:4 msgid "Login redirection to UDS" msgstr "Reindirizzamento login a UDS" @@ -1239,7 +1296,7 @@ msgstr "Circa" msgid "Dashboard" msgstr "Cruscotto" -#: templates/uds/html5/templates/base.html:51 +#: templates/uds/html5/templates/base.html:52 msgid "" "Your browser is supported only partially. Please, upgrade it to a modern " "html5 browser like Firefox, Chrome, Opera, ... (IE must be 10 or better)" @@ -1277,27 +1334,27 @@ msgstr "" "accessibile da parte degli utenti" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "Empty creds" msgstr "Vuoto creds" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "If checked, the credentials used to connect will be emtpy" msgstr "Se selezionata, le credenziali utilizzate per connettersi sarà emtpy" #: transports/HTML5RDP/HTML5RDP.py:64 transports/NX/NXTransport.py:61 -#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 -#: transports/TSNX/TSNXTransport.py:66 +#: transports/NX/TSNXTransport.py:66 transports/RDP/RDPTransport.py:59 +#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 msgid "If not empty, this username will be always used as credential" msgstr "" "Se non vuota, questo nome utente verrà sempre utilizzato come credenziale" #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 msgid "If not empty, this password will be always used as credential" msgstr "Se non vuota, questa password verrà sempre utilizzata come credenziale" @@ -1350,46 +1407,98 @@ msgstr "Trasporto NX (diretto)" msgid "NX Transport for direct connection" msgstr "Trasporto di NX per connessione diretta" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listen port" msgstr "Porta di ascolto" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listening port of NX (ssh) at client machine" msgstr "Porto di NX (ssh) in computer client in ascolto" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection" msgstr "Connessione" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection speed for this transport (quality)" msgstr "Velocità di connessione per questo trasporto (qualità)" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Session" msgstr "Sessione" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Desktop session" msgstr "Sessione desktop" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Disk Cache" msgstr "Cache disco" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Cache size en Mb stored at disk" msgstr "Memorizzare nella cache en dimensione che MB conservati a disco" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Memory Cache" msgstr "Memoria Cache" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Cache size en Mb keept at memory" msgstr "Cache size it Mb keept a memoria" +#: transports/NX/TSNXTransport.py:55 transports/TSNX/TSNXTransport.py:55 +msgid "NX Transport (tunneled)" +msgstr "Trasporto NX (con tunnel)" + +#: transports/NX/TSNXTransport.py:57 transports/TSNX/TSNXTransport.py:57 +msgid "NX Transport for tunneled connection" +msgstr "Trasporto di NX per connessione con tunnel" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "Tunnel server" +msgstr "Server per il tunnel" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "" +"IP or Hostname of tunnel server send to client device (\"public\" ip) and " +"port. (use HOST:PORT format)" +msgstr "" +"IP o l'Hostname del server per il tunnel invia a dispositivo client (ip " +"\"pubblico\") e porto. (utilizzare il formato HOST: PORT)" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "Tunnel host check" +msgstr "Controllo host tunnel" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "" +"If not empty, this server will be used to check if service is running before " +"assigning it to user. (use HOST:PORT format)" +msgstr "" +"Se non vuota, questo server verrà utilizzato per verificare se il servizio è " +"in esecuzione prima di assegnandolo all'utente. (utilizzare il formato HOST: " +"PORT)" + +#: transports/NX/TSNXTransport.py:103 transports/RDP/TSRDPTransport.py:75 +#: transports/TSNX/TSNXTransport.py:103 +msgid "Must use HOST:PORT in Tunnel Server Field" +msgstr "Necessario utilizzare HOST: porta nel campo Server di Tunnel" + #: transports/NX/__init__.py:45 transports/TSNX/__init__.py:44 msgid "NX Protocol" msgstr "Protocollo NX" @@ -1481,35 +1590,6 @@ msgstr "Trasporto di RDP (con tunnel)" msgid "RDP Transport for tunneled connection" msgstr "Trasporto di RDP per connessione con tunnel" -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "Tunnel server" -msgstr "Server per il tunnel" - -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "" -"IP or Hostname of tunnel server send to client device (\"public\" ip) and " -"port. (use HOST:PORT format)" -msgstr "" -"IP o l'Hostname del server per il tunnel invia a dispositivo client (ip " -"\"pubblico\") e porto. (utilizzare il formato HOST: PORT)" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "Tunnel host check" -msgstr "Controllo host tunnel" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "" -"If not empty, this server will be used to check if service is running before " -"assigning it to user. (use HOST:PORT format)" -msgstr "" -"Se non vuota, questo server verrà utilizzato per verificare se il servizio è " -"in esecuzione prima di assegnandolo all'utente. (utilizzare il formato HOST: " -"PORT)" - -#: transports/RDP/TSRDPTransport.py:75 transports/TSNX/TSNXTransport.py:103 -msgid "Must use HOST:PORT in Tunnel Server Field" -msgstr "Necessario utilizzare HOST: porta nel campo Server di Tunnel" - #: transports/RDP/__init__.py:39 msgid "Remote Desktop Protocol" msgstr "Remote Desktop Protocol" @@ -1527,14 +1607,6 @@ msgstr "Si può ottenere da" msgid "CoRD Website" msgstr "Sito Web di cavo" -#: transports/TSNX/TSNXTransport.py:55 -msgid "NX Transport (tunneled)" -msgstr "Trasporto NX (con tunnel)" - -#: transports/TSNX/TSNXTransport.py:57 -msgid "NX Transport for tunneled connection" -msgstr "Trasporto di NX per connessione con tunnel" - #: web/errors.py:60 msgid "Unknown error" msgstr "Errore sconosciuto" @@ -1598,6 +1670,10 @@ msgstr "" msgid "Authenticator do not provides information" msgstr "Autenticatore do non fornisce informazioni" +#: web/forms/LoginForm.py:50 +msgid "Select authenticator" +msgstr "Selezionare autenticatore" + #: web/forms/LoginForm.py:54 msgid "authenticator" msgstr "autenticatore" diff --git a/server/src/uds/locale/it/LC_MESSAGES/djangojs.mo b/server/src/uds/locale/it/LC_MESSAGES/djangojs.mo index dcd9f761174c849be22d3c964be6ec049356a5a9..ac988e59ece2001b21e9a901c19c36609a7c4a39 100644 GIT binary patch literal 2007 zcmZ9LJ&YSg6vrnJ0+^4$@e#h65F+JkgMA?)^5xJi=e^^CzhwI^kj5H&$Lk^M9Wy(7 z;G>{`0*N9GNGT8^O(LO)2IwFK5d{(rLZSc(r2>ft(I86xZ+CJhG1|Ak`FQi@&71dr zo7?>nLpun00#e(>*hw(H1wXWiVs;JOkMR*~ zqJ4G8E_e^d=Ri7t4ATBLzz4v$-TVcR?sw6RKLPQvD{lUCH~%F_etZMsW8XRc;P?|r zc7Ac=8zAZb0n+(@f#lD>ZoCJJw7wU=C&7In#qlIaaasaNKLoLb8Ib&+fe(W3f@Jri z<0Z$>K(g}%_y~9nM3}bQ+;*>s8=djAo1^$syB9)dJqEc8Liza&J zJ%h1SnoTv7DGNenSumMGc|{IPCJZ|Hk${1{6{A8iV`oH?ubs(a46;PBy1;5fnBf@z z8Efc-^qTT5%bNP8bLegs9<+v5lPB$1id6D9g|f%^)Mz-7sw84vhV>ow9yh2Be9lzKf~<)wD3=Pes4EH-&HVP%!imn$c{O2w%8eV0)9GZ_-pkg zzgFu6-R_G}O`;6`dp#*8RbKa-tLx3V%BR>!r8c68usW33VF+^=%HTtW_6nc%qD z6n2uRqsAPc;$HJu2F0S`hyi+@Rsb^7t162U&DLY9CW115OXD9!xke&s2NDL^3>!^kb(Xk$xFUd0EsG)meT(=a zIVCDUM*0|+u^4D0wvYvsb|~8r4mEZnwbw@1Lns_8D<71~`^ zRkeeScmjl2v4$-Y3wQ>^iXDO#5)u+Gz=|z@we6XRlB&Kw>eJ^^=kGr+p8uL*UBrGJ z`+Mv+u=gIrf%OA;4g3*&0sI|&4*VN@3H%3q6Fm1gV^4tB!1LhNn%m%I*muEKz$W-K zD8OgH2jG*S1AV;Dz}LVp!JFWBpwIUk_z80T1zv$2A<6TgUh{MC66`O)>)?c@3!eqC6h zJkLGy>~r|_EVhsDm#^RV?DL|Gat1(IH`*+hzjL4Obln)K%t<3t8W}yMVHA8gB&VIo z$jC&S)NZk$a1)t3l?bPeWd}OXW#ZIaxdm&;S*92G+)6W7iL|Vt>?{)tgbLe(;U)^r zq@kG@OLnM?b*v?DwB@Hbw411WOe0<7DRHvem<8)*Qdmh3g>tuPW;7yOc(JaLbEON* zdNPq}j>N1lg-IqrSpap7o~u-%(Eda}^pUG*2!|fwST}Y0Ze`Q39|yhIcTU5w-57f3 zVcdy>){ym!#Ahd+(^cfx570bsru-N=l+Nqa4GumCjzT&Pd;MmoUFpf0HjYPjtWy47 zF}6I`b*gkbF+VU;IDEt#!pS=ARBLy6t;TC_QLR>g`<+|WTD1yC-b0r@_}cHIFzE59 z!y5s;->FB?H~$iFN}g_>weH^^um7sUAX4s0=Lg& zDW-L51?{7OFL|%kx}T|SZN_IlC^c$E;aPvR?P>)>chCTj7cy*z*)9&x=(&};lMow4uskXIS zVWl<=TBB5~2e*=@T$`=1J1I$!H%ITUrSzOnSf4{GW1M|M6$r)a-ca0smigwO)?WF+K44a zC=mi$O;M<1J^Ui`0#V8*lL&^J$Q7pNqpg0TrDBmr%_2`BTVC}qHp0bcw#Xbbw7HOt Ta{d3ck}ll;CtXdpxXS(m(vE7L diff --git a/server/src/uds/locale/it/LC_MESSAGES/djangojs.po b/server/src/uds/locale/it/LC_MESSAGES/djangojs.po index 6477714f9..5a723612f 100644 --- a/server/src/uds/locale/it/LC_MESSAGES/djangojs.po +++ b/server/src/uds/locale/it/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-14 11:59+0100\n" +"POT-Creation-Date: 2013-11-17 04:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,70 +18,146 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: static/adm/js/api.js:23 -msgid "Success on \"" -msgstr "Successo su\"" - -#: static/adm/js/api.js:24 -msgid "Received " -msgstr "Ricevuto " - -#: static/adm/js/gui.js:17 -msgid "Display _MENU_ records per page" -msgstr "Visualizzare _MENU_ record per pagina" - -#: static/adm/js/gui.js:18 -msgid "Nothing found - sorry" -msgstr "Trovato nulla - ci dispiace" - -#: static/adm/js/gui.js:19 -msgid "Showing record _START_ to _END_ of _TOTAL_" -msgstr "Risultati record _START_ per _END_ di _TOTAL_" - -#: static/adm/js/gui.js:20 -msgid "Showing 0 to 0 of 0 records" -msgstr "Mostrando 0-0 di 0 record" - -#: static/adm/js/gui.js:21 -msgid "(filtered from _MAX_ total records)" -msgstr "(filtrato da record totale _MAX_)" - -#: static/adm/js/gui.js:22 -msgid "Please wait, processing" -msgstr "Attendere prego, elaborazione" - -#: static/adm/js/gui.js:23 -msgid "Search" -msgstr "Ricerca" - -#: static/adm/js/gui.js:26 -msgid "First" -msgstr "Primo" - -#: static/adm/js/gui.js:27 -msgid "Last" -msgstr "Ultima" - -#: static/adm/js/gui.js:28 -msgid "Next" -msgstr "Prossimo" - -#: static/adm/js/gui.js:29 -msgid "Previous" -msgstr "Precedente" - -#: static/adm/js/gui.js:83 -msgid "Connectivity" -msgstr "Connettività" - -#: static/adm/js/gui.js:88 -msgid "Deployed services" -msgstr "Servizi distribuiti" - -#: static/adm/js/gui.js:181 +#: static/adm/js/gui-elements.js:7 msgid "Service Providers" msgstr "Fornitori di servizi" -#: static/adm/js/gui.js:191 -msgid "Authenticators" -msgstr "Autenticatori" +#: static/adm/js/gui-elements.js:81 +msgid "Connectivity" +msgstr "Connettività" + +#: static/adm/js/gui.js:18 +msgid "_MENU_ records per page" +msgstr "Record _MENU_ per pagina" + +#: static/adm/js/gui.js:19 +msgid "Empty" +msgstr "Vuoto" + +#: static/adm/js/gui.js:20 +msgid "Records _START_ to _END_ of _TOTAL_" +msgstr "Registra _START_ a _END_ di _TOTAL_" + +#: static/adm/js/gui.js:21 +msgid "No records" +msgstr "Nessun record" + +#: static/adm/js/gui.js:22 +msgid "(filtered from _MAX_ total records)" +msgstr "(filtrato da record totale _MAX_)" + +#: static/adm/js/gui.js:23 +msgid "Please wait, processing" +msgstr "Attendere prego, elaborazione" + +#: static/adm/js/gui.js:24 +msgid "Filter" +msgstr "Filtro" + +#: static/adm/js/gui.js:27 +msgid "First" +msgstr "Primo" + +#: static/adm/js/gui.js:28 +msgid "Last" +msgstr "Ultima" + +#: static/adm/js/gui.js:29 +msgid "Next" +msgstr "Prossimo" + +#: static/adm/js/gui.js:30 +msgid "Previous" +msgstr "Precedente" + +#: static/adm/js/gui.js:80 +msgid "Deployed services" +msgstr "Servizi distribuiti" + +#: static/adm/js/gui.js:349 +msgid "Edit" +msgstr "Modifica" + +#: static/adm/js/gui.js:358 +msgid "Delete" +msgstr "Eliminare" + +#: static/adm/js/gui.js:367 +msgid "Refresh" +msgstr "Aggiornamento" + +#: static/adm/js/strftime.js:30 +msgid "Sunday" +msgstr "Domenica" + +#: static/adm/js/strftime.js:30 +msgid "Monday" +msgstr "Lunedì" + +#: static/adm/js/strftime.js:30 +msgid "Tuesday" +msgstr "Martedì" + +#: static/adm/js/strftime.js:31 +msgid "Wednesday" +msgstr "Mercoledì" + +#: static/adm/js/strftime.js:31 +msgid "Thursday" +msgstr "Giovedì" + +#: static/adm/js/strftime.js:31 +msgid "Friday" +msgstr "Venerdì" + +#: static/adm/js/strftime.js:31 +msgid "Saturday" +msgstr "Sabato" + +#: static/adm/js/strftime.js:32 +msgid "January" +msgstr "Gennaio" + +#: static/adm/js/strftime.js:32 +msgid "February" +msgstr "Febbraio" + +#: static/adm/js/strftime.js:32 +msgid "March" +msgstr "Marzo" + +#: static/adm/js/strftime.js:33 +msgid "April" +msgstr "Aprile" + +#: static/adm/js/strftime.js:33 +msgid "May" +msgstr "Maggio" + +#: static/adm/js/strftime.js:33 +msgid "June" +msgstr "Giugno" + +#: static/adm/js/strftime.js:33 +msgid "July" +msgstr "Luglio" + +#: static/adm/js/strftime.js:34 +msgid "August" +msgstr "Agosto" + +#: static/adm/js/strftime.js:34 +msgid "September" +msgstr "Settembre" + +#: static/adm/js/strftime.js:34 +msgid "October" +msgstr "Ottobre" + +#: static/adm/js/strftime.js:34 +msgid "November" +msgstr "Novembre" + +#: static/adm/js/strftime.js:35 +msgid "December" +msgstr "Dicembre" diff --git a/server/src/uds/locale/pt/LC_MESSAGES/django.mo b/server/src/uds/locale/pt/LC_MESSAGES/django.mo index b340ceb19f50494028a2bd69d9ebcbc855f5c8ff..2d16e0dc1f90b4320e4cc82687d823eb3f45c94e 100644 GIT binary patch delta 9161 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 F{4Z5Km`?xz delta 8382 zcmY+|30ziH8prVivg!*ctB43FD2NKUv5BalAZ{p{0-7r#idq=B=IfG;WQ>`))U=Fd zHCB_2uQo2zsx#KKPNt(~HP+OaW~rqOHrf3C+|zuT`{{YV&pG$L_n!NlbMK2aZSuZy zkGK2dP@gS^ZKann9ns}7=121XM5))9%W=l|;}vVO)hpf@Kl%gF7u#YGMxu^S#Gcp# zbzBANxak;-)!5z`w`m}0N5@9&j5{z9k0N6+U!uNn9d!ZU1TKbQI2;pE-(P?MxC#ei zBkDY_V^_R{T`-)B6k!$yaecFjB!!M&qrPweWAP(Y5q>}oAdGLT-5GN+2Ys*sHL&Fv zfsGi5kJTc!+P|?XK)DaMV0y* z>P~N>rX--7F{v1hJ#Z-M2I^1)TZX#xt>}l3cccDcBu~?!6TXBQcnnq2W^9fA$;NcY zP|U+T?1{@!H?SLZ;-jd_{0(*7bu7TX%&!Kp1k>;V)KnZzq5jb%AJU;YzlMPr#?^F3 zv8WRF!g#E*-i;dQQ>evv8a0I%QBTni*c#hY4u9-|IzAP3=Too{XSqpq!QI#fJ*Yc* z8Fj+9&==2IKSeFZ^Qa4akNUnh^$tK6svUuCFb;K|RMdHLQI#ER``u$mbl_Cf>YZm@ zjk>@#)CqQ?M!pv{We3p*-^Mb0AHA_F^U?}aP!;Tn8rVRbg+-_}^(>Cl^ZzMHHXZ$X zIgjB&oIv|Q)MNGy4#3njXK~I!EyAa;953KlEKGOid@C-c{ef+drtT@U??s+u^8&K0 z%xN5;=ijThF_m--#4-2~2IB?P9XF%y!1QtEIuP}g#GvN70#&)i7=}%#$887de1}k# zY2DXZtU)+}b}|O*`M-n2g=W@Ord2iGUY5-2f z@i-LsVJY4~ieg5vqP5sppnEdOLnL}kzQ@s+%iBcWgK>Bobw|yp6NY9v1DJ$bJ2e=D z^|rkhSq^3+YK{B}^%T5{T7++)*4DdO)W03c89LhISEx$(vLJNAP}G6(sOLEqTP}z? zt{x+C4XR=fqAIlC_J4rMv@c?J49}rTn2)-#x*Y1SFWygw7Rhs{3!K6T{3k}?4bu3Oc?U$hV*t%`Vg(Jd4`DA6pg^cB1_TYHH4-2GC|O^NeX2f`u50)Cm@#M!pGE%4aYP4`a*oi>lZeR3*;a_6=-BJD|v^ zlnV#Z9*JexgsSYhBI>V2be#@=3}To%VFaq(1${6Tb-{GhbDxVUbuq@_M7w`6YT#>7 zPt6mUgnO_foO zRN@S*J0{c4MorZWR3(?A2Dk+^kOOXez`K}9$9bHA@gpcZu0@qTVx)7yBvgg6ZMz8l zXjh_E`3y|JdeoxbhFZ*fFbm&ARm^9UbK~wr65UZxY>oMLM+xc<%5a_+KNhGdIX~L* zvi0An0q8BHiuq#@2HAED>c$dmyWBbzL-hPtk?2D8sFFU4-El8=#g9<0Vjq6Ov}ih@ z2AqaEelSurGXX>Jx2PL=9yP~@Q6+E2MC>@$SrdbCoSy$`5*IrTVJaTObo>@IcZs}L zHMe=FMOT3;VGZg6ji?G7Lk;j9)bXETThx-*B5sG;ABmcpR1D(!rhr5vAB(!<>Dqzo zu?KF&Ks^X}t3PI^~SB8 zME&)mSVD)UV1>02^@iGtD*1b;3x9$-@p&AC(dEwKszCh~+>ffO#{{ zH?RhE$D1%8A3@#FNBaBgR+2AJr5rlNIdBYWO;n;zJP)jHPqC+iP3lx^_X5pRmy#xL>Ka56q*670d2tP zcprM>Rn*j8L!H0b8aS1oUfR)^t>^y%5~kCDX<8_dPM7>i%qe%EYge-~8Ab8s4tM{nGZ9q|B8Cc>xe69_eEY6#)HhZ@vm{7nksZB(eVh$ zU3dg}QcUq&e*1AJQZ3VNp7RGtJ!(K(aX22tL~K>-3_KaN2>YQg7GfHf*!D8Jf0b=- ztfl_?!WKGIs$HlHykrkNhgyu6(S_dgoePJc?z9~B{c4QC228;Ft^2S8?USe*y@K5^ zio46h`~}p%E6JU7=mfh^FPK+Q7rcU+>zk+nMl5trl!hs^C!i0yF%0iQ9lsq_fj!tA z_hTmh1KVKx+nhC(=q6DKQ<2{bQ;PZcIO>F-p%%^e=!Z8j7`<+H=CUnnju#*|XD(SQ z>-dYB_8X|jICqgVpfYSvyBu{McO8jFyc$)i?Wig6U^1S>9{3Z+V~;zW6OF6= zXmH+a;TTVU9BSZ$P*XD#b>~eOhEHH59z;#$dzhf-{{l%k9j?XB^PYgZvkcVKd>t#$wUYYB zl2o&Vb%AxL$L?X&g?6J#co?+?j-W2|7PiGtZ2K~*Vy!5r_IJlL%tIYFAG2^J#^WDR zQ+vuyGLqy+)PW_doC7Lx5bYJHMfW1+;W5;Jd{;Y*D+o34B-as+%te=bjdOxx>r@=fjs|31nFF{J)7LtsJ&wBIHB_ZscRB57)FMkqRUi`+umn3| zEyiIZX5((uU6fOk%Khu#F>P$ZJ|! z&c{@EmG}n{McgDxIA#>?*7N@y$uGCR(MaO}y%QcMI+Ab4lSC(S#@kY%F!E~hDC~qU z60Z;g2(9j+^oJ4!2%A|2{{ue>SbzsO?tlZ1Y*P$CH=3`B+6G9~Tl|k|$yj{=6mHa*B9{NFu5TZLK)Q9l*zB8h2m<@yqQ28s)?}+xZ=?{KYXf zXMP~GeM$robBPgz zw&#g=S~BNj2p5hg-9iMDcgEqwOrkYyy{`4*8B6{aCTsrRB>8y@WJe*vXohuXZ9>$m)=^%vxa?fZp(4{Tf9O&lPqI9{9Hn2!+4iTQ-K4ED8l(w2Xk>H4OQm_aOJ=Ra{H zp|_p3bO+GM_D5k9~lKiNXnib@e$@LSwl>9W-p*9~c=D)9P zsN)QAh1f~x?f1*gpW|*P+S}s?TJx}*&F|$4BW(UPd9KZGCGSftux&5Y?@PMoKZ|4_ zagj)}2avYB_d~D`eOpoQacxr^%si{!j@mvV7PVx&nD|bD&3ofM;uGR^qJVvRv(CU} zs(&p>K0Zu5Nobo+>>{SJ??L=65kjub+u9p{N4prGYT3g-Ht=ntt34)#Jc7K)winvt z!maLWHhBU&5Sbj9We+}V_bs74%l3Um-{(ZVZ7;FMOvE@MmUxyZv-@LlIPrJ-3W*f* zX?7n?-9LY+5MAi}J!TWW?!Jn17RxB?i$y2`3OQ6EVbl#D3yw;uc~&ah9|=k02+?Qk&T=&L0EGclKZq9-rmlfcd6 zQ&T(}Qon2M+0g&A%d@ng*3VUECM>F|iyvHFwcrkqSIK5C&yEr0-kW1a-we2I`l3aP z7uL<%JZa2R{(a*!GIIK5d;Ch9U7Ite^zqbB+2`_P&20?voLRcYzis`I9d$JeP0M+z j;%6=NtXrM#?fJ{v%if+-cSn2qE~;8EXZq%}^|$^PUL(C$ diff --git a/server/src/uds/locale/pt/LC_MESSAGES/django.po b/server/src/uds/locale/pt/LC_MESSAGES/django.po index dac40c3c6..036d5dff4 100644 --- a/server/src/uds/locale/pt/LC_MESSAGES/django.po +++ b/server/src/uds/locale/pt/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-14 11:59+0100\n" +"POT-Creation-Date: 2013-11-17 04:20+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,35 +18,86 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: REST/methods/authenticators.py:72 +#: REST/methods/authenticators.py:73 msgid "Current authenticators" msgstr "Autenticadores atuais" -#: REST/methods/authenticators.py:74 REST/methods/providers.py:71 +#: REST/methods/authenticators.py:75 REST/methods/networks.py:68 +#: REST/methods/osmanagers.py:71 REST/methods/providers.py:69 +#: REST/methods/transports.py:71 REST/methods/users.py:77 msgid "Name" msgstr "Nome" -#: REST/methods/authenticators.py:75 REST/methods/providers.py:72 +#: REST/methods/authenticators.py:76 REST/methods/osmanagers.py:72 +#: REST/methods/providers.py:70 REST/methods/transports.py:72 +#: REST/methods/users.py:78 msgid "Comments" msgstr "Comentários" -#: REST/methods/authenticators.py:76 +#: REST/methods/authenticators.py:77 msgid "Users" msgstr "Usuários" -#: REST/methods/providers.py:69 +#: REST/methods/networks.py:66 +msgid "Current Networks" +msgstr "Redes atuais" + +#: REST/methods/networks.py:69 templates/uds/index.html:79 +#: templates/uds/html5/index.html:127 +msgid "Networks" +msgstr "Redes" + +#: REST/methods/networks.py:70 REST/methods/osmanagers.py:73 +#: REST/methods/transports.py:73 +msgid "Used by" +msgstr "Usado por" + +#: REST/methods/osmanagers.py:69 +msgid "Current OS Managers" +msgstr "Atual OS gerentes" + +#: REST/methods/providers.py:67 msgid "Current service providers" msgstr "Provedores de serviço atual" -#: REST/methods/providers.py:73 templates/uds/index.html:51 +#: REST/methods/providers.py:71 templates/uds/index.html:51 #: templates/uds/html5/index.html:68 msgid "Services" msgstr "Serviços" -#: admin/views.py:53 admin/views.py:61 web/views.py:422 +#: REST/methods/transports.py:69 +msgid "Current Transports" +msgstr "Atuais transportes" + +#: REST/methods/users.py:70 +#, python-brace-format +msgid "Users of {0}" +msgstr "Usuários de {0}" + +#: REST/methods/users.py:72 +msgid "Current users" +msgstr "Usuários atuais" + +#: REST/methods/users.py:76 +msgid "User Id" +msgstr "Id de usuário" + +#: REST/methods/users.py:79 +msgid "state" +msgstr "Estado" + +#: REST/methods/users.py:80 +msgid "Last access" +msgstr "Último acesso" + +#: admin/views.py:55 admin/views.py:63 admin/views.py:76 web/views.py:422 msgid "Forbidden" msgstr "Proibido" +#: admin/views.py:69 +msgid "requested a template that do not exists" +msgstr "solicitado um modelo que não existe" + #: auths/IP/Authenticator.py:48 auths/IP/Authenticator.py:50 msgid "IP Authenticator" msgstr "Autenticador IP" @@ -136,8 +187,9 @@ msgstr "Nome de usuário com privilégios de leitura da base selecionada" #: osmanagers/WindowsOsManager/WinRandomPassOsManager.py:30 #: services/OVirt/OVirtProvider.py:94 services/Sample/SampleService.py:131 #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 web/forms/LoginForm.py:70 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 +#: web/forms/LoginForm.py:70 msgid "Password" msgstr "Senha" @@ -206,9 +258,9 @@ msgstr "Autenticador de LDAP de expressões regular" #: auths/RegexLdap/Authenticator.py:72 auths/SimpleLDAP/Authenticator.py:73 #: services/OVirt/OVirtProvider.py:93 transports/HTML5RDP/HTML5RDP.py:64 -#: transports/NX/NXTransport.py:61 transports/RDP/RDPTransport.py:59 -#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 -#: web/forms/LoginForm.py:69 +#: transports/NX/NXTransport.py:61 transports/NX/TSNXTransport.py:66 +#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 +#: transports/TSNX/TSNXTransport.py:66 web/forms/LoginForm.py:69 msgid "Username" msgstr "Nome de usuário" @@ -1061,10 +1113,6 @@ msgstr "e reinicie o navegador" msgid "Ip" msgstr "IP" -#: templates/uds/index.html:79 templates/uds/html5/index.html:127 -msgid "Networks" -msgstr "Redes" - #: templates/uds/index.html:80 templates/uds/html5/index.html:128 msgid "Transports" msgstr "Transportes" @@ -1121,35 +1169,44 @@ msgstr "" msgid "toggle navigation" msgstr "navegação toggle" -#: templates/uds/admin/snippets/navbar.html:17 +#: templates/uds/admin/snippets/navbar.html:18 msgid "Service providers" msgstr "Prestadores de serviços" -#: templates/uds/admin/snippets/navbar.html:18 +#: templates/uds/admin/snippets/navbar.html:19 +#: templates/uds/admin/tmpl/authenticators.html:4 msgid "Authenticators" msgstr "Autenticadores" -#: templates/uds/admin/snippets/navbar.html:20 +#: templates/uds/admin/snippets/navbar.html:21 msgid "Connectivity" msgstr "Conectividade" -#: templates/uds/admin/snippets/navbar.html:21 +#: templates/uds/admin/snippets/navbar.html:22 msgid "Deployed services" msgstr "Serviços implantados" -#: templates/uds/admin/snippets/navbar.html:25 +#: templates/uds/admin/snippets/navbar.html:26 msgid "Configuration" msgstr "Configuração" -#: templates/uds/admin/snippets/navbar.html:57 +#: templates/uds/admin/snippets/navbar.html:56 msgid "Exit dashboard" msgstr "Painel de saída" -#: templates/uds/admin/snippets/navbar.html:58 +#: templates/uds/admin/snippets/navbar.html:57 #: templates/uds/html5/snippets/navbar.html:47 msgid "logout" msgstr "logout" +#: templates/uds/admin/tmpl/authenticators.html:4 +msgid "administration of authenticators" +msgstr "Administração de autenticadores" + +#: templates/uds/admin/tmpl/dashboard.html:4 +msgid "overview" +msgstr "Visão geral" + #: templates/uds/html5/detectJava.html:4 msgid "Login redirection to UDS" msgstr "Redirecionamento de login para UDS" @@ -1241,7 +1298,7 @@ msgstr "Sobre" msgid "Dashboard" msgstr "Painel de controle" -#: templates/uds/html5/templates/base.html:51 +#: templates/uds/html5/templates/base.html:52 msgid "" "Your browser is supported only partially. Please, upgrade it to a modern " "html5 browser like Firefox, Chrome, Opera, ... (IE must be 10 or better)" @@ -1279,27 +1336,27 @@ msgstr "" "accesible de usuários" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "Empty creds" msgstr "Creds vazio" #: transports/HTML5RDP/HTML5RDP.py:63 transports/NX/NXTransport.py:60 -#: transports/RDP/RDPTransport.py:58 transports/RDP/TSRDPTransport.py:62 -#: transports/TSNX/TSNXTransport.py:65 +#: transports/NX/TSNXTransport.py:65 transports/RDP/RDPTransport.py:58 +#: transports/RDP/TSRDPTransport.py:62 transports/TSNX/TSNXTransport.py:65 msgid "If checked, the credentials used to connect will be emtpy" msgstr "Se marcada, as credenciais usadas para se conectar será vazio" #: transports/HTML5RDP/HTML5RDP.py:64 transports/NX/NXTransport.py:61 -#: transports/RDP/RDPTransport.py:59 transports/RDP/TSRDPTransport.py:63 -#: transports/TSNX/TSNXTransport.py:66 +#: transports/NX/TSNXTransport.py:66 transports/RDP/RDPTransport.py:59 +#: transports/RDP/TSRDPTransport.py:63 transports/TSNX/TSNXTransport.py:66 msgid "If not empty, this username will be always used as credential" msgstr "" "Se não for vazio, este nome de utilizador será sempre usado como credencial" #: transports/HTML5RDP/HTML5RDP.py:65 transports/NX/NXTransport.py:62 -#: transports/RDP/RDPTransport.py:60 transports/RDP/TSRDPTransport.py:64 -#: transports/TSNX/TSNXTransport.py:67 +#: transports/NX/TSNXTransport.py:67 transports/RDP/RDPTransport.py:60 +#: transports/RDP/TSRDPTransport.py:64 transports/TSNX/TSNXTransport.py:67 msgid "If not empty, this password will be always used as credential" msgstr "Se não for vazio, essa senha será sempre usada como credencial" @@ -1352,46 +1409,97 @@ msgstr "Transporte NX (direto)" msgid "NX Transport for direct connection" msgstr "Transporte de NX para conexão direta" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listen port" msgstr "Porta" -#: transports/NX/NXTransport.py:63 transports/TSNX/TSNXTransport.py:68 +#: transports/NX/NXTransport.py:63 transports/NX/TSNXTransport.py:68 +#: transports/TSNX/TSNXTransport.py:68 msgid "Listening port of NX (ssh) at client machine" msgstr "Ouvindo a porta do NX (ssh) na máquina cliente" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection" msgstr "Conexão" -#: transports/NX/NXTransport.py:64 transports/TSNX/TSNXTransport.py:69 +#: transports/NX/NXTransport.py:64 transports/NX/TSNXTransport.py:69 +#: transports/TSNX/TSNXTransport.py:69 msgid "Connection speed for this transport (quality)" msgstr "Velocidade de conexão para esse transporte (qualidade)" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Session" msgstr "Sessão" -#: transports/NX/NXTransport.py:71 transports/TSNX/TSNXTransport.py:76 +#: transports/NX/NXTransport.py:71 transports/NX/TSNXTransport.py:76 +#: transports/TSNX/TSNXTransport.py:76 msgid "Desktop session" msgstr "Sessão de desktop" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Disk Cache" msgstr "Cache de disco" -#: transports/NX/NXTransport.py:76 transports/TSNX/TSNXTransport.py:81 +#: transports/NX/NXTransport.py:76 transports/NX/TSNXTransport.py:81 +#: transports/TSNX/TSNXTransport.py:81 msgid "Cache size en Mb stored at disk" msgstr "Pt-br tamanho que MB armazenado no disco em cache" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Memory Cache" msgstr "Memória Cache" -#: transports/NX/NXTransport.py:84 transports/TSNX/TSNXTransport.py:89 +#: transports/NX/NXTransport.py:84 transports/NX/TSNXTransport.py:89 +#: transports/TSNX/TSNXTransport.py:89 msgid "Cache size en Mb keept at memory" msgstr "Cache tamanho en Mb keept na memória" +#: transports/NX/TSNXTransport.py:55 transports/TSNX/TSNXTransport.py:55 +msgid "NX Transport (tunneled)" +msgstr "Transporte NX (um túnel)" + +#: transports/NX/TSNXTransport.py:57 transports/TSNX/TSNXTransport.py:57 +msgid "NX Transport for tunneled connection" +msgstr "Transporte de NX para ligação em túnel" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "Tunnel server" +msgstr "Servidor de túnel" + +#: transports/NX/TSNXTransport.py:62 transports/RDP/TSRDPTransport.py:59 +#: transports/TSNX/TSNXTransport.py:62 +msgid "" +"IP or Hostname of tunnel server send to client device (\"public\" ip) and " +"port. (use HOST:PORT format)" +msgstr "" +"IP ou nome do host do servidor de túnel enviar para dispositivo cliente (ip " +"\"público\") e Port. (usar formato HOST: PORT)" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "Tunnel host check" +msgstr "Seleção de anfitrião do túnel" + +#: transports/NX/TSNXTransport.py:63 transports/RDP/TSRDPTransport.py:60 +#: transports/TSNX/TSNXTransport.py:63 +msgid "" +"If not empty, this server will be used to check if service is running before " +"assigning it to user. (use HOST:PORT format)" +msgstr "" +"Se não for vazio, este servidor será usado para verificar se o serviço está " +"sendo executado antes atribuí-la ao usuário. (usar formato HOST: PORT)" + +#: transports/NX/TSNXTransport.py:103 transports/RDP/TSRDPTransport.py:75 +#: transports/TSNX/TSNXTransport.py:103 +msgid "Must use HOST:PORT in Tunnel Server Field" +msgstr "Deve usar HOST: PORT no campo servidor de túnel" + #: transports/NX/__init__.py:45 transports/TSNX/__init__.py:44 msgid "NX Protocol" msgstr "Protocolo NX" @@ -1481,34 +1589,6 @@ msgstr "Transporte de RDP (um túnel)" msgid "RDP Transport for tunneled connection" msgstr "Transporte de RDP para ligação em túnel" -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "Tunnel server" -msgstr "Servidor de túnel" - -#: transports/RDP/TSRDPTransport.py:59 transports/TSNX/TSNXTransport.py:62 -msgid "" -"IP or Hostname of tunnel server send to client device (\"public\" ip) and " -"port. (use HOST:PORT format)" -msgstr "" -"IP ou nome do host do servidor de túnel enviar para dispositivo cliente (ip " -"\"público\") e Port. (usar formato HOST: PORT)" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "Tunnel host check" -msgstr "Seleção de anfitrião do túnel" - -#: transports/RDP/TSRDPTransport.py:60 transports/TSNX/TSNXTransport.py:63 -msgid "" -"If not empty, this server will be used to check if service is running before " -"assigning it to user. (use HOST:PORT format)" -msgstr "" -"Se não for vazio, este servidor será usado para verificar se o serviço está " -"sendo executado antes atribuí-la ao usuário. (usar formato HOST: PORT)" - -#: transports/RDP/TSRDPTransport.py:75 transports/TSNX/TSNXTransport.py:103 -msgid "Must use HOST:PORT in Tunnel Server Field" -msgstr "Deve usar HOST: PORT no campo servidor de túnel" - #: transports/RDP/__init__.py:39 msgid "Remote Desktop Protocol" msgstr "Protocolo de área de trabalho remoto" @@ -1525,14 +1605,6 @@ msgstr "Você pode obtê-lo de" msgid "CoRD Website" msgstr "Site medula" -#: transports/TSNX/TSNXTransport.py:55 -msgid "NX Transport (tunneled)" -msgstr "Transporte NX (um túnel)" - -#: transports/TSNX/TSNXTransport.py:57 -msgid "NX Transport for tunneled connection" -msgstr "Transporte de NX para ligação em túnel" - #: web/errors.py:60 msgid "Unknown error" msgstr "Erro desconhecido" @@ -1595,6 +1667,10 @@ msgstr "" msgid "Authenticator do not provides information" msgstr "Autenticador que não fornece informações" +#: web/forms/LoginForm.py:50 +msgid "Select authenticator" +msgstr "Selecione o autenticador" + #: web/forms/LoginForm.py:54 msgid "authenticator" msgstr "autenticador" diff --git a/server/src/uds/locale/pt/LC_MESSAGES/djangojs.mo b/server/src/uds/locale/pt/LC_MESSAGES/djangojs.mo index 7045ed5e701ed6dac00a0469b8ffb7ff9de6edfe..d0f64af2e192436ee0c4c22b53ab07861b30d98c 100644 GIT binary patch literal 2049 zcmZ9MO>7%Q6vwAfpqS5w@9!xs&=0oQDHWC5pe*sGq}*IP zAvkbA>VX3v2h<*-O6>(s&>Q7|PvwS$KmrLNfjGd40~|Q&e;Va z*(-qefm0yK4}<%`WBK=$T;2h1hI{~${{|%c@8sXlfn@Ikko3-jWcLzy7I*d~_$1bc zv5EX#1Zn>YhTFi`z+1o&Bs=TiJ>c6Qe(WO*wC@5)_Alo0PeJngbCC951u4#JAnAXb zfByj_yT5?6{|^u@vA;k%{~wU-?19o0xEG}L0g(1N814m+=khA}6xK^1?SB)*kDbFn z``!od2hZp7DDnQj!v;Wh)%JSoyXD1 zPihqZBj|YYEY`chN6~Rq*65ud$meut^j>$Nli$?H-~TsUQ`YXlNbhq1{h>@Ut`Uwo zmByXubPw!cPlZ+*8StLbL*DV-mpj~QD?)B$SDPR?#N61Zkhy6;O)Q(!Q6#%ottq>~ zDzYnwtI}W+N-Kdl)Eh9CNVBH8GGShzEc1pjl;`EDNrk~AI}$LkH*ZuRHrN>vW#7)E zAr@&QSykYxFHCoUafA6fBE6bix2&co&SAPX_MqOinmlQQQY4bUA(VZZ$40}6L`8kp zFmg@lG-1tgSiI9}yUjKQ%R64J(&4(tJMDVgt#+W(Gcp;lmawUzV_Pz|<8xZ$$aur( zH5EvcuvVIR)*hrLA>DQ=Gp@)W8qYeuS6k{#eCDw-b4u1Irai}kXz=hMpTu}a#jBKL>2AXPMkS#|ahgJ;*l>!bT1z*5yOZF-6^6d>X z`fQ!FYNLyq4@O%%A?785gX^hH;XiZndM1$D}6`|S`qsusywMJX3h#rnnrDSo+gzf{CM0cM3CD2u|iXP$(HCs#-E-a6rEfL;i Yu?PpZzx>CYaUG!`cs$zbt4Oea0jN#aH~;_u delta 886 zcmYk3&ubGw6vwA#+g00WEdB_#O@{`Qh)RN0u;|Gs2qpxA;HhQ0J55H@opfe4P4E!J zvj|beX?iMbt((tZmNp?pW>)1VkQkQ)c?b<48@hu%k zA-}|}HfF#Y9Vx8jyF$5(Nx{o!rRqV2HKi~?JK6D0mfCuk?v=UID0&Me6=TixY|{*d#BO3R)CLydaAGhNp-hG|`SrfqRA%2& zC?V8R))@_78ooxaTPhN)Vbr!%Mzhh&j#JyTG1}|XqAo%Khl\n" "Language-Team: LANGUAGE \n" @@ -18,70 +18,146 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: static/adm/js/api.js:23 -msgid "Success on \"" -msgstr "Sucesso na\"" - -#: static/adm/js/api.js:24 -msgid "Received " -msgstr "Recebido " - -#: static/adm/js/gui.js:17 -msgid "Display _MENU_ records per page" -msgstr "Exibir _MENU_ de registros por página" - -#: static/adm/js/gui.js:18 -msgid "Nothing found - sorry" -msgstr "Nada foi encontrado - Desculpe" - -#: static/adm/js/gui.js:19 -msgid "Showing record _START_ to _END_ of _TOTAL_" -msgstr "Mostrando registro _START_ para _END_ de _TOTAL_" - -#: static/adm/js/gui.js:20 -msgid "Showing 0 to 0 of 0 records" -msgstr "Mostrando 0 a 0 de 0 registros" - -#: static/adm/js/gui.js:21 -msgid "(filtered from _MAX_ total records)" -msgstr "(filtrada de registros total de _MAX_)" - -#: static/adm/js/gui.js:22 -msgid "Please wait, processing" -msgstr "Aguarde, processamento" - -#: static/adm/js/gui.js:23 -msgid "Search" -msgstr "Pesquisa" - -#: static/adm/js/gui.js:26 -msgid "First" -msgstr "Primeiro" - -#: static/adm/js/gui.js:27 -msgid "Last" -msgstr "Última" - -#: static/adm/js/gui.js:28 -msgid "Next" -msgstr "Próxima" - -#: static/adm/js/gui.js:29 -msgid "Previous" -msgstr "Anterior" - -#: static/adm/js/gui.js:83 -msgid "Connectivity" -msgstr "Conectividade" - -#: static/adm/js/gui.js:88 -msgid "Deployed services" -msgstr "Serviços implantados" - -#: static/adm/js/gui.js:181 +#: static/adm/js/gui-elements.js:7 msgid "Service Providers" msgstr "Prestadores de serviços" -#: static/adm/js/gui.js:191 -msgid "Authenticators" -msgstr "Autenticadores" +#: static/adm/js/gui-elements.js:81 +msgid "Connectivity" +msgstr "Conectividade" + +#: static/adm/js/gui.js:18 +msgid "_MENU_ records per page" +msgstr "Registros _MENU_ por página" + +#: static/adm/js/gui.js:19 +msgid "Empty" +msgstr "Vazio" + +#: static/adm/js/gui.js:20 +msgid "Records _START_ to _END_ of _TOTAL_" +msgstr "Registros _START_ para _END_ de _TOTAL_" + +#: static/adm/js/gui.js:21 +msgid "No records" +msgstr "Não há registros" + +#: static/adm/js/gui.js:22 +msgid "(filtered from _MAX_ total records)" +msgstr "(filtrada de registros total de _MAX_)" + +#: static/adm/js/gui.js:23 +msgid "Please wait, processing" +msgstr "Aguarde, processamento" + +#: static/adm/js/gui.js:24 +msgid "Filter" +msgstr "Filtro" + +#: static/adm/js/gui.js:27 +msgid "First" +msgstr "Primeiro" + +#: static/adm/js/gui.js:28 +msgid "Last" +msgstr "Última" + +#: static/adm/js/gui.js:29 +msgid "Next" +msgstr "Próxima" + +#: static/adm/js/gui.js:30 +msgid "Previous" +msgstr "Anterior" + +#: static/adm/js/gui.js:80 +msgid "Deployed services" +msgstr "Serviços implantados" + +#: static/adm/js/gui.js:349 +msgid "Edit" +msgstr "Editar" + +#: static/adm/js/gui.js:358 +msgid "Delete" +msgstr "Excluir" + +#: static/adm/js/gui.js:367 +msgid "Refresh" +msgstr "Atualização" + +#: static/adm/js/strftime.js:30 +msgid "Sunday" +msgstr "Domingo" + +#: static/adm/js/strftime.js:30 +msgid "Monday" +msgstr "Segunda-feira" + +#: static/adm/js/strftime.js:30 +msgid "Tuesday" +msgstr "Terça-feira" + +#: static/adm/js/strftime.js:31 +msgid "Wednesday" +msgstr "Quarta-feira" + +#: static/adm/js/strftime.js:31 +msgid "Thursday" +msgstr "Quinta-feira" + +#: static/adm/js/strftime.js:31 +msgid "Friday" +msgstr "Sexta-feira" + +#: static/adm/js/strftime.js:31 +msgid "Saturday" +msgstr "Sábado" + +#: static/adm/js/strftime.js:32 +msgid "January" +msgstr "Janeiro de" + +#: static/adm/js/strftime.js:32 +msgid "February" +msgstr "Fevereiro" + +#: static/adm/js/strftime.js:32 +msgid "March" +msgstr "Março de" + +#: static/adm/js/strftime.js:33 +msgid "April" +msgstr "Abril" + +#: static/adm/js/strftime.js:33 +msgid "May" +msgstr "Maio" + +#: static/adm/js/strftime.js:33 +msgid "June" +msgstr "Junho de" + +#: static/adm/js/strftime.js:33 +msgid "July" +msgstr "Julho" + +#: static/adm/js/strftime.js:34 +msgid "August" +msgstr "Agosto" + +#: static/adm/js/strftime.js:34 +msgid "September" +msgstr "Setembro" + +#: static/adm/js/strftime.js:34 +msgid "October" +msgstr "Outubro" + +#: static/adm/js/strftime.js:34 +msgid "November" +msgstr "Novembro" + +#: static/adm/js/strftime.js:35 +msgid "December" +msgstr "Dezembro de" diff --git a/server/src/uds/static/adm/js/api.js b/server/src/uds/static/adm/js/api.js index 83ed6e2b0..11e0f9df7 100644 --- a/server/src/uds/static/adm/js/api.js +++ b/server/src/uds/static/adm/js/api.js @@ -1,140 +1,138 @@ (function(api, $, undefined) { - - // "public" methods - api.doLog = function(data) { - if( api.debug ) { - try { - console.log(data); - } catch (e) { - // nothing can be logged - } - - } - } - - api.getJson = function (path, success_fnc) { - url = api.url_for(path) - api.doLog('Ajax GET Json for "' + url + '"'); - $.ajax({ - url: url, - type: "GET", - dataType: "json", - success: function(data) { - api.doLog('Success on "' + url + '".'); - api.doLog('Received ' + JSON.stringify(data)); - if( success_fnc != undefined ){ - api.doLog('Executing success method') - success_fnc(data); - } - }, - beforeSend: function (request) { - request.setRequestHeader(api.auth_header, api.token); - }, - }); - }; - - // Public attributes - api.debug = false; + + // "public" methods + api.doLog = function(data) { + if (api.debug) { + try { + console.log(data); + } catch (e) { + // nothing can be logged + } + + } + }; + + api.getJson = function(path, success_fnc) { + url = api.url_for(path); + api.doLog('Ajax GET Json for "' + url + '"'); + $.ajax({ + url : url, + type : "GET", + dataType : "json", + success : function(data) { + api.doLog('Success on "' + url + '".'); + api.doLog('Received ' + JSON.stringify(data)); + if (success_fnc !== undefined) { + api.doLog('Executing success method'); + success_fnc(data); + } + }, + beforeSend : function(request) { + request.setRequestHeader(api.auth_header, api.token); + }, + }); + }; + + // Public attributes + api.debug = false; }(window.api = window.api || {}, jQuery)); - // Great part of UDS REST api provides same methods. -// We will take advantage of this and save a lot of nonsense, prone to failure code :-) +// We will take advantage of this and save a lot of nonsense, prone to failure +// code :-) function BasicModelRest(path) { - this.path = path || ""; - this.cached_types = undefined; - this.cached_tableInfo = undefined; + this.path = path || ""; + this.cached_types = undefined; + this.cached_tableInfo = undefined; } BasicModelRest.prototype = { - get: function(options, alternate_url) { - if( options == undefined ){ - options = {}; - } - var path = alternate_url || this.path; - if( options.id != undefined ) - path += '/' + options.id; - api.getJson(path, options.success); - }, - types: function(success_fnc, alternate_url) { - // Cache types locally, will not change unless new broker version - if( this.cached_types ) { - if( success_fnc ) { - success_fnc(this.cached_types); - } - } - else { - var $this = this; - var path = this.path + '/types'; - if( alternate_url != undefined ) - path = alternate_url; - api.getJson( path, function(data) { - $this.cached_types = data; - if( success_fnc ) { - success_fnc($this.cached_types); - } - }); - } - }, - - tableInfo: function(success_fnc, alternate_url) { - // Cache types locally, will not change unless new broker version - if( this.cached_tableInfo ) { - if( success_fnc ) { - success_fnc(this.cached_tableInfo); - } - return; - } - var $this = this; - var path = this.path + '/tableinfo'; - if( alternate_url != undefined ) - path = alternate_url; - - api.getJson( path, function(data) { - $this.cached_tableInfo = data; - if( success_fnc ) { - success_fnc($this.cached_tableInfo); - } - }); - - }, + get : function(options, alternate_url) { + if (options === undefined) { + options = {}; + } + var path = alternate_url || this.path; + if (options.id !== undefined) + path += '/' + options.id; + api.getJson(path, options.success); + }, + types : function(success_fnc, alternate_url) { + // Cache types locally, will not change unless new broker version + if (this.cached_types) { + if (success_fnc) { + success_fnc(this.cached_types); + } + } else { + var $this = this; + var path = this.path + '/types'; + if (alternate_url !== undefined) + path = alternate_url; + api.getJson(path, function(data) { + $this.cached_types = data; + if (success_fnc) { + success_fnc($this.cached_types); + } + }); + } + }, + + tableInfo : function(success_fnc, alternate_url) { + // Cache types locally, will not change unless new broker version + if (this.cached_tableInfo) { + if (success_fnc) { + success_fnc(this.cached_tableInfo); + } + return; + } + var $this = this; + var path = this.path + '/tableinfo'; + if (alternate_url !== undefined) + path = alternate_url; + + api.getJson(path, function(data) { + $this.cached_tableInfo = data; + if (success_fnc) { + success_fnc($this.cached_tableInfo); + } + }); + + }, }; // For REST of type /auth/[id]/users, /services/[id]/users, ... function DetailModelRestApi(parentApi, path) { - this.parentPath = parentApi.path; - this.path = path; + this.parentPath = parentApi.path; + this.path = path; } DetailModelRestApi.prototype = { - // Generates a basic model with fixed methods for "detail" models - detail: function(parentId) { - var $this = this; - var rest = new BasicModelRest(this.parentPath + '/' + parentId + '/' + this.path); - - // Overwrite types, detail do not have types - rest.types = function() { - return []; // No types at all - } - - // And overwrite tableInfo - var parentTableInfo = rest.tableInfo; - rest.tableInfo = function(success_fnc, alternate_url) { - if( alternate_url == undefined ) - alternate_url = $this.parentPath + '/tableinfo/' + parentId + '/' + $this.path; - parentTableInfo( success_fnc, alternate_url ) - } - return rest; - } -}; + // Generates a basic model with fixed methods for "detail" models + detail : function(parentId) { + var $this = this; + var rest = new BasicModelRest(this.parentPath + '/' + parentId + '/' + this.path); + // Overwrite types, detail do not have types + rest.types = function() { + return []; // No types at all + }; + + // And overwrite tableInfo + var parentTableInfo = rest.tableInfo; + rest.tableInfo = function(success_fnc, alternate_url) { + if (alternate_url === undefined) + alternate_url = $this.parentPath + '/tableinfo/' + parentId + '/' + $this.path; + parentTableInfo(success_fnc, alternate_url); + }; + return rest; + } +}; // Populate api api.providers = new BasicModelRest('providers'); -//api.services = new BasicModelRest('services'); +// api.services = new BasicModelRest('services'); api.authenticators = new BasicModelRest('authenticators'); api.authenticators.users = new DetailModelRestApi(api.authenticators, 'users'); @@ -142,64 +140,69 @@ api.osmanagers = new BasicModelRest('osmanagers'); api.transports = new BasicModelRest('transports'); api.networks = new BasicModelRest('networks'); +// Locale related +api.locale = new BasicModelRest('locale'); +api.locale.tableInfo = api.locale.types = undefined; // ------------------------------- // Templates related -// This is not part of REST api provided by UDS, but it's part of the api needed for the admin app +// This is not part of REST api provided by UDS, but it's part of the api needed +// for the admin app // ------------------------------- -(function(templates, $){ - templates.cache = {}; // Will cache templates locally. If name contains '?', data will not be cached and always re-requested - templates.get = function(name, success_fnc) { - if( !name.contains('?') ) { - if( templates.cache[name] != undefined ) { - if( success_fnc != undefined ) { - success_fnc(templates.cache[name]); - } - return; - } - } - $.ajax({ - url: '/adm/tmpl/' + name, - type: "GET", - dataType: "text", - success: function(data) { - templates.cache[name] = data; - api.doLog('Success getting template "' + name + '".'); - api.doLog('Received: ' + data); - if( success_fnc != undefined ){ - api.doLog('Executing success method') - success_fnc(data); - } - }, - }); - }; - - // Simple JavaScript Templating - // Based on John Resig - http://ejohn.org/ - MIT Licensed - templates.eval = function tmpl(str, data){ - // Figure out if we're getting a template, or if we need to - // load the template - and be sure to cache the result. - var fn = - // Generate a reusable function that will serve as a template - // generator (and which will be cached). - new Function("obj", - "var p=[],print=function(){p.push.apply(p,arguments);};" + - - // Introduce the data as local variables using with(){} - "with(obj){p.push('" + - - // Convert the template into pure JavaScript - str - .replace(/[\r\t\n]/g, " ") - .split("<%").join("\t") - .replace(/((^|%>)[^\t]*)'/g, "$1\r") - .replace(/\t=(.*?)%>/g, "',$1,'") - .split("\t").join("');") - .split("%>").join("p.push('") - .split("\r").join("\\'") - + "');}return p.join('');"); - - // Provide some basic currying to the user - return data ? fn( data ) : fn; - }; +(function(templates, $) { + templates.cache = {}; // Will cache templates locally. If name contains + // '?', data will not be cached and always + // re-requested + templates.get = function(name, success_fnc) { + api.doLog('Getting tempkate ' + name); + if (name.indexOf('?') != -1) { + if (templates.cache[name] !== undefined) { + if (success_fnc !== undefined) { + success_fnc(templates.cache[name]); + } + return; + } + } + $.ajax({ + url : '/adm/tmpl/' + name, + type : "GET", + dataType : "text", + success : function(data) { + templates.cache[name] = data; + api.doLog('Success getting template "' + name + '".'); + api.doLog('Received: ' + data); + if (success_fnc !== undefined) { + api.doLog('Executing success method'); + success_fnc(data); + } + }, + fail: function( jqXHR, textStatus, errorThrown ) { + api.doLog(jqXHR); + api.doLog(textStatus); + apid.doLog(errorThrown); + }, + }); + }; + + // Simple JavaScript Templating + // Based on John Resig - http://ejohn.org/ - MIT Licensed + templates.evaluate = function tmpl(str, data) { + // Figure out if we're getting a template, or if we need to + // load the template - and be sure to cache the result. + var fn = + // Generate a reusable function that will serve as a template + // generator (and which will be cached). + new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" + + + // Introduce the data as local variables using with(){} + "with(obj){p.push('" + + + // Convert the template into pure JavaScript + str.replace(/[\r\t\n]/g, " ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g, "$1\r").replace( + /\t=(.*?)%>/g, "',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join( + "\\'") + "');}return p.join('');"); + + // Provide some basic currying to the user + return data ? fn(data) : fn; + }; }(api.templates = api.templates || {}, jQuery)); diff --git a/server/src/uds/static/adm/js/gui-elements.js b/server/src/uds/static/adm/js/gui-elements.js index 0916e2eb8..dfdc4d8b9 100644 --- a/server/src/uds/static/adm/js/gui-elements.js +++ b/server/src/uds/static/adm/js/gui-elements.js @@ -1,22 +1,22 @@ // Compose gui elements // Service providers -gui.providers = new GuiElement(api.providers, 'provi'); +gui.providers = new GuiElement(api.providers, 'provi'); gui.providers.link = function(event) { - gui.clearWorkspace(); - gui.appendToWorkspace(gui.breadcrumbs(gettext('Service Providers'))); - - var tableId = gui.providers.table({ - rowSelect: 'multi', - rowSelectFnc: function(nodes){ - gui.doLog(nodes); - gui.doLog(this); - gui.doLog(this.fnGetSelectedData()); - }, - buttons: ['edit', 'refresh', 'delete'], - }); - - return false; + gui.clearWorkspace(); + gui.appendToWorkspace(gui.breadcrumbs(gettext('Service Providers'))); + + var tableId = gui.providers.table({ + rowSelect : 'multi', + rowSelectFnc : function(nodes) { + gui.doLog(nodes); + gui.doLog(this); + gui.doLog(this.fnGetSelectedData()); + }, + buttons : [ 'edit', 'refresh', 'delete' ], + }); + + return false; }; // --------------.. @@ -25,63 +25,71 @@ gui.providers.link = function(event) { gui.authenticators = new GuiElement(api.authenticators, 'auth'); gui.authenticators.link = function(event) { - api.templates.get('authenticators', function(tmpl){ - gui.clearWorkspace(); - gui.appendToWorkspace(api.templates.eval(tmpl, { auths: 'auths-placeholder', users: 'users-placeholder' })); - gui.setLinksEvents(); - - gui.authenticators.table({ - container: 'auths-placeholder', - rowSelect: 'single', - buttons: ['edit', 'refresh', 'delete'], - rowSelectFnc: function(nodes){ - var id = this.fnGetSelectedData()[0].id; - var user = new GuiElement(api.authenticators.users.detail(id), 'users'); - user.table({ - container: 'users-placeholder', - rowSelect: 'multi', - buttons: ['edit', 'refresh', 'delete'], - scroll: true, - }); - return false; - }, - }); - }); - - return false; + gui.doLog('enter auths'); + api.templates.get('authenticators', function(tmpl) { + gui.clearWorkspace(); + gui.appendToWorkspace(api.templates.evaluate(tmpl, { + auths : 'auths-placeholder', + users : 'users-placeholder' + })); + gui.setLinksEvents(); + + gui.authenticators.table({ + container : 'auths-placeholder', + rowSelect : 'single', + buttons : [ 'edit', 'refresh', 'delete' ], + onRowSelect : function(nodes) { + var id = this.fnGetSelectedData()[0].id; + var user = new GuiElement(api.authenticators.users.detail(id), 'users'); + user.table({ + container : 'users-placeholder', + rowSelect : 'multi', + buttons : [ 'edit', 'refresh', 'delete' ], + scroll : true, + }); + return false; + }, + onRefresh : function() { + $('#users-placeholder').empty(); // Remove detail on parent refresh + }, + }); + }); + + return false; }; gui.osmanagers = new GuiElement(api.osmanagers, 'osm'); gui.osmanagers.link = function(event) { - gui.clearWorkspace(); - gui.appendToWorkspace(gui.breadcrumbs('Os Managers')); - - gui.osmanagers.table({ - rowSelect: 'single', - buttons: ['edit', 'refresh', 'delete'], - }); - - return false; + gui.clearWorkspace(); + gui.appendToWorkspace(gui.breadcrumbs('Os Managers')); + + gui.osmanagers.table({ + rowSelect : 'single', + buttons : [ 'edit', 'refresh', 'delete' ], + }); + + return false; }; gui.connectivity = { - transports: new GuiElement(api.transports, 'trans'), - networks: new GuiElement(api.networks, 'nets'), + transports : new GuiElement(api.transports, 'trans'), + networks : new GuiElement(api.networks, 'nets'), }; gui.connectivity.link = function(event) { - gui.clearWorkspace(); - gui.appendToWorkspace(gui.breadcrumbs(gettext('Connectivity'))); - gui.appendToWorkspace('
'); - - gui.connectivity.transports.table({ - rowSelect: 'multi', - container: 'ttbl', - buttons: ['edit', 'refresh', 'delete', 'pdf'], - }); - gui.connectivity.networks.table({ - rowSelect: 'single', - container: 'ntbl', - buttons: ['edit', 'refresh', 'delete'], - }); -} + gui.clearWorkspace(); + gui.appendToWorkspace(gui.breadcrumbs(gettext('Connectivity'))); + gui + .appendToWorkspace('
'); + + gui.connectivity.transports.table({ + rowSelect : 'multi', + container : 'ttbl', + buttons : [ 'edit', 'refresh', 'delete', 'pdf' ], + }); + gui.connectivity.networks.table({ + rowSelect : 'multi', + container : 'ntbl', + buttons : [ 'edit', 'refresh', 'delete' ], + }); +}; diff --git a/server/src/uds/static/adm/js/gui.js b/server/src/uds/static/adm/js/gui.js index ce7d672c0..bf5fba8b4 100644 --- a/server/src/uds/static/adm/js/gui.js +++ b/server/src/uds/static/adm/js/gui.js @@ -1,342 +1,430 @@ +/* jshint strict: true */ (function(gui, $, undefined) { - - // "public" methods - gui.doLog = function(data) { - if( gui.debug ) { - try { - console.log(data); - } catch (e) { - // nothing can be logged - } - - } - } - - // Several convenience "constants" - gui.dataTablesLanguage = { - "sLengthMenu": gettext("_MENU_ records per page"), - "sZeroRecords": gettext("Empty"), - "sInfo": gettext("Records _START_ to _END_ of _TOTAL_"), - "sInfoEmpty": gettext("No records"), - "sInfoFiltered": gettext("(filtered from _MAX_ total records)"), - "sProcessing": gettext("Please wait, processing"), - "sSearch": gettext("Filter"), - "sInfoThousands": django.formats.THOUSAND_SEPARATOR, - "oPaginate": { - "sFirst": gettext("First"), - "sLast": gettext("Last"), - "sNext": gettext("Next"), - "sPrevious": gettext("Previous"), - } - }; + "use strict"; + // "public" methods + gui.doLog = function(data) { + if (gui.debug) { + try { + console.log(data); + } catch (e) { + // nothing can be logged + } - gui.table = function(title, table_id, options) { - if( options == undefined ) - options = { 'size': 12, 'icon': 'table'}; - if( options.size == undefined ) - options.size = 12; - if( options.icon == undefined ) - options.icon = 'table'; - - return '
'+ - '

' + title + '

'+ - '
'; - } - - gui.breadcrumbs = function(path) { - var items = path.split('/'); - var active = items.pop(); - var list = ''; - $.each(items, function(index, value){ - list += '
  • ' + value + '
  • '; - }); - list += '
  • ' + active + '
  • '; - - return '
    "; - - } - - gui.clearWorkspace = function() { - $('#page-wrapper').empty(); - }; + } + }; - gui.appendToWorkspace = function(data) { - $(data).appendTo('#page-wrapper'); - }; + // Several convenience "constants" + gui.dataTablesLanguage = { + "sLengthMenu" : gettext("_MENU_ records per page"), + "sZeroRecords" : gettext("Empty"), + "sInfo" : gettext("Records _START_ to _END_ of _TOTAL_"), + "sInfoEmpty" : gettext("No records"), + "sInfoFiltered" : gettext("(filtered from _MAX_ total records)"), + "sProcessing" : gettext("Please wait, processing"), + "sSearch" : gettext("Filter"), + "sInfoThousands" : django.formats.THOUSAND_SEPARATOR, + "oPaginate" : { + "sFirst" : gettext("First"), + "sLast" : gettext("Last"), + "sNext" : gettext("Next"), + "sPrevious" : gettext("Previous"), + } + }; - - // Links methods - gui.dashboard = function() { - gui.clearWorkspace(); - gui.appendToWorkspace(gui.breadcrumbs('Dasboard')); - gui.doLog(this); - }; - - gui.deployed_services = function() { - gui.clearWorkspace(); - gui.appendToWorkspace(gui.breadcrumbs(gettext('Deployed services'))); - } - - gui.setLinksEvents = function() { - var sidebarLinks = [ - { id: 'lnk-dashboard', exec: gui.dashboard }, - { id: 'lnk-service_providers', exec: gui.providers.link }, - { id: 'lnk-authenticators', exec: gui.authenticators.link }, - { id: 'lnk-osmanagers', exec: gui.osmanagers.link }, - { id: 'lnk-connectivity', exec: gui.connectivity.link }, - { id: 'lnk-deployed_services', exec: gui.deployed_services }, - ]; - $.each(sidebarLinks, function(index, value){ - gui.doLog('Adding ' + value.id) - $('.'+value.id).unbind('click').click(function(event) { - if($('.navbar-toggle').css('display') !='none') { - $(".navbar-toggle").trigger( "click" ); + gui.table = function(title, table_id, options) { + if (options === undefined) + options = { + 'size' : 12, + 'icon' : 'table' + }; + if (options.size === undefined) + options.size = 12; + if (options.icon === undefined) + options.icon = 'table'; + + return '
    ' + + '

    ' + title + '

    ' + + '
    '; + }; + + gui.breadcrumbs = function(path) { + var items = path.split('/'); + var active = items.pop(); + var list = ''; + $.each(items, function(index, value) { + list += '
  • ' + value + '
  • '; + }); + list += '
  • ' + active + '
  • '; + + return '
    "; + }; + + gui.clearWorkspace = function() { + $('#page-wrapper').empty(); + }; + + gui.appendToWorkspace = function(data) { + $(data).appendTo('#page-wrapper'); + }; + + // Links methods + gui.dashboard = function() { + gui.clearWorkspace(); + gui.appendToWorkspace(gui.breadcrumbs('Dasboard')); + gui.doLog(this); + }; + + gui.deployed_services = function() { + gui.clearWorkspace(); + gui.appendToWorkspace(gui.breadcrumbs(gettext('Deployed services'))); + }; + + gui.setLinksEvents = function() { + var sidebarLinks = [ { + id : 'lnk-dashboard', + exec : gui.dashboard + }, { + id : 'lnk-service_providers', + exec : gui.providers.link + }, { + id : 'lnk-authenticators', + exec : gui.authenticators.link + }, { + id : 'lnk-osmanagers', + exec : gui.osmanagers.link + }, { + id : 'lnk-connectivity', + exec : gui.connectivity.link + }, { + id : 'lnk-deployed_services', + exec : gui.deployed_services + }, ]; + $.each(sidebarLinks, function(index, value) { + gui.doLog('Adding ' + value.id); + $('.' + value.id).unbind('click').click(function(event) { + if ($('.navbar-toggle').css('display') != 'none') { + $(".navbar-toggle").trigger("click"); } $('html, body').scrollTop(0); value.exec(event); - }); - }); - } - - - gui.init = function() { - gui.setLinksEvents(); - }; - - // Public attributes - gui.debug = true; + }); + }); + }; + + gui.init = function() { + gui.setLinksEvents(); + }; + + // Public attributes + gui.debug = true; }(window.gui = window.gui || {}, jQuery)); function GuiElement(restItem, name) { - this.rest = restItem; - this.name = name; - this.types = {} - this.init(); + "use strict"; + this.rest = restItem; + this.name = name; + this.types = {}; + this.init(); } // all gui elements has, at least, name && type // Types must include, at least: type, icon GuiElement.prototype = { - init: function() { - gui.doLog('Initializing ' + this.name); - var $this = this; - this.rest.types(function(data){ - var styles = ''; - $.each(data, function(index, value){ - var className = $this.name + '-' + value.type; - $this.types[value.type] = { css: className, name: value.name || '', description: value.description || '' }; - gui.doLog('Creating style for ' + className ) - var style = '.' + className + - ' { display:inline-block; background: url(data:image/png;base64,' + value.icon + '); ' + - 'width: 16px; height: 16px; vertical-align: middle; } '; - styles += style; - }); - if(styles != '') { - styles = '' - $(styles).appendTo('head'); - } - }); - }, - table: function(options) { - // Options (all are optionals) - // rowSelect: 'single' or 'multi' - // container: ID of the element that will hold this table (will be emptied) - // rowSelectFnc: function to invoke on row selection. receives 1 array - node : TR elements that were selected - // rowDeselectFnc: function to invoke on row deselection. receives 1 array - node : TR elements that were selected - gui.doLog('Composing table for ' + this.name); - var tableId = this.name + '-table'; - var $this = this; - this.rest.tableInfo(function(data){ - var title = data.title; - var columns = []; - $.each(data.fields,function(index, value) { - for( var v in value ){ - var options = value[v]; - var column = { mData: v }; - column.sTitle = options.title; - if( options.type ) - column.sType = options.type; - if( options.width ) - column.sWidth = options.width; - if( options.visible != undefined ) - column.bVisible = options.visible; - if( options.sortable != undefined ) - column.bSortable = options.sortable; - if( options.searchable != undefined ) - column.bSearchable = options.searchable; + init : function() { + "use strict"; + gui.doLog('Initializing ' + this.name); + var $this = this; + this.rest.types(function(data) { + var styles = ''; + $.each(data, function(index, value) { + var className = $this.name + '-' + value.type; + $this.types[value.type] = { + css : className, + name : value.name || '', + description : value.description || '' + }; + gui.doLog('Creating style for ' + className); + var style = '.' + className + ' { display:inline-block; background: url(data:image/png;base64,' + + value.icon + '); ' + 'width: 16px; height: 16px; vertical-align: middle; } '; + styles += style; + }); + if (styles !== '') { + styles = ''; + $(styles).appendTo('head'); + } + }); + }, + table : function(options) { + "use strict"; + // Options (all are optionals) + // rowSelect: 'single' or 'multi' + // container: ID of the element that will hold this table (will be + // emptied) + // rowSelectFnc: function to invoke on row selection. receives 1 array - + // node : TR elements that were selected + // rowDeselectFnc: function to invoke on row deselection. receives 1 + // array - node : TR elements that were selected + gui.doLog('Composing table for ' + this.name); + var tableId = this.name + '-table'; + var $this = this; + + // Empty cells transform + var renderEmptyCell = function(data) { + if( data === '' ) + return '-'; + return data; + }; + + // Datetime renderer (with specified format) + var renderDate = function(format) { + return function(data, type, full) { + return strftime(format, new Date(data*1000)); + }; + }; + + // Icon renderer, based on type (created on init methods in styles) + var renderTypeIcon = function(data, type, value){ + if( type == 'display' ) { + var css = $this.types[value.type].css; + return ' ' + renderEmptyCell(data); + } else { + return renderEmptyCell(data); + } + }; + + // Custom icon renderer, in fact span with defined class + var renderIcon = function(icon) { + return function(data, type, full) { + if( type == 'display' ) { + return ' ' + renderEmptyCell(data); + } else { + return renderEmptyCell(data); + } + }; + }; + // Text transformation, dictionary based + var renderTextTransform = function(dict) { + return function(data, type, full) { + return dict[data] || renderEmptyCell(''); + }; + }; + + this.rest.tableInfo(function(data) { + var title = data.title; + var columns = []; + $.each(data.fields, function(index, value) { + for ( var v in value) { + var options = value[v]; + var column = { + mData : v, + }; + column.sTitle = options.title; + column.mRender = renderEmptyCell; + if (options.type !== undefined) { + switch(options.type) { + case 'date': + column.sType = 'date'; + column.mRender = renderDate(djangoFormat(get_format('SHORT_DATE_FORMAT'))); + break; + case 'datetime': + column.sType = 'date'; + column.mRender = renderDate(djangoFormat(get_format('SHORT_DATETIME_FORMAT'))); + break; + case 'time': + column.mRender = renderDate(djangoFormat(get_format('TIME_FORMAT'))); + break; + case 'iconType': + //columnt.sType = 'html'; // html is default, so this is not needed + column.mRender = renderTypeIcon; + break; + case 'icon': + if( options.icon !== undefined ) { + column.mRender = renderIcon(options.icon); + } + break; + case 'dict': + if( options.dict !== undefined ) { + column.mRender = renderTextTransform(options.dict); + } + break; + default: + column.sType = options.type; + } + } + if (options.width) + column.sWidth = options.width; + if (options.visible !== undefined) + column.bVisible = options.visible; + if (options.sortable !== undefined) + column.bSortable = options.sortable; + if (options.searchable !== undefined) + column.bSearchable = options.searchable; + columns.push(column); + } + }); + // Generate styles for responsibe table, just the name of fields + var respStyles = []; + var counter = 0; + $.each(columns, function(col, value) { + if( value.bVisible === false ) + return; + counter += 1; + respStyles.push('#' + tableId + ' td:nth-of-type(' + counter + '):before { content: "' + + (value.sTitle || '') + '";}\n'); + respStyles.push('#' + tableId + ' td:nth-of-type(' + counter + '):empty { background-color: red ;}\n'); + }); + // If styles already exists, remove them before adding new ones + $('style-' + tableId).remove(); + $('').appendTo('head') + + $this.rest.get({ + success : function(data) { + var table = gui.table(title, tableId); + if (options.container === undefined) { + gui.appendToWorkspace('
    ' + table + '
    '); + } else { + $('#' + options.container).empty(); + $('#' + options.container).append(table); + } + + var btns = []; + + if (options.buttons) { + + // methods for buttons click + var editFnc = function() { + gui.doLog('Edit'); + gui.doLog(this); + }; + var deleteFnc = function() { + gui.doLog('Delete'); + gui.doLog(this); + }; + + // What execute on refresh button push + var onRefresh = options.onRefresh || function(){}; + + var refreshFnc = function(btn) { + // Refreshes table content + var tbl = $('#' + tableId).dataTable(); + var width = $(btn).width(); + var saved = $(btn).html(); + $(btn).addClass('disabled').html('') + .width(width); + onRefresh(); + $this.rest.get({ + success : function(data) { + tbl.fnClearTable(); + tbl.fnAddData(data); + $(btn).removeClass('disabled').html(saved); + } + }); + }; + + // methods for buttons on row select + var editSelected = function(btn, obj, node) { + var sel = this.fnGetSelectedData(); + if (sel.length == 1) { + $(btn).removeClass('disabled').addClass('btn-info'); + } else { + $(btn).removeClass('btn-info').addClass('disabled'); + } + }; + var deleteSelected = function(btn, obj, node) { + var sel = this.fnGetSelectedData(); + if (sel.length > 0) { + $(btn).removeClass('disabled').addClass('btn-warning'); + } else { + $(btn).removeClass('btn-warning').addClass('disabled'); + } + }; + + $.each(options.buttons, function(index, value) { + var btn; + switch (value) { + case 'edit': + btn = { + "sExtends" : "text", + "sButtonText" : gettext('Edit'), + "fnSelect" : editSelected, + "fnClick" : editFnc, + "sButtonClass" : "disabled" + }; + break; + case 'delete': + btn = { + "sExtends" : "text", + "sButtonText" : gettext('Delete'), + "fnSelect" : deleteSelected, + "fnClick" : deleteFnc, + "sButtonClass" : "disabled" + }; + break; + case 'refresh': + btn = { + "sExtends" : "text", + "sButtonText" : gettext('Refresh'), + "fnClick" : refreshFnc, + "sButtonClass" : "btn-info" + }; + break; + case 'csb': + btn = { + "sExtends" : "csv", + "sTitle" : title, + "sFileName" : title + '.csv', + }; + break; + case 'pdf': + btn = { + "sExtends" : "pdf", + "sTitle" : title, + "sPdfMessage" : "Summary Info", + "sFileName" : title + '.pdf', + "sPdfOrientation" : "portrait" + }; + break; + } + + if (btn !== undefined) + btns.push(btn); + }); + } + + // Initializes oTableTools + var oTableTools = { + "aButtons" : btns + }; + if (options.rowSelect) { + oTableTools.sRowSelect = options.rowSelect; + } + if (options.onRowSelect) { + oTableTools.fnRowSelected = options.onRowSelect; + } + if (options.onRowDeselect) { + oTableTools.fnRowDeselected = options.onRowDeselect; + } + + $('#' + tableId).dataTable({ + "aaData" : data, + "aoColumns" : columns, + "oLanguage" : gui.dataTablesLanguage, + "oTableTools" : oTableTools, + // First is upper row, + // second row is lower + // (pagination) row + "sDom" : "<'row'<'col-xs-6'T><'col-xs-6'f>r>t<'row'<'col-xs-5'i><'col-xs-7'p>>", + + }); + $('#' + tableId + '_filter input').addClass('form-control'); + var tableTop = $('#' + tableId).offset().top; + if (options.scroll) + $('html, body').scrollTop(tableTop); + } + }); + }); + return '#' + tableId; + } - // Fix name columm so we can add a class icon - if( v == 'name' ) { - column.sType ='html' - } - - columns.push(column); - } - }); - gui.doLog(columns); - - var processResponse = function(data) { - // If it has a "type" column - try { - if( data[0].type != undefined ) { - $.each(data, function(index, value){ - var type = $this.types[value.type]; - data[index].name = ' ' + value.name - }); - } - } catch (e) { - return; - } - }; - - $this.rest.get({ - success: function(data) { - processResponse(data); - var table = gui.table(title, tableId); - if( options.container == undefined ) { - gui.appendToWorkspace('
    ' + table + '
    '); - } else { - $('#'+options.container).empty(); - $('#'+options.container).append(table); - } - - var btns = [ - ]; - - if( options.buttons ) { - - // methods for buttons click - var editFnc = function() { - gui.doLog('Edit'); - gui.doLog(this); - }; - var deleteFnc = function() { - gui.doLog('Delete'); - gui.doLog(this); - }; - var refreshFnc = function(btn) { - // Refreshes table content - gui.doLog('Refresh'); - gui.doLog(this); - gui.doLog(btn); - var tbl = $('#' + tableId).dataTable(); - var width = $(btn).width(); - var saved = $(btn).html(); - $(btn).addClass('disabled').html('').width(width); - $this.rest.get({ - success: function(data) { - processResponse(data); - tbl.fnClearTable(); - tbl.fnAddData(data); - $(btn).removeClass('disabled').html(saved); - } - }); - } - - // methods for buttons on row select - var editSelected = function(btn, obj, node) { - var sel = this.fnGetSelectedData(); - if( sel.length == 1) { - $(btn).removeClass('disabled').addClass('btn-info'); - } else { - $(btn).removeClass('btn-info').addClass('disabled'); - } - }; - var deleteSelected = function(btn, obj, node) { - var sel = this.fnGetSelectedData(); - if( sel.length > 0) { - $(btn).removeClass('disabled').addClass('btn-warning'); - } else { - $(btn).removeClass('btn-warning').addClass('disabled'); - } - }; - - $.each(options.buttons, function(index, value){ - var btn = undefined; - switch(value) { - case 'edit': - btn = { - "sExtends": "text", - "sButtonText": gettext('Edit'), - "fnSelect": editSelected, - "fnClick": editFnc, - "sButtonClass": "disabled" - }; - break; - case 'delete': - btn = { - "sExtends": "text", - "sButtonText": gettext('Delete'), - "fnSelect": deleteSelected, - "fnClick": deleteFnc, - "sButtonClass": "disabled" - }; - break; - case 'refresh': - btn = { - "sExtends": "text", - "sButtonText": gettext('Refresh'), - "fnClick": refreshFnc, - "sButtonClass": "btn-info" - }; - break; - case 'csb': - btn = { - "sExtends": "csv", - "sTitle": title, - "sFileName": title + '.csv', - }; - break; - case 'pdf': - btn = { - "sExtends": "pdf", - "sTitle": title, - "sPdfMessage": "Summary Info", - "sFileName": title + '.pdf', - "sPdfOrientation": "portrait" - }; - break; - } - - if( btn != undefined ) - btns.push(btn); - }); - } - - // Initializes oTableTools - oTableTools = { - "aButtons": btns - }; - if( options.rowSelect ) { - oTableTools.sRowSelect = options.rowSelect - } - if( options.rowSelectFnc ) { - oTableTools.fnRowSelected = options.rowSelectFnc - } - if( options.rowDeselectFnc ) { - oTableTools.fnRowDeselected = options.rowDeselectFnc - } - - - $('#' + tableId).dataTable({ - "aaData": data, - "aoColumns": columns, - "oLanguage": gui.dataTablesLanguage, - "oTableTools": oTableTools, - // First is upper row, second row is lower (pagination) row - "sDom": "<'row'<'col-xs-6'T><'col-xs-6'f>r>t<'row'<'col-xs-5'i><'col-xs-7'p>>", - - }); - $('#' + tableId + '_filter input').addClass('form-control'); - var tableTop = $('#'+tableId).offset().top; - gui.doLog(tableTop); - //$('html, body').animate({ scrollTop: tableTop }); - if( options.scroll ) - $('html, body').scrollTop(tableTop); - } - }); - }); - return '#' + tableId; - } - }; diff --git a/server/src/uds/static/adm/js/strftime.js b/server/src/uds/static/adm/js/strftime.js new file mode 100644 index 000000000..2931fe7a6 --- /dev/null +++ b/server/src/uds/static/adm/js/strftime.js @@ -0,0 +1,345 @@ +// +// strftime +// github.com/samsonjs/strftime +// @_sjs +// +// Copyright 2010 - 2013 Sami Samhuri +// +// MIT License +// http://sjs.mit-license.org +// + +;(function() { + + // // Where to export the API + var namespace; + + // CommonJS / Node module + if (typeof module !== 'undefined') { + namespace = module.exports = strftime; + } + + // Browsers and other environments + else { + // Get the global object. Works in ES3, ES5, and ES5 strict mode. + namespace = (function(){ return this || (1,eval)('this'); }()); + } + + function words(s) { return (s || '').split(' '); } + + var dayNames = [gettext('Sunday'), gettext('Monday'), gettext('Tuesday'), + gettext('Wednesday'), gettext('Thursday'), gettext('Friday'), gettext('Saturday')]; + var monthNames = [gettext('January'), gettext('February'), gettext('March'), + gettext('April'), gettext('May'), gettext('June'), gettext('July'), + gettext('August'), gettext('September'), gettext('October'), gettext('November'), + gettext('December')]; + + function initialsOf(arr) { + var res = []; + for( var v in arr ) { + res.push(arr[v].substr(0,3)); + } + return res; + } + + var DefaultLocale = { + days: dayNames, + shortDays: initialsOf(dayNames), + months: monthNames, + shortMonths: initialsOf(monthNames), + AM: 'AM', + PM: 'PM', + am: 'am', + pm: 'pm', + }; + + // Added this to convert django format strings to c format string + // This is ofc, a "simplified" version, aimed to use date format used by DJANGO + namespace.djangoFormat = function(format) { + return format.replace(/./g, function(c) { + switch(c) { + case 'a': + case 'A': + return '%p'; + case 'b': + case 'd': + case 'm': + case 'w': + case 'W': + case 'y': + case 'Y': + return '%' + c; + case 'c': return '%FT%TZ'; + case 'D': return '%a'; + case 'e': return '%z'; + case 'f': return '%I:%M'; + case 'F': return '%F'; + case 'h': + case 'g': + return '%I'; + case 'H': + case 'G': + return '%H'; + case 'i': return '%M'; + case 'I': return ''; // daylight saving + case 'j': return '%d'; + case 'l': return '%A'; + case 'L': return ''; // if it is leap year + case 'M': return '%b'; + case 'n': return '%m'; + case 'N': return '%b'; + case 'o': return '%W'; // Not so sure, not important i thing anyway :-) + case 'O': return '%z'; + case 'P': return '%R %p'; + case 'r': return '%a, %d %b %Y %T %z'; + case 's': return '%S'; + case 'S': return ''; // english ordinal suffix for day of month + case 't': return ''; // number of days of specified month, not important + case 'T': return '%Z'; + case 'u': return '0'; // microseconds + case 'U': return ''; // Seconds since EPOCH, not used + case 'z': return '%j'; + case 'Z': return 'z'; // Time zone offset in seconds, replaced by offset in ours/minutes :-) + default: + return c; + } + + }); + }; + + + namespace.strftime = strftime; + function strftime(fmt, d, locale) { + return _strftime(fmt, d, locale); + } + + // locale is optional + namespace.strftimeTZ = strftime.strftimeTZ = strftimeTZ; + function strftimeTZ(fmt, d, locale, timezone) { + if (typeof locale == 'number' && timezone == null) { + timezone = locale; + locale = undefined; + } + return _strftime(fmt, d, locale, { timezone: timezone }); + } + + namespace.strftimeUTC = strftime.strftimeUTC = strftimeUTC; + function strftimeUTC(fmt, d, locale) { + return _strftime(fmt, d, locale, { utc: true }); + } + + namespace.localizedStrftime = strftime.localizedStrftime = localizedStrftime; + function localizedStrftime(locale) { + return function(fmt, d, options) { + return strftime(fmt, d, locale, options); + }; + } + + // d, locale, and options are optional, but you can't leave + // holes in the argument list. If you pass options you have to pass + // in all the preceding args as well. + // + // options: + // - locale [object] an object with the same structure as DefaultLocale + // - timezone [number] timezone offset in minutes from GMT + function _strftime(fmt, d, locale, options) { + options = options || {}; + + // d and locale are optional so check if d is really the locale + if (d && !quacksLikeDate(d)) { + locale = d; + d = undefined; + } + d = d || new Date(); + + locale = locale || DefaultLocale; + locale.formats = locale.formats || {}; + + // Hang on to this Unix timestamp because we might mess with it directly + // below. + var timestamp = d.getTime(); + + if (options.utc || typeof options.timezone == 'number') { + d = dateToUTC(d); + } + + if (typeof options.timezone == 'number') { + d = new Date(d.getTime() + (options.timezone * 60000)); + } + + // Most of the specifiers supported by C's strftime, and some from Ruby. + // Some other syntax extensions from Ruby are supported: %-, %_, and %0 + // to pad with nothing, space, or zero (respectively). + return fmt.replace(/%([-_0]?.)/g, function(_, c) { + var mod, padding; + if (c.length == 2) { + mod = c[0]; + // omit padding + if (mod == '-') { + padding = ''; + } + // pad with space + else if (mod == '_') { + padding = ' '; + } + // pad with zero + else if (mod == '0') { + padding = '0'; + } + else { + // unrecognized, return the format + return _; + } + c = c[1]; + } + switch (c) { + case 'A': return locale.days[d.getDay()]; + case 'a': return locale.shortDays[d.getDay()]; + case 'B': return locale.months[d.getMonth()]; + case 'b': return locale.shortMonths[d.getMonth()]; + case 'C': return pad(Math.floor(d.getFullYear() / 100), padding); + case 'D': return _strftime(locale.formats.D || '%m/%d/%y', d, locale); + case 'd': return pad(d.getDate(), padding); + case 'e': return d.getDate(); + case 'F': return _strftime(locale.formats.F || '%Y-%m-%d', d, locale); + case 'H': return pad(d.getHours(), padding); + case 'h': return locale.shortMonths[d.getMonth()]; + case 'I': return pad(hours12(d), padding); + case 'j': + var y = new Date(d.getFullYear(), 0, 1); + var day = Math.ceil((d.getTime() - y.getTime()) / (1000 * 60 * 60 * 24)); + return pad(day, 3); + case 'k': return pad(d.getHours(), padding == null ? ' ' : padding); + case 'L': return pad(Math.floor(timestamp % 1000), 3); + case 'l': return pad(hours12(d), padding == null ? ' ' : padding); + case 'M': return pad(d.getMinutes(), padding); + case 'm': return pad(d.getMonth() + 1, padding); + case 'n': return '\n'; + case 'o': return String(d.getDate()) + ordinal(d.getDate()); + case 'P': return d.getHours() < 12 ? locale.am : locale.pm; + case 'p': return d.getHours() < 12 ? locale.AM : locale.PM; + case 'R': return _strftime(locale.formats.R || '%H:%M', d, locale); + case 'r': return _strftime(locale.formats.r || '%I:%M:%S %p', d, locale); + case 'S': return pad(d.getSeconds(), padding); + case 's': return Math.floor(timestamp / 1000); + case 'T': return _strftime(locale.formats.T || '%H:%M:%S', d, locale); + case 't': return '\t'; + case 'U': return pad(weekNumber(d, 'sunday'), padding); + case 'u': + var day = d.getDay(); + return day == 0 ? 7 : day; // 1 - 7, Monday is first day of the + // week + case 'v': return _strftime(locale.formats.v || '%e-%b-%Y', d, locale); + case 'W': return pad(weekNumber(d, 'monday'), padding); + case 'w': return d.getDay(); // 0 - 6, Sunday is first day of the + // week + case 'Y': return d.getFullYear(); + case 'y': + var y = String(d.getFullYear()); + return y.slice(y.length - 2); + case 'Z': + if (options.utc) { + return "GMT"; + } + else { + var tz = d.toString().match(/\((\w+)\)/); + return tz && tz[1] || ''; + } + case 'z': + if (options.utc) { + return "+0000"; + } + else { + var off = typeof options.timezone == 'number' ? options.timezone : -d.getTimezoneOffset(); + return (off < 0 ? '-' : '+') + pad(Math.abs(off / 60)) + pad(off % 60); + } + default: return c; + } + }); + } + + function dateToUTC(d) { + var msDelta = (d.getTimezoneOffset() || 0) * 60000; + return new Date(d.getTime() + msDelta); + } + + var RequiredDateMethods = ['getTime', 'getTimezoneOffset', 'getDay', 'getDate', 'getMonth', 'getFullYear', 'getYear', 'getHours', 'getMinutes', 'getSeconds']; + function quacksLikeDate(x) { + var i = 0 + , n = RequiredDateMethods.length + ; + for (i = 0; i < n; ++i) { + if (typeof x[RequiredDateMethods[i]] != 'function') { + return false; + } + } + return true; + } + + // Default padding is '0' and default length is 2, both are optional. + function pad(n, padding, length) { + // pad(n, ) + if (typeof padding === 'number') { + length = padding; + padding = '0'; + } + + // Defaults handle pad(n) and pad(n, ) + if (padding == null) { + padding = '0'; + } + length = length || 2; + + var s = String(n); + // padding may be an empty string, don't loop forever if it is + if (padding) { + while (s.length < length) s = padding + s; + } + return s; + } + + function hours12(d) { + var hour = d.getHours(); + if (hour == 0) hour = 12; + else if (hour > 12) hour -= 12; + return hour; + } + + // Get the ordinal suffix for a number: st, nd, rd, or th + function ordinal(n) { + var i = n % 10 + , ii = n % 100 + ; + if ((ii >= 11 && ii <= 13) || i === 0 || i >= 4) { + return 'th'; + } + switch (i) { + case 1: return 'st'; + case 2: return 'nd'; + case 3: return 'rd'; + } + } + + // firstWeekday: 'sunday' or 'monday', default is 'sunday' + // + // Pilfered & ported from Ruby's strftime implementation. + function weekNumber(d, firstWeekday) { + firstWeekday = firstWeekday || 'sunday'; + + // This works by shifting the weekday back by one day if we + // are treating Monday as the first day of the week. + var wday = d.getDay(); + if (firstWeekday == 'monday') { + if (wday == 0) // Sunday + wday = 6; + else + wday--; + } + var firstDayOfYear = new Date(d.getFullYear(), 0, 1) + , yday = (d - firstDayOfYear) / 86400000 + , weekNum = (yday + 7 - wday) / 7 + ; + return Math.floor(weekNum); + } + +}()); diff --git a/server/src/uds/static/adm/js/templating.js b/server/src/uds/static/adm/js/templating.js deleted file mode 100644 index 8b1378917..000000000 --- a/server/src/uds/static/adm/js/templating.js +++ /dev/null @@ -1 +0,0 @@ - diff --git a/server/src/uds/static/js/jquery-1.7.1.js b/server/src/uds/static/js/jquery-1.7.1.js deleted file mode 100644 index 8ccd0ea78..000000000 --- a/server/src/uds/static/js/jquery-1.7.1.js +++ /dev/null @@ -1,9266 +0,0 @@ -/*! - * jQuery JavaScript Library v1.7.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: Mon Nov 21 21:11:03 2011 -0500 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z]|[0-9])/ig, - rmsPrefix = /^-ms-/, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = ( context ? context.ownerDocument || context : document ); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.7.1", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.add( fn ); - - return this; - }, - - eq: function( i ) { - i = +i; - return i === -1 ? - this.slice( i ) : - this.slice( i, i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.fireWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).off( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery.Callbacks( "once memory" ); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array, i ) { - var len; - - if ( array ) { - if ( indexOf ) { - return indexOf.call( array, elem, i ); - } - - len = array.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in array && array[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; - - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } - - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - - return elems; - } - - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, - - now: function() { - return ( new Date() ).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, - - browser: {} -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -return jQuery; - -})(); - - -// String to Object flags format cache -var flagsCache = {}; - -// Convert String-formatted flags into Object-formatted ones and store in cache -function createFlags( flags ) { - var object = flagsCache[ flags ] = {}, - i, length; - flags = flags.split( /\s+/ ); - for ( i = 0, length = flags.length; i < length; i++ ) { - object[ flags[i] ] = true; - } - return object; -} - -/* - * Create a callback list using the following parameters: - * - * flags: an optional list of space-separated flags that will change how - * the callback list behaves - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible flags: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( flags ) { - - // Convert flags from String-formatted to Object-formatted - // (we check in cache first) - flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; - - var // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = [], - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Add one or several callbacks to the list - add = function( args ) { - var i, - length, - elem, - type, - actual; - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - // Inspect recursively - add( elem ); - } else if ( type === "function" ) { - // Add if not in unique mode and callback is not in - if ( !flags.unique || !self.has( elem ) ) { - list.push( elem ); - } - } - } - }, - // Fire callbacks - fire = function( context, args ) { - args = args || []; - memory = !flags.memory || [ context, args ]; - firing = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { - memory = true; // Mark as halted - break; - } - } - firing = false; - if ( list ) { - if ( !flags.once ) { - if ( stack && stack.length ) { - memory = stack.shift(); - self.fireWith( memory[ 0 ], memory[ 1 ] ); - } - } else if ( memory === true ) { - self.disable(); - } else { - list = []; - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - var length = list.length; - add( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away, unless previous - // firing was halted (stopOnFalse) - } else if ( memory && memory !== true ) { - firingStart = length; - fire( memory[ 0 ], memory[ 1 ] ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - var args = arguments, - argIndex = 0, - argLength = args.length; - for ( ; argIndex < argLength ; argIndex++ ) { - for ( var i = 0; i < list.length; i++ ) { - if ( args[ argIndex ] === list[ i ] ) { - // Handle firingIndex and firingLength - if ( firing ) { - if ( i <= firingLength ) { - firingLength--; - if ( i <= firingIndex ) { - firingIndex--; - } - } - } - // Remove the element - list.splice( i--, 1 ); - // If we have some unicity property then - // we only need to do this once - if ( flags.unique ) { - break; - } - } - } - } - } - return this; - }, - // Control if a given callback is in the list - has: function( fn ) { - if ( list ) { - var i = 0, - length = list.length; - for ( ; i < length; i++ ) { - if ( fn === list[ i ] ) { - return true; - } - } - } - return false; - }, - // Remove all callbacks from the list - empty: function() { - list = []; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory || memory === true ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( stack ) { - if ( firing ) { - if ( !flags.once ) { - stack.push( [ context, args ] ); - } - } else if ( !( flags.once && memory ) ) { - fire( context, args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!memory; - } - }; - - return self; -}; - - - - -var // Static reference to slice - sliceDeferred = [].slice; - -jQuery.extend({ - - Deferred: function( func ) { - var doneList = jQuery.Callbacks( "once memory" ), - failList = jQuery.Callbacks( "once memory" ), - progressList = jQuery.Callbacks( "memory" ), - state = "pending", - lists = { - resolve: doneList, - reject: failList, - notify: progressList - }, - promise = { - done: doneList.add, - fail: failList.add, - progress: progressList.add, - - state: function() { - return state; - }, - - // Deprecated - isResolved: doneList.fired, - isRejected: failList.fired, - - then: function( doneCallbacks, failCallbacks, progressCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); - return this; - }, - always: function() { - deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); - return this; - }, - pipe: function( fnDone, fnFail, fnProgress ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ], - progress: [ fnProgress, "notify" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - obj = promise; - } else { - for ( var key in promise ) { - obj[ key ] = promise[ key ]; - } - } - return obj; - } - }, - deferred = promise.promise({}), - key; - - for ( key in lists ) { - deferred[ key ] = lists[ key ].fire; - deferred[ key + "With" ] = lists[ key ].fireWith; - } - - // Handle state - deferred.done( function() { - state = "resolved"; - }, failList.disable, progressList.lock ).fail( function() { - state = "rejected"; - }, doneList.disable, progressList.lock ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = sliceDeferred.call( arguments, 0 ), - i = 0, - length = args.length, - pValues = new Array( length ), - count = length, - pCount = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(), - promise = deferred.promise(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - deferred.resolveWith( deferred, args ); - } - }; - } - function progressFunc( i ) { - return function( value ) { - pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - deferred.notifyWith( promise, pValues ); - }; - } - if ( length > 1 ) { - for ( ; i < length; i++ ) { - if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return promise; - } -}); - - - - -jQuery.support = (function() { - - var support, - all, - a, - select, - opt, - input, - marginDiv, - fragment, - tds, - events, - eventName, - i, - isSupported, - div = document.createElement( "div" ), - documentElement = document.documentElement; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
    a"; - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } - - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName("tbody").length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName("link").length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute("href") === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Tests for enctype support on a form(#6743) - enctype: !!document.createElement("form").enctype, - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true - }; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains its value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.lastChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - fragment.removeChild( input ); - fragment.appendChild( div ); - - div.innerHTML = ""; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( window.getComputedStyle ) { - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.style.width = "2px"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - // Technique from Juriy Zaytsev - // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for( i in { - submit: 1, - change: 1, - focusin: 1 - }) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - fragment.removeChild( div ); - - // Null elements to avoid leaks in IE - fragment = select = opt = marginDiv = div = input = null; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, outer, inner, table, td, offsetSupport, - conMarginTop, ptlm, vb, style, html, - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - conMarginTop = 1; - ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; - vb = "visibility:hidden;border:0;"; - style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; - html = "
    " + - "" + - "
    "; - - container = document.createElement("div"); - container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; - body.insertBefore( container, body.firstChild ); - - // Construct the test element - div = document.createElement("div"); - container.appendChild( div ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - div.innerHTML = "
    t
    "; - tds = div.getElementsByTagName( "td" ); - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE <= 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Figure out if the W3C box model works as expected - div.innerHTML = ""; - div.style.width = div.style.paddingLeft = "1px"; - jQuery.boxModel = support.boxModel = div.offsetWidth === 2; - - if ( typeof div.style.zoom !== "undefined" ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
    "; - support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); - } - - div.style.cssText = ptlm + vb; - div.innerHTML = html; - - outer = div.firstChild; - inner = outer.firstChild; - td = outer.nextSibling.firstChild.firstChild; - - offsetSupport = { - doesNotAddBorder: ( inner.offsetTop !== 5 ), - doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) - }; - - inner.style.position = "fixed"; - inner.style.top = "20px"; - - // safari subtracts parent border width here which is 5px - offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); - inner.style.position = inner.style.top = ""; - - outer.style.overflow = "hidden"; - outer.style.position = "relative"; - - offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); - offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); - - body.removeChild( container ); - div = container = null; - - jQuery.extend( support, offsetSupport ); - }); - - return support; -})(); - - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([A-Z])/g; - -jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var privateCache, thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, - isEvents = name === "events"; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ internalKey ] = id = ++jQuery.uuid; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // Avoids exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - privateCache = thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Users should not attempt to inspect the internal events object using jQuery.data, - // it is undocumented and subject to change. But does anyone listen? No. - if ( isEvents && !thisCache[ name ] ) { - return privateCache.events; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, l, - - // Reference to internal data cache key - internalKey = jQuery.expando, - - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ internalKey ] : internalKey; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split( " " ); - } - } - } - - for ( i = 0, l = name.length; i < l; i++ ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - // Ensure that `cache` is not a window object #10080 - if ( jQuery.support.deleteExpando || !cache.setInterval ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the cache and need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ internalKey ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( internalKey ); - } else { - elem[ internalKey ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var parts, attr, name, - data = null; - - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); - - if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { - attr = this[0].attributes; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( this[0], name, data[ name ] ); - } - } - jQuery._data( this[0], "parsedAttrs", true ); - } - } - - return data; - - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - - } else { - return this.each(function() { - var self = jQuery( this ), - args = [ parts[0], value ]; - - self.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - self.triggerHandler( "changeData" + parts[1] + "!", args ); - }); - } - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - jQuery.isNumeric( data ) ? parseFloat( data ) : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery._data( elem, deferDataKey ); - if ( defer && - ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && - ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery._data( elem, queueDataKey ) && - !jQuery._data( elem, markDataKey ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.fire(); - } - }, 0 ); - } -} - -jQuery.extend({ - - _mark: function( elem, type ) { - if ( elem ) { - type = ( type || "fx" ) + "mark"; - jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); - if ( count ) { - jQuery._data( elem, key, count ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - var q; - if ( elem ) { - type = ( type || "fx" ) + "queue"; - q = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - hooks = {}; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - jQuery._data( elem, type + ".run", hooks ); - fn.call( elem, function() { - jQuery.dequeue( elem, type ); - }, hooks ); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue " + type + ".run", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function() { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { - count++; - tmp.add( resolve ); - } - } - resolve(); - return defer.promise(); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - nodeHook, boolHook, fixSpecified; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.prop ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - classNames = ( value || "" ).split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, i, max, option, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - i = one ? index : 0; - max = one ? index + 1 : options.length; - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attr: function( elem, name, value, pass ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( notxml ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var propName, attrNames, name, l, - i = 0; - - if ( value && elem.nodeType === 1 ) { - attrNames = value.toLowerCase().split( rspace ); - l = attrNames.length; - - for ( ; i < l; i++ ) { - name = attrNames[ i ]; - - if ( name ) { - propName = jQuery.propFix[ name ] || name; - - // See #9699 for explanation of this approach (setting first, then removal) - jQuery.attr( elem, name, "" ); - elem.removeAttribute( getSetAttribute ? name : propName ); - - // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) && propName in elem ) { - elem[ propName ] = false; - } - } - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return ( elem[ name ] = value ); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - } - } -}); - -// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) -jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode, - property = jQuery.prop( elem, name ); - return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - fixSpecified = { - name: true, - id: true - }; - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return ( ret.nodeValue = value + "" ); - } - }; - - // Apply the nodeHook to tabindex - jQuery.attrHooks.tabindex.set = nodeHook.set; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - get: nodeHook.get, - set: function( elem, value, name ) { - if ( value === "" ) { - value = "false"; - } - nodeHook.set( elem, value, name ); - } - }; -} - - -// Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = "" + value ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }); -} - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }); -}); - - - - -var rformElems = /^(?:textarea|input|select)$/i, - rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, - rhoverHack = /\bhover(\.\S+)?\b/, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, - quickParse = function( selector ) { - var quick = rquickIs.exec( selector ); - if ( quick ) { - // 0 1 2 3 - // [ _, tag, id, class ] - quick[1] = ( quick[1] || "" ).toLowerCase(); - quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); - } - return quick; - }, - quickIs = function( elem, m ) { - var attrs = elem.attributes || {}; - return ( - (!m[1] || elem.nodeName.toLowerCase() === m[1]) && - (!m[2] || (attrs.id || {}).value === m[2]) && - (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) - ); - }, - hoverHack = function( events ) { - return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); - }; - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - add: function( elem, types, handler, data, selector ) { - - var elemData, eventHandle, events, - t, tns, type, namespaces, handleObj, - handleObjIn, quick, handlers, special; - - // Don't attach events to noData or text/comment nodes (allow plain objects tho) - if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - events = elemData.events; - if ( !events ) { - elemData.events = events = {}; - } - eventHandle = elemData.handle; - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = jQuery.trim( hoverHack(types) ).split( " " ); - for ( t = 0; t < types.length; t++ ) { - - tns = rtypenamespace.exec( types[t] ) || []; - type = tns[1]; - namespaces = ( tns[2] || "" ).split( "." ).sort(); - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: tns[1], - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - quick: quickParse( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - handlers = events[ type ]; - if ( !handlers ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - t, tns, type, origType, namespaces, origCount, - j, events, special, handle, eventType, handleObj; - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = jQuery.trim( hoverHack( types || "" ) ).split(" "); - for ( t = 0; t < types.length; t++ ) { - tns = rtypenamespace.exec( types[t] ) || []; - type = origType = tns[1]; - namespaces = tns[2]; - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector? special.delegateType : special.bindType ) || type; - eventType = events[ type ] || []; - origCount = eventType.length; - namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - - // Remove matching events - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !namespaces || namespaces.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - eventType.splice( j--, 1 ); - - if ( handleObj.selector ) { - eventType.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( eventType.length === 0 && origCount !== eventType.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery.removeData( elem, [ "events", "handle" ], true ); - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Don't do events on text and comment nodes - if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { - return; - } - - // Event object or event type - var type = event.type || event, - namespaces = [], - cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "!" ) >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf( "." ) >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.isTrigger = true; - event.exclusive = exclusive; - event.namespace = namespaces.join( "." ); - event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; - - // Handle a global trigger - if ( !elem ) { - - // TODO: Stop taunting the data cache; remove global events and always attach to document - cache = jQuery.cache; - for ( i in cache ) { - if ( cache[ i ].events && cache[ i ].events[ type ] ) { - jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); - } - } - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - eventPath = [[ elem, special.bindType || type ]]; - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; - old = null; - for ( ; cur; cur = cur.parentNode ) { - eventPath.push([ cur, bubbleType ]); - old = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( old && old === elem.ownerDocument ) { - eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); - } - } - - // Fire handlers on the event path - for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { - - cur = eventPath[i][0]; - event.type = eventPath[i][1]; - - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - // Note that this is a bare JS function and not a jQuery handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - // IE<9 dies on focus/blur to hidden element (#1486) - if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( old ) { - elem[ ontype ] = old; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event || window.event ); - - var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), - delegateCount = handlers.delegateCount, - args = [].slice.call( arguments, 0 ), - run_all = !event.exclusive && !event.namespace, - handlerQueue = [], - i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Determine handlers that should run if there are delegated events - // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) - if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { - - // Pregenerate a single jQuery object for reuse with .is() - jqcur = jQuery(this); - jqcur.context = this.ownerDocument || this; - - for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { - selMatch = {}; - matches = []; - jqcur[0] = cur; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - sel = handleObj.selector; - - if ( selMatch[ sel ] === undefined ) { - selMatch[ sel ] = ( - handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) - ); - } - if ( selMatch[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, matches: matches }); - } - } - } - - // Add the remaining (directly-bound) handlers - if ( handlers.length > delegateCount ) { - handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); - } - - // Run delegates first; they may want to stop propagation beneath us - for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { - matched = handlerQueue[ i ]; - event.currentTarget = matched.elem; - - for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { - handleObj = matched.matches[ j ]; - - // Triggered event must either 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { - - event.data = handleObj.data; - event.handleObj = handleObj; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - return event.result; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** - props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, - originalEvent = event, - fixHook = jQuery.event.fixHooks[ event.type ] || {}, - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = jQuery.Event( originalEvent ); - - for ( i = copy.length; i; ) { - prop = copy[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Target should not be a text node (#504, Safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) - if ( event.metaKey === undefined ) { - event.metaKey = event.ctrlKey; - } - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady - }, - - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - - focus: { - delegateType: "focusin" - }, - blur: { - delegateType: "focusout" - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -// Some plugins are using, but it's undocumented/deprecated and will be removed. -// The 1.7 special event interface should provide all the hooks needed now. -jQuery.event.handle = jQuery.event.dispatch; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var target = this, - related = event.relatedTarget, - handleObj = event.handleObj, - selector = handleObj.selector, - ret; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !form._submit_attached ) { - jQuery.event.add( form, "submit._submit", function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - }); - form._submit_attached = true; - } - }); - // return undefined since we don't need an event listener - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - jQuery.event.simulate( "change", this, event, true ); - } - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - elem._change_attached = true; - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on.call( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - var handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( var type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - live: function( types, data, fn ) { - jQuery( this.context ).on( types, this.selector, data, fn ); - return this; - }, - die: function( types, fn ) { - jQuery( this.context ).off( types, this.selector || "**", fn ); - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } - - if ( rkeyEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; - } - - if ( rmouseEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; - } -}); - - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - expando = "sizcache" + (Math.random() + '').replace('.', ''), - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rReturn = /\r\n/g, - rNonWord = /\W/; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context, seed ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set, seed ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set, i, len, match, type, left; - - if ( !expr ) { - return []; - } - - for ( i = 0, len = Expr.order.length; i < len; i++ ) { - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - type, found, item, filter, left, - i, pass, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - filter = Expr.filter[ type ]; - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - pass = not ^ found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Utility function for retreiving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -var getText = Sizzle.getText = function( elem ) { - var i, node, - nodeType = elem.nodeType, - ret = ""; - - if ( nodeType ) { - if ( nodeType === 1 || nodeType === 9 ) { - // Use textContent || innerText for elements - if ( typeof elem.textContent === 'string' ) { - return elem.textContent; - } else if ( typeof elem.innerText === 'string' ) { - // Replace IE's carriage returns - return elem.innerText.replace( rReturn, '' ); - } else { - // Traverse it's children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - } else { - - // If no nodeType, this is expected to be an array - for ( i = 0; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - if ( node.nodeType !== 8 ) { - ret += getText( node ); - } - } - } - return ret; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var first, last, - doneName, parent, cache, - count, diff, - type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - first = match[2]; - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - doneName = match[0]; - parent = elem.parentNode; - - if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { - count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent[ expando ] = doneName; - } - - diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Sizzle.attr ? - Sizzle.attr( elem, name ) : - Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - !type && Sizzle.attr ? - result != null : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - -} else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

    "; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
    "; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem[ expando ] = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem[ expando ] = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context, seed ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet, seed ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -// Override sizzle attribute retrieval -Sizzle.attr = jQuery.attr; -Sizzle.selectors.attrMap = {}; -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( - typeof selector === "string" ? - // If this is a positional selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - POS.test( selector ) ? - jQuery( selector, this.context ).index( this[0] ) >= 0 : - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array (deprecated as of jQuery 1.7) - if ( jQuery.isArray( selectors ) ) { - var level = 1; - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( i = 0; i < selectors.length; i++ ) { - - if ( jQuery( cur ).is( selectors[ i ] ) ) { - ret.push({ selector: selectors[ i ], elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( elem.parentNode.firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, slice.call( arguments ).join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return ( elem === qualifier ) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; - }); -} - - - - -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
    ", "
    " ], - thead: [ 1, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - col: [ 2, "", "
    " ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }, - safeFragment = createSafeFragment( document ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and + + + + - - -