backport stable
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Tue, 01 Feb 2011 11:52:10 +0100
changeset 6931 0af44a38fe41
parent 6884 6fa712e9dfa5 (diff)
parent 6930 118881289a31 (current diff)
child 6932 1599ad09624f
backport stable
devtools/fill.py
i18n/en.po
server/checkintegrity.py
server/repository.py
server/sources/__init__.py
server/sources/ldapuser.py
server/sources/native.py
utils.py
view.py
web/formwidgets.py
web/views/primary.py
web/views/startup.py
--- a/__pkginfo__.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/__pkginfo__.py	Tue Feb 01 11:52:10 2011 +0100
@@ -22,7 +22,7 @@
 
 modname = distname = "cubicweb"
 
-numversion = (3, 10, 7)
+numversion = (3, 11, 0)
 version = '.'.join(str(num) for num in numversion)
 
 description = "a repository of entities / relations for knowledge management"
--- a/dbapi.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/dbapi.py	Tue Feb 01 11:52:10 2011 +0100
@@ -220,11 +220,10 @@
         return False
 
 class DBAPISession(object):
-    def __init__(self, cnx, login=None, authinfo=None):
+    def __init__(self, cnx, login=None):
         self.cnx = cnx
         self.data = {}
         self.login = login
-        self.authinfo = authinfo
         # dbapi session identifier is the same as the first connection
         # identifier, but may later differ in case of auto-reconnection as done
         # by the web authentication manager (in cw.web.views.authentication)
@@ -586,9 +585,8 @@
             req = self.request()
         rset = req.eid_rset(eid, 'CWUser')
         if self.vreg is not None and 'etypes' in self.vreg:
-            user = self.vreg['etypes'].etype_class('CWUser')(req, rset, row=0,
-                                                             groups=groups,
-                                                             properties=properties)
+            user = self.vreg['etypes'].etype_class('CWUser')(
+                req, rset, row=0, groups=groups, properties=properties)
         else:
             from cubicweb.entity import Entity
             user = Entity(req, rset, row=0)
--- a/devtools/fake.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/devtools/fake.py	Tue Feb 01 11:52:10 2011 +0100
@@ -185,8 +185,7 @@
     def internal_session(self):
         return FakeSession(self)
 
-    def extid2eid(self, source, extid, etype, session, insert=True,
-                  recreate=False):
+    def extid2eid(self, source, extid, etype, session, insert=True):
         try:
             return self.extids[extid]
         except KeyError:
--- a/devtools/fill.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/devtools/fill.py	Tue Feb 01 11:52:10 2011 +0100
@@ -157,6 +157,11 @@
         base = date(randint(2000, 2010), 1, 1) + timedelta(randint(1, 365))
         return self._constrained_generate(entity, attrname, base, timedelta(days=1), index)
 
+    def generate_interval(self, entity, attrname, index):
+        """generates a random date (format is 'yyyy-mm-dd')"""
+        base = timedelta(randint(1, 365))
+        return self._constrained_generate(entity, attrname, base, timedelta(days=1), index)
+
     def generate_time(self, entity, attrname, index):
         """generates a random time (format is ' HH:MM')"""
         return time(11, index%60) #'11:%02d' % (index % 60)
--- a/devtools/testlib.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/devtools/testlib.py	Tue Feb 01 11:52:10 2011 +0100
@@ -259,8 +259,7 @@
         cls.init_config(cls.config)
         cls.repo.hm.call_hooks('server_startup', repo=cls.repo)
         cls.vreg = cls.repo.vreg
-        cls.websession = DBAPISession(cls.cnx, cls.admlogin,
-                                      {'password': cls.admpassword})
+        cls.websession = DBAPISession(cls.cnx, cls.admlogin)
         cls._orig_cnx = (cls.cnx, cls.websession)
         cls.config.repository = lambda x=None: cls.repo
 
--- a/hooks/syncsources.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/hooks/syncsources.py	Tue Feb 01 11:52:10 2011 +0100
@@ -1,6 +1,7 @@
+from yams.schema import role_name
 from cubicweb import ValidationError
 from cubicweb.selectors import is_instance
-from cubicweb.server import hook
+from cubicweb.server import SOURCE_TYPES, hook
 
 class SourceHook(hook.Hook):
     __abstract__ = True
@@ -8,7 +9,7 @@
 
 
 class SourceAddedOp(hook.Operation):
-    def precommit_event(self):
+    def postcommit_event(self):
         self.session.repo.add_source(self.entity)
 
 class SourceAddedHook(SourceHook):
@@ -16,6 +17,10 @@
     __select__ = SourceHook.__select__ & is_instance('CWSource')
     events = ('after_add_entity',)
     def __call__(self):
+        if not self.entity.type in SOURCE_TYPES:
+            msg = self._cw._('unknown source type')
+            raise ValidationError(self.entity.eid,
+                                  {role_name('type', 'subject'): msg})
         SourceAddedOp(self._cw, entity=self.entity)
 
 
@@ -31,3 +36,13 @@
         if self.entity.name == 'system':
             raise ValidationError(self.entity.eid, {None: 'cant remove system source'})
         SourceRemovedOp(self._cw, uri=self.entity.name)
+
+class SourceRemovedHook(SourceHook):
+    __regid__ = 'cw.sources.removed'
+    __select__ = SourceHook.__select__ & hook.match_rtype('cw_support', 'cw_may_cross')
+    events = ('after_add_relation',)
+    def __call__(self):
+        entity = self._cw.entity_from_eid(self.eidto)
+        if entity.__regid__ == 'CWRType' and entity.name in  ('is', 'is_instance_of', 'cw_source'):
+            msg = self._cw._('the %s relation type can\'t be used here') % entity.name
+            raise ValidationError(self.eidto, {role_name(self.rtype, 'subject'): msg})
--- a/i18n/de.po	Tue Feb 01 10:10:46 2011 +0100
+++ b/i18n/de.po	Tue Feb 01 11:52:10 2011 +0100
@@ -8,10 +8,10 @@
 "PO-Revision-Date: 2010-09-15 14:55+0200\n"
 "Last-Translator: Dr. Leo <fhaxbox66@googlemail.com>\n"
 "Language-Team: English <devel@logilab.fr.org>\n"
-"Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
 "Generated-By: pygettext.py 1.5\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
@@ -27,8 +27,8 @@
 "url: %(url)s\n"
 msgstr ""
 "\n"
-"%(user)s hat den Zustand geändert von <%(previous_state)s> in <"
-"%(current_state)s> für die Entität\n"
+"%(user)s hat den Zustand geändert von <%(previous_state)s> in <%"
+"(current_state)s> für die Entität\n"
 "'%(title)s'\n"
 "\n"
 "%(comment)s\n"
@@ -392,8 +392,8 @@
 "Can't restore relation %(rtype)s, %(role)s entity %(eid)s doesn't exist "
 "anymore."
 msgstr ""
-"Kann die Relation %(rtype)s nicht wieder herstellen, die Entität %(role)s "
-"%(eid)s existiert nicht mehr."
+"Kann die Relation %(rtype)s nicht wieder herstellen, die Entität %(role)s %"
+"(eid)s existiert nicht mehr."
 
 #, python-format
 msgid ""
@@ -439,10 +439,10 @@
 msgid "Download schema as OWL"
 msgstr "Herunterladen des Schemas im OWL-Format"
 
+msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Email-Adresse"
 
-msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Email-Adresse"
 
@@ -1051,9 +1051,6 @@
 msgid "add_permission"
 msgstr "Berechtigung hinzufügen"
 
-msgid "add_permission_object"
-msgstr "hat die Berechtigung zum Hinzufügen"
-
 msgctxt "CWGroup"
 msgid "add_permission_object"
 msgstr "kann hinzufügen"
@@ -1062,6 +1059,9 @@
 msgid "add_permission_object"
 msgstr "benutzt, um die Hinzufüge-Berechtigung zu festzulegen für"
 
+msgid "add_permission_object"
+msgstr "hat die Berechtigung zum Hinzufügen"
+
 msgid "add_relation"
 msgstr "hinzufügen"
 
@@ -1071,11 +1071,11 @@
 
 #, python-format
 msgid ""
-"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
-"Die Relation %(rtype)s von %(frometype)s #%(eidfrom)s zu %(toetype)s #"
-"%(eidto)s wurde hinzugefügt."
+"Die Relation %(rtype)s von %(frometype)s #%(eidfrom)s zu %(toetype)s #%"
+"(eidto)s wurde hinzugefügt."
 
 msgid "addrelated"
 msgstr "hinzufügen"
@@ -1107,9 +1107,6 @@
 msgid "allowed_transition"
 msgstr "erlaubter Übergang"
 
-msgid "allowed_transition_object"
-msgstr "ausstehende Zustände"
-
 msgctxt "BaseTransition"
 msgid "allowed_transition_object"
 msgstr "ausstehende Zustände"
@@ -1122,6 +1119,9 @@
 msgid "allowed_transition_object"
 msgstr "ausstehende Zustände"
 
+msgid "allowed_transition_object"
+msgstr "ausstehende Zustände"
+
 msgid "am/pm calendar (month)"
 msgstr "am/pm Kalender (Monat)"
 
@@ -1216,13 +1216,13 @@
 msgid "bookmarked_by"
 msgstr "Lesezeichen angelegt durch"
 
-msgid "bookmarked_by_object"
-msgstr "hat Lesezeichen"
-
 msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "verwendet Lesezeichen"
 
+msgid "bookmarked_by_object"
+msgstr "hat Lesezeichen"
+
 msgid "bookmarks"
 msgstr "Lesezeichen"
 
@@ -1260,9 +1260,6 @@
 msgid "by_transition"
 msgstr "je Übergang"
 
-msgid "by_transition_object"
-msgstr "Übergangsinformation"
-
 msgctxt "BaseTransition"
 msgid "by_transition_object"
 msgstr "Übergangsinformation"
@@ -1275,6 +1272,9 @@
 msgid "by_transition_object"
 msgstr "Übergangsinformation"
 
+msgid "by_transition_object"
+msgstr "Übergangsinformation"
+
 msgid "calendar"
 msgstr "Kalender anzeigen"
 
@@ -1432,10 +1432,10 @@
 msgid "condition"
 msgstr "Bedingung"
 
+msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "Bedingung von"
 
-msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "Bedingung von"
 
@@ -1445,11 +1445,11 @@
 msgid "config"
 msgstr ""
 
-msgctxt "CWSource"
+msgctxt "CWSourceHostConfig"
 msgid "config"
 msgstr ""
 
-msgctxt "CWSourceHostConfig"
+msgctxt "CWSource"
 msgid "config"
 msgstr ""
 
@@ -1473,10 +1473,10 @@
 msgid "constrained_by"
 msgstr "eingeschränkt durch"
 
+msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "Einschränkungen"
 
-msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "Einschränkungen"
 
@@ -1490,10 +1490,10 @@
 msgid "constraint_of"
 msgstr ""
 
+msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr ""
 
-msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr ""
 
@@ -1585,8 +1585,8 @@
 msgstr "Erstelle Relation %(linkto)s"
 
 msgid ""
-"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
-"%(linkto)s)"
+"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource %"
+"(linkto)s)"
 msgstr ""
 
 msgid ""
@@ -1675,8 +1675,8 @@
 msgstr "Erstelle Workflow-Übergang, der zum Zustand %(linkto)s führt."
 
 msgid ""
-"creating WorkflowTransition (WorkflowTransition transition_of Workflow "
-"%(linkto)s)"
+"creating WorkflowTransition (WorkflowTransition transition_of Workflow %"
+"(linkto)s)"
 msgstr "Erstelle Workflow-Übergang des Workflows %(linkto)s"
 
 msgid "creation"
@@ -1698,13 +1698,13 @@
 msgid "cstrtype"
 msgstr "Einschränkungstyp"
 
-msgid "cstrtype_object"
-msgstr "benutzt von"
-
 msgctxt "CWConstraintType"
 msgid "cstrtype_object"
 msgstr "Einschränkungstyp von"
 
+msgid "cstrtype_object"
+msgstr "benutzt von"
+
 msgid "csv entities export"
 msgstr "CSV-Export von Entitäten"
 
@@ -1829,10 +1829,10 @@
 msgid "cw_dont_cross"
 msgstr ""
 
+msgctxt "CWRType"
 msgid "cw_dont_cross_object"
 msgstr ""
 
-msgctxt "CWRType"
 msgid "cw_dont_cross_object"
 msgstr ""
 
@@ -1843,10 +1843,10 @@
 msgid "cw_host_config_of"
 msgstr ""
 
+msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr ""
 
-msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr ""
 
@@ -1857,10 +1857,10 @@
 msgid "cw_may_cross"
 msgstr ""
 
+msgctxt "CWRType"
 msgid "cw_may_cross_object"
 msgstr ""
 
-msgctxt "CWRType"
 msgid "cw_may_cross_object"
 msgstr ""
 
@@ -1877,9 +1877,6 @@
 msgid "cw_support"
 msgstr ""
 
-msgid "cw_support_object"
-msgstr ""
-
 msgctxt "CWEType"
 msgid "cw_support_object"
 msgstr ""
@@ -1888,6 +1885,9 @@
 msgid "cw_support_object"
 msgstr ""
 
+msgid "cw_support_object"
+msgstr ""
+
 msgid "cwetype-box"
 msgstr "Box-Ansicht"
 
@@ -1924,6 +1924,9 @@
 msgid "date"
 msgstr "Datum"
 
+msgid "day"
+msgstr ""
+
 msgid "deactivate"
 msgstr "deaktivieren"
 
@@ -1955,10 +1958,10 @@
 msgid "default_workflow"
 msgstr "Standard-Workflow"
 
+msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "Standard-Workflow von"
 
-msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "Standard-Workflow von"
 
@@ -2038,9 +2041,6 @@
 msgid "delete_permission"
 msgstr "Lösch-Berechtigung"
 
-msgid "delete_permission_object"
-msgstr "hat Lösch-Berechtigung"
-
 msgctxt "CWGroup"
 msgid "delete_permission_object"
 msgstr "hat Lösch-Berechtigung für"
@@ -2049,14 +2049,17 @@
 msgid "delete_permission_object"
 msgstr "hat die Berechtigung, zu löschen"
 
+msgid "delete_permission_object"
+msgstr "hat Lösch-Berechtigung"
+
 #, python-format
 msgid "deleted %(etype)s #%(eid)s (%(title)s)"
 msgstr "Löschen der Entität %(etype)s #%(eid)s (%(title)s)"
 
 #, python-format
 msgid ""
-"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 "Relation %(rtype)s von %(frometype)s #%(eidfrom)s zu %(toetype)s #%(eidto)s "
 "gelöscht"
@@ -2067,7 +2070,15 @@
 msgid "description"
 msgstr "Beschreibung"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description"
+msgstr "Beschreibung"
+
+msgctxt "CWRelation"
+msgid "description"
+msgstr "Beschreibung"
+
+msgctxt "Workflow"
 msgid "description"
 msgstr "Beschreibung"
 
@@ -2075,38 +2086,38 @@
 msgid "description"
 msgstr "Beschreibung"
 
-msgctxt "CWEType"
-msgid "description"
-msgstr "Beschreibung"
-
-msgctxt "CWRType"
-msgid "description"
-msgstr "Beschreibung"
-
-msgctxt "CWRelation"
-msgid "description"
-msgstr "Beschreibung"
-
-msgctxt "State"
-msgid "description"
-msgstr "Beschreibung"
-
 msgctxt "Transition"
 msgid "description"
 msgstr "Beschreibung"
 
-msgctxt "Workflow"
-msgid "description"
-msgstr "Beschreibung"
-
 msgctxt "WorkflowTransition"
 msgid "description"
 msgstr "Beschreibung"
 
+msgctxt "State"
+msgid "description"
+msgstr "Beschreibung"
+
+msgctxt "CWRType"
+msgid "description"
+msgstr "Beschreibung"
+
+msgctxt "BaseTransition"
+msgid "description"
+msgstr "Beschreibung"
+
 msgid "description_format"
 msgstr "Format"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description_format"
+msgstr "Format"
+
+msgctxt "CWRelation"
+msgid "description_format"
+msgstr "Format"
+
+msgctxt "Workflow"
 msgid "description_format"
 msgstr "Format"
 
@@ -2114,7 +2125,15 @@
 msgid "description_format"
 msgstr "Format"
 
-msgctxt "CWEType"
+msgctxt "Transition"
+msgid "description_format"
+msgstr "Format"
+
+msgctxt "WorkflowTransition"
+msgid "description_format"
+msgstr "Format"
+
+msgctxt "State"
 msgid "description_format"
 msgstr "Format"
 
@@ -2122,23 +2141,7 @@
 msgid "description_format"
 msgstr "Format"
 
-msgctxt "CWRelation"
-msgid "description_format"
-msgstr "Format"
-
-msgctxt "State"
-msgid "description_format"
-msgstr "Format"
-
-msgctxt "Transition"
-msgid "description_format"
-msgstr "Format"
-
-msgctxt "Workflow"
-msgid "description_format"
-msgstr "Format"
-
-msgctxt "WorkflowTransition"
+msgctxt "BaseTransition"
 msgid "description_format"
 msgstr "Format"
 
@@ -2161,18 +2164,18 @@
 msgid "destination_state"
 msgstr "Zielzustand"
 
+msgctxt "Transition"
+msgid "destination_state"
+msgstr "Zielzustand"
+
 msgctxt "SubWorkflowExitPoint"
 msgid "destination_state"
 msgstr "Zielzustand"
 
-msgctxt "Transition"
-msgid "destination_state"
-msgstr "Zielzustand"
-
+msgctxt "State"
 msgid "destination_state_object"
 msgstr "Ziel von"
 
-msgctxt "State"
 msgid "destination_state_object"
 msgstr "Ziel von"
 
@@ -2436,13 +2439,13 @@
 msgid "for_user"
 msgstr "für Nutzer"
 
-msgid "for_user_object"
-msgstr "hat als Eigenschaft"
-
 msgctxt "CWUser"
 msgid "for_user_object"
 msgstr "verwendet die Eigenschaften"
 
+msgid "for_user_object"
+msgstr "hat als Eigenschaft"
+
 msgid "friday"
 msgstr "Freitag"
 
@@ -2464,13 +2467,13 @@
 msgid "from_entity"
 msgstr "Relation der Entität"
 
-msgid "from_entity_object"
-msgstr "der Entität"
-
 msgctxt "CWEType"
 msgid "from_entity_object"
 msgstr "Subjektrelation"
 
+msgid "from_entity_object"
+msgstr "der Entität"
+
 msgid "from_interval_start"
 msgstr "Von"
 
@@ -2481,13 +2484,13 @@
 msgid "from_state"
 msgstr "Anfangszustand"
 
-msgid "from_state_object"
-msgstr "Übergänge aus diesem Zustand"
-
 msgctxt "State"
 msgid "from_state_object"
 msgstr "Anfangszustand von"
 
+msgid "from_state_object"
+msgstr "Übergänge aus diesem Zustand"
+
 msgid "full text or RQL query"
 msgstr "Volltextsuche oder RQL-Anfrage"
 
@@ -2533,16 +2536,16 @@
 "graphical representation of the %(etype)s entity type from %(appid)s data "
 "model"
 msgstr ""
-"graphische Darstellung des Datenmodells des Entitätstyps (etype)s von "
-"%(appid)s"
+"graphische Darstellung des Datenmodells des Entitätstyps (etype)s von %"
+"(appid)s"
 
 #, python-format
 msgid ""
 "graphical representation of the %(rtype)s relation type from %(appid)s data "
 "model"
 msgstr ""
-"graphische Darstellung des Datenmodells des Relationstyps %(rtype)s von "
-"%(appid)s"
+"graphische Darstellung des Datenmodells des Relationstyps %(rtype)s von %"
+"(appid)s"
 
 msgid "group in which a user should be to be allowed to pass this transition"
 msgstr ""
@@ -2572,6 +2575,9 @@
 msgid "header-right"
 msgstr ""
 
+msgid "help"
+msgstr ""
+
 msgid "hide filter form"
 msgstr "Filter verbergen"
 
@@ -2660,13 +2666,13 @@
 msgid "in_group"
 msgstr "gehört zu der Gruppe"
 
-msgid "in_group_object"
-msgstr "Mitglieder"
-
 msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "enthält die Nutzer"
 
+msgid "in_group_object"
+msgstr "Mitglieder"
+
 msgid "in_state"
 msgstr "Zustand"
 
@@ -2720,10 +2726,10 @@
 msgid "initial_state"
 msgstr "Anfangszustand"
 
+msgctxt "State"
 msgid "initial_state_object"
 msgstr "Anfangszustand von"
 
-msgctxt "State"
 msgid "initial_state_object"
 msgstr "Anfangszustand von"
 
@@ -2992,6 +2998,9 @@
 msgid "monday"
 msgstr "Montag"
 
+msgid "month"
+msgstr ""
+
 msgid "more actions"
 msgstr "weitere Aktionen"
 
@@ -3007,11 +3016,23 @@
 msgid "name"
 msgstr "Name"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "name"
+msgstr "Name"
+
+msgctxt "Transition"
 msgid "name"
 msgstr "Name"
 
-msgctxt "CWCache"
+msgctxt "CWSource"
+msgid "name"
+msgstr ""
+
+msgctxt "Workflow"
+msgid "name"
+msgstr "Name"
+
+msgctxt "CWGroup"
 msgid "name"
 msgstr "Name"
 
@@ -3019,11 +3040,11 @@
 msgid "name"
 msgstr "Name"
 
-msgctxt "CWEType"
+msgctxt "WorkflowTransition"
 msgid "name"
 msgstr "Name"
 
-msgctxt "CWGroup"
+msgctxt "State"
 msgid "name"
 msgstr "Name"
 
@@ -3035,23 +3056,11 @@
 msgid "name"
 msgstr "Name"
 
-msgctxt "CWSource"
-msgid "name"
-msgstr ""
-
-msgctxt "State"
+msgctxt "BaseTransition"
 msgid "name"
 msgstr "Name"
 
-msgctxt "Transition"
-msgid "name"
-msgstr "Name"
-
-msgctxt "Workflow"
-msgid "name"
-msgstr "Name"
-
-msgctxt "WorkflowTransition"
+msgctxt "CWCache"
 msgid "name"
 msgstr "Name"
 
@@ -3269,13 +3278,13 @@
 msgid "prefered_form"
 msgstr "bevorzugte form"
 
-msgid "prefered_form_object"
-msgstr "bevorzugte form vor"
-
 msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "bevorzugte form von"
 
+msgid "prefered_form_object"
+msgstr "bevorzugte form vor"
+
 msgid "preferences"
 msgstr "Einstellungen"
 
@@ -3292,13 +3301,13 @@
 msgid "primary_email"
 msgstr "primäre E-Mail-Adresse"
 
-msgid "primary_email_object"
-msgstr "Objekt der primären E-Mail-Adresse"
-
 msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "primäre E-Mail-Adresse von"
 
+msgid "primary_email_object"
+msgstr "Objekt der primären E-Mail-Adresse"
+
 msgid "profile"
 msgstr "Profil"
 
@@ -3323,11 +3332,11 @@
 msgid "read_permission"
 msgstr "Leseberechtigung"
 
-msgctxt "CWAttribute"
+msgctxt "CWEType"
 msgid "read_permission"
 msgstr "Leseberechtigung"
 
-msgctxt "CWEType"
+msgctxt "CWAttribute"
 msgid "read_permission"
 msgstr "Leseberechtigung"
 
@@ -3335,9 +3344,6 @@
 msgid "read_permission"
 msgstr "Leseberechtigung"
 
-msgid "read_permission_object"
-msgstr "hat eine Leseberechtigung"
-
 msgctxt "CWGroup"
 msgid "read_permission_object"
 msgstr "kann lesen"
@@ -3346,6 +3352,9 @@
 msgid "read_permission_object"
 msgstr "kann lesen"
 
+msgid "read_permission_object"
+msgstr "hat eine Leseberechtigung"
+
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
 
@@ -3382,13 +3391,13 @@
 msgid "relation_type"
 msgstr "Relationstyp"
 
-msgid "relation_type_object"
-msgstr "Definition"
-
 msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "definition"
 
+msgid "relation_type_object"
+msgstr "Definition"
+
 msgid "relations"
 msgstr "Relationen"
 
@@ -3399,12 +3408,12 @@
 msgid "relations deleted"
 msgstr "Relationen entfernt"
 
+msgctxt "CWRType"
 msgid "relations_object"
 msgstr "Relationen von"
 
-msgctxt "CWRType"
 msgid "relations_object"
-msgstr ""
+msgstr "Relationen von"
 
 msgid "relative url of the bookmarked page"
 msgstr "URL relativ zu der Seite"
@@ -3419,11 +3428,11 @@
 msgid "require_group"
 msgstr "auf Gruppe beschränkt"
 
-msgctxt "CWPermission"
+msgctxt "Transition"
 msgid "require_group"
 msgstr "auf Gruppe beschränkt"
 
-msgctxt "Transition"
+msgctxt "CWPermission"
 msgid "require_group"
 msgstr "auf Gruppe beschränkt"
 
@@ -3431,10 +3440,10 @@
 msgid "require_group"
 msgstr "auf Gruppe beschränkt"
 
+msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "hat die Rechte"
 
-msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "hat die Rechte"
 
@@ -3645,10 +3654,10 @@
 msgid "specializes"
 msgstr "spezialisiert"
 
+msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "Vorgänger von"
 
-msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "Vorgänger von"
 
@@ -3687,13 +3696,13 @@
 msgid "state_of"
 msgstr "Zustand von"
 
-msgid "state_of_object"
-msgstr "hat als Zustand"
-
 msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "enthält die Zustände"
 
+msgid "state_of_object"
+msgstr "hat als Zustand"
+
 msgid "status change"
 msgstr "Zustand ändern"
 
@@ -3736,20 +3745,20 @@
 msgid "subworkflow_exit"
 msgstr "Ende des Subworkflows"
 
-msgid "subworkflow_exit_object"
-msgstr "Endzustand"
-
 msgctxt "SubWorkflowExitPoint"
 msgid "subworkflow_exit_object"
 msgstr "Endzustände"
 
-msgid "subworkflow_object"
-msgstr "verwendet vom Übergang"
+msgid "subworkflow_exit_object"
+msgstr "Endzustand"
 
 msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "Subworkflow von"
 
+msgid "subworkflow_object"
+msgstr "verwendet vom Übergang"
+
 msgid "subworkflow_state"
 msgstr "Zustand des Subworkflows"
 
@@ -3757,10 +3766,10 @@
 msgid "subworkflow_state"
 msgstr "Zustand"
 
+msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "Endzustand von"
 
-msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "Endzustand von"
 
@@ -3875,10 +3884,10 @@
 msgid "to_entity"
 msgstr "für die Entität"
 
+msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "Objekt der Relation"
 
-msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "Objekt der Relation"
 
@@ -3892,13 +3901,16 @@
 msgid "to_state"
 msgstr "Zielstatus"
 
-msgid "to_state_object"
-msgstr "Übergänge zu dem Zustand"
-
 msgctxt "State"
 msgid "to_state_object"
 msgstr "Übergang zu diesem Zustand"
 
+msgid "to_state_object"
+msgstr "Übergänge zu dem Zustand"
+
+msgid "today"
+msgstr ""
+
 msgid "todo_by"
 msgstr "zu erledigen bis"
 
@@ -3943,10 +3955,10 @@
 msgid "transition_of"
 msgstr "Übergang des/der"
 
+msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "hat als Übergang"
 
-msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "hat als Übergang"
 
@@ -3963,10 +3975,6 @@
 msgid "type"
 msgstr "Typ"
 
-msgctxt "CWSource"
-msgid "type"
-msgstr ""
-
 msgctxt "Transition"
 msgid "type"
 msgstr "Typ"
@@ -3975,6 +3983,10 @@
 msgid "type"
 msgstr "Typ"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr ""
+
 msgid "type here a sparql query"
 msgstr "Geben sie eine sparql-Anfrage ein"
 
@@ -4055,17 +4067,14 @@
 msgid "update_permission"
 msgstr "Änderungsrecht"
 
+msgctxt "CWEType"
+msgid "update_permission"
+msgstr "Änderungsrecht"
+
 msgctxt "CWAttribute"
 msgid "update_permission"
 msgstr "Änderungsrecht"
 
-msgctxt "CWEType"
-msgid "update_permission"
-msgstr "Änderungsrecht"
-
-msgid "update_permission_object"
-msgstr "hat die Änderungsberechtigung"
-
 msgctxt "CWGroup"
 msgid "update_permission_object"
 msgstr "kann ändern"
@@ -4074,6 +4083,9 @@
 msgid "update_permission_object"
 msgstr "kann ändern"
 
+msgid "update_permission_object"
+msgstr "hat die Änderungsberechtigung"
+
 msgid "update_relation"
 msgstr "aktualisieren"
 
@@ -4110,13 +4122,13 @@
 msgid "use_email"
 msgstr "verwendet die E-Mail-Adresse"
 
-msgid "use_email_object"
-msgstr "Adresse verwendet von"
-
 msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "verwendet von"
 
+msgid "use_email_object"
+msgstr "Adresse verwendet von"
+
 msgid "use_template_format"
 msgstr "Benutzung des 'cubicweb template'-Formats"
 
@@ -4306,10 +4318,10 @@
 msgid "workflow_of"
 msgstr "Workflow von"
 
+msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "hat als Workflow"
 
-msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "hat als Workflow"
 
--- a/i18n/en.po	Tue Feb 01 10:10:46 2011 +0100
+++ b/i18n/en.po	Tue Feb 01 11:52:10 2011 +0100
@@ -8,10 +8,10 @@
 "PO-Revision-Date: 2010-09-15 14:55+0200\n"
 "Last-Translator: Sylvain Thenault <sylvain.thenault@logilab.fr>\n"
 "Language-Team: English <devel@logilab.fr.org>\n"
-"Language: en\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: en\n"
 "Generated-By: pygettext.py 1.5\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
@@ -415,10 +415,10 @@
 msgid "Download schema as OWL"
 msgstr ""
 
+msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Email address"
 
-msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Email address"
 
@@ -1011,9 +1011,6 @@
 msgid "add_permission"
 msgstr "add permission"
 
-msgid "add_permission_object"
-msgstr "has permission to add"
-
 msgctxt "CWGroup"
 msgid "add_permission_object"
 msgstr "can add"
@@ -1022,6 +1019,9 @@
 msgid "add_permission_object"
 msgstr "used to define add permission on"
 
+msgid "add_permission_object"
+msgstr "has permission to add"
+
 msgid "add_relation"
 msgstr "add"
 
@@ -1031,8 +1031,8 @@
 
 #, python-format
 msgid ""
-"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 
 msgid "addrelated"
@@ -1065,9 +1065,6 @@
 msgid "allowed_transition"
 msgstr "allowed transition"
 
-msgid "allowed_transition_object"
-msgstr "incoming states"
-
 msgctxt "BaseTransition"
 msgid "allowed_transition_object"
 msgstr "incoming states"
@@ -1080,6 +1077,9 @@
 msgid "allowed_transition_object"
 msgstr "incoming states"
 
+msgid "allowed_transition_object"
+msgstr "incoming states"
+
 msgid "am/pm calendar (month)"
 msgstr ""
 
@@ -1171,13 +1171,13 @@
 msgid "bookmarked_by"
 msgstr "bookmarked by"
 
-msgid "bookmarked_by_object"
-msgstr "has bookmarks"
-
 msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "uses bookmarks"
 
+msgid "bookmarked_by_object"
+msgstr "has bookmarks"
+
 msgid "bookmarks"
 msgstr ""
 
@@ -1215,9 +1215,6 @@
 msgid "by_transition"
 msgstr "by transition"
 
-msgid "by_transition_object"
-msgstr "transition information"
-
 msgctxt "BaseTransition"
 msgid "by_transition_object"
 msgstr "transition information"
@@ -1230,6 +1227,9 @@
 msgid "by_transition_object"
 msgstr "transition information"
 
+msgid "by_transition_object"
+msgstr "transition information"
+
 msgid "calendar"
 msgstr ""
 
@@ -1384,10 +1384,10 @@
 msgid "condition"
 msgstr "condition"
 
+msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condition of"
 
-msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condition of"
 
@@ -1397,11 +1397,11 @@
 msgid "config"
 msgstr ""
 
-msgctxt "CWSource"
+msgctxt "CWSourceHostConfig"
 msgid "config"
 msgstr ""
 
-msgctxt "CWSourceHostConfig"
+msgctxt "CWSource"
 msgid "config"
 msgstr ""
 
@@ -1425,10 +1425,10 @@
 msgid "constrained_by"
 msgstr "constrained by"
 
+msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "constraints"
 
-msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "constraints"
 
@@ -1442,10 +1442,10 @@
 msgid "constraint_of"
 msgstr "constraint of"
 
+msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "constrained by"
 
-msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "constrained by"
 
@@ -1536,8 +1536,8 @@
 msgstr "creating relation %(linkto)s"
 
 msgid ""
-"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
-"%(linkto)s)"
+"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource %"
+"(linkto)s)"
 msgstr "creating host configuration for source %(linkto)s"
 
 msgid ""
@@ -1626,8 +1626,8 @@
 msgstr "creating workflow-transition leading to state %(linkto)s"
 
 msgid ""
-"creating WorkflowTransition (WorkflowTransition transition_of Workflow "
-"%(linkto)s)"
+"creating WorkflowTransition (WorkflowTransition transition_of Workflow %"
+"(linkto)s)"
 msgstr "creating workflow-transition of workflow %(linkto)s"
 
 msgid "creation"
@@ -1649,13 +1649,13 @@
 msgid "cstrtype"
 msgstr "constraint type"
 
-msgid "cstrtype_object"
-msgstr "used by"
-
 msgctxt "CWConstraintType"
 msgid "cstrtype_object"
 msgstr "constraint type of"
 
+msgid "cstrtype_object"
+msgstr "used by"
+
 msgid "csv entities export"
 msgstr ""
 
@@ -1782,10 +1782,10 @@
 msgid "cw_dont_cross"
 msgstr ""
 
+msgctxt "CWRType"
 msgid "cw_dont_cross_object"
 msgstr ""
 
-msgctxt "CWRType"
 msgid "cw_dont_cross_object"
 msgstr ""
 
@@ -1796,10 +1796,10 @@
 msgid "cw_host_config_of"
 msgstr ""
 
+msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr ""
 
-msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr ""
 
@@ -1810,10 +1810,10 @@
 msgid "cw_may_cross"
 msgstr ""
 
+msgctxt "CWRType"
 msgid "cw_may_cross_object"
 msgstr ""
 
-msgctxt "CWRType"
 msgid "cw_may_cross_object"
 msgstr ""
 
@@ -1830,9 +1830,6 @@
 msgid "cw_support"
 msgstr ""
 
-msgid "cw_support_object"
-msgstr ""
-
 msgctxt "CWEType"
 msgid "cw_support_object"
 msgstr ""
@@ -1841,6 +1838,9 @@
 msgid "cw_support_object"
 msgstr ""
 
+msgid "cw_support_object"
+msgstr ""
+
 msgid "cwetype-box"
 msgstr "\"box\" view"
 
@@ -1877,6 +1877,9 @@
 msgid "date"
 msgstr ""
 
+msgid "day"
+msgstr ""
+
 msgid "deactivate"
 msgstr ""
 
@@ -1908,10 +1911,10 @@
 msgid "default_workflow"
 msgstr "default workflow"
 
+msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "default workflow of"
 
-msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "default workflow of"
 
@@ -1987,9 +1990,6 @@
 msgid "delete_permission"
 msgstr "delete_permission"
 
-msgid "delete_permission_object"
-msgstr "has permission to delete"
-
 msgctxt "CWGroup"
 msgid "delete_permission_object"
 msgstr "has permission to delete"
@@ -1998,14 +1998,17 @@
 msgid "delete_permission_object"
 msgstr "has permission to delete"
 
+msgid "delete_permission_object"
+msgstr "has permission to delete"
+
 #, python-format
 msgid "deleted %(etype)s #%(eid)s (%(title)s)"
 msgstr ""
 
 #, python-format
 msgid ""
-"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 
 msgid "depends on the constraint type"
@@ -2014,7 +2017,15 @@
 msgid "description"
 msgstr "description"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description"
+msgstr "description"
+
+msgctxt "CWRelation"
+msgid "description"
+msgstr "description"
+
+msgctxt "Workflow"
 msgid "description"
 msgstr "description"
 
@@ -2022,38 +2033,38 @@
 msgid "description"
 msgstr "description"
 
-msgctxt "CWEType"
-msgid "description"
-msgstr "description"
-
-msgctxt "CWRType"
-msgid "description"
-msgstr "description"
-
-msgctxt "CWRelation"
-msgid "description"
-msgstr "description"
-
-msgctxt "State"
-msgid "description"
-msgstr "description"
-
 msgctxt "Transition"
 msgid "description"
 msgstr "description"
 
-msgctxt "Workflow"
-msgid "description"
-msgstr "description"
-
 msgctxt "WorkflowTransition"
 msgid "description"
 msgstr "description"
 
+msgctxt "State"
+msgid "description"
+msgstr "description"
+
+msgctxt "CWRType"
+msgid "description"
+msgstr "description"
+
+msgctxt "BaseTransition"
+msgid "description"
+msgstr "description"
+
 msgid "description_format"
 msgstr "format"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "CWRelation"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "Workflow"
 msgid "description_format"
 msgstr "format"
 
@@ -2061,7 +2072,15 @@
 msgid "description_format"
 msgstr "format"
 
-msgctxt "CWEType"
+msgctxt "Transition"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "WorkflowTransition"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "State"
 msgid "description_format"
 msgstr "format"
 
@@ -2069,23 +2088,7 @@
 msgid "description_format"
 msgstr "format"
 
-msgctxt "CWRelation"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "State"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "Transition"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "Workflow"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "WorkflowTransition"
+msgctxt "BaseTransition"
 msgid "description_format"
 msgstr "format"
 
@@ -2106,18 +2109,18 @@
 msgid "destination_state"
 msgstr "destination state"
 
+msgctxt "Transition"
+msgid "destination_state"
+msgstr "destination state"
+
 msgctxt "SubWorkflowExitPoint"
 msgid "destination_state"
 msgstr "destination state"
 
-msgctxt "Transition"
-msgid "destination_state"
-msgstr "destination state"
-
+msgctxt "State"
 msgid "destination_state_object"
 msgstr "destination of"
 
-msgctxt "State"
 msgid "destination_state_object"
 msgstr "destination of"
 
@@ -2376,13 +2379,13 @@
 msgid "for_user"
 msgstr "for user"
 
-msgid "for_user_object"
-msgstr "use properties"
-
 msgctxt "CWUser"
 msgid "for_user_object"
 msgstr "property of"
 
+msgid "for_user_object"
+msgstr "use properties"
+
 msgid "friday"
 msgstr ""
 
@@ -2404,13 +2407,13 @@
 msgid "from_entity"
 msgstr "from entity"
 
-msgid "from_entity_object"
-msgstr "subjet relation"
-
 msgctxt "CWEType"
 msgid "from_entity_object"
 msgstr "subjec relation"
 
+msgid "from_entity_object"
+msgstr "subjet relation"
+
 msgid "from_interval_start"
 msgstr "from"
 
@@ -2421,10 +2424,10 @@
 msgid "from_state"
 msgstr "from state"
 
+msgctxt "State"
 msgid "from_state_object"
 msgstr "transitions from this state"
 
-msgctxt "State"
 msgid "from_state_object"
 msgstr "transitions from this state"
 
@@ -2505,6 +2508,9 @@
 msgid "header-right"
 msgstr "header (right)"
 
+msgid "help"
+msgstr ""
+
 msgid "hide filter form"
 msgstr ""
 
@@ -2585,10 +2591,10 @@
 msgid "in_group"
 msgstr "in group"
 
+msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "contains"
 
-msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "contains"
 
@@ -2643,10 +2649,10 @@
 msgid "initial_state"
 msgstr "initial state"
 
+msgctxt "State"
 msgid "initial_state_object"
 msgstr "initial state of"
 
-msgctxt "State"
 msgid "initial_state_object"
 msgstr "initial state of"
 
@@ -2903,6 +2909,9 @@
 msgid "monday"
 msgstr ""
 
+msgid "month"
+msgstr ""
+
 msgid "more actions"
 msgstr ""
 
@@ -2918,19 +2927,19 @@
 msgid "name"
 msgstr ""
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
 msgid "name"
-msgstr "name"
-
-msgctxt "CWCache"
+msgstr ""
+
+msgctxt "Transition"
 msgid "name"
-msgstr "name"
-
-msgctxt "CWConstraintType"
+msgstr ""
+
+msgctxt "CWSource"
 msgid "name"
 msgstr ""
 
-msgctxt "CWEType"
+msgctxt "Workflow"
 msgid "name"
 msgstr ""
 
@@ -2938,6 +2947,18 @@
 msgid "name"
 msgstr ""
 
+msgctxt "CWConstraintType"
+msgid "name"
+msgstr ""
+
+msgctxt "WorkflowTransition"
+msgid "name"
+msgstr ""
+
+msgctxt "State"
+msgid "name"
+msgstr "name"
+
 msgctxt "CWPermission"
 msgid "name"
 msgstr "name"
@@ -2946,25 +2967,13 @@
 msgid "name"
 msgstr "name"
 
-msgctxt "CWSource"
-msgid "name"
-msgstr ""
-
-msgctxt "State"
+msgctxt "BaseTransition"
 msgid "name"
 msgstr "name"
 
-msgctxt "Transition"
-msgid "name"
-msgstr ""
-
-msgctxt "Workflow"
+msgctxt "CWCache"
 msgid "name"
-msgstr ""
-
-msgctxt "WorkflowTransition"
-msgid "name"
-msgstr ""
+msgstr "name"
 
 msgid "name of the cache"
 msgstr ""
@@ -3177,10 +3186,10 @@
 msgid "prefered_form"
 msgstr "prefered form"
 
+msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "prefered over"
 
-msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "prefered over"
 
@@ -3200,10 +3209,10 @@
 msgid "primary_email"
 msgstr "primary email"
 
+msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "primary email of"
 
-msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "primary email of"
 
@@ -3231,11 +3240,11 @@
 msgid "read_permission"
 msgstr "can be read by"
 
-msgctxt "CWAttribute"
+msgctxt "CWEType"
 msgid "read_permission"
 msgstr "read permission"
 
-msgctxt "CWEType"
+msgctxt "CWAttribute"
 msgid "read_permission"
 msgstr "read permission"
 
@@ -3243,9 +3252,6 @@
 msgid "read_permission"
 msgstr "read permission"
 
-msgid "read_permission_object"
-msgstr "has permission to read"
-
 msgctxt "CWGroup"
 msgid "read_permission_object"
 msgstr "can be read by"
@@ -3254,6 +3260,9 @@
 msgid "read_permission_object"
 msgstr "can be read by"
 
+msgid "read_permission_object"
+msgstr "has permission to read"
+
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
 
@@ -3290,10 +3299,10 @@
 msgid "relation_type"
 msgstr "relation type"
 
+msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "relation definitions"
 
-msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "relation definitions"
 
@@ -3307,6 +3316,7 @@
 msgid "relations deleted"
 msgstr ""
 
+msgctxt "CWAttribute"
 msgid "relations_object"
 msgstr "constrained by"
 
@@ -3314,6 +3324,9 @@
 msgid "relations_object"
 msgstr "constrained by"
 
+msgid "relations_object"
+msgstr "constrained by"
+
 msgid "relative url of the bookmarked page"
 msgstr ""
 
@@ -3327,11 +3340,11 @@
 msgid "require_group"
 msgstr "require group"
 
-msgctxt "CWPermission"
+msgctxt "Transition"
 msgid "require_group"
 msgstr "require group"
 
-msgctxt "Transition"
+msgctxt "CWPermission"
 msgid "require_group"
 msgstr "require group"
 
@@ -3339,10 +3352,10 @@
 msgid "require_group"
 msgstr "require group"
 
+msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "required by"
 
-msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "required by"
 
@@ -3543,10 +3556,10 @@
 msgid "specializes"
 msgstr "specializes"
 
+msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "specialized by"
 
-msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "specialized by"
 
@@ -3583,10 +3596,10 @@
 msgid "state_of"
 msgstr "state of"
 
+msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "use states"
 
-msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "use states"
 
@@ -3630,17 +3643,17 @@
 msgid "subworkflow_exit"
 msgstr "subworkflow exit"
 
-msgid "subworkflow_exit_object"
-msgstr "subworkflow exit of"
-
 msgctxt "SubWorkflowExitPoint"
 msgid "subworkflow_exit_object"
 msgstr "subworkflow exit of"
 
+msgid "subworkflow_exit_object"
+msgstr "subworkflow exit of"
+
+msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "subworkflow of"
 
-msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "subworkflow of"
 
@@ -3651,10 +3664,10 @@
 msgid "subworkflow_state"
 msgstr "subworkflow state"
 
+msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "exit point"
 
-msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "exit point"
 
@@ -3768,10 +3781,10 @@
 msgid "to_entity"
 msgstr "to entity"
 
+msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "object relations"
 
-msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "object relations"
 
@@ -3785,13 +3798,16 @@
 msgid "to_state"
 msgstr "to state"
 
-msgid "to_state_object"
-msgstr "transitions to this state"
-
 msgctxt "State"
 msgid "to_state_object"
 msgstr "transitions to this state"
 
+msgid "to_state_object"
+msgstr "transitions to this state"
+
+msgid "today"
+msgstr ""
+
 msgid "todo_by"
 msgstr "to do by"
 
@@ -3836,10 +3852,10 @@
 msgid "transition_of"
 msgstr "transition of"
 
+msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "use transitions"
 
-msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "use transitions"
 
@@ -3856,10 +3872,6 @@
 msgid "type"
 msgstr "type"
 
-msgctxt "CWSource"
-msgid "type"
-msgstr ""
-
 msgctxt "Transition"
 msgid "type"
 msgstr "type"
@@ -3868,6 +3880,10 @@
 msgid "type"
 msgstr "type"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr ""
+
 msgid "type here a sparql query"
 msgstr ""
 
@@ -3948,17 +3964,14 @@
 msgid "update_permission"
 msgstr "can be updated by"
 
+msgctxt "CWEType"
+msgid "update_permission"
+msgstr "can be updated by"
+
 msgctxt "CWAttribute"
 msgid "update_permission"
 msgstr "can be updated by"
 
-msgctxt "CWEType"
-msgid "update_permission"
-msgstr "can be updated by"
-
-msgid "update_permission_object"
-msgstr "has permission to update"
-
 msgctxt "CWGroup"
 msgid "update_permission_object"
 msgstr "has permission to update"
@@ -3967,6 +3980,9 @@
 msgid "update_permission_object"
 msgstr "has permission to update"
 
+msgid "update_permission_object"
+msgstr "has permission to update"
+
 msgid "update_relation"
 msgstr "update"
 
@@ -4000,10 +4016,10 @@
 msgid "use_email"
 msgstr "use email"
 
+msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "used by"
 
-msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "used by"
 
@@ -4186,10 +4202,10 @@
 msgid "workflow_of"
 msgstr "workflow of"
 
+msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "may use workflow"
 
-msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "may use workflow"
 
--- a/i18n/es.po	Tue Feb 01 10:10:46 2011 +0100
+++ b/i18n/es.po	Tue Feb 01 11:52:10 2011 +0100
@@ -8,10 +8,10 @@
 "Last-Translator: Celso Flores<celso.flores@crealibre.com>, Carlos Balderas "
 "<carlos.balderas@crealibre.com>\n"
 "Language-Team: es <contact@logilab.fr>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
 
 #, python-format
 msgid ""
@@ -25,8 +25,8 @@
 "url: %(url)s\n"
 msgstr ""
 "\n"
-"%(user)s ha cambiado su estado de <%(previous_state)s> hacia <"
-"%(current_state)s> por la entidad\n"
+"%(user)s ha cambiado su estado de <%(previous_state)s> hacia <%"
+"(current_state)s> por la entidad\n"
 "'%(title)s'\n"
 "\n"
 "%(comment)s\n"
@@ -436,10 +436,10 @@
 msgid "Download schema as OWL"
 msgstr "Descargar el esquema en formato OWL"
 
+msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Correo Electrónico"
 
-msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Correo Electrónico"
 
@@ -1053,9 +1053,6 @@
 msgid "add_permission"
 msgstr "Permiso de agregar"
 
-msgid "add_permission_object"
-msgstr "tiene permiso de agregar"
-
 msgctxt "CWGroup"
 msgid "add_permission_object"
 msgstr "tiene permiso de agregar"
@@ -1064,6 +1061,9 @@
 msgid "add_permission_object"
 msgstr "tiene permiso de agregar"
 
+msgid "add_permission_object"
+msgstr "tiene permiso de agregar"
+
 msgid "add_relation"
 msgstr "agregar"
 
@@ -1073,8 +1073,8 @@
 
 #, python-format
 msgid ""
-"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 "la relación %(rtype)s de %(frometype)s #%(eidfrom)s a %(toetype)s #%(eidto)s "
 "ha sido agregada"
@@ -1109,9 +1109,6 @@
 msgid "allowed_transition"
 msgstr "transiciones autorizadas"
 
-msgid "allowed_transition_object"
-msgstr "Estados de entrada"
-
 msgctxt "BaseTransition"
 msgid "allowed_transition_object"
 msgstr "transición autorizada de"
@@ -1124,6 +1121,9 @@
 msgid "allowed_transition_object"
 msgstr "transición autorizada de"
 
+msgid "allowed_transition_object"
+msgstr "Estados de entrada"
+
 msgid "am/pm calendar (month)"
 msgstr "calendario am/pm (mes)"
 
@@ -1217,10 +1217,10 @@
 msgid "bookmarked_by"
 msgstr "está en los Favoritos de"
 
+msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "tiene como Favoritos"
 
-msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "tiene como Favoritos"
 
@@ -1261,9 +1261,6 @@
 msgid "by_transition"
 msgstr "transición"
 
-msgid "by_transition_object"
-msgstr "cambio de estados"
-
 msgctxt "BaseTransition"
 msgid "by_transition_object"
 msgstr "tiene como información"
@@ -1276,6 +1273,9 @@
 msgid "by_transition_object"
 msgstr "tiene como información"
 
+msgid "by_transition_object"
+msgstr "cambio de estados"
+
 msgid "calendar"
 msgstr "mostrar un calendario"
 
@@ -1434,10 +1434,10 @@
 msgid "condition"
 msgstr "condición"
 
+msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condición de"
 
-msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condición de"
 
@@ -1447,11 +1447,11 @@
 msgid "config"
 msgstr ""
 
-msgctxt "CWSource"
+msgctxt "CWSourceHostConfig"
 msgid "config"
 msgstr ""
 
-msgctxt "CWSourceHostConfig"
+msgctxt "CWSource"
 msgid "config"
 msgstr ""
 
@@ -1475,10 +1475,10 @@
 msgid "constrained_by"
 msgstr "Restricción impuesta por"
 
+msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "Restricción de"
 
-msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "Restricción de"
 
@@ -1492,10 +1492,10 @@
 msgid "constraint_of"
 msgstr ""
 
+msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr ""
 
-msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr ""
 
@@ -1593,8 +1593,8 @@
 msgstr "Creación de la relación %(linkto)s"
 
 msgid ""
-"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
-"%(linkto)s)"
+"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource %"
+"(linkto)s)"
 msgstr ""
 
 msgid ""
@@ -1687,8 +1687,8 @@
 "Creación de una Transición Workflow permitida desde el estado %(linkto)s"
 
 msgid ""
-"creating WorkflowTransition (WorkflowTransition transition_of Workflow "
-"%(linkto)s)"
+"creating WorkflowTransition (WorkflowTransition transition_of Workflow %"
+"(linkto)s)"
 msgstr "Creación de una Transición Workflow del Workflow %(linkto)s"
 
 msgid "creation"
@@ -1710,13 +1710,13 @@
 msgid "cstrtype"
 msgstr "Tipo"
 
-msgid "cstrtype_object"
-msgstr "utilizado por"
-
 msgctxt "CWConstraintType"
 msgid "cstrtype_object"
 msgstr "Tipo de restricciones"
 
+msgid "cstrtype_object"
+msgstr "utilizado por"
+
 msgid "csv entities export"
 msgstr "Exportar entidades en csv"
 
@@ -1846,10 +1846,10 @@
 msgid "cw_dont_cross"
 msgstr ""
 
+msgctxt "CWRType"
 msgid "cw_dont_cross_object"
 msgstr ""
 
-msgctxt "CWRType"
 msgid "cw_dont_cross_object"
 msgstr ""
 
@@ -1860,10 +1860,10 @@
 msgid "cw_host_config_of"
 msgstr ""
 
+msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr ""
 
-msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr ""
 
@@ -1874,10 +1874,10 @@
 msgid "cw_may_cross"
 msgstr ""
 
+msgctxt "CWRType"
 msgid "cw_may_cross_object"
 msgstr ""
 
-msgctxt "CWRType"
 msgid "cw_may_cross_object"
 msgstr ""
 
@@ -1894,9 +1894,6 @@
 msgid "cw_support"
 msgstr ""
 
-msgid "cw_support_object"
-msgstr ""
-
 msgctxt "CWEType"
 msgid "cw_support_object"
 msgstr ""
@@ -1905,6 +1902,9 @@
 msgid "cw_support_object"
 msgstr ""
 
+msgid "cw_support_object"
+msgstr ""
+
 msgid "cwetype-box"
 msgstr "Vista \"caja\""
 
@@ -1941,6 +1941,9 @@
 msgid "date"
 msgstr "Fecha"
 
+msgid "day"
+msgstr ""
+
 msgid "deactivate"
 msgstr "Desactivar"
 
@@ -1973,10 +1976,10 @@
 msgid "default_workflow"
 msgstr "Workflow por defecto"
 
+msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "Workflow por defecto de"
 
-msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "Workflow por defecto de"
 
@@ -2062,9 +2065,6 @@
 msgid "delete_permission"
 msgstr "Permiso de eliminar"
 
-msgid "delete_permission_object"
-msgstr "posee permiso para eliminar"
-
 msgctxt "CWGroup"
 msgid "delete_permission_object"
 msgstr "puede eliminar"
@@ -2073,14 +2073,17 @@
 msgid "delete_permission_object"
 msgstr "puede eliminar"
 
+msgid "delete_permission_object"
+msgstr "posee permiso para eliminar"
+
 #, python-format
 msgid "deleted %(etype)s #%(eid)s (%(title)s)"
 msgstr "Eliminación de la entidad %(etype)s #%(eid)s (%(title)s)"
 
 #, python-format
 msgid ""
-"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 "La relación %(rtype)s de %(frometype)s #%(eidfrom)s a %(toetype)s #%(eidto)s "
 "ha sido suprimida."
@@ -2091,7 +2094,15 @@
 msgid "description"
 msgstr "Descripción"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description"
+msgstr "Descripción"
+
+msgctxt "CWRelation"
+msgid "description"
+msgstr "Descripción"
+
+msgctxt "Workflow"
 msgid "description"
 msgstr "Descripción"
 
@@ -2099,38 +2110,38 @@
 msgid "description"
 msgstr "Descripción"
 
-msgctxt "CWEType"
-msgid "description"
-msgstr "Descripción"
-
-msgctxt "CWRType"
-msgid "description"
-msgstr "Descripción"
-
-msgctxt "CWRelation"
-msgid "description"
-msgstr "Descripción"
-
-msgctxt "State"
-msgid "description"
-msgstr "Descripción"
-
 msgctxt "Transition"
 msgid "description"
 msgstr "Descripción"
 
-msgctxt "Workflow"
-msgid "description"
-msgstr "Descripción"
-
 msgctxt "WorkflowTransition"
 msgid "description"
 msgstr "Descripción"
 
+msgctxt "State"
+msgid "description"
+msgstr "Descripción"
+
+msgctxt "CWRType"
+msgid "description"
+msgstr "Descripción"
+
+msgctxt "BaseTransition"
+msgid "description"
+msgstr "Descripción"
+
 msgid "description_format"
 msgstr "Formato"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description_format"
+msgstr "Formato"
+
+msgctxt "CWRelation"
+msgid "description_format"
+msgstr "Formato"
+
+msgctxt "Workflow"
 msgid "description_format"
 msgstr "Formato"
 
@@ -2138,7 +2149,15 @@
 msgid "description_format"
 msgstr "Formato"
 
-msgctxt "CWEType"
+msgctxt "Transition"
+msgid "description_format"
+msgstr "Formato"
+
+msgctxt "WorkflowTransition"
+msgid "description_format"
+msgstr "Formato"
+
+msgctxt "State"
 msgid "description_format"
 msgstr "Formato"
 
@@ -2146,23 +2165,7 @@
 msgid "description_format"
 msgstr "Formato"
 
-msgctxt "CWRelation"
-msgid "description_format"
-msgstr "Formato"
-
-msgctxt "State"
-msgid "description_format"
-msgstr "Formato"
-
-msgctxt "Transition"
-msgid "description_format"
-msgstr "Formato"
-
-msgctxt "Workflow"
-msgid "description_format"
-msgstr "Formato"
-
-msgctxt "WorkflowTransition"
+msgctxt "BaseTransition"
 msgid "description_format"
 msgstr "Formato"
 
@@ -2188,21 +2191,21 @@
 msgid "destination_state"
 msgstr "Estado destino"
 
+msgctxt "Transition"
+msgid "destination_state"
+msgstr "Estado destino"
+
 msgctxt "SubWorkflowExitPoint"
 msgid "destination_state"
 msgstr "Estado destino"
 
-msgctxt "Transition"
-msgid "destination_state"
-msgstr "Estado destino"
-
-msgid "destination_state_object"
-msgstr "Destino de"
-
 msgctxt "State"
 msgid "destination_state_object"
 msgstr "Estado final de"
 
+msgid "destination_state_object"
+msgstr "Destino de"
+
 msgid "detach attached file"
 msgstr "soltar el archivo existente"
 
@@ -2465,13 +2468,13 @@
 msgid "for_user"
 msgstr "Propiedad del Usuario"
 
-msgid "for_user_object"
-msgstr "Utiliza las propiedades"
-
 msgctxt "CWUser"
 msgid "for_user_object"
 msgstr "Tiene como preferencia"
 
+msgid "for_user_object"
+msgstr "Utiliza las propiedades"
+
 msgid "friday"
 msgstr "Viernes"
 
@@ -2493,13 +2496,13 @@
 msgid "from_entity"
 msgstr "Relación de la entidad"
 
-msgid "from_entity_object"
-msgstr "Relación sujeto"
-
 msgctxt "CWEType"
 msgid "from_entity_object"
 msgstr "Entidad de"
 
+msgid "from_entity_object"
+msgstr "Relación sujeto"
+
 msgid "from_interval_start"
 msgstr "De"
 
@@ -2510,13 +2513,13 @@
 msgid "from_state"
 msgstr "Estado de Inicio"
 
-msgid "from_state_object"
-msgstr "Transiciones desde este estado"
-
 msgctxt "State"
 msgid "from_state_object"
 msgstr "Estado de Inicio de"
 
+msgid "from_state_object"
+msgstr "Transiciones desde este estado"
+
 msgid "full text or RQL query"
 msgstr "Texto de búsqueda o demanda RQL"
 
@@ -2570,8 +2573,8 @@
 "graphical representation of the %(rtype)s relation type from %(appid)s data "
 "model"
 msgstr ""
-"Representación gráfica del modelo de datos para el tipo de relación "
-"%(rtype)s de %(appid)s"
+"Representación gráfica del modelo de datos para el tipo de relación %(rtype)"
+"s de %(appid)s"
 
 msgid "group in which a user should be to be allowed to pass this transition"
 msgstr "Grupo en el cual el usuario debe estar lograr la transición"
@@ -2600,6 +2603,9 @@
 msgid "header-right"
 msgstr ""
 
+msgid "help"
+msgstr ""
+
 msgid "hide filter form"
 msgstr "Esconder el filtro"
 
@@ -2689,13 +2695,13 @@
 msgid "in_group"
 msgstr "Forma parte del grupo"
 
-msgid "in_group_object"
-msgstr "Miembros"
-
 msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "Contiene los usuarios"
 
+msgid "in_group_object"
+msgstr "Miembros"
+
 msgid "in_state"
 msgstr "Estado"
 
@@ -2748,10 +2754,10 @@
 msgid "initial_state"
 msgstr "Estado inicial"
 
+msgctxt "State"
 msgid "initial_state_object"
 msgstr "Estado inicial de"
 
-msgctxt "State"
 msgid "initial_state_object"
 msgstr "Estado inicial de"
 
@@ -3017,6 +3023,9 @@
 msgid "monday"
 msgstr "Lunes"
 
+msgid "month"
+msgstr ""
+
 msgid "more actions"
 msgstr "Más acciones"
 
@@ -3032,11 +3041,23 @@
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "name"
+msgstr "Nombre"
+
+msgctxt "Transition"
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "CWCache"
+msgctxt "CWSource"
+msgid "name"
+msgstr ""
+
+msgctxt "Workflow"
+msgid "name"
+msgstr "Nombre"
+
+msgctxt "CWGroup"
 msgid "name"
 msgstr "Nombre"
 
@@ -3044,11 +3065,11 @@
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "CWEType"
+msgctxt "WorkflowTransition"
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "CWGroup"
+msgctxt "State"
 msgid "name"
 msgstr "Nombre"
 
@@ -3060,23 +3081,11 @@
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "CWSource"
-msgid "name"
-msgstr ""
-
-msgctxt "State"
+msgctxt "BaseTransition"
 msgid "name"
 msgstr "Nombre"
 
-msgctxt "Transition"
-msgid "name"
-msgstr "Nombre"
-
-msgctxt "Workflow"
-msgid "name"
-msgstr "Nombre"
-
-msgctxt "WorkflowTransition"
+msgctxt "CWCache"
 msgid "name"
 msgstr "Nombre"
 
@@ -3292,13 +3301,13 @@
 msgid "prefered_form"
 msgstr "Email principal"
 
-msgid "prefered_form_object"
-msgstr "Formato preferido sobre"
-
 msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "Email principal de"
 
+msgid "prefered_form_object"
+msgstr "Formato preferido sobre"
+
 msgid "preferences"
 msgstr "Preferencias"
 
@@ -3315,13 +3324,13 @@
 msgid "primary_email"
 msgstr "Dirección principal de correo electrónico"
 
-msgid "primary_email_object"
-msgstr "Dirección de email principal (objeto)"
-
 msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "Dirección principal de correo electrónico de"
 
+msgid "primary_email_object"
+msgstr "Dirección de email principal (objeto)"
+
 msgid "profile"
 msgstr ""
 
@@ -3346,11 +3355,11 @@
 msgid "read_permission"
 msgstr "Permiso de lectura"
 
-msgctxt "CWAttribute"
+msgctxt "CWEType"
 msgid "read_permission"
 msgstr "Permiso de Lectura"
 
-msgctxt "CWEType"
+msgctxt "CWAttribute"
 msgid "read_permission"
 msgstr "Permiso de Lectura"
 
@@ -3358,9 +3367,6 @@
 msgid "read_permission"
 msgstr "Permiso de Lectura"
 
-msgid "read_permission_object"
-msgstr "Tiene acceso de lectura a"
-
 msgctxt "CWGroup"
 msgid "read_permission_object"
 msgstr "Puede leer"
@@ -3369,6 +3375,9 @@
 msgid "read_permission_object"
 msgstr "Puede leer"
 
+msgid "read_permission_object"
+msgstr "Tiene acceso de lectura a"
+
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
 
@@ -3405,10 +3414,10 @@
 msgid "relation_type"
 msgstr "Tipo de Relación"
 
+msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "Definición de Relaciones"
 
-msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "Definición de Relaciones"
 
@@ -3422,6 +3431,7 @@
 msgid "relations deleted"
 msgstr "Relaciones Eliminadas"
 
+msgctxt "CWAttribute"
 msgid "relations_object"
 msgstr ""
 
@@ -3442,11 +3452,11 @@
 msgid "require_group"
 msgstr "Restringida al Grupo"
 
-msgctxt "CWPermission"
+msgctxt "Transition"
 msgid "require_group"
 msgstr "Restringida al Grupo"
 
-msgctxt "Transition"
+msgctxt "CWPermission"
 msgid "require_group"
 msgstr "Restringida al Grupo"
 
@@ -3454,10 +3464,10 @@
 msgid "require_group"
 msgstr "Restringida al Grupo"
 
+msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "Posee derechos sobre"
 
-msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "Posee derechos sobre"
 
@@ -3667,10 +3677,10 @@
 msgid "specializes"
 msgstr "Especializa"
 
+msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "Especializado por"
 
-msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "Especializado por"
 
@@ -3709,10 +3719,10 @@
 msgid "state_of"
 msgstr "Estado de"
 
+msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "Tiene por Estado"
 
-msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "Tiene por Estado"
 
@@ -3758,17 +3768,17 @@
 msgid "subworkflow_exit"
 msgstr "Salida del Sub-Workflow"
 
-msgid "subworkflow_exit_object"
-msgstr "Salida Sub-Workflow de"
-
 msgctxt "SubWorkflowExitPoint"
 msgid "subworkflow_exit_object"
 msgstr "Salida Sub-Workflow de"
 
+msgid "subworkflow_exit_object"
+msgstr "Salida Sub-Workflow de"
+
+msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "Sub-Workflow de"
 
-msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "Sub-Workflow de"
 
@@ -3779,10 +3789,10 @@
 msgid "subworkflow_state"
 msgstr "Estado de Sub-Workflow"
 
+msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "Estado de Salida de"
 
-msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "Estado de Salida de"
 
@@ -3896,10 +3906,10 @@
 msgid "to_entity"
 msgstr "Por la entidad"
 
+msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "Objeto de la Relación"
 
-msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "Objeto de la Relación"
 
@@ -3913,13 +3923,16 @@
 msgid "to_state"
 msgstr "Hacia el Estado"
 
-msgid "to_state_object"
-msgstr "Transición hacia este Estado"
-
 msgctxt "State"
 msgid "to_state_object"
 msgstr "Transición hacia este Estado"
 
+msgid "to_state_object"
+msgstr "Transición hacia este Estado"
+
+msgid "today"
+msgstr ""
+
 msgid "todo_by"
 msgstr "Asignada a"
 
@@ -3964,10 +3977,10 @@
 msgid "transition_of"
 msgstr "Transición de"
 
+msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "Utiliza las transiciones"
 
-msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "Utiliza las transiciones"
 
@@ -3984,10 +3997,6 @@
 msgid "type"
 msgstr "Tipo"
 
-msgctxt "CWSource"
-msgid "type"
-msgstr ""
-
 msgctxt "Transition"
 msgid "type"
 msgstr "Tipo"
@@ -3996,6 +4005,10 @@
 msgid "type"
 msgstr "Tipo"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr ""
+
 msgid "type here a sparql query"
 msgstr "Escriba aquí su consulta en Sparql"
 
@@ -4076,17 +4089,14 @@
 msgid "update_permission"
 msgstr "Puede ser modificado por"
 
+msgctxt "CWEType"
+msgid "update_permission"
+msgstr "Puede ser modificado por"
+
 msgctxt "CWAttribute"
 msgid "update_permission"
 msgstr "Puede ser modificado por"
 
-msgctxt "CWEType"
-msgid "update_permission"
-msgstr "Puede ser modificado por"
-
-msgid "update_permission_object"
-msgstr "Tiene permiso de modificar"
-
 msgctxt "CWGroup"
 msgid "update_permission_object"
 msgstr "Puede modificar"
@@ -4095,6 +4105,9 @@
 msgid "update_permission_object"
 msgstr "Puede modificar"
 
+msgid "update_permission_object"
+msgstr "Tiene permiso de modificar"
+
 msgid "update_relation"
 msgstr "Modificar"
 
@@ -4131,13 +4144,13 @@
 msgid "use_email"
 msgstr "Usa el Correo Electrónico"
 
-msgid "use_email_object"
-msgstr "Email utilizado por"
-
 msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "Utilizado por"
 
+msgid "use_email_object"
+msgstr "Email utilizado por"
+
 msgid "use_template_format"
 msgstr "Utilización del formato 'cubicweb template'"
 
@@ -4326,10 +4339,10 @@
 msgid "workflow_of"
 msgstr "Workflow de"
 
+msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "Utiliza el Workflow"
 
-msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "Utiliza el Workflow"
 
--- a/i18n/fr.po	Tue Feb 01 10:10:46 2011 +0100
+++ b/i18n/fr.po	Tue Feb 01 11:52:10 2011 +0100
@@ -7,10 +7,10 @@
 "PO-Revision-Date: 2011-01-03 14:35+0100\n"
 "Last-Translator: Logilab Team <contact@logilab.fr>\n"
 "Language-Team: fr <contact@logilab.fr>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
 
 #, python-format
 msgid ""
@@ -434,10 +434,10 @@
 msgid "Download schema as OWL"
 msgstr "Télécharger le schéma au format OWL"
 
+msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Adresse électronique"
 
-msgctxt "inlined:CWUser.use_email.subject"
 msgid "EmailAddress"
 msgstr "Adresse électronique"
 
@@ -1054,9 +1054,6 @@
 msgid "add_permission"
 msgstr "permission d'ajout"
 
-msgid "add_permission_object"
-msgstr "a la permission d'ajouter"
-
 msgctxt "CWGroup"
 msgid "add_permission_object"
 msgstr "a la permission d'ajouter"
@@ -1065,6 +1062,9 @@
 msgid "add_permission_object"
 msgstr "a la permission d'ajouter"
 
+msgid "add_permission_object"
+msgstr "a la permission d'ajouter"
+
 msgid "add_relation"
 msgstr "ajouter"
 
@@ -1074,11 +1074,11 @@
 
 #, python-format
 msgid ""
-"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"added relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
-"la relation %(rtype)s de %(frometype)s #%(eidfrom)s vers %(toetype)s #"
-"%(eidto)s a été ajoutée"
+"la relation %(rtype)s de %(frometype)s #%(eidfrom)s vers %(toetype)s #%"
+"(eidto)s a été ajoutée"
 
 msgid "addrelated"
 msgstr "ajouter"
@@ -1110,9 +1110,6 @@
 msgid "allowed_transition"
 msgstr "transitions autorisées"
 
-msgid "allowed_transition_object"
-msgstr "états en entrée"
-
 msgctxt "BaseTransition"
 msgid "allowed_transition_object"
 msgstr "transition autorisée de"
@@ -1125,6 +1122,9 @@
 msgid "allowed_transition_object"
 msgstr "transition autorisée de"
 
+msgid "allowed_transition_object"
+msgstr "états en entrée"
+
 msgid "am/pm calendar (month)"
 msgstr "calendrier am/pm (mois)"
 
@@ -1218,10 +1218,10 @@
 msgid "bookmarked_by"
 msgstr "utilisé par"
 
+msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "utilise le(s) signet(s)"
 
-msgctxt "CWUser"
 msgid "bookmarked_by_object"
 msgstr "utilise le(s) signet(s)"
 
@@ -1263,9 +1263,6 @@
 msgid "by_transition"
 msgstr "transition"
 
-msgid "by_transition_object"
-msgstr "changement d'états"
-
 msgctxt "BaseTransition"
 msgid "by_transition_object"
 msgstr "a pour information"
@@ -1278,6 +1275,9 @@
 msgid "by_transition_object"
 msgstr "a pour information"
 
+msgid "by_transition_object"
+msgstr "changement d'états"
+
 msgid "calendar"
 msgstr "afficher un calendrier"
 
@@ -1436,10 +1436,10 @@
 msgid "condition"
 msgstr "condition"
 
+msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condition de"
 
-msgctxt "RQLExpression"
 msgid "condition_object"
 msgstr "condition de"
 
@@ -1449,11 +1449,11 @@
 msgid "config"
 msgstr "configuration"
 
-msgctxt "CWSource"
+msgctxt "CWSourceHostConfig"
 msgid "config"
 msgstr "configuration"
 
-msgctxt "CWSourceHostConfig"
+msgctxt "CWSource"
 msgid "config"
 msgstr "configuration"
 
@@ -1477,10 +1477,10 @@
 msgid "constrained_by"
 msgstr "contraint par"
 
+msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "contrainte de"
 
-msgctxt "CWConstraint"
 msgid "constrained_by_object"
 msgstr "contrainte de"
 
@@ -1494,10 +1494,10 @@
 msgid "constraint_of"
 msgstr "contrainte de"
 
+msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "contraint par"
 
-msgctxt "CWEType"
 msgid "constraint_of_object"
 msgstr "contraint par"
 
@@ -1596,8 +1596,8 @@
 msgstr "création relation %(linkto)s"
 
 msgid ""
-"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
-"%(linkto)s)"
+"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource %"
+"(linkto)s)"
 msgstr "création d'une configuration d'hôte pour la source %(linkto)s"
 
 msgid ""
@@ -1690,8 +1690,8 @@
 msgstr "création d'une transition workflow autorisée depuis l'état %(linkto)s"
 
 msgid ""
-"creating WorkflowTransition (WorkflowTransition transition_of Workflow "
-"%(linkto)s)"
+"creating WorkflowTransition (WorkflowTransition transition_of Workflow %"
+"(linkto)s)"
 msgstr "création d'une transition workflow du workflow %(linkto)s"
 
 msgid "creation"
@@ -1713,13 +1713,13 @@
 msgid "cstrtype"
 msgstr "type"
 
-msgid "cstrtype_object"
-msgstr "utilisé par"
-
 msgctxt "CWConstraintType"
 msgid "cstrtype_object"
 msgstr "type des contraintes"
 
+msgid "cstrtype_object"
+msgstr "utilisé par"
+
 msgid "csv entities export"
 msgstr "export d'entités en CSV"
 
@@ -1852,10 +1852,10 @@
 msgid "cw_dont_cross"
 msgstr "don't cross"
 
+msgctxt "CWRType"
 msgid "cw_dont_cross_object"
 msgstr "can't be crossed with"
 
-msgctxt "CWRType"
 msgid "cw_dont_cross_object"
 msgstr "can't be crossed with"
 
@@ -1866,10 +1866,10 @@
 msgid "cw_host_config_of"
 msgstr "host configuration of"
 
+msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr "has host configuration"
 
-msgctxt "CWSource"
 msgid "cw_host_config_of_object"
 msgstr "has host configuration"
 
@@ -1880,10 +1880,10 @@
 msgid "cw_may_cross"
 msgstr "may cross"
 
+msgctxt "CWRType"
 msgid "cw_may_cross_object"
 msgstr "may be crossed with"
 
-msgctxt "CWRType"
 msgid "cw_may_cross_object"
 msgstr "may be crossed with"
 
@@ -1900,9 +1900,6 @@
 msgid "cw_support"
 msgstr "support"
 
-msgid "cw_support_object"
-msgstr "supported by"
-
 msgctxt "CWEType"
 msgid "cw_support_object"
 msgstr "supported by"
@@ -1911,6 +1908,9 @@
 msgid "cw_support_object"
 msgstr "supported by"
 
+msgid "cw_support_object"
+msgstr "supported by"
+
 msgid "cwetype-box"
 msgstr "vue \"boîte\""
 
@@ -1947,6 +1947,9 @@
 msgid "date"
 msgstr "date"
 
+msgid "day"
+msgstr "jour"
+
 msgid "deactivate"
 msgstr "désactiver"
 
@@ -1978,10 +1981,10 @@
 msgid "default_workflow"
 msgstr "workflow par défaut"
 
+msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "workflow par défaut de"
 
-msgctxt "Workflow"
 msgid "default_workflow_object"
 msgstr "workflow par défaut de"
 
@@ -2064,9 +2067,6 @@
 msgid "delete_permission"
 msgstr "permission de supprimer"
 
-msgid "delete_permission_object"
-msgstr "a la permission de supprimer"
-
 msgctxt "CWGroup"
 msgid "delete_permission_object"
 msgstr "peut supprimer"
@@ -2075,14 +2075,17 @@
 msgid "delete_permission_object"
 msgstr "peut supprimer"
 
+msgid "delete_permission_object"
+msgstr "a la permission de supprimer"
+
 #, python-format
 msgid "deleted %(etype)s #%(eid)s (%(title)s)"
 msgstr "suppression de l'entité %(etype)s #%(eid)s (%(title)s)"
 
 #, python-format
 msgid ""
-"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #"
-"%(eidto)s"
+"deleted relation %(rtype)s from %(frometype)s #%(eidfrom)s to %(toetype)s #%"
+"(eidto)s"
 msgstr ""
 "relation %(rtype)s de %(frometype)s #%(eidfrom)s vers %(toetype)s #%(eidto)s "
 "supprimée"
@@ -2093,7 +2096,15 @@
 msgid "description"
 msgstr "description"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description"
+msgstr "description"
+
+msgctxt "CWRelation"
+msgid "description"
+msgstr "description"
+
+msgctxt "Workflow"
 msgid "description"
 msgstr "description"
 
@@ -2101,38 +2112,38 @@
 msgid "description"
 msgstr "description"
 
-msgctxt "CWEType"
-msgid "description"
-msgstr "description"
-
-msgctxt "CWRType"
-msgid "description"
-msgstr "description"
-
-msgctxt "CWRelation"
-msgid "description"
-msgstr "description"
-
-msgctxt "State"
-msgid "description"
-msgstr "description"
-
 msgctxt "Transition"
 msgid "description"
 msgstr "description"
 
-msgctxt "Workflow"
-msgid "description"
-msgstr "description"
-
 msgctxt "WorkflowTransition"
 msgid "description"
 msgstr "description"
 
+msgctxt "State"
+msgid "description"
+msgstr "description"
+
+msgctxt "CWRType"
+msgid "description"
+msgstr "description"
+
+msgctxt "BaseTransition"
+msgid "description"
+msgstr "description"
+
 msgid "description_format"
 msgstr "format"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "CWRelation"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "Workflow"
 msgid "description_format"
 msgstr "format"
 
@@ -2140,7 +2151,15 @@
 msgid "description_format"
 msgstr "format"
 
-msgctxt "CWEType"
+msgctxt "Transition"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "WorkflowTransition"
+msgid "description_format"
+msgstr "format"
+
+msgctxt "State"
 msgid "description_format"
 msgstr "format"
 
@@ -2148,23 +2167,7 @@
 msgid "description_format"
 msgstr "format"
 
-msgctxt "CWRelation"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "State"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "Transition"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "Workflow"
-msgid "description_format"
-msgstr "format"
-
-msgctxt "WorkflowTransition"
+msgctxt "BaseTransition"
 msgid "description_format"
 msgstr "format"
 
@@ -2190,21 +2193,21 @@
 msgid "destination_state"
 msgstr "état de destination"
 
+msgctxt "Transition"
+msgid "destination_state"
+msgstr "état de destination"
+
 msgctxt "SubWorkflowExitPoint"
 msgid "destination_state"
 msgstr "état de destination"
 
-msgctxt "Transition"
-msgid "destination_state"
-msgstr "état de destination"
-
-msgid "destination_state_object"
-msgstr "destination de"
-
 msgctxt "State"
 msgid "destination_state_object"
 msgstr "état final de"
 
+msgid "destination_state_object"
+msgstr "destination de"
+
 msgid "detach attached file"
 msgstr "détacher le fichier existant"
 
@@ -2466,13 +2469,13 @@
 msgid "for_user"
 msgstr "propriété de l'utilisateur"
 
-msgid "for_user_object"
-msgstr "utilise les propriétés"
-
 msgctxt "CWUser"
 msgid "for_user_object"
 msgstr "a pour préférence"
 
+msgid "for_user_object"
+msgstr "utilise les propriétés"
+
 msgid "friday"
 msgstr "vendredi"
 
@@ -2494,13 +2497,13 @@
 msgid "from_entity"
 msgstr "relation de l'entité"
 
-msgid "from_entity_object"
-msgstr "relation sujet"
-
 msgctxt "CWEType"
 msgid "from_entity_object"
 msgstr "entité de"
 
+msgid "from_entity_object"
+msgstr "relation sujet"
+
 msgid "from_interval_start"
 msgstr "De"
 
@@ -2511,13 +2514,13 @@
 msgid "from_state"
 msgstr "état de départ"
 
-msgid "from_state_object"
-msgstr "transitions depuis cet état"
-
 msgctxt "State"
 msgid "from_state_object"
 msgstr "état de départ de"
 
+msgid "from_state_object"
+msgstr "transitions depuis cet état"
+
 msgid "full text or RQL query"
 msgstr "texte à rechercher ou requête RQL"
 
@@ -2563,16 +2566,16 @@
 "graphical representation of the %(etype)s entity type from %(appid)s data "
 "model"
 msgstr ""
-"réprésentation graphique du modèle de données pour le type d'entité "
-"%(etype)s de %(appid)s"
+"réprésentation graphique du modèle de données pour le type d'entité %(etype)"
+"s de %(appid)s"
 
 #, python-format
 msgid ""
 "graphical representation of the %(rtype)s relation type from %(appid)s data "
 "model"
 msgstr ""
-"réprésentation graphique du modèle de données pour le type de relation "
-"%(rtype)s de %(appid)s"
+"réprésentation graphique du modèle de données pour le type de relation %"
+"(rtype)s de %(appid)s"
 
 msgid "group in which a user should be to be allowed to pass this transition"
 msgstr ""
@@ -2602,6 +2605,9 @@
 msgid "header-right"
 msgstr "en-tête (droite)"
 
+msgid "help"
+msgstr ""
+
 msgid "hide filter form"
 msgstr "cacher le filtre"
 
@@ -2690,13 +2696,13 @@
 msgid "in_group"
 msgstr "fait partie du groupe"
 
-msgid "in_group_object"
-msgstr "membres"
-
 msgctxt "CWGroup"
 msgid "in_group_object"
 msgstr "contient les utilisateurs"
 
+msgid "in_group_object"
+msgstr "membres"
+
 msgid "in_state"
 msgstr "état"
 
@@ -2749,10 +2755,10 @@
 msgid "initial_state"
 msgstr "état initial"
 
+msgctxt "State"
 msgid "initial_state_object"
 msgstr "état initial de"
 
-msgctxt "State"
 msgid "initial_state_object"
 msgstr "état initial de"
 
@@ -3019,6 +3025,9 @@
 msgid "monday"
 msgstr "lundi"
 
+msgid "month"
+msgstr "mois"
+
 msgid "more actions"
 msgstr "plus d'actions"
 
@@ -3034,11 +3043,23 @@
 msgid "name"
 msgstr "nom"
 
-msgctxt "BaseTransition"
+msgctxt "CWEType"
+msgid "name"
+msgstr "nom"
+
+msgctxt "Transition"
 msgid "name"
 msgstr "nom"
 
-msgctxt "CWCache"
+msgctxt "CWSource"
+msgid "name"
+msgstr "nom"
+
+msgctxt "Workflow"
+msgid "name"
+msgstr "nom"
+
+msgctxt "CWGroup"
 msgid "name"
 msgstr "nom"
 
@@ -3046,11 +3067,11 @@
 msgid "name"
 msgstr "nom"
 
-msgctxt "CWEType"
+msgctxt "WorkflowTransition"
 msgid "name"
 msgstr "nom"
 
-msgctxt "CWGroup"
+msgctxt "State"
 msgid "name"
 msgstr "nom"
 
@@ -3062,23 +3083,11 @@
 msgid "name"
 msgstr "nom"
 
-msgctxt "CWSource"
-msgid "name"
-msgstr "nom"
-
-msgctxt "State"
+msgctxt "BaseTransition"
 msgid "name"
 msgstr "nom"
 
-msgctxt "Transition"
-msgid "name"
-msgstr "nom"
-
-msgctxt "Workflow"
-msgid "name"
-msgstr "nom"
-
-msgctxt "WorkflowTransition"
+msgctxt "CWCache"
 msgid "name"
 msgstr "nom"
 
@@ -3296,13 +3305,13 @@
 msgid "prefered_form"
 msgstr "forme préférée"
 
-msgid "prefered_form_object"
-msgstr "forme préférée à"
-
 msgctxt "EmailAddress"
 msgid "prefered_form_object"
 msgstr "forme préférée de"
 
+msgid "prefered_form_object"
+msgstr "forme préférée à"
+
 msgid "preferences"
 msgstr "préférences"
 
@@ -3319,13 +3328,13 @@
 msgid "primary_email"
 msgstr "email principal"
 
-msgid "primary_email_object"
-msgstr "adresse email principale (object)"
-
 msgctxt "EmailAddress"
 msgid "primary_email_object"
 msgstr "adresse principale de"
 
+msgid "primary_email_object"
+msgstr "adresse email principale (object)"
+
 msgid "profile"
 msgstr "profil"
 
@@ -3350,11 +3359,11 @@
 msgid "read_permission"
 msgstr "permission de lire"
 
-msgctxt "CWAttribute"
+msgctxt "CWEType"
 msgid "read_permission"
 msgstr "permission de lire"
 
-msgctxt "CWEType"
+msgctxt "CWAttribute"
 msgid "read_permission"
 msgstr "permission de lire"
 
@@ -3362,9 +3371,6 @@
 msgid "read_permission"
 msgstr "permission de lire"
 
-msgid "read_permission_object"
-msgstr "a la permission de lire"
-
 msgctxt "CWGroup"
 msgid "read_permission_object"
 msgstr "peut lire"
@@ -3373,6 +3379,9 @@
 msgid "read_permission_object"
 msgstr "peut lire"
 
+msgid "read_permission_object"
+msgstr "a la permission de lire"
+
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
 "expression régulière des noms d'hôtes auxquels cette configuration s'applique"
@@ -3410,10 +3419,10 @@
 msgid "relation_type"
 msgstr "type de relation"
 
+msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "définition"
 
-msgctxt "CWRType"
 msgid "relation_type_object"
 msgstr "définition"
 
@@ -3427,10 +3436,10 @@
 msgid "relations deleted"
 msgstr "relations supprimées"
 
+msgctxt "CWRType"
 msgid "relations_object"
 msgstr "relations de"
 
-msgctxt "CWRType"
 msgid "relations_object"
 msgstr "relations de"
 
@@ -3447,11 +3456,11 @@
 msgid "require_group"
 msgstr "restreinte au groupe"
 
-msgctxt "CWPermission"
+msgctxt "Transition"
 msgid "require_group"
 msgstr "restreinte au groupe"
 
-msgctxt "Transition"
+msgctxt "CWPermission"
 msgid "require_group"
 msgstr "restreinte au groupe"
 
@@ -3459,10 +3468,10 @@
 msgid "require_group"
 msgstr "restreinte au groupe"
 
+msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "a les droits"
 
-msgctxt "CWGroup"
 msgid "require_group_object"
 msgstr "a les droits"
 
@@ -3675,10 +3684,10 @@
 msgid "specializes"
 msgstr "spécialise"
 
+msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "parent de"
 
-msgctxt "CWEType"
 msgid "specializes_object"
 msgstr "parent de"
 
@@ -3717,13 +3726,13 @@
 msgid "state_of"
 msgstr "état de"
 
-msgid "state_of_object"
-msgstr "a pour état"
-
 msgctxt "Workflow"
 msgid "state_of_object"
 msgstr "contient les états"
 
+msgid "state_of_object"
+msgstr "a pour état"
+
 msgid "status change"
 msgstr "changer l'état"
 
@@ -3766,20 +3775,20 @@
 msgid "subworkflow_exit"
 msgstr "sortie du sous-workflow"
 
-msgid "subworkflow_exit_object"
-msgstr "états de sortie"
-
 msgctxt "SubWorkflowExitPoint"
 msgid "subworkflow_exit_object"
 msgstr "états de sortie"
 
-msgid "subworkflow_object"
-msgstr "utilisé par la transition"
+msgid "subworkflow_exit_object"
+msgstr "états de sortie"
 
 msgctxt "Workflow"
 msgid "subworkflow_object"
 msgstr "sous workflow de"
 
+msgid "subworkflow_object"
+msgstr "utilisé par la transition"
+
 msgid "subworkflow_state"
 msgstr "état du sous-workflow"
 
@@ -3787,10 +3796,10 @@
 msgid "subworkflow_state"
 msgstr "état"
 
+msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "état de sortie de"
 
-msgctxt "State"
 msgid "subworkflow_state_object"
 msgstr "état de sortie de"
 
@@ -3905,10 +3914,10 @@
 msgid "to_entity"
 msgstr "pour l'entité"
 
+msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "objet de la relation"
 
-msgctxt "CWEType"
 msgid "to_entity_object"
 msgstr "objet de la relation"
 
@@ -3922,13 +3931,16 @@
 msgid "to_state"
 msgstr "état de destination"
 
-msgid "to_state_object"
-msgstr "transitions vers cet état"
-
 msgctxt "State"
 msgid "to_state_object"
 msgstr "transition vers cet état"
 
+msgid "to_state_object"
+msgstr "transitions vers cet état"
+
+msgid "today"
+msgstr "aujourd'hui"
+
 msgid "todo_by"
 msgstr "à faire par"
 
@@ -3973,10 +3985,10 @@
 msgid "transition_of"
 msgstr "transition de"
 
+msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "a pour transition"
 
-msgctxt "Workflow"
 msgid "transition_of_object"
 msgstr "a pour transition"
 
@@ -3993,10 +4005,6 @@
 msgid "type"
 msgstr "type"
 
-msgctxt "CWSource"
-msgid "type"
-msgstr "type"
-
 msgctxt "Transition"
 msgid "type"
 msgstr "type"
@@ -4005,6 +4013,10 @@
 msgid "type"
 msgstr "type"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr "type"
+
 msgid "type here a sparql query"
 msgstr "Tapez une requête sparql"
 
@@ -4085,17 +4097,14 @@
 msgid "update_permission"
 msgstr "permission de modification"
 
+msgctxt "CWEType"
+msgid "update_permission"
+msgstr "permission de modifier"
+
 msgctxt "CWAttribute"
 msgid "update_permission"
 msgstr "permission de modifier"
 
-msgctxt "CWEType"
-msgid "update_permission"
-msgstr "permission de modifier"
-
-msgid "update_permission_object"
-msgstr "a la permission de modifier"
-
 msgctxt "CWGroup"
 msgid "update_permission_object"
 msgstr "peut modifier"
@@ -4104,6 +4113,9 @@
 msgid "update_permission_object"
 msgstr "peut modifier"
 
+msgid "update_permission_object"
+msgstr "a la permission de modifier"
+
 msgid "update_relation"
 msgstr "modifier"
 
@@ -4140,13 +4152,13 @@
 msgid "use_email"
 msgstr "utilise l'adresse électronique"
 
-msgid "use_email_object"
-msgstr "adresse utilisée par"
-
 msgctxt "EmailAddress"
 msgid "use_email_object"
 msgstr "utilisée par"
 
+msgid "use_email_object"
+msgstr "adresse utilisée par"
+
 msgid "use_template_format"
 msgstr "utilisation du format 'cubicweb template'"
 
@@ -4272,7 +4284,7 @@
 msgstr "mercredi"
 
 msgid "week"
-msgstr "sem."
+msgstr "semaine"
 
 #, python-format
 msgid "welcome %s !"
@@ -4334,10 +4346,10 @@
 msgid "workflow_of"
 msgstr "workflow de"
 
+msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "a pour workflow"
 
-msgctxt "CWEType"
 msgid "workflow_of_object"
 msgstr "a pour workflow"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/migration/3.11.0_Any.py	Tue Feb 01 11:52:10 2011 +0100
@@ -0,0 +1,57 @@
+sync_schema_props_perms('cw_support', syncperms=False)
+sync_schema_props_perms('cw_dont_cross', syncperms=False)
+sync_schema_props_perms('cw_may_cross', syncperms=False)
+
+try:
+    from cubicweb.server.sources.pyrorql import PyroRQLSource
+except ImportError:
+    pass
+else:
+
+    from os.path import join
+
+    def load_mapping_file(source):
+        mappingfile = source.config['mapping-file']
+        mappingfile = join(source.repo.config.apphome, mappingfile)
+        mapping = {}
+        execfile(mappingfile, mapping)
+        for junk in ('__builtins__', '__doc__'):
+            mapping.pop(junk, None)
+        mapping.setdefault('support_relations', {})
+        mapping.setdefault('dont_cross_relations', set())
+        mapping.setdefault('cross_relations', set())
+        # do some basic checks of the mapping content
+        assert 'support_entities' in mapping, \
+               'mapping file should at least define support_entities'
+        assert isinstance(mapping['support_entities'], dict)
+        assert isinstance(mapping['support_relations'], dict)
+        assert isinstance(mapping['dont_cross_relations'], set)
+        assert isinstance(mapping['cross_relations'], set)
+        unknown = set(mapping) - set( ('support_entities', 'support_relations',
+                                       'dont_cross_relations', 'cross_relations') )
+        assert not unknown, 'unknown mapping attribute(s): %s' % unknown
+        # relations that are necessarily not crossed
+        for rtype in ('is', 'is_instance_of', 'cw_source'):
+            assert rtype not in mapping['dont_cross_relations'], \
+                   '%s relation should not be in dont_cross_relations' % rtype
+            assert rtype not in mapping['support_relations'], \
+                   '%s relation should not be in support_relations' % rtype
+        return mapping
+
+    for source in repo.sources_by_uri.values():
+        if not isinstance(source, PyroRQLSource):
+            continue
+        mapping = load_mapping_file(source)
+        print 'migrating map for', source
+        for etype in mapping['support_entities']: # XXX write support
+            rql('SET S cw_support ET WHERE ET name %(etype)s, ET is CWEType, S eid %(s)s',
+                {'etype': etype, 's': source.eid})
+        for rtype in mapping['support_relations']: # XXX write support
+            rql('SET S cw_support RT WHERE RT name %(rtype)s, RT is CWRType, S eid %(s)s',
+                {'rtype': rtype, 's': source.eid})
+        for rtype in mapping['dont_cross_relations']: # XXX write support
+            rql('SET S cw_dont_cross RT WHERE RT name %(rtype)s, S eid %(s)s',
+                {'rtype': rtype, 's': source.eid})
+        for rtype in mapping['cross_relations']: # XXX write support
+            rql('SET S cw_may_cross RT WHERE RT name %(rtype)s, S eid %(s)s',
+                {'rtype': rtype, 's': source.eid})
--- a/schemas/base.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/schemas/base.py	Tue Feb 01 11:52:10 2011 +0100
@@ -301,14 +301,19 @@
 class cw_support(RelationDefinition):
     subject = 'CWSource'
     object = ('CWEType', 'CWRType')
+    constraints = [RQLConstraint('NOT O final TRUE')]
 
 class cw_dont_cross(RelationDefinition):
     subject = 'CWSource'
     object = 'CWRType'
+    constraints = [RQLConstraint('NOT O final TRUE'),
+                   RQLConstraint('NOT S cw_may_cross O')]
 
 class cw_may_cross(RelationDefinition):
     subject = 'CWSource'
     object = 'CWRType'
+    constraints = [RQLConstraint('NOT O final TRUE'),
+                   RQLConstraint('NOT S cw_dont_cross O')]
 
 # "abtract" relation types, no definition in cubicweb itself ###################
 
--- a/server/checkintegrity.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/server/checkintegrity.py	Tue Feb 01 11:52:10 2011 +0100
@@ -19,8 +19,6 @@
 
 * integrity of a CubicWeb repository. Hum actually only the system database is
   checked.
-
-* consistency of multi-sources instance mapping file
 """
 
 from __future__ import with_statement
@@ -32,7 +30,7 @@
 
 from logilab.common.shellutils import ProgressBar
 
-from cubicweb.schema import META_RTYPES, VIRTUAL_RTYPES, PURE_VIRTUAL_RTYPES
+from cubicweb.schema import PURE_VIRTUAL_RTYPES
 from cubicweb.server.sqlutils import SQL_PREFIX
 from cubicweb.server.session import security_enabled
 
@@ -334,103 +332,3 @@
         session.set_pool()
         reindex_entities(repo.schema, session, withpb=withpb)
         cnx.commit()
-
-
-def info(msg, *args):
-    if args:
-        msg = msg % args
-    print 'INFO: %s' % msg
-
-def warning(msg, *args):
-    if args:
-        msg = msg % args
-    print 'WARNING: %s' % msg
-
-def error(msg, *args):
-    if args:
-        msg = msg % args
-    print 'ERROR: %s' % msg
-
-def check_mapping(schema, mapping, warning=warning, error=error):
-    # first check stuff found in mapping file exists in the schema
-    for attr in ('support_entities', 'support_relations'):
-        for ertype in mapping[attr].keys():
-            try:
-                mapping[attr][ertype] = erschema = schema[ertype]
-            except KeyError:
-                error('reference to unknown type %s in %s', ertype, attr)
-                del mapping[attr][ertype]
-            else:
-                if erschema.final or erschema in META_RTYPES:
-                    error('type %s should not be mapped in %s', ertype, attr)
-                    del mapping[attr][ertype]
-    for attr in ('dont_cross_relations', 'cross_relations'):
-        for rtype in list(mapping[attr]):
-            try:
-                rschema = schema.rschema(rtype)
-            except KeyError:
-                error('reference to unknown relation type %s in %s', rtype, attr)
-                mapping[attr].remove(rtype)
-            else:
-                if rschema.final or rschema in VIRTUAL_RTYPES:
-                    error('relation type %s should not be mapped in %s',
-                          rtype, attr)
-                    mapping[attr].remove(rtype)
-    # check relation in dont_cross_relations aren't in support_relations
-    for rschema in mapping['dont_cross_relations']:
-        if rschema in mapping['support_relations']:
-            info('relation %s is in dont_cross_relations and in support_relations',
-                 rschema)
-    # check relation in cross_relations are in support_relations
-    for rschema in mapping['cross_relations']:
-        if rschema not in mapping['support_relations']:
-            info('relation %s is in cross_relations but not in support_relations',
-                 rschema)
-    # check for relation in both cross_relations and dont_cross_relations
-    for rschema in mapping['cross_relations'] & mapping['dont_cross_relations']:
-        error('relation %s is in both cross_relations and dont_cross_relations',
-              rschema)
-    # now check for more handy things
-    seen = set()
-    for eschema in mapping['support_entities'].values():
-        for rschema, ttypes, role in eschema.relation_definitions():
-            if rschema in META_RTYPES:
-                continue
-            ttypes = [ttype for ttype in ttypes if ttype in mapping['support_entities']]
-            if not rschema in mapping['support_relations']:
-                somethingprinted = False
-                for ttype in ttypes:
-                    rdef = rschema.role_rdef(eschema, ttype, role)
-                    seen.add(rdef)
-                    if rdef.role_cardinality(role) in '1+':
-                        error('relation %s with %s as %s and target type %s is '
-                              'mandatory but not supported',
-                              rschema, eschema, role, ttype)
-                        somethingprinted = True
-                    elif ttype in mapping['support_entities']:
-                        if rdef not in seen:
-                            warning('%s could be supported', rdef)
-                        somethingprinted = True
-                if rschema not in mapping['dont_cross_relations']:
-                    if role == 'subject' and rschema.inlined:
-                        error('inlined relation %s of %s should be supported',
-                              rschema, eschema)
-                    elif not somethingprinted and rschema not in seen and rschema not in mapping['cross_relations']:
-                        print 'you may want to specify something for %s' % rschema
-                        seen.add(rschema)
-            else:
-                if not ttypes:
-                    warning('relation %s with %s as %s is supported but no target '
-                            'type supported', rschema, role, eschema)
-                if rschema in mapping['cross_relations'] and rschema.inlined:
-                    error('you should unline relation %s which is supported and '
-                          'may be crossed ', rschema)
-    for rschema in mapping['support_relations'].values():
-        if rschema in META_RTYPES:
-            continue
-        for subj, obj in rschema.rdefs:
-            if subj in mapping['support_entities'] and obj in mapping['support_entities']:
-                break
-        else:
-            error('relation %s is supported but none if its definitions '
-                  'matches supported entities', rschema)
--- a/server/repository.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/server/repository.py	Tue Feb 01 11:52:10 2011 +0100
@@ -211,8 +211,8 @@
             # needed (for instance looking for persistent configuration using an
             # internal session, which is not possible until pools have been
             # initialized)
-            for source in self.sources:
-                source.init()
+            for source in self.sources_by_uri.itervalues():
+                source.init(source in self.sources)
         else:
             # call init_creating so that for instance native source can
             # configurate tsearch according to postgres version
@@ -263,11 +263,14 @@
         self.sources_by_eid[sourceent.eid] = source
         self.sources_by_uri[sourceent.name] = source
         if self.config.source_enabled(source):
+            source.init(True, session=sourceent._cw)
             self.sources.append(source)
             self.querier.set_planner()
             if add_to_pools:
                 for pool in self.pools:
                     pool.add_source(source)
+        else:
+            source.init(False, session=sourceent._cw)
         self._clear_planning_caches()
 
     def remove_source(self, uri):
@@ -427,33 +430,24 @@
         except ZeroDivisionError:
             pass
 
-    def _login_from_email(self, login):
-        session = self.internal_session()
-        try:
-            rset = session.execute('Any L WHERE U login L, U primary_email M, '
-                                   'M address %(login)s', {'login': login},
-                                   build_descr=False)
-            if rset.rowcount == 1:
-                login = rset[0][0]
-        finally:
-            session.close()
-        return login
-
-    def authenticate_user(self, session, login, **kwargs):
-        """validate login / password, raise AuthenticationError on failure
-        return associated CWUser instance on success
+    def check_auth_info(self, session, login, authinfo):
+        """validate authentication, raise AuthenticationError on failure, return
+        associated CWUser's eid on success.
         """
-        if self.vreg.config['allow-email-login'] and '@' in login:
-            login = self._login_from_email(login)
         for source in self.sources:
             if source.support_entity('CWUser'):
                 try:
-                    eid = source.authenticate(session, login, **kwargs)
-                    break
+                    return source.authenticate(session, login, **authinfo)
                 except AuthenticationError:
                     continue
         else:
             raise AuthenticationError('authentication failed with all sources')
+
+    def authenticate_user(self, session, login, **authinfo):
+        """validate login / password, raise AuthenticationError on failure
+        return associated CWUser instance on success
+        """
+        eid = self.check_auth_info(session, login, authinfo)
         cwuser = self._build_user(session, eid)
         if self.config.consider_user_state and \
                not cwuser.cw_adapt_to('IWorkflowable').state in cwuser.AUTHENTICABLE_STATES:
@@ -1022,8 +1016,7 @@
             raise UnknownEid(eid)
         return extid
 
-    def extid2eid(self, source, extid, etype, session=None, insert=True,
-                  recreate=False):
+    def extid2eid(self, source, extid, etype, session=None, insert=True):
         """get eid from a local id. An eid is attributed if no record is found"""
         cachekey = (extid, source.uri)
         try:
@@ -1038,16 +1031,6 @@
         if eid is not None:
             self._extid_cache[cachekey] = eid
             self._type_source_cache[eid] = (etype, source.uri, extid)
-            # XXX used with extlite (eg vcsfile), probably not needed anymore
-            if recreate:
-                entity = source.before_entity_insertion(session, extid, etype, eid)
-                entity._cw_recreating = True
-                if source.should_call_hooks:
-                    self.hm.call_hooks('before_add_entity', session, entity=entity)
-                # XXX add fti op ?
-                source.after_entity_insertion(session, extid, entity)
-                if source.should_call_hooks:
-                    self.hm.call_hooks('after_add_entity', session, entity=entity)
             if reset_pool:
                 session.reset_pool()
             return eid
--- a/server/serverctl.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/server/serverctl.py	Tue Feb 01 11:52:10 2011 +0100
@@ -914,39 +914,11 @@
         mih.cmd_synchronize_schema()
 
 
-class CheckMappingCommand(Command):
-    """Check content of the mapping file of an external source.
-
-    The mapping is checked against the instance's schema, searching for
-    inconsistencies or stuff you may have forgotten. It's higly recommanded to
-    run it when you setup a multi-sources instance.
-
-    <instance>
-      the identifier of the instance.
-
-    <mapping file>
-      the mapping file to check.
-    """
-    name = 'check-mapping'
-    arguments = '<instance> <mapping file>'
-    min_args = max_args = 2
-
-    def run(self, args):
-        from cubicweb.server.checkintegrity import check_mapping
-        from cubicweb.server.sources.pyrorql import load_mapping_file
-        appid, mappingfile = args
-        config = ServerConfiguration.config_for(appid)
-        config.quick_start = True
-        mih = config.migration_handler(connect=False, verbosity=1)
-        repo = mih.repo_connect() # necessary to get cubes
-        check_mapping(config.load_schema(), load_mapping_file(mappingfile))
-
 for cmdclass in (CreateInstanceDBCommand, InitInstanceCommand,
                  GrantUserOnInstanceCommand, ResetAdminPasswordCommand,
                  StartRepositoryCommand,
                  DBDumpCommand, DBRestoreCommand, DBCopyCommand,
                  AddSourceCommand, CheckRepositoryCommand, RebuildFTICommand,
                  SynchronizeInstanceSchemaCommand,
-                 CheckMappingCommand,
                  ):
     CWCTL.register(cmdclass)
--- a/server/sources/__init__.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/server/sources/__init__.py	Tue Feb 01 11:52:10 2011 +0100
@@ -117,8 +117,10 @@
         """method called by the repository once ready to create a new instance"""
         pass
 
-    def init(self):
-        """method called by the repository once ready to handle request"""
+    def init(self, activated, session=None):
+        """method called by the repository once ready to handle request.
+        `activated` is a boolean flag telling if the source is activated or not.
+        """
         pass
 
     def backup(self, backupfile, confirm):
@@ -147,7 +149,7 @@
         pass
 
     def __repr__(self):
-        return '<%s source @%#x>' % (self.uri, id(self))
+        return '<%s source %s @%#x>' % (self.uri, self.eid, id(self))
 
     def __cmp__(self, other):
         """simple comparison function to get predictable source order, with the
--- a/server/sources/ldapuser.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/server/sources/ldapuser.py	Tue Feb 01 11:52:10 2011 +0100
@@ -212,14 +212,15 @@
         self._cache = {}
         self._query_cache = TimedCache(self._cache_ttl)
 
-    def init(self):
+    def init(self, activated, session=None):
         """method called by the repository once ready to handle request"""
-        self.info('ldap init')
-        # set minimum period of 5min 1s (the additional second is to minimize
-        # resonnance effet)
-        self.repo.looping_task(max(301, self._interval), self.synchronize)
-        self.repo.looping_task(self._cache_ttl // 10,
-                               self._query_cache.clear_expired)
+        if activated:
+            self.info('ldap init')
+            # set minimum period of 5min 1s (the additional second is to
+            # minimize resonnance effet)
+            self.repo.looping_task(max(301, self._interval), self.synchronize)
+            self.repo.looping_task(self._cache_ttl // 10,
+                                   self._query_cache.clear_expired)
 
     def synchronize(self):
         """synchronize content known by this repository with content in the
--- a/server/sources/native.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/server/sources/native.py	Tue Feb 01 11:52:10 2011 +0100
@@ -267,6 +267,8 @@
     def __init__(self, repo, source_config, *args, **kwargs):
         SQLAdapterMixIn.__init__(self, source_config)
         self.authentifiers = [LoginPasswordAuthentifier(self)]
+        if repo.config['allow-email-login']:
+            self.authentifiers.insert(0, EmailPasswordAuthentifier(self))
         AbstractSource.__init__(self, repo, source_config, *args, **kwargs)
         # sql generator
         self._rql_sqlgen = self.sqlgen_class(self.schema, self.dbhelper,
@@ -327,17 +329,21 @@
         """execute the query and return its result"""
         return self.process_result(self.doexec(session, sql, args))
 
-    def init_creating(self):
-        pool = self.repo._get_pool()
-        pool.pool_set()
+    def init_creating(self, pool=None):
         # check full text index availibility
         if self.do_fti:
-            if not self.dbhelper.has_fti_table(pool['system']):
+            if pool is None:
+                _pool = self.repo._get_pool()
+                _pool.pool_set()
+            else:
+                _pool = pool
+            if not self.dbhelper.has_fti_table(_pool['system']):
                 if not self.repo.config.creating:
                     self.critical('no text index table')
                 self.do_fti = False
-        pool.pool_reset()
-        self.repo._free_pool(pool)
+            if pool is None:
+                _pool.pool_reset()
+                self.repo._free_pool(_pool)
 
     def backup(self, backupfile, confirm):
         """method called to create a backup of the source's data"""
@@ -357,8 +363,8 @@
             if self.repo.config.open_connections_pools:
                 self.open_pool_connections()
 
-    def init(self):
-        self.init_creating()
+    def init(self, activated, session=None):
+        self.init_creating(session and session.pool)
 
     def shutdown(self):
         if self._eid_creation_cnx:
@@ -887,20 +893,19 @@
                  'source': source.uri, 'mtime': datetime.now()}
         self.doexec(session, self.sqlgen.insert('entities', attrs), attrs)
         # insert core relations: is, is_instance_of and cw_source
-        if not hasattr(entity, '_cw_recreating'):
-            try:
-                self.doexec(session, 'INSERT INTO is_relation(eid_from,eid_to) VALUES (%s,%s)'
-                            % (entity.eid, eschema_eid(session, entity.e_schema)))
-            except IndexError:
-                # during schema serialization, skip
-                pass
-            else:
-                for eschema in entity.e_schema.ancestors() + [entity.e_schema]:
-                    self.doexec(session, 'INSERT INTO is_instance_of_relation(eid_from,eid_to) VALUES (%s,%s)'
-                               % (entity.eid, eschema_eid(session, eschema)))
-            if 'CWSource' in self.schema and source.eid is not None: # else, cw < 3.10
-                self.doexec(session, 'INSERT INTO cw_source_relation(eid_from,eid_to) '
-                            'VALUES (%s,%s)' % (entity.eid, source.eid))
+        try:
+            self.doexec(session, 'INSERT INTO is_relation(eid_from,eid_to) VALUES (%s,%s)'
+                        % (entity.eid, eschema_eid(session, entity.e_schema)))
+        except IndexError:
+            # during schema serialization, skip
+            pass
+        else:
+            for eschema in entity.e_schema.ancestors() + [entity.e_schema]:
+                self.doexec(session, 'INSERT INTO is_instance_of_relation(eid_from,eid_to) VALUES (%s,%s)'
+                           % (entity.eid, eschema_eid(session, eschema)))
+        if 'CWSource' in self.schema and source.eid is not None: # else, cw < 3.10
+            self.doexec(session, 'INSERT INTO cw_source_relation(eid_from,eid_to) '
+                        'VALUES (%s,%s)' % (entity.eid, source.eid))
         # now we can update the full text index
         if self.do_fti and self.need_fti_indexation(entity.__regid__):
             if complete:
@@ -1524,3 +1529,19 @@
             return rset[0][0]
         except IndexError:
             raise AuthenticationError('bad password')
+
+
+class EmailPasswordAuthentifier(BaseAuthentifier):
+    def authenticate(self, session, login, **authinfo):
+        # email_auth flag prevent from infinite recursion (call to
+        # repo.check_auth_info at the end of this method may lead us here again)
+        if not '@' in login or authinfo.pop('email_auth', None):
+            raise AuthenticationError('not an email')
+        rset = session.execute('Any L WHERE U login L, U primary_email M, '
+                               'M address %(login)s', {'login': login},
+                               build_descr=False)
+        if rset.rowcount != 1:
+            raise AuthenticationError('unexisting email')
+        login = rset.rows[0][0]
+        authinfo['email_auth'] = True
+        return self.source.repo.check_auth_info(session, login, authinfo)
--- a/server/sources/pyrorql.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/server/sources/pyrorql.py	Tue Feb 01 11:52:10 2011 +0100
@@ -45,34 +45,6 @@
     select, col = union.locate_subquery(col, etype, args)
     return getattr(select.selection[col], 'uidtype', None)
 
-def load_mapping_file(mappingfile):
-    mapping = {}
-    execfile(mappingfile, mapping)
-    for junk in ('__builtins__', '__doc__'):
-        mapping.pop(junk, None)
-    mapping.setdefault('support_relations', {})
-    mapping.setdefault('dont_cross_relations', set())
-    mapping.setdefault('cross_relations', set())
-
-    # do some basic checks of the mapping content
-    assert 'support_entities' in mapping, \
-           'mapping file should at least define support_entities'
-    assert isinstance(mapping['support_entities'], dict)
-    assert isinstance(mapping['support_relations'], dict)
-    assert isinstance(mapping['dont_cross_relations'], set)
-    assert isinstance(mapping['cross_relations'], set)
-    unknown = set(mapping) - set( ('support_entities', 'support_relations',
-                                   'dont_cross_relations', 'cross_relations') )
-    assert not unknown, 'unknown mapping attribute(s): %s' % unknown
-    # relations that are necessarily not crossed
-    mapping['dont_cross_relations'] |= set(('owned_by', 'created_by'))
-    for rtype in ('is', 'is_instance_of', 'cw_source'):
-        assert rtype not in mapping['dont_cross_relations'], \
-               '%s relation should not be in dont_cross_relations' % rtype
-        assert rtype not in mapping['support_relations'], \
-               '%s relation should not be in support_relations' % rtype
-    return mapping
-
 
 class ReplaceByInOperator(Exception):
     def __init__(self, eids):
@@ -96,12 +68,6 @@
           'help': 'identifier of the repository in the pyro name server',
           'group': 'pyro-source', 'level': 0,
           }),
-        ('mapping-file',
-         {'type' : 'string',
-          'default': REQUIRED,
-          'help': 'path to a python file with the schema mapping definition',
-          'group': 'pyro-source', 'level': 1,
-          }),
         ('cubicweb-user',
          {'type' : 'string',
           'default': REQUIRED,
@@ -156,24 +122,7 @@
 
     def __init__(self, repo, source_config, *args, **kwargs):
         AbstractSource.__init__(self, repo, source_config, *args, **kwargs)
-        mappingfile = source_config['mapping-file']
-        if not mappingfile[0] == '/':
-            mappingfile = join(repo.config.apphome, mappingfile)
-        try:
-            mapping = load_mapping_file(mappingfile)
-        except IOError:
-            self.disabled = True
-            self.error('cant read mapping file %s, source disabled',
-                       mappingfile)
-            self.support_entities = {}
-            self.support_relations = {}
-            self.dont_cross_relations = set()
-            self.cross_relations = set()
-        else:
-            self.support_entities = mapping['support_entities']
-            self.support_relations = mapping['support_relations']
-            self.dont_cross_relations = mapping['dont_cross_relations']
-            self.cross_relations = mapping['cross_relations']
+        # XXX get it through pyro if unset
         baseurl = source_config.get('base-url')
         if baseurl and not baseurl.endswith('/'):
             source_config['base-url'] += '/'
@@ -212,12 +161,47 @@
         finally:
             session.close()
 
-    def init(self):
+    def init(self, activated, session=None):
         """method called by the repository once ready to handle request"""
-        interval = int(self.config.get('synchronization-interval', 5*60))
-        self.repo.looping_task(interval, self.synchronize)
-        self.repo.looping_task(self._query_cache.ttl.seconds/10,
-                               self._query_cache.clear_expired)
+        self.load_mapping(session)
+        if activated:
+            interval = int(self.config.get('synchronization-interval', 5*60))
+            self.repo.looping_task(interval, self.synchronize)
+            self.repo.looping_task(self._query_cache.ttl.seconds/10,
+                                   self._query_cache.clear_expired)
+
+    def load_mapping(self, session=None):
+        self.support_entities = {}
+        self.support_relations = {}
+        self.dont_cross_relations = set(('owned_by', 'created_by'))
+        self.cross_relations = set()
+        assert self.eid is not None
+        if session is None:
+            _session = self.repo.internal_session()
+        else:
+            _session = session
+        try:
+            for rql, struct in [('Any ETN WHERE S cw_support ET, ET name ETN, ET is CWEType, S eid %(s)s',
+                                 self.support_entities),
+                                ('Any RTN WHERE S cw_support RT, RT name RTN, RT is CWRType, S eid %(s)s',
+                                 self.support_relations)]:
+                for ertype, in _session.execute(rql, {'s': self.eid}):
+                    struct[ertype] = True # XXX write support
+            for rql, struct in [('Any RTN WHERE S cw_may_cross RT, RT name RTN, S eid %(s)s',
+                                 self.cross_relations),
+                                ('Any RTN WHERE S cw_dont_cross RT, RT name RTN, S eid %(s)s',
+                                 self.dont_cross_relations)]:
+                for rtype, in _session.execute(rql, {'s': self.eid}):
+                    struct.add(rtype)
+        finally:
+            if session is None:
+                _session.close()
+        # XXX move in hooks or schema constraints
+        for rtype in ('is', 'is_instance_of', 'cw_source'):
+            assert rtype not in self.dont_cross_relations, \
+                   '%s relation should not be in dont_cross_relations' % rtype
+            assert rtype not in self.support_relations, \
+                   '%s relation should not be in support_relations' % rtype
 
     def local_eid(self, cnx, extid, session):
         etype, dexturi, dextid = cnx.describe(extid)
@@ -246,8 +230,8 @@
         etypes = self.support_entities.keys()
         if mtime is None:
             mtime = self.last_update_time()
-        updatetime, modified, deleted = extrepo.entities_modified_since(etypes,
-                                                                        mtime)
+        updatetime, modified, deleted = extrepo.entities_modified_since(
+            etypes, mtime)
         self._query_cache.clear()
         repo = self.repo
         session = repo.internal_session()
--- a/server/test/unittest_multisources.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/server/test/unittest_multisources.py	Tue Feb 01 11:52:10 2011 +0100
@@ -1,4 +1,4 @@
- # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
 #
 # This file is part of CubicWeb.
@@ -35,7 +35,6 @@
 pyro-ns-id = extern
 cubicweb-user = admin
 cubicweb-password = gingkow
-mapping-file = extern_mapping.py
 base-url=http://extern.org/
 '''
 
@@ -46,14 +45,25 @@
 PyroRQLSource_get_connection = PyroRQLSource.get_connection
 Connection_close = Connection.close
 
+def add_extern_mapping(source):
+    execute = source._cw.execute
+    for etype in ('Card', 'Affaire', 'State'):
+        assert execute('SET S cw_support ET WHERE ET name %(etype)s, ET is CWEType, S eid %(s)s',
+                       {'etype': etype, 's': source.eid})
+    for rtype in ('in_state', 'documented_by', 'multisource_inlined_rel'):
+        assert execute('SET S cw_support RT WHERE RT name %(rtype)s, RT is CWRType, S eid %(s)s',
+                       {'rtype': rtype, 's': source.eid})
+
+
 def setUpModule(*args):
     global repo2, cnx2, repo3, cnx3
     cfg1 = ExternalSource1Configuration('data', apphome=TwoSourcesTC.datadir)
     repo2, cnx2 = init_test_database(config=cfg1)
     cfg2 = ExternalSource2Configuration('data', apphome=TwoSourcesTC.datadir)
     repo3, cnx3 = init_test_database(config=cfg2)
-    cnx3.request().create_entity('CWSource', name=u'extern', type=u'pyrorql',
-                                 config=EXTERN_SOURCE_CFG)
+    src = cnx3.request().create_entity('CWSource', name=u'extern',
+                                       type=u'pyrorql', config=EXTERN_SOURCE_CFG)
+    add_extern_mapping(src)
     cnx3.commit()
 
     TestServerConfiguration.no_sqlite_wrap = True
@@ -108,11 +118,11 @@
 pyro-ns-id = extern-multi
 cubicweb-user = admin
 cubicweb-password = gingkow
-mapping-file = extern_mapping.py
 ''')]:
-            self.request().create_entity('CWSource', name=unicode(uri),
-                                         type=u'pyrorql',
-                                         config=unicode(config))
+            source = self.request().create_entity(
+                'CWSource', name=unicode(uri), type=u'pyrorql',
+                config=unicode(config))
+            add_extern_mapping(source)
         self.commit()
         # trigger discovery
         self.sexecute('Card X')
--- a/utils.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/utils.py	Tue Feb 01 11:52:10 2011 +0100
@@ -114,7 +114,7 @@
 
 # use networkX instead ?
 # http://networkx.lanl.gov/reference/algorithms.traversal.html#module-networkx.algorithms.traversal.astar
-def transitive_closure_of(entity, relname, _seen=None):
+def transitive_closure_of(entity, rtype, _seen=None):
     """return transitive closure *for the subgraph starting from the given
     entity* (eg 'parent' entities are not included in the results)
     """
@@ -122,10 +122,10 @@
         _seen = set()
     _seen.add(entity.eid)
     yield entity
-    for child in getattr(entity, relname):
+    for child in getattr(entity, rtype):
         if child.eid in _seen:
             continue
-        for subchild in transitive_closure_of(child, relname, _seen):
+        for subchild in transitive_closure_of(child, rtype, _seen):
             yield subchild
 
 
--- a/web/data/cubicweb.calendar.css	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/data/cubicweb.calendar.css	Tue Feb 01 11:52:10 2011 +0100
@@ -336,3 +336,48 @@
 td.next {
   text-align: right;
 }
+
+/* ------------------------- */
+/* tooltips for fullcalendar */
+
+div.calevent div.tooltip {
+   display: none; /* tooltip hidden */
+}
+
+div.calevent:hover {
+   z-index: auto !important; /* in order that the tooltip from the above .calevent div can be put over this div*/
+}
+
+div.calevent a{
+   display: inline;
+   font-size: none;
+   font-weight: bold;
+}
+
+div.calevent:hover div.tooltip{
+   display: block;
+   position: absolute;
+   z-index: 10;
+   color: black;
+   border:1px solid black;
+   background: white;
+   padding: 5px;
+   overflow: visible;
+   width: 200px;
+}
+
+div.tooltip a{
+   border: none;
+   background: none;
+   color: #2952A3;
+   text-decoration: none;
+ }
+
+div.tooltip a:hover{
+   text-decoration: underline;
+ }
+
+
+div.fc-view{
+  overflow: visible;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/data/fullcalendar.css	Tue Feb 01 11:52:10 2011 +0100
@@ -0,0 +1,586 @@
+/*
+ * FullCalendar v1.4.8 Stylesheet
+ *
+ * Feel free to edit this file to customize the look of FullCalendar.
+ * When upgrading to newer versions, please upgrade this file as well,
+ * porting over any customizations afterwards.
+ *
+ * Date: Sat Oct 16 17:10:03 2010 -0700
+ *
+ */
+ 
+ 
+/* TODO: make font sizes look the same in all doctypes */
+
+
+.fc,
+.fc .fc-header,
+.fc .fc-content {
+	font-size: 1em;
+	}
+	
+.fc {
+	direction: ltr;
+	text-align: left;
+	}
+	
+.fc table {
+	border-collapse: collapse;
+	border-spacing: 0;
+	}
+	
+.fc td, .fc th {
+	padding: 0;
+	vertical-align: top;
+	}
+
+
+
+/* Header
+------------------------------------------------------------------------*/
+	
+table.fc-header {
+	width: 100%;
+	}
+	
+.fc-header-left {
+	width: 25%;
+	}
+	
+.fc-header-left table {
+	float: left;
+	}
+	
+.fc-header-center {
+	width: 50%;
+	text-align: center;
+	}
+	
+.fc-header-center table {
+	margin: 0 auto;
+	}
+	
+.fc-header-right {
+	width: 25%;
+	}
+	
+.fc-header-right table {
+	float: right;
+	}
+	
+.fc-header-title {
+	margin-top: 0;
+	white-space: nowrap;
+	}
+	
+.fc-header-space {
+	padding-left: 10px;
+	}
+	
+/* right-to-left */
+
+.fc-rtl .fc-header-title {
+	direction: rtl;
+	}
+
+
+
+/* Buttons
+------------------------------------------------------------------------*/
+
+.fc-header .fc-state-default,
+.fc-header .ui-state-default {
+	margin-bottom: 1em;
+	cursor: pointer;
+	}
+	
+.fc-header .fc-state-default {
+	border-width: 1px 0;
+	padding: 0 1px;
+	}
+	
+.fc-header .fc-state-default,
+.fc-header .fc-state-default a {
+	border-style: solid;
+	}
+	
+.fc-header .fc-state-default a {
+	display: block;
+	border-width: 0 1px;
+	margin: 0 -1px;
+	width: 100%;
+	text-decoration: none;
+	}
+	
+.fc-header .fc-state-default span {
+	display: block;
+	border-style: solid;
+	border-width: 1px 0 1px 1px;
+	padding: 3px 5px;
+	}
+	
+.fc-header .ui-state-default {
+	padding: 4px 6px;
+	}
+	
+.fc-header .fc-state-default span,
+.fc-header .ui-state-default span {
+	white-space: nowrap;
+	}
+	
+/* for adjacent buttons */
+	
+.fc-header .fc-no-right {
+	padding-right: 0;
+	}
+	
+.fc-header .fc-no-right a {
+	margin-right: 0;
+	border-right: 0;
+	}
+	
+.fc-header .ui-no-right {
+	border-right: 0;
+	}
+	
+/* for fake rounded corners */
+	
+.fc-header .fc-corner-left {
+	margin-left: 1px;
+	padding-left: 0;
+	}
+	
+.fc-header .fc-corner-right {
+	margin-right: 1px;
+	padding-right: 0;
+	}
+	
+/* DEFAULT button COLORS */
+	
+.fc-header .fc-state-default,
+.fc-header .fc-state-default a {
+	border-color: #777; /* outer border */
+	color: #333;
+	}
+
+.fc-header .fc-state-default span {
+	border-color: #fff #fff #d1d1d1; /* inner border */
+	background: #e8e8e8;
+	}
+	
+/* PRESSED button COLORS (down and active) */
+	
+.fc-header .fc-state-active a {
+	color: #fff;
+	}
+	
+.fc-header .fc-state-down span,
+.fc-header .fc-state-active span {
+	background: #888;
+	border-color: #808080 #808080 #909090; /* inner border */
+	}
+	
+/* DISABLED button COLORS */
+	
+.fc-header .fc-state-disabled a {
+	color: #999;
+	}
+	
+.fc-header .fc-state-disabled,
+.fc-header .fc-state-disabled a {
+	border-color: #ccc; /* outer border */
+	}
+	
+.fc-header .fc-state-disabled span {
+	border-color: #fff #fff #f0f0f0; /* inner border */
+	background: #f0f0f0;
+	}
+	
+	
+	
+/* Content Area & Global Cell Styles
+------------------------------------------------------------------------*/
+	
+.fc-widget-content {
+	border: 1px solid #ccc; /* outer border color */
+	}
+	
+.fc-content {
+	clear: both;
+	}
+	
+.fc-content .fc-state-default {
+	border-style: solid;
+	border-color: #ccc; /* inner border color */
+	}
+	
+.fc-content .fc-state-highlight { /* today */
+	background: #ffc;
+	}
+	
+.fc-content .fc-not-today { /* override jq-ui highlight (TODO: ui-widget-content) */
+	background: none;
+	}
+	
+.fc-cell-overlay { /* semi-transparent rectangle while dragging */
+	background: #9cf;
+	opacity: .2;
+	filter: alpha(opacity=20); /* for IE */
+	}
+	
+.fc-view { /* prevents dragging outside of widget */
+	width: 100%;
+	overflow: hidden;
+	}
+	
+	
+	
+
+
+/* Global Event Styles
+------------------------------------------------------------------------*/
+
+.fc-event,
+.fc-agenda .fc-event-time,
+.fc-event a {
+	border-style: solid; 
+	border-color: #36c;     /* default BORDER color (probably the same as background-color) */
+	background-color: #36c; /* default BACKGROUND color */
+	color: #fff;            /* default TEXT color */
+	}
+	
+	/* Use the 'className' CalEvent property and the following
+	 * example CSS to change event color on a per-event basis:
+	 *
+	 * .myclass,
+	 * .fc-agenda .myclass .fc-event-time,
+	 * .myclass a {
+	 *     background-color: black;
+	 *     border-color: black;
+	 *     color: red;
+	 *     }
+	 */
+	 
+.fc-event {
+	text-align: left;
+	}
+	
+.fc-event a {
+	overflow: hidden;
+	font-size: .85em;
+	text-decoration: none;
+	cursor: pointer;
+	}
+	
+.fc-event-editable {
+	cursor: pointer;
+	}
+	
+.fc-event-time,
+.fc-event-title {
+	padding: 0 1px;
+	}
+	
+/* for fake rounded corners */
+
+.fc-event a {
+	display: block;
+	position: relative;
+	width: 100%;
+	height: 100%;
+	}
+	
+/* right-to-left */
+
+.fc-rtl .fc-event a {
+	text-align: right;
+	}
+	
+/* resizable */
+	
+.fc .ui-resizable-handle {
+	display: block;
+	position: absolute;
+	z-index: 99999;
+	border: 0 !important; /* important overrides pre jquery ui 1.7 styles */
+	background: url(data:image/gif;base64,AAAA) !important; /* hover fix for IE */
+	}
+	
+	
+	
+/* Horizontal Events
+------------------------------------------------------------------------*/
+
+.fc-event-hori {
+	border-width: 1px 0;
+	margin-bottom: 1px;
+	}
+	
+.fc-event-hori a {
+	border-width: 0;
+	}
+	
+/* for fake rounded corners */
+	
+.fc-content .fc-corner-left {
+	margin-left: 1px;
+	}
+	
+.fc-content .fc-corner-left a {
+	margin-left: -1px;
+	border-left-width: 1px;
+	}
+	
+.fc-content .fc-corner-right {
+	margin-right: 1px;
+	}
+	
+.fc-content .fc-corner-right a {
+	margin-right: -1px;
+	border-right-width: 1px;
+	}
+	
+/* resizable */
+	
+.fc-event-hori .ui-resizable-e {
+	top: 0           !important; /* importants override pre jquery ui 1.7 styles */
+	right: -3px      !important;
+	width: 7px       !important;
+	height: 100%     !important;
+	cursor: e-resize;
+	}
+	
+.fc-event-hori .ui-resizable-w {
+	top: 0           !important;
+	left: -3px       !important;
+	width: 7px       !important;
+	height: 100%     !important;
+	cursor: w-resize;
+	}
+	
+.fc-event-hori .ui-resizable-handle {
+	_padding-bottom: 14px; /* IE6 had 0 height */
+	}
+	
+	
+	
+
+/* Month View, Basic Week View, Basic Day View
+------------------------------------------------------------------------*/
+
+.fc-grid table {
+	width: 100%;
+	}
+	
+.fc .fc-grid th {
+	border-width: 0 0 0 1px;
+	text-align: center;
+	}
+	
+.fc .fc-grid td {
+	border-width: 1px 0 0 1px;
+	}
+	
+.fc-grid th.fc-leftmost,
+.fc-grid td.fc-leftmost {
+	border-left: 0;
+	}
+	
+.fc-grid .fc-day-number {
+	float: right;
+	padding: 0 2px;
+	}
+	
+.fc-grid .fc-other-month .fc-day-number {
+	opacity: 0.3;
+	filter: alpha(opacity=30); /* for IE */
+	/* opacity with small font can sometimes look too faded
+	   might want to set the 'color' property instead
+	   making day-numbers bold also fixes the problem */
+	}
+	
+.fc-grid .fc-day-content {
+	clear: both;
+	padding: 2px 2px 0; /* distance between events and day edges */
+	}
+	
+/* event styles */
+	
+.fc-grid .fc-event-time {
+	font-weight: bold;
+	}
+	
+/* right-to-left */
+
+.fc-rtl .fc-grid {
+	direction: rtl;
+	}
+	
+.fc-rtl .fc-grid .fc-day-number {
+	float: left;
+	}
+	
+.fc-rtl .fc-grid .fc-event-time {
+	float: right;
+	}
+	
+/* Agenda Week View, Agenda Day View
+------------------------------------------------------------------------*/
+
+.fc .fc-agenda th,
+.fc .fc-agenda td {
+	border-width: 1px 0 0 1px;
+	}
+	
+.fc .fc-agenda .fc-leftmost {
+	border-left: 0;
+	}
+	
+.fc-agenda tr.fc-first th,
+.fc-agenda tr.fc-first td {
+	border-top: 0;
+	}
+	
+.fc-agenda-head tr.fc-last th {
+	border-bottom-width: 1px;
+	}
+	
+.fc .fc-agenda-head td,
+.fc .fc-agenda-body td {
+	background: none;
+	}
+	
+.fc-agenda-head th {
+	text-align: center;
+	}
+	
+/* the time axis running down the left side */
+	
+.fc-agenda .fc-axis {
+	width: 50px;
+	padding: 0 4px;
+	vertical-align: middle;
+	white-space: nowrap;
+	text-align: right;
+	font-weight: normal;
+	}
+	
+/* all-day event cells at top */
+	
+.fc-agenda-head tr.fc-all-day th {
+	height: 35px;
+	}
+	
+.fc-agenda-head td {
+	padding-bottom: 10px;
+	}
+	
+.fc .fc-divider div {
+	font-size: 1px; /* for IE6/7 */
+	height: 2px;
+	}
+	
+.fc .fc-divider .fc-state-default {
+	background: #eee; /* color for divider between all-day and time-slot events */
+	}
+
+/* body styles */
+	
+.fc .fc-agenda-body td div {
+	height: 20px; /* slot height */
+	}
+	
+.fc .fc-agenda-body tr.fc-minor th,
+.fc .fc-agenda-body tr.fc-minor td {
+	border-top-style: dotted;
+	}
+	
+.fc-agenda .fc-day-content {
+	padding: 2px 2px 0; /* distance between events and day edges */
+	}
+	
+/* vertical background columns */
+
+.fc .fc-agenda-bg .ui-state-highlight {
+	background-image: none; /* tall column, don't want repeating background image */
+	}
+	
+
+
+/* Vertical Events
+------------------------------------------------------------------------*/
+
+.fc-event-vert {
+	border-width: 0 1px;
+	}
+	
+.fc-event-vert a {
+	border-width: 0;
+	}
+	
+/* for fake rounded corners */
+	
+.fc-content .fc-corner-top {
+	margin-top: 1px;
+	}
+	
+.fc-content .fc-corner-top a {
+	margin-top: -1px;
+	border-top-width: 1px;
+	}
+	
+.fc-content .fc-corner-bottom {
+	margin-bottom: 1px;
+	}
+	
+.fc-content .fc-corner-bottom a {
+	margin-bottom: -1px;
+	border-bottom-width: 1px;
+	}
+	
+/* event content */
+	
+.fc-event-vert span {
+	display: block;
+	position: relative;
+	z-index: 2;
+	}
+	
+.fc-event-vert span.fc-event-time {
+	white-space: nowrap;
+	_white-space: normal;
+	overflow: hidden;
+	border: 0;
+	font-size: 10px;
+	}
+	
+.fc-event-vert span.fc-event-title {
+	line-height: 13px;
+	}
+	
+.fc-event-vert span.fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay  */
+	position: absolute;
+	z-index: 1;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	background: #fff;
+	opacity: .3;
+	filter: alpha(opacity=30); /* for IE */
+	}
+	
+/* resizable */
+	
+.fc-event-vert .ui-resizable-s {
+	bottom: 0        !important; /* importants override pre jquery ui 1.7 styles */
+	width: 100%      !important;
+	height: 8px      !important;
+	line-height: 8px !important;
+	font-size: 11px  !important;
+	font-family: monospace;
+	text-align: center;
+	cursor: s-resize;
+	}
+	
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/data/fullcalendar.min.js	Tue Feb 01 11:52:10 2011 +0100
@@ -0,0 +1,108 @@
+/*
+
+ FullCalendar v1.4.8
+ http://arshaw.com/fullcalendar/
+
+ Use fullcalendar.css for basic styling.
+ For event drag & drop, requires jQuery UI draggable.
+ For event resizing, requires jQuery UI resizable.
+
+ Copyright (c) 2010 Adam Shaw
+ Dual licensed under the MIT and GPL licenses, located in
+ MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+
+ Date: Sat Oct 16 17:10:03 2010 -0700
+
+*/
+(function(m,Z){function fb(a){m.extend(true,Pa,a)}function Bb(a,b,f){function h(e){if(qa){E();ea();M();H(e)}else i()}function i(){ya=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");qa=m("<div class='fc-content "+ya+"-widget-content' style='position:relative'/>").prependTo(a);pa=new Cb(p,b);(ta=pa.render())&&a.prepend(ta);w(b.defaultView);m(window).resize(y);t()||s()}function s(){setTimeout(function(){!F.start&&t()&&H()},0)}function j(){m(window).unbind("resize",
+y);pa.destroy();qa.remove();a.removeClass("fc fc-rtl fc-ui-widget")}function l(){return ca.offsetWidth!==0}function t(){return m("body")[0].offsetWidth!==0}function w(e){if(!F||e!=F.name){g++;N();var q=F,J;if(q){if(q.eventsChanged){M();q.eventDirty=q.eventsChanged=false}(q.beforeHide||gb)();Ra(qa,qa.height());q.element.hide()}else Ra(qa,1);qa.css("overflow","hidden");if(F=ka[e])F.element.show();else F=ka[e]=new Ha[e](J=ua=m("<div class='fc-view fc-view-"+e+"' style='position:absolute'/>").appendTo(qa),
+p);q&&pa.deactivateButton(q.name);pa.activateButton(e);H();qa.css("overflow","");q&&Ra(qa,1);J||(F.afterShow||gb)();g--}}function H(e){if(l()){g++;N();ma===Z&&E();if(!F.start||e||n<F.start||n>=F.end){F.render(n,e||0);K(true);!b.lazyFetching||fa()?X():F.renderEvents(Y())}else if(F.sizeDirty||F.eventsDirty||!b.lazyFetching){F.clearEvents();F.sizeDirty&&K();!b.lazyFetching||fa()?X():F.renderEvents(Y())}ia=a.outerWidth();F.sizeDirty=false;F.eventsDirty=false;pa.updateTitle(F.title);e=new Date;e>=F.start&&
+e<F.end?pa.disableButton("today"):pa.enableButton("today");g--;F.trigger("viewDisplay",ca)}}function E(){ma=b.contentHeight?b.contentHeight:b.height?b.height-(ta?ta.height():0)-Sa(qa[0]):Math.round(qa.width()/Math.max(b.aspectRatio,0.5))}function K(e){g++;F.setHeight(ma,e);if(ua){ua.css("position","relative");ua=null}F.setWidth(qa.width(),e);g--}function y(){if(!g)if(F.start){var e=++d;setTimeout(function(){if(e==d&&!g&&l())if(ia!=(ia=a.outerWidth())){g++;P();F.trigger("windowResize",ca);g--}},200)}else s()}
+function P(){ea();if(l()){E();K();N();F.rerenderEvents();F.sizeDirty=false}}function ea(){m.each(ka,function(e,q){q.sizeDirty=true})}function S(){M();if(l()){F.clearEvents();F.renderEvents(Y());F.eventsDirty=false}}function M(){m.each(ka,function(e,q){q.eventsDirty=true})}function X(){$(function(e){F.renderEvents(e)})}function ga(e,q,J){F.select(e,q,J===Z?true:J)}function N(){F&&F.unselect()}function U(){H(-1)}function u(){H(1)}function B(){Ta(n,-1);H()}function G(){Ta(n,1);H()}function k(){n=new Date;
+H()}function c(e,q,J){if(e instanceof Date)n=x(e);else hb(n,e,q,J);H()}function A(e,q,J){e!==Z&&Ta(n,e);q!==Z&&Ua(n,q);J!==Z&&O(n,J);H()}function C(){return x(n)}function I(){return F}function V(e,q){if(q===Z)return b[e];if(e=="height"||e=="contentHeight"||e=="aspectRatio"){b[e]=q;P()}}function r(e,q){if(b[e])return b[e].apply(q||ca,Array.prototype.slice.call(arguments,2))}var p=this;p.options=b;p.render=h;p.destroy=j;p.changeView=w;p.select=ga;p.unselect=N;p.rerenderEvents=S;p.prev=U;p.next=u;p.prevYear=
+B;p.nextYear=G;p.today=k;p.gotoDate=c;p.incrementDate=A;p.formatDate=function(e,q){return Ja(e,q,b)};p.formatDates=function(e,q,J){return Va(e,q,J,b)};p.getDate=C;p.getView=I;p.option=V;p.trigger=r;Db.call(p,b,f);var $=p.fetchEvents,fa=p.isFetchNeeded,Y=p.clientEvents,ca=a[0],pa,ta,qa,ya,F,ka={},ia,ma,ua,d=0,g=0,n=new Date;hb(n,b.year,b.month,b.date);var z;b.droppable&&m(document).bind("dragstart",function(e,q){var J=e.target,R=m(J);if(!R.parents(".fc").length){var Q=b.dropAccept;if(m.isFunction(Q)?
+Q.call(J,R):R.is(Q)){z=J;F.dragStart(z,e,q)}}}).bind("dragstop",function(e,q){if(z){F.dragStop(z,e,q);z=null}})}function Cb(a,b){function f(){K=b.theme?"ui":"fc";var y=b.header;if(y)return E=m("<table class='fc-header'/>").append(m("<tr/>").append(m("<td class='fc-header-left'/>").append(i(y.left))).append(m("<td class='fc-header-center'/>").append(i(y.center))).append(m("<td class='fc-header-right'/>").append(i(y.right))))}function h(){E.remove()}function i(y){if(y){var P=m("<tr/>");m.each(y.split(" "),
+function(ea){ea>0&&P.append("<td><span class='fc-header-space'/></td>");var S;m.each(this.split(","),function(M,X){if(X=="title"){P.append("<td><h2 class='fc-header-title'>&nbsp;</h2></td>");S&&S.addClass(K+"-corner-right");S=null}else{var ga;if(a[X])ga=a[X];else if(Ha[X])ga=function(){N.removeClass(K+"-state-hover");a.changeView(X)};if(ga){S&&S.addClass(K+"-no-right");var N;M=b.theme?Wa(b.buttonIcons,X):null;var U=Wa(b.buttonText,X);if(M)N=m("<div class='fc-button-"+X+" ui-state-default'><a><span class='ui-icon ui-icon-"+
+M+"'/></a></div>");else if(U)N=m("<div class='fc-button-"+X+" "+K+"-state-default'><a><span>"+U+"</span></a></div>");if(N){N.click(function(){N.hasClass(K+"-state-disabled")||ga()}).mousedown(function(){N.not("."+K+"-state-active").not("."+K+"-state-disabled").addClass(K+"-state-down")}).mouseup(function(){N.removeClass(K+"-state-down")}).hover(function(){N.not("."+K+"-state-active").not("."+K+"-state-disabled").addClass(K+"-state-hover")},function(){N.removeClass(K+"-state-hover").removeClass(K+
+"-state-down")}).appendTo(m("<td/>").appendTo(P));S?S.addClass(K+"-no-right"):N.addClass(K+"-corner-left");S=N}}}});S&&S.addClass(K+"-corner-right")});return m("<table/>").append(P)}}function s(y){E.find("h2.fc-header-title").html(y)}function j(y){E.find("div.fc-button-"+y).addClass(K+"-state-active")}function l(y){E.find("div.fc-button-"+y).removeClass(K+"-state-active")}function t(y){E.find("div.fc-button-"+y).addClass(K+"-state-disabled")}function w(y){E.find("div.fc-button-"+y).removeClass(K+
+"-state-disabled")}var H=this;H.render=f;H.destroy=h;H.updateTitle=s;H.activateButton=j;H.deactivateButton=l;H.disableButton=t;H.enableButton=w;var E=m([]),K}function Db(a,b){function f(c){b.push(c);l(c,N)}function h(c){b=m.grep(b,function(A){return A!=c});G=m.grep(G,function(A){return A.source!=c});N()}function i(c){G=[];s(b,c)}function s(c,A){function C($,fa){var Y=X();if(r!=Y)r.eventsDirty=true;if(I==U&&u<=Y.visStart&&B>=Y.visEnd){if(m.inArray($,b)!=-1){for(Y=0;Y<fa.length;Y++){S(fa[Y]);fa[Y].source=
+$}G=G.concat(fa)}--V||A&&A(G)}}var I=++U,V=c.length,r=X();u=x(r.visStart);B=x(r.visEnd);for(var p=0;p<c.length;p++)j(c[p],C)}function j(c,A){function C(r){A(c,r)}function I(r){C(r);ea()}if(typeof c=="string"){var V={};V[a.startParam]=Math.round(u.getTime()/1E3);V[a.endParam]=Math.round(B.getTime()/1E3);if(a.cacheParam)V[a.cacheParam]=(new Date).getTime();P();m.ajax({url:c,dataType:"json",data:V,cache:a.cacheParam||false,success:I})}else if(m.isFunction(c)){P();c(x(u),x(B),I)}else C(c)}function l(c,
+A){s([c],A)}function t(){i(N)}function w(){var c=X();return!u||c.visStart<u||c.visEnd>B}function H(c){var A,C=G.length,I,V=X().defaultEventEnd,r=c.start-c._start,p=c.end?c.end-(c._end||V(c)):0;for(A=0;A<C;A++){I=G[A];if(I._id==c._id&&I!=c){I.start=new Date(+I.start+r);I.end=c.end?I.end?new Date(+I.end+p):new Date(+V(I)+p):null;I.title=c.title;I.url=c.url;I.allDay=c.allDay;I.className=c.className;I.editable=c.editable;S(I)}}S(c);N()}function E(c,A){S(c);if(!c.source){if(A)(c.source=b[0]).push(c);G.push(c)}N()}
+function K(c){if(c){if(!m.isFunction(c)){var A=c+"";c=function(I){return I._id==A}}G=m.grep(G,c,true);for(C=0;C<b.length;C++)if(typeof b[C]=="object")b[C]=m.grep(b[C],c,true)}else{G=[];for(var C=0;C<b.length;C++)if(typeof b[C]=="object")b[C]=[]}N()}function y(c){if(m.isFunction(c))return m.grep(G,c);else if(c){c+="";return m.grep(G,function(A){return A._id==c})}return G}function P(){k++||ga("loading",null,true)}function ea(){--k||ga("loading",null,false)}function S(c){c._id=c._id||(c.id===Z?"_fc"+
+Eb++:c.id+"");if(c.date){if(!c.start)c.start=c.date;delete c.date}c._start=x(c.start=Xa(c.start,a.ignoreTimezone));c.end=Xa(c.end,a.ignoreTimezone);if(c.end&&c.end<=c.start)c.end=null;c._end=c.end?x(c.end):null;if(c.allDay===Z)c.allDay=a.allDayDefault;if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[]}var M=this;M.fetchEvents=i;M.refetchEvents=t;M.isFetchNeeded=w;M.addEventSource=f;M.removeEventSource=h;M.updateEvent=H;M.renderEvent=E;M.removeEvents=
+K;M.clientEvents=y;M.normalizeEvent=S;var X=M.getView,ga=M.trigger,N=M.rerenderEvents,U=0,u,B,G=[],k=0;b.unshift([])}function Fb(a,b){function f(l,t){if(t){Ua(l,t);l.setDate(1)}l=x(l,true);l.setDate(1);t=Ua(x(l),1);var w=x(l),H=x(t),E=i("firstDay"),K=i("weekends")?0:1;if(K){va(w);va(H,-1,true)}O(w,-((w.getDay()-Math.max(E,K)+7)%7));O(H,(7-H.getDay()+Math.max(E,K))%7);E=Math.round((H-w)/(ib*7));if(i("weekMode")=="fixed"){O(H,(6-E)*7);E=6}h.title=j(l,i("titleFormat"));h.start=l;h.end=t;h.visStart=w;
+h.visEnd=H;s(E,K?5:7,true)}var h=this;h.render=f;Ya.call(h,a,b,"month");var i=h.opt,s=h.renderBasic,j=b.formatDate}function Gb(a,b){function f(l,t){t&&O(l,t*7);l=O(x(l),-((l.getDay()-i("firstDay")+7)%7));t=O(x(l),7);var w=x(l),H=x(t),E=i("weekends");if(!E){va(w);va(H,-1,true)}h.title=j(w,O(x(H),-1),i("titleFormat"));h.start=l;h.end=t;h.visStart=w;h.visEnd=H;s(1,E?7:5,false)}var h=this;h.render=f;Ya.call(h,a,b,"basicWeek");var i=h.opt,s=h.renderBasic,j=b.formatDates}function Hb(a,b){function f(l,t){if(t){O(l,
+t);i("weekends")||va(l,t<0?-1:1)}h.title=j(l,i("titleFormat"));h.start=h.visStart=x(l,true);h.end=h.visEnd=O(x(h.start),1);s(1,1,false)}var h=this;h.render=f;Ya.call(h,a,b,"basicDay");var i=h.opt,s=h.renderBasic,j=b.formatDate}function Ya(a,b,f){function h(d,g,n){Y=d;ca=g;if(V=B("isRTL")){r=-1;p=ca-1}else{r=1;p=0}$=B("firstDay");fa=B("weekends")?0:1;var z=B("theme")?"ui":"fc",e=B("columnFormat"),q=u.start.getMonth(),J=Ia(new Date),R,Q=x(u.visStart);if(F){k();g=F.find("tr").length;if(Y<g)F.find("tr:gt("+
+(Y-1)+")").remove();else if(Y>g){d="";for(g=g;g<Y;g++){d+="<tr class='fc-week"+g+"'>";for(R=0;R<ca;R++){d+="<td class='fc-"+Da[Q.getDay()]+" "+z+"-state-default fc-new fc-day"+(g*ca+R)+(R==p?" fc-leftmost":"")+"'>"+(n?"<div class='fc-day-number'></div>":"")+"<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></td>";O(Q,1);fa&&va(Q)}d+="</tr>"}F.append(d)}j(F.find("td.fc-new").removeClass("fc-new"));Q=x(u.visStart);F.find("td").each(function(){var ha=m(this);if(Y>1)Q.getMonth()==
+q?ha.removeClass("fc-other-month"):ha.addClass("fc-other-month");+Q==+J?ha.removeClass("fc-not-today").addClass("fc-today").addClass(z+"-state-highlight"):ha.addClass("fc-not-today").removeClass("fc-today").removeClass(z+"-state-highlight");ha.find("div.fc-day-number").text(Q.getDate());O(Q,1);fa&&va(Q)});if(Y==1){Q=x(u.visStart);ya.find("th").each(function(ha,da){m(da).text(I(Q,e));da.className=da.className.replace(/^fc-\w+(?= )/,"fc-"+Da[Q.getDay()]);O(Q,1);fa&&va(Q)});Q=x(u.visStart);F.find("td").each(function(ha,
+da){da.className=da.className.replace(/^fc-\w+(?= )/,"fc-"+Da[Q.getDay()]);O(Q,1);fa&&va(Q)})}}else{var ba=m("<table/>").appendTo(a);d="<thead><tr>";for(g=0;g<ca;g++){d+="<th class='fc-"+Da[Q.getDay()]+" "+z+"-state-default"+(g==p?" fc-leftmost":"")+"'>"+I(Q,e)+"</th>";O(Q,1);fa&&va(Q)}ya=m(d+"</tr></thead>").appendTo(ba);d="<tbody>";Q=x(u.visStart);for(g=0;g<Y;g++){d+="<tr class='fc-week"+g+"'>";for(R=0;R<ca;R++){d+="<td class='fc-"+Da[Q.getDay()]+" "+z+"-state-default fc-day"+(g*ca+R)+(R==p?" fc-leftmost":
+"")+(Y>1&&Q.getMonth()!=q?" fc-other-month":"")+(+Q==+J?" fc-today "+z+"-state-highlight":" fc-not-today")+"'>"+(n?"<div class='fc-day-number'>"+Q.getDate()+"</div>":"")+"<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></td>";O(Q,1);fa&&va(Q)}d+="</tr>"}F=m(d+"</tbody>").appendTo(ba);j(F.find("td"));ka=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(a)}}function i(d){qa=d;d=F.find("tr td:first-child");var g=qa-ya.height(),n;if(B("weekMode")=="variable")n=
+g=Math.floor(g/(Y==1?2:6));else{n=Math.floor(g/Y);g=g-n*(Y-1)}if(Za===Z){var z=F.find("tr:first").find("td:first");z.height(n);Za=n!=z.height()}if(Za){d.slice(0,-1).height(n);d.slice(-1).height(g)}else{Qa(d.slice(0,-1),n);Qa(d.slice(-1),g)}}function s(d){ta=d;ua.clear();pa=Math.floor(ta/ca);Ka(ya.find("th").slice(0,-1),pa)}function j(d){d.click(l).mousedown(C)}function l(d){if(!B("selectable")){var g=parseInt(this.className.match(/fc\-day(\d+)/)[1]);g=O(x(u.visStart),Math.floor(g/ca)*7+g%ca);G("dayClick",
+this,g,true,d)}}function t(d,g,n){n&&ia.build();n=x(u.visStart);for(var z=O(x(n),ca),e=0;e<Y;e++){var q=new Date(Math.max(n,d)),J=new Date(Math.min(z,g));if(q<J){var R;if(V){R=Ea(J,n)*r+p+1;q=Ea(q,n)*r+p+1}else{R=Ea(q,n);q=Ea(J,n)}j(w(e,R,e,q-1))}O(n,7);O(z,7)}}function w(d,g,n,z){d=ia.rect(d,g,n,z,a);return c(d,a)}function H(d){return x(d)}function E(d,g){t(d,O(x(g),1),true)}function K(){A()}function y(d,g){ma.start(function(n){A();n&&w(n.row,n.col,n.row,n.col)},g)}function P(d,g,n){var z=ma.stop();
+A();if(z){z=ga(z);G("drop",d,z,true,g,n)}}function ea(d){return x(d.start)}function S(d){return ua.left(d)}function M(d){return ua.right(d)}function X(d){return(d-Math.max($,fa)+ca)%ca}function ga(d){return O(x(u.visStart),d.row*7+d.col*r+p)}function N(d){return F.find("tr:eq("+d+")")}function U(){return{left:0,right:ta}}var u=this;u.renderBasic=h;u.setHeight=i;u.setWidth=s;u.renderDayOverlay=t;u.defaultSelectionEnd=H;u.renderSelection=E;u.clearSelection=K;u.dragStart=y;u.dragStop=P;u.defaultEventEnd=
+ea;u.getHoverListener=function(){return ma};u.colContentLeft=S;u.colContentRight=M;u.dayOfWeekCol=X;u.cellDate=ga;u.cellIsAllDay=function(){return true};u.allDayTR=N;u.allDayBounds=U;u.getRowCnt=function(){return Y};u.getColCnt=function(){return ca};u.getColWidth=function(){return pa};u.getDaySegmentContainer=function(){return ka};jb.call(u,a,b,f);kb.call(u);lb.call(u);Ib.call(u);var B=u.opt,G=u.trigger,k=u.clearEvents,c=u.renderOverlay,A=u.clearOverlays,C=u.daySelectionMousedown,I=b.formatDate,V,
+r,p,$,fa,Y,ca,pa,ta,qa,ya,F,ka,ia,ma,ua;mb(a.addClass("fc-grid"));ia=new nb(function(d,g){var n,z,e,q=F.find("tr:first td");if(V)q=m(q.get().reverse());q.each(function(J,R){n=m(R);z=n.offset().left;if(J)e[1]=z;e=[z];g[J]=e});e[1]=z+n.outerWidth();F.find("tr").each(function(J,R){n=m(R);z=n.offset().top;if(J)e[1]=z;e=[z];d[J]=e});e[1]=z+n.outerHeight()});ma=new ob(ia);ua=new pb(function(d){return F.find("td:eq("+d+") div div")})}function Ib(){function a(G){w(B=G);U(h(G))}function b(G){f();U(h(B),G)}
+function f(){H();ea().empty()}function h(G){var k=ga(),c=N(),A=x(j.visStart);c=O(x(A),c);var C=m.map(G,Oa),I,V,r,p,$,fa,Y=[];for(I=0;I<k;I++){V=$a(ab(G,C,A,c));for(r=0;r<V.length;r++){p=V[r];for($=0;$<p.length;$++){fa=p[$];fa.row=I;fa.level=r;Y.push(fa)}}O(A,7);O(c,7)}return Y}function i(G,k,c){E(G,k);if(G.editable||G.editable===Z&&l("editable")){s(G,k);c.isEnd&&u(G,k)}}function s(G,k){if(!l("disableDragging")&&k.draggable){var c=S(),A;k.draggable({zIndex:9,delay:50,opacity:l("dragOpacity"),revertDuration:l("dragRevertDuration"),
+start:function(C,I){t("eventDragStart",k,G,C,I);y(G,k);c.start(function(V,r,p,$){k.draggable("option","revert",!V||!p&&!$);X();if(V){A=p*7+$*(l("isRTL")?-1:1);M(O(x(G.start),A),O(Oa(G),A))}else A=0},C,"drag")},stop:function(C,I){c.stop();X();t("eventDragStop",k,G,C,I);if(A){k.find("a").removeAttr("href");P(this,G,A,0,G.allDay,C,I)}else{m.browser.msie&&k.css("filter","");K(G,k)}}})}}var j=this;j.renderEvents=a;j.rerenderEvents=b;j.clearEvents=f;j.bindDaySeg=i;qb.call(j);var l=j.opt,t=j.trigger,w=j.reportEvents,
+H=j.clearEventData,E=j.eventElementHandlers,K=j.showEvents,y=j.hideEvents,P=j.eventDrop,ea=j.getDaySegmentContainer,S=j.getHoverListener,M=j.renderDayOverlay,X=j.clearOverlays,ga=j.getRowCnt,N=j.getColCnt,U=j.renderDaySegs,u=j.resizableDayEvent,B=[]}function Jb(a,b){function f(l,t){t&&O(l,t*7);l=O(x(l),-((l.getDay()-i("firstDay")+7)%7));t=O(x(l),7);var w=x(l),H=x(t),E=i("weekends");if(!E){va(w);va(H,-1,true)}h.title=j(w,O(x(H),-1),i("titleFormat"));h.start=l;h.end=t;h.visStart=w;h.visEnd=H;s(E?7:
+5)}var h=this;h.render=f;rb.call(h,a,b,"agendaWeek");var i=h.opt,s=h.renderAgenda,j=b.formatDates}function Kb(a,b){function f(l,t){if(t){O(l,t);i("weekends")||va(l,t<0?-1:1)}t=x(l,true);var w=O(x(t),1);h.title=j(l,i("titleFormat"));h.start=h.visStart=t;h.end=h.visEnd=w;s(1)}var h=this;h.render=f;rb.call(h,a,b,"agendaDay");var i=h.opt,s=h.renderAgenda,j=b.formatDate}function rb(a,b,f){function h(o){g=o;ba=p("theme")?"ui":"fc";da=p("weekends")?0:1;ha=p("firstDay");if(ra=p("isRTL")){aa=-1;T=g-1}else{aa=
+1;T=0}na=bb(p("minTime"));ja=bb(p("maxTime"));o=ra?O(x(r.visEnd),-1):x(r.visStart);var v=x(o),D=Ia(new Date),L=p("columnFormat");if(ka){fa();ka.find("tr:first th").slice(1,-1).each(function(La,xa){m(xa).text(F(v,L));xa.className=xa.className.replace(/^fc-\w+(?= )/,"fc-"+Da[v.getDay()]);O(v,aa);da&&va(v,aa)});v=x(o);d.find("td").each(function(La,xa){xa.className=xa.className.replace(/^fc-\w+(?= )/,"fc-"+Da[v.getDay()]);+v==+D?m(xa).removeClass("fc-not-today").addClass("fc-today").addClass(ba+"-state-highlight"):
+m(xa).addClass("fc-not-today").removeClass("fc-today").removeClass(ba+"-state-highlight");O(v,aa);da&&va(v,aa)})}else{var W,wa,Fa=p("slotMinutes")%15==0,oa="<div class='fc-agenda-head' style='position:relative;z-index:4'><table style='width:100%'><tr class='fc-first"+(p("allDaySlot")?"":" fc-last")+"'><th class='fc-leftmost "+ba+"-state-default'>&nbsp;</th>";for(W=0;W<g;W++){oa+="<th class='fc-"+Da[v.getDay()]+" "+ba+"-state-default'>"+F(v,L)+"</th>";O(v,aa);da&&va(v,aa)}oa+="<th class='"+ba+"-state-default'>&nbsp;</th></tr>";
+if(p("allDaySlot"))oa+="<tr class='fc-all-day'><th class='fc-axis fc-leftmost "+ba+"-state-default'>"+p("allDayText")+"</th><td colspan='"+g+"' class='"+ba+"-state-default'><div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></td><th class='"+ba+"-state-default'>&nbsp;</th></tr><tr class='fc-divider fc-last'><th colspan='"+(g+2)+"' class='"+ba+"-state-default fc-leftmost'><div/></th></tr>";oa+="</table></div>";ka=m(oa).appendTo(a);w(ka.find("td"));sb=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(ka);
+v=tb();var cb=sa(x(v),ja);sa(v,na);oa="<table>";for(W=0;v<cb;W++){wa=v.getMinutes();oa+="<tr class='"+(!W?"fc-first":!wa?"":"fc-minor")+"'><th class='fc-axis fc-leftmost "+ba+"-state-default'>"+(!Fa||!wa?F(v,p("axisFormat")):"&nbsp;")+"</th><td class='fc-slot"+W+" "+ba+"-state-default'><div style='position:relative'>&nbsp;</div></td></tr>";sa(v,p("slotMinutes"));n++}oa+="</table>";ia=m("<div class='fc-agenda-body' style='position:relative;z-index:2;overflow:auto'/>").append(ma=m("<div style='position:relative;overflow:hidden'>").append(ua=
+m(oa))).appendTo(a);H(ia.find("td"));ub=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(ma);v=x(o);oa="<div class='fc-agenda-bg' style='position:absolute;z-index:1'><table style='width:100%;height:100%'><tr class='fc-first'>";for(W=0;W<g;W++){oa+="<td class='fc-"+Da[v.getDay()]+" "+ba+"-state-default "+(!W?"fc-leftmost ":"")+(+v==+D?ba+"-state-highlight fc-today":"fc-not-today")+"'><div class='fc-day-content'><div>&nbsp;</div></div></td>";O(v,aa);da&&va(v,aa)}oa+="</tr></table></div>";
+d=m(oa).appendTo(a)}}function i(o,v){if(o===Z)o=R;R=o;Aa={};o=o-ka.height();o=Math.min(o,ua.height());ia.height(o);q=ia.find("tr:first div").height()+1;v&&j()}function s(o){J=o;Ba.clear();ia.width(o).css("overflow","auto");ua.width("");var v=ka.find("tr:first th"),D=ka.find("tr.fc-all-day th:last"),L=d.find("td"),W=ia[0].clientWidth;ua.width(W);W=ia[0].clientWidth;ua.width(W);z=0;Ka(ka.find("tr:lt(2) th:first").add(ia.find("tr:first th")).width(1).each(function(){z=Math.max(z,m(this).outerWidth())}),
+z);e=Math.floor((W-z)/g);Ka(L.slice(0,-1),e);Ka(v.slice(1,-2),e);if(o!=W){Ka(v.slice(-2,-1),W-z-e*(g-1));v.slice(-1).show();D.show()}else{ia.css("overflow","hidden");v.slice(-2,-1).width("");v.slice(-1).hide();D.hide()}d.css({top:ka.find("tr").height(),left:z,width:W-z,height:R})}function j(){var o=tb(),v=x(o);v.setHours(p("firstHour"));var D=X(o,v)+1;o=function(){ia.scrollTop(D)};o();setTimeout(o,0)}function l(){Q=ia.scrollTop()}function t(){ia.scrollTop(Q)}function w(o){o.click(E).mousedown(qa)}
+function H(o){o.click(E).mousedown(C)}function E(o){if(!p("selectable")){var v=Math.min(g-1,Math.floor((o.pageX-d.offset().left)/e));v=O(x(r.visStart),v*aa+T);var D=this.className.match(/fc-slot(\d+)/);if(D){D=parseInt(D[1])*p("slotMinutes");var L=Math.floor(D/60);v.setHours(L);v.setMinutes(D%60+na);$("dayClick",this,v,false,o)}else $("dayClick",this,v,true,o)}}function K(o,v,D){D&&la.build();var L=x(r.visStart);if(ra){D=Ea(v,L)*aa+T+1;o=Ea(o,L)*aa+T+1}else{D=Ea(o,L);o=Ea(v,L)}D=Math.max(0,D);o=Math.min(g,
+o);D<o&&w(y(0,D,0,o-1))}function y(o,v,D,L){o=la.rect(o,v,D,L,ka);return Y(o,ka)}function P(o,v){for(var D=x(r.visStart),L=O(x(D),1),W=0;W<g;W++){var wa=new Date(Math.max(D,o)),Fa=new Date(Math.min(L,v));if(wa<Fa){var oa=W*aa+T;oa=la.rect(0,oa,0,oa,ma);wa=X(D,wa);Fa=X(D,Fa);oa.top=wa;oa.height=Fa-wa;H(Y(oa,ma))}O(D,1);O(L,1)}}function ea(o){return z+Ba.left(o)}function S(o){return z+Ba.right(o)}function M(o){return(o-Math.max(ha,da)+g)%g*aa+T}function X(o,v){o=x(o,true);if(v<sa(x(o),na))return 0;
+if(v>=sa(x(o),ja))return ma.height();o=p("slotMinutes");v=v.getHours()*60+v.getMinutes()-na;var D=Math.floor(v/o),L=Aa[D];if(L===Z)L=Aa[D]=ia.find("tr:eq("+D+") td div")[0].offsetTop;return Math.max(0,Math.round(L-1+q*(v%o/o)))}function ga(o){var v=O(x(r.visStart),o.col*aa+T);o=o.row;p("allDaySlot")&&o--;o>=0&&sa(v,na+o*p("slotMinutes"));return v}function N(o){return p("allDaySlot")&&!o.row}function U(){return{left:z,right:J}}function u(){return ka.find("tr.fc-all-day")}function B(o){var v=x(o.start);
+if(o.allDay)return v;return sa(v,p("defaultEventMinutes"))}function G(o,v){if(v)return x(o);return sa(x(o),p("slotMinutes"))}function k(o,v,D){if(D)p("allDaySlot")&&K(o,O(x(v),1),true);else c(o,v)}function c(o,v){var D=p("selectHelper");la.build();if(D){var L=Ea(o,r.visStart)*aa+T;if(L>=0&&L<g){L=la.rect(0,L,0,L,ma);var W=X(o,o),wa=X(o,v);if(wa>W){L.top=W;L.height=wa-W;L.left+=2;L.width-=5;if(m.isFunction(D)){if(o=D(o,v)){L.position="absolute";L.zIndex=8;za=m(o).css(L).appendTo(ma)}}else{za=m(ya({title:"",
+start:o,end:v,className:[],editable:false},L,"fc-event fc-event-vert fc-corner-top fc-corner-bottom "));m.browser.msie&&za.find("span.fc-event-bg").hide();za.css("opacity",p("dragOpacity"))}if(za){H(za);ma.append(za);Ka(za,L.width,true);Qa(za,L.height,true)}}}}else P(o,v)}function A(){ca();if(za){za.remove();za=null}}function C(o){if(o.which==1&&p("selectable")){ta(o);var v=this,D;Ca.start(function(L,W){A();if(L&&L.col==W.col&&!N(L)){W=ga(W);L=ga(L);D=[W,sa(x(W),p("slotMinutes")),L,sa(x(L),p("slotMinutes"))].sort(vb);
+c(D[0],D[3])}else D=null},o);m(document).one("mouseup",function(L){Ca.stop();if(D){+D[0]==+D[1]&&$("dayClick",v,D[0],false,L);pa(D[0],D[3],false,L)}})}}function I(o,v){Ca.start(function(D){ca();if(D)if(N(D))y(D.row,D.col,D.row,D.col);else{D=ga(D);var L=sa(x(D),p("defaultEventMinutes"));P(D,L)}},v)}function V(o,v,D){var L=Ca.stop();ca();L&&$("drop",o,ga(L),N(L),v,D)}var r=this;r.renderAgenda=h;r.setWidth=s;r.setHeight=i;r.beforeHide=l;r.afterShow=t;r.defaultEventEnd=B;r.timePosition=X;r.dayOfWeekCol=
+M;r.cellDate=ga;r.cellIsAllDay=N;r.allDayTR=u;r.allDayBounds=U;r.getHoverListener=function(){return Ca};r.colContentLeft=ea;r.colContentRight=S;r.getDaySegmentContainer=function(){return sb};r.getSlotSegmentContainer=function(){return ub};r.getMinMinute=function(){return na};r.getMaxMinute=function(){return ja};r.getBodyContent=function(){return ma};r.getRowCnt=function(){return 1};r.getColCnt=function(){return g};r.getColWidth=function(){return e};r.getSlotHeight=function(){return q};r.defaultSelectionEnd=
+G;r.renderDayOverlay=K;r.renderSelection=k;r.clearSelection=A;r.dragStart=I;r.dragStop=V;jb.call(r,a,b,f);kb.call(r);lb.call(r);Lb.call(r);var p=r.opt,$=r.trigger,fa=r.clearEvents,Y=r.renderOverlay,ca=r.clearOverlays,pa=r.reportSelection,ta=r.unselect,qa=r.daySelectionMousedown,ya=r.slotSegHtml,F=b.formatDate,ka,ia,ma,ua,d,g,n=0,z,e,q,J,R,Q,ba,ha,da,ra,aa,T,na,ja,la,Ca,Ba,Aa={},za,sb,ub;mb(a.addClass("fc-agenda"));la=new nb(function(o,v){function D(xa){return Math.max(oa,Math.min(cb,xa))}var L,W,
+wa;d.find("td").each(function(xa,Mb){L=m(Mb);W=L.offset().left;if(xa)wa[1]=W;wa=[W];v[xa]=wa});wa[1]=W+L.outerWidth();if(p("allDaySlot")){L=ka.find("td");W=L.offset().top;o[0]=[W,W+L.outerHeight()]}for(var Fa=ma.offset().top,oa=ia.offset().top,cb=oa+ia.outerHeight(),La=0;La<n;La++)o.push([D(Fa+q*La),D(Fa+q*(La+1))])});Ca=new ob(la);Ba=new pb(function(o){return d.find("td:eq("+o+") div div")})}function Lb(){function a(d,g){M(ua=d);var n,z=d.length,e=[],q=[];for(n=0;n<z;n++)d[n].allDay?e.push(d[n]):
+q.push(d[n]);if(P("allDaySlot")){I(h(e),g);N()}j(i(q),g)}function b(d){f();a(ua,d)}function f(){X();U().empty();u().empty()}function h(d){d=$a(ab(d,m.map(d,Oa),y.visStart,y.visEnd));var g,n=d.length,z,e,q,J=[];for(g=0;g<n;g++){z=d[g];for(e=0;e<z.length;e++){q=z[e];q.row=0;q.level=g;J.push(q)}}return J}function i(d){var g=r(),n=k(),z=G(),e=sa(x(y.visStart),n),q=m.map(d,s),J,R,Q,ba,ha,da,ra=[];for(J=0;J<g;J++){R=$a(ab(d,q,e,sa(x(e),z-n)));Nb(R);for(Q=0;Q<R.length;Q++){ba=R[Q];for(ha=0;ha<ba.length;ha++){da=
+ba[ha];da.col=J;da.level=Q;ra.push(da)}}O(e,1,true)}return ra}function s(d){return d.end?x(d.end):sa(x(d.start),P("defaultEventMinutes"))}function j(d,g){var n,z=d.length,e,q,J,R,Q,ba,ha,da,ra,aa,T="",na,ja,la={},Ca={},Ba=u(),Aa;n=r();if(na=P("isRTL")){ja=-1;Aa=n-1}else{ja=1;Aa=0}for(n=0;n<z;n++){e=d[n];q=e.event;J="fc-event fc-event-vert ";if(e.isStart)J+="fc-corner-top ";if(e.isEnd)J+="fc-corner-bottom ";R=c(e.start,e.start);Q=c(e.start,e.end);ba=e.col;ha=e.level;da=e.forward||0;ra=A(ba*ja+Aa);
+aa=C(ba*ja+Aa)-ra;aa=Math.min(aa-6,aa*0.95);ba=ha?aa/(ha+da+1):da?(aa/(da+1)-6)*2:aa;ha=ra+aa/(ha+da+1)*ha*ja+(na?aa-ba:0);e.top=R;e.left=ha;e.outerWidth=ba;e.outerHeight=Q-R;T+=l(q,e,J)}Ba[0].innerHTML=T;na=Ba.children();for(n=0;n<z;n++){e=d[n];q=e.event;T=m(na[n]);ja=ea("eventRender",q,q,T);if(ja===false)T.remove();else{if(ja&&ja!==true){T.remove();T=m(ja).css({position:"absolute",top:e.top,left:e.left}).appendTo(Ba)}e.element=T;if(q._id===g)w(q,T,e);else T[0]._fci=n;Y(q,T)}}wb(Ba,d,w);for(n=0;n<
+z;n++){e=d[n];if(T=e.element){q=la[g=e.key=xb(T[0])];e.vsides=q===Z?(la[g]=Sa(T[0],true)):q;q=Ca[g];e.hsides=q===Z?(Ca[g]=db(T[0],true)):q;g=T.find("span.fc-event-title");if(g.length)e.titleTop=g[0].offsetTop}}for(n=0;n<z;n++){e=d[n];if(T=e.element){T[0].style.width=Math.max(0,e.outerWidth-e.hsides)+"px";la=Math.max(0,e.outerHeight-e.vsides);T[0].style.height=la+"px";q=e.event;if(e.titleTop!==Z&&la-e.titleTop<10){T.find("span.fc-event-time").text(ia(q.start,P("timeFormat"))+" - "+q.title);T.find("span.fc-event-title").remove()}ea("eventAfterRender",
+q,q,T)}}}function l(d,g,n){return"<div class='"+n+d.className.join(" ")+"' style='position:absolute;z-index:8;top:"+g.top+"px;left:"+g.left+"px'><a"+(d.url?" href='"+Ma(d.url)+"'":"")+"><span class='fc-event-bg'></span><span class='fc-event-time'>"+Ma(ma(d.start,d.end,P("timeFormat")))+"</span><span class='fc-event-title'>"+Ma(d.title)+"</span></a>"+((d.editable||d.editable===Z&&P("editable"))&&!P("disableResizing")&&m.fn.resizable?"<div class='ui-resizable-handle ui-resizable-s'>=</div>":"")+"</div>"}
+function t(d,g,n){ga(d,g);if(d.editable||d.editable===Z&&P("editable")){H(d,g,n.isStart);n.isEnd&&V(d,g,p())}}function w(d,g,n){ga(d,g);if(d.editable||d.editable===Z&&P("editable")){var z=g.find("span.fc-event-time");E(d,g,z);n.isEnd&&K(d,g,z)}}function H(d,g,n){if(!P("disableDragging")&&g.draggable){var z,e=true,q,J=P("isRTL")?-1:1,R=B(),Q=p(),ba=$(),ha=k();g.draggable({zIndex:9,opacity:P("dragOpacity","month"),revertDuration:P("dragRevertDuration"),start:function(ra,aa){ea("eventDragStart",g,d,
+ra,aa);pa(d,g);z=g.width();R.start(function(T,na,ja,la){g.draggable("option","revert",!T||!ja&&!la);F();if(T){q=la*J;if(T.row){if(n&&e){Qa(g.width(Q-10),ba*Math.round((d.end?(d.end-d.start)/Ob:P("defaultEventMinutes"))/P("slotMinutes")));g.draggable("option","grid",[Q,1]);e=false}}else{ya(O(x(d.start),q),O(Oa(d),q));da()}}},ra,"drag")},stop:function(ra,aa){var T=R.stop();F();ea("eventDragStop",g,d,ra,aa);if(T&&(!e||q)){g.find("a").removeAttr("href");T=0;e||(T=Math.round((g.offset().top-fa().offset().top)/
+ba)*P("slotMinutes")+ha-(d.start.getHours()*60+d.start.getMinutes()));ta(this,d,q,T,e,ra,aa)}else{da();m.browser.msie&&g.css("filter","");ca(d,g)}}});function da(){if(!e){g.width(z).height("").draggable("option","grid",null);e=true}}}}function E(d,g,n){if(!P("disableDragging")&&g.draggable){var z,e=false,q,J,R,Q=P("isRTL")?-1:1,ba=B(),ha=r(),da=p(),ra=$();g.draggable({zIndex:9,scroll:false,grid:[da,ra],axis:ha==1?"y":false,opacity:P("dragOpacity"),revertDuration:P("dragRevertDuration"),start:function(na,
+ja){ea("eventDragStart",g,d,na,ja);pa(d,g);m.browser.msie&&g.find("span.fc-event-bg").hide();z=g.position();J=R=0;ba.start(function(la,Ca,Ba,Aa){g.draggable("option","revert",!la);F();if(la){q=Aa*Q;if(P("allDaySlot")&&!la.row){if(!e){e=true;n.hide();g.draggable("option","grid",null)}ya(O(x(d.start),q),O(Oa(d),q))}else T()}},na,"drag")},drag:function(na,ja){J=Math.round((ja.position.top-z.top)/ra)*P("slotMinutes");if(J!=R){e||aa(J);R=J}},stop:function(na,ja){var la=ba.stop();F();ea("eventDragStop",
+g,d,na,ja);if(la&&(q||J||e))ta(this,d,q,e?0:J,e,na,ja);else{T();g.css(z);aa(0);m.browser.msie&&g.css("filter","").find("span.fc-event-bg").css("display","");ca(d,g)}}});function aa(na){var ja=sa(x(d.start),na),la;if(d.end)la=sa(x(d.end),na);n.text(ma(ja,la,P("timeFormat")))}function T(){if(e){n.css("display","");g.draggable("option","grid",[da,ra]);e=false}}}}function K(d,g,n){if(!P("disableResizing")&&g.resizable){var z,e,q=$();g.resizable({handles:{s:"div.ui-resizable-s"},grid:q,start:function(J,
+R){z=e=0;pa(d,g);m.browser.msie&&m.browser.version=="6.0"&&g.css("overflow","hidden");g.css("z-index",9);ea("eventResizeStart",this,d,J,R)},resize:function(J,R){z=Math.round((Math.max(q,g.height())-R.originalSize.height)/q);if(z!=e){n.text(ma(d.start,!z&&!d.end?null:sa(S(d),P("slotMinutes")*z),P("timeFormat")));e=z}},stop:function(J,R){ea("eventResizeStop",this,d,J,R);if(z)qa(this,d,0,P("slotMinutes")*z,J,R);else{g.css("z-index",8);ca(d,g)}}})}}var y=this;y.renderEvents=a;y.rerenderEvents=b;y.clearEvents=
+f;y.slotSegHtml=l;y.bindDaySeg=t;qb.call(y);var P=y.opt,ea=y.trigger,S=y.eventEnd,M=y.reportEvents,X=y.clearEventData,ga=y.eventElementHandlers,N=y.setHeight,U=y.getDaySegmentContainer,u=y.getSlotSegmentContainer,B=y.getHoverListener,G=y.getMaxMinute,k=y.getMinMinute,c=y.timePosition,A=y.colContentLeft,C=y.colContentRight,I=y.renderDaySegs,V=y.resizableDayEvent,r=y.getColCnt,p=y.getColWidth,$=y.getSlotHeight,fa=y.getBodyContent,Y=y.reportEventElement,ca=y.showEvents,pa=y.hideEvents,ta=y.eventDrop,
+qa=y.eventResize,ya=y.renderDayOverlay,F=y.clearOverlays,ka=y.calendar,ia=ka.formatDate,ma=ka.formatDates,ua=[]}function Nb(a){var b,f,h,i,s,j;for(b=a.length-1;b>0;b--){i=a[b];for(f=0;f<i.length;f++){s=i[f];for(h=0;h<a[b-1].length;h++){j=a[b-1][h];if(yb(s,j))j.forward=Math.max(j.forward||0,(s.forward||0)+1)}}}}function jb(a,b,f){function h(k,c){k=G[k];if(typeof k=="object")return Wa(k,c||f);return k}function i(k,c){return b.trigger.apply(b,[k,c||M].concat(Array.prototype.slice.call(arguments,2),[M]))}
+function s(k){U={};var c,A=k.length,C;for(c=0;c<A;c++){C=k[c];if(U[C._id])U[C._id].push(C);else U[C._id]=[C]}}function j(){u=[];B={}}function l(k){return k.end?x(k.end):X(k)}function t(k,c){u.push(c);if(B[k._id])B[k._id].push(c);else B[k._id]=[c]}function w(k,c){c.click(function(A){if(!c.hasClass("ui-draggable-dragging")&&!c.hasClass("ui-resizable-resizing"))return i("eventClick",this,k,A)}).hover(function(A){i("eventMouseover",this,k,A)},function(A){i("eventMouseout",this,k,A)})}function H(k,c){K(k,
+c,"show")}function E(k,c){K(k,c,"hide")}function K(k,c,A){k=B[k._id];var C,I=k.length;for(C=0;C<I;C++)k[C][0]!=c[0]&&k[C][A]()}function y(k,c,A,C,I,V,r){var p=c.allDay,$=c._id;ea(U[$],A,C,I);i("eventDrop",k,c,A,C,I,function(){ea(U[$],-A,-C,p);N()},V,r);M.eventsChanged=true;N($)}function P(k,c,A,C,I,V){var r=c._id;S(U[r],A,C);i("eventResize",k,c,A,C,function(){S(U[r],-A,-C);N()},I,V);M.eventsChanged=true;N(r)}function ea(k,c,A,C){A=A||0;for(var I,V=k.length,r=0;r<V;r++){I=k[r];if(C!==Z)I.allDay=C;
+sa(O(I.start,c,true),A);if(I.end)I.end=sa(O(I.end,c,true),A);ga(I,G)}}function S(k,c,A){A=A||0;for(var C,I=k.length,V=0;V<I;V++){C=k[V];C.end=sa(O(l(C),c,true),A);ga(C,G)}}var M=this;M.element=a;M.calendar=b;M.name=f;M.opt=h;M.trigger=i;M.reportEvents=s;M.clearEventData=j;M.eventEnd=l;M.reportEventElement=t;M.eventElementHandlers=w;M.showEvents=H;M.hideEvents=E;M.eventDrop=y;M.eventResize=P;var X=M.defaultEventEnd,ga=b.normalizeEvent,N=b.rerenderEvents,U={},u=[],B={},G=b.options}function qb(){function a(N,
+U){var u=h("isRTL"),B,G=N.length,k,c,A,C,I,V="",r,p={},$={},fa=[],Y=[];B=y();r=B.left;var ca=B.right,pa=w();H();var ta=M();for(B=0;B<G;B++){k=N[B];c=k.event;A="fc-event fc-event-hori ";if(u){if(k.isStart)A+="fc-corner-right ";if(k.isEnd)A+="fc-corner-left ";C=k.isEnd?P(S(k.end.getDay()-1)):r;I=k.isStart?ea(S(k.start.getDay())):ca}else{if(k.isStart)A+="fc-corner-left ";if(k.isEnd)A+="fc-corner-right ";C=k.isStart?P(S(k.start.getDay())):r;I=k.isEnd?ea(S(k.end.getDay()-1)):ca}V+="<div class='"+A+c.className.join(" ")+
+"' style='position:absolute;z-index:8;left:"+C+"px'><a"+(c.url?" href='"+Ma(c.url)+"'":"")+">"+(!c.allDay&&k.isStart?"<span class='fc-event-time'>"+Ma(ga(c.start,c.end,h("timeFormat")))+"</span>":"")+"<span class='fc-event-title'>"+Ma(c.title)+"</span></a>"+((c.editable||c.editable===Z&&h("editable"))&&!h("disableResizing")&&m.fn.resizable?"<div class='ui-resizable-handle ui-resizable-"+(u?"w":"e")+"'></div>":"")+"</div>";k.left=C;k.outerWidth=I-C}ta[0].innerHTML=V;V=ta.children();for(B=0;B<G;B++){k=
+N[B];u=m(V[B]);c=k.event;r=i("eventRender",c,c,u);if(r===false)u.remove();else{if(r&&r!==true){u.remove();u=m(r).css({position:"absolute",left:k.left}).appendTo(ta)}k.element=u;if(c._id===U)X(c,u,k);else u[0]._fci=B;s(c,u)}}wb(ta,N,X);for(B=0;B<G;B++){k=N[B];if(u=k.element){c=p[U=k.key=xb(u[0])];k.hsides=c===Z?(p[U]=db(u[0],true)):c}}for(B=0;B<G;B++){k=N[B];if(u=k.element)u[0].style.width=Math.max(0,k.outerWidth-k.hsides)+"px"}for(B=0;B<G;B++){k=N[B];if(u=k.element){c=$[U=k.key];k.outerHeight=u[0].offsetHeight+
+(c===Z?($[U]=zb(u[0])):c)}}for(p=B=0;p<pa;p++){for($=U=c=0;B<G&&(k=N[B]).row==p;){if(k.level!=U){$+=c;c=0;U++}c=Math.max(c,k.outerHeight||0);k.top=$;B++}fa[p]=K(p).find("td:first div.fc-day-content > div").height($+c)}for(p=0;p<pa;p++)Y[p]=fa[p][0].offsetTop;for(B=0;B<G;B++){k=N[B];if(u=k.element){u[0].style.top=Y[k.row]+k.top+"px";c=k.event;i("eventAfterRender",c,c,u)}}}function b(N,U){if(!h("disableResizing")&&U.resizable){var u=E();U.resizable({handles:h("isRTL")?{w:"div.ui-resizable-w"}:{e:"div.ui-resizable-e"},
+grid:u,minWidth:u/2,containment:f.element.parent().parent(),start:function(B,G){U.css("z-index",9);l(N,U);i("eventResizeStart",this,N,B,G)},stop:function(B,G){i("eventResizeStop",this,N,B,G);var k=Math.round((U.width()-G.originalSize.width)/u);if(k)t(this,N,k,0,B,G);else{U.css("z-index",8);j(N,U)}}})}}var f=this;f.renderDaySegs=a;f.resizableDayEvent=b;var h=f.opt,i=f.trigger,s=f.reportEventElement,j=f.showEvents,l=f.hideEvents,t=f.eventResize,w=f.getRowCnt,H=f.getColCnt,E=f.getColWidth,K=f.allDayTR,
+y=f.allDayBounds,P=f.colContentLeft,ea=f.colContentRight,S=f.dayOfWeekCol,M=f.getDaySegmentContainer,X=f.bindDaySeg,ga=f.calendar.formatDates}function lb(){function a(E,K,y){b();K||(K=l(E,y));t(E,K,y);f(E,K,y)}function b(E){if(H){H=false;w();j("unselect",null,E)}}function f(E,K,y,P){H=true;j("select",null,E,K,y,P)}function h(E){var K=i.cellDate,y=i.cellIsAllDay,P=i.getHoverListener();if(E.which==1&&s("selectable")){b(E);var ea=this,S;P.start(function(M,X){w();if(M&&y(M)){S=[K(X),K(M)].sort(vb);t(S[0],
+S[1],true)}else S=null},E);m(document).one("mouseup",function(M){P.stop();if(S){+S[0]==+S[1]&&j("dayClick",ea,S[0],true,M);f(S[0],S[1],true,M)}})}}var i=this;i.select=a;i.unselect=b;i.reportSelection=f;i.daySelectionMousedown=h;var s=i.opt,j=i.trigger,l=i.defaultSelectionEnd,t=i.renderSelection,w=i.clearSelection,H=false;s("selectable")&&s("unselectAuto")&&m(document).mousedown(function(E){var K=s("unselectCancel");if(K)if(m(E.target).parents(K).length)return;b(E)})}function kb(){function a(s,j){var l=
+i.shift();l||(l=m("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>"));l[0].parentNode!=j[0]&&l.appendTo(j);h.push(l.css(s).show());return l}function b(){for(var s;s=h.shift();)i.push(s.hide().unbind())}var f=this;f.renderOverlay=a;f.clearOverlays=b;var h=[],i=[]}function nb(a){var b=this,f,h;b.build=function(){f=[];h=[];a(f,h)};b.cell=function(i,s){var j=f.length,l=h.length,t,w=-1,H=-1;for(t=0;t<j;t++)if(s>=f[t][0]&&s<f[t][1]){w=t;break}for(t=0;t<l;t++)if(i>=h[t][0]&&i<h[t][1]){H=
+t;break}return w>=0&&H>=0?{row:w,col:H}:null};b.rect=function(i,s,j,l,t){t=t.offset();return{top:f[i][0]-t.top,left:h[s][0]-t.left,width:h[l][1]-h[s][0],height:f[j][1]-f[i][0]}}}function ob(a){function b(l){l=a.cell(l.pageX,l.pageY);if(!l!=!j||l&&(l.row!=j.row||l.col!=j.col)){if(l){s||(s=l);i(l,s,l.row-s.row,l.col-s.col)}else i(l,s);j=l}}var f=this,h,i,s,j;f.start=function(l,t,w){i=l;s=j=null;a.build();b(t);h=w||"mousemove";m(document).bind(h,b)};f.stop=function(){m(document).unbind(h,b);return j}}
+function pb(a){function b(j){return h[j]=h[j]||a(j)}var f=this,h={},i={},s={};f.left=function(j){return i[j]=i[j]===Z?b(j).position().left:i[j]};f.right=function(j){return s[j]=s[j]===Z?f.left(j)+b(j).width():s[j]};f.clear=function(){h={};i={};s={}}}function Ta(a,b,f){a.setFullYear(a.getFullYear()+b);f||Ia(a);return a}function Ua(a,b,f){if(+a){b=a.getMonth()+b;var h=x(a);h.setDate(1);h.setMonth(b);a.setMonth(b);for(f||Ia(a);a.getMonth()!=h.getMonth();)a.setDate(a.getDate()+(a<h?1:-1))}return a}function O(a,
+b,f){if(+a){b=a.getDate()+b;var h=x(a);h.setHours(9);h.setDate(b);a.setDate(b);f||Ia(a);eb(a,h)}return a}function eb(a,b){if(+a)for(;a.getDate()!=b.getDate();)a.setTime(+a+(a<b?1:-1)*Pb)}function sa(a,b){a.setMinutes(a.getMinutes()+b);return a}function Ia(a){a.setHours(0);a.setMinutes(0);a.setSeconds(0);a.setMilliseconds(0);return a}function x(a,b){if(b)return Ia(new Date(+a));return new Date(+a)}function tb(){var a=0,b;do b=new Date(1970,a++,1);while(b.getHours());return b}function va(a,b,f){for(b=
+b||1;!a.getDay()||f&&a.getDay()==1||!f&&a.getDay()==6;)O(a,b);return a}function Ea(a,b){return Math.round((x(a,true)-x(b,true))/ib)}function hb(a,b,f,h){if(b!==Z&&b!=a.getFullYear()){a.setDate(1);a.setMonth(0);a.setFullYear(b)}if(f!==Z&&f!=a.getMonth()){a.setDate(1);a.setMonth(f)}h!==Z&&a.setDate(h)}function Xa(a,b){if(typeof a=="object")return a;if(typeof a=="number")return new Date(a*1E3);if(typeof a=="string"){if(a.match(/^\d+$/))return new Date(parseInt(a)*1E3);if(b===Z)b=true;return Ab(a,b)||
+(a?new Date(a):null)}return null}function Ab(a,b){a=a.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?$/);if(!a)return null;var f=new Date(a[1],0,1);if(b||!a[14]){b=new Date(a[1],0,1,9,0);if(a[3]){f.setMonth(a[3]-1);b.setMonth(a[3]-1)}if(a[5]){f.setDate(a[5]);b.setDate(a[5])}eb(f,b);a[7]&&f.setHours(a[7]);a[8]&&f.setMinutes(a[8]);a[10]&&f.setSeconds(a[10]);a[12]&&f.setMilliseconds(Number("0."+a[12])*1E3);eb(f,b)}else{f.setUTCFullYear(a[1],
+a[3]?a[3]-1:0,a[5]||1);f.setUTCHours(a[7]||0,a[8]||0,a[10]||0,a[12]?Number("0."+a[12])*1E3:0);b=Number(a[16])*60+Number(a[17]);b*=a[15]=="-"?1:-1;f=new Date(+f+b*60*1E3)}return f}function bb(a){if(typeof a=="number")return a*60;if(typeof a=="object")return a.getHours()*60+a.getMinutes();if(a=a.match(/(\d+)(?::(\d+))?\s*(\w+)?/)){var b=parseInt(a[1]);if(a[3]){b%=12;if(a[3].toLowerCase().charAt(0)=="p")b+=12}return b*60+(a[2]?parseInt(a[2]):0)}}function Ja(a,b,f){return Va(a,null,b,f)}function Va(a,
+b,f,h){h=h||Pa;var i=a,s=b,j,l=f.length,t,w,H,E="";for(j=0;j<l;j++){t=f.charAt(j);if(t=="'")for(w=j+1;w<l;w++){if(f.charAt(w)=="'"){if(i){E+=w==j+1?"'":f.substring(j+1,w);j=w}break}}else if(t=="(")for(w=j+1;w<l;w++){if(f.charAt(w)==")"){j=Ja(i,f.substring(j+1,w),h);if(parseInt(j.replace(/\D/,"")))E+=j;j=w;break}}else if(t=="[")for(w=j+1;w<l;w++){if(f.charAt(w)=="]"){t=f.substring(j+1,w);j=Ja(i,t,h);if(j!=Ja(s,t,h))E+=j;j=w;break}}else if(t=="{"){i=b;s=a}else if(t=="}"){i=a;s=b}else{for(w=l;w>j;w--)if(H=
+Qb[f.substring(j,w)]){if(i)E+=H(i,h);j=w-1;break}if(w==j)if(i)E+=t}}return E}function Oa(a){return a.end?Rb(a.end,a.allDay):O(x(a.start),1)}function Rb(a,b){a=x(a);return b||a.getHours()||a.getMinutes()?O(a,1):Ia(a)}function Sb(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function yb(a,b){return a.end>b.start&&a.start<b.end}function ab(a,b,f,h){var i=[],s,j=a.length,l,t,w,H,E;for(s=0;s<j;s++){l=a[s];t=l.start;w=b[s];if(w>f&&t<h){if(t<f){t=x(f);H=false}else{t=t;H=true}if(w>
+h){w=x(h);E=false}else{w=w;E=true}i.push({event:l,start:t,end:w,isStart:H,isEnd:E,msLength:w-t})}}return i.sort(Sb)}function $a(a){var b=[],f,h=a.length,i,s,j,l;for(f=0;f<h;f++){i=a[f];for(s=0;;){j=false;if(b[s])for(l=0;l<b[s].length;l++)if(yb(b[s][l],i)){j=true;break}if(j)s++;else break}if(b[s])b[s].push(i);else b[s]=[i]}return b}function wb(a,b,f){a.unbind("mouseover").mouseover(function(h){for(var i=h.target,s;i!=this;){s=i;i=i.parentNode}if((i=s._fci)!==Z){s._fci=Z;s=b[i];f(s.event,s.element,
+s);m(h.target).trigger(h)}h.stopPropagation()})}function Ka(a,b,f){a.each(function(h,i){i.style.width=Math.max(0,b-db(i,f))+"px"})}function Qa(a,b,f){a.each(function(h,i){i.style.height=Math.max(0,b-Sa(i,f))+"px"})}function db(a,b){return(parseFloat(m.curCSS(a,"paddingLeft",true))||0)+(parseFloat(m.curCSS(a,"paddingRight",true))||0)+(parseFloat(m.curCSS(a,"borderLeftWidth",true))||0)+(parseFloat(m.curCSS(a,"borderRightWidth",true))||0)+(b?Tb(a):0)}function Tb(a){return(parseFloat(m.curCSS(a,"marginLeft",
+true))||0)+(parseFloat(m.curCSS(a,"marginRight",true))||0)}function Sa(a,b){return(parseFloat(m.curCSS(a,"paddingTop",true))||0)+(parseFloat(m.curCSS(a,"paddingBottom",true))||0)+(parseFloat(m.curCSS(a,"borderTopWidth",true))||0)+(parseFloat(m.curCSS(a,"borderBottomWidth",true))||0)+(b?zb(a):0)}function zb(a){return(parseFloat(m.curCSS(a,"marginTop",true))||0)+(parseFloat(m.curCSS(a,"marginBottom",true))||0)}function Ra(a,b){b=typeof b=="number"?b+"px":b;a[0].style.cssText+=";min-height:"+b+";_height:"+
+b}function gb(){}function vb(a,b){return a-b}function Na(a){return(a<10?"0":"")+a}function Wa(a,b){if(a[b]!==Z)return a[b];b=b.split(/(?=[A-Z])/);for(var f=b.length-1,h;f>=0;f--){h=a[b[f].toLowerCase()];if(h!==Z)return h}return a[""]}function Ma(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function xb(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,
+"")}function mb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}var Pa={defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},
+isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:"&nbsp;&#9668;&nbsp;",next:"&nbsp;&#9658;&nbsp;",prevYear:"&nbsp;&lt;&lt;&nbsp;",nextYear:"&nbsp;&gt;&gt;&nbsp;",
+today:"today",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},Ub={header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:"&nbsp;&#9658;&nbsp;",next:"&nbsp;&#9668;&nbsp;",prevYear:"&nbsp;&gt;&gt;&nbsp;",nextYear:"&nbsp;&lt;&lt;&nbsp;"},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Ga=m.fullCalendar={version:"1.4.8"},Ha=Ga.views={};m.fn.fullCalendar=function(a){if(typeof a==
+"string"){var b=Array.prototype.slice.call(arguments,1),f;this.each(function(){var i=m.data(this,"fullCalendar");if(i&&m.isFunction(i[a])){i=i[a].apply(i,b);if(f===Z)f=i;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(f!==Z)return f;return this}var h=a.eventSources||[];delete a.eventSources;if(a.events){h.push(a.events);delete a.events}a=m.extend(true,{},Pa,a.isRTL||a.isRTL===Z&&Pa.isRTL?Ub:{},a);this.each(function(i,s){i=m(s);s=new Bb(i,a,h);i.data("fullCalendar",s);s.render()});return this};
+var Eb=1;Ha.month=Fb;Ha.basicWeek=Gb;Ha.basicDay=Hb;var Za;fb({weekMode:"fixed"});Ha.agendaWeek=Jb;Ha.agendaDay=Kb;fb({allDaySlot:true,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:0.5},minTime:0,maxTime:24});Ga.addDays=O;Ga.cloneDate=x;Ga.parseDate=Xa;Ga.parseISO8601=Ab;Ga.parseTime=bb;Ga.formatDate=Ja;Ga.formatDates=Va;var Da=["sun","mon","tue","wed","thu","fri","sat"],ib=864E5,Pb=36E5,Ob=6E4,
+Qb={s:function(a){return a.getSeconds()},ss:function(a){return Na(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Na(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Na(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Na(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Na(a.getDate())},ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},
+M:function(a){return a.getMonth()+1},MM:function(a){return Na(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<12?"A":"P"},TT:function(a){return a.getHours()<12?"AM":"PM"},u:function(a){return Ja(a,
+"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(a){a=a.getDate();if(a>10&&a<20)return"th";return["st","nd","rd"][a%10-1]||"th"}}})(jQuery);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/data/jquery.ui.datepicker-de.js	Tue Feb 01 11:52:10 2011 +0100
@@ -0,0 +1,23 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+	$.datepicker.regional['de'] = {
+		closeText: 'schließen',
+		prevText: '&#x3c;zurück',
+		nextText: 'Vor&#x3e;',
+		currentText: 'heute',
+		monthNames: ['Januar','Februar','März','April','Mai','Juni',
+		'Juli','August','September','Oktober','November','Dezember'],
+		monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dez'],
+		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		weekHeader: 'Wo',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['de']);
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/data/jquery.ui.datepicker-es.js	Tue Feb 01 11:52:10 2011 +0100
@@ -0,0 +1,23 @@
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['es'] = {
+		closeText: 'Cerrar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Sig&#x3e;',
+		currentText: 'Hoy',
+		monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+		'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+		monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+		'Jul','Ago','Sep','Oct','Nov','Dic'],
+		dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['es']);
+});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/data/jquery.ui.datepicker-fr.js	Tue Feb 01 11:52:10 2011 +0100
@@ -0,0 +1,23 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */
+jQuery(function($){
+	$.datepicker.regional['fr'] = {
+		closeText: 'Fermer',
+		prevText: '&#x3c;Préc',
+		nextText: 'Suiv&#x3e;',
+		currentText: 'Courant',
+		monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+		'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+		monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+		'Jul','Aoû','Sep','Oct','Nov','Déc'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr']);
+});
\ No newline at end of file
--- a/web/formwidgets.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/formwidgets.py	Tue Feb 01 11:52:10 2011 +0100
@@ -580,6 +580,8 @@
 
     def _render(self, form, field, renderer):
         req = form._cw
+        if req.lang != 'en':
+            req.add_js('jquery.ui.datepicker-%s.js' % req.lang)
         domid = field.dom_id(form, self.suffix)
         # XXX find a way to understand every format
         fmt = req.property_value('ui.date-format')
--- a/web/test/unittest_application.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/test/unittest_application.py	Tue Feb 01 11:52:10 2011 +0100
@@ -24,7 +24,7 @@
 from urllib import unquote
 
 from logilab.common.testlib import TestCase, unittest_main
-from logilab.common.decorators import clear_cache
+from logilab.common.decorators import clear_cache, classproperty
 
 from cubicweb import AuthenticationError, Unauthorized
 from cubicweb.devtools.testlib import CubicWebTC
@@ -159,6 +159,15 @@
             raise
         self.app.error_handler = raise_hdlr
 
+    @classproperty
+    def config(cls):
+        try:
+            return cls.__dict__['_config']
+        except KeyError:
+            config = super(ApplicationTC, cls).config
+            config.global_set_option('allow-email-login', True)
+            return config
+
     def test_cnx_user_groups_sync(self):
         user = self.user()
         self.assertEqual(user.groups, set(('managers',)))
@@ -324,10 +333,9 @@
         self.assertAuthFailure(req)
         self.assertRaises(AuthenticationError, self.app_publish, req, 'login')
         self.assertEqual(req.cnx, None)
-        authstr = base64.encodestring('%s:%s' % (origsession.login, origsession.authinfo['password']))
+        authstr = base64.encodestring('%s:%s' % (self.admlogin, self.admpassword))
         req._headers['Authorization'] = 'basic %s' % authstr
         self.assertAuthSuccess(req, origsession)
-        self.assertEqual(req.session.authinfo, {'password': origsession.authinfo['password']})
         self.assertRaises(LogOut, self.app_publish, req, 'logout')
         self.assertEqual(len(self.open_sessions), 0)
 
@@ -338,10 +346,9 @@
         self.failUnless('__login' in form)
         self.failUnless('__password' in form)
         self.assertEqual(req.cnx, None)
-        req.form['__login'] = origsession.login
-        req.form['__password'] = origsession.authinfo['password']
+        req.form['__login'] = self.admlogin
+        req.form['__password'] = self.admpassword
         self.assertAuthSuccess(req, origsession)
-        self.assertEqual(req.session.authinfo, {'password': origsession.authinfo['password']})
         self.assertRaises(LogOut, self.app_publish, req, 'logout')
         self.assertEqual(len(self.open_sessions), 0)
 
@@ -351,18 +358,17 @@
         self.execute('INSERT EmailAddress X: X address %(address)s, U primary_email X '
                      'WHERE U login %(login)s', {'address': address, 'login': login})
         self.commit()
-        # option allow-email-login not set
+        # # option allow-email-login not set
         req, origsession = self.init_authentication('cookie')
-        req.form['__login'] = address
-        req.form['__password'] = origsession.authinfo['password']
-        self.assertAuthFailure(req)
+        # req.form['__login'] = address
+        # req.form['__password'] = self.admpassword
+        # self.assertAuthFailure(req)
         # option allow-email-login set
         origsession.login = address
         self.set_option('allow-email-login', True)
         req.form['__login'] = address
-        req.form['__password'] = origsession.authinfo['password']
+        req.form['__password'] = self.admpassword
         self.assertAuthSuccess(req, origsession)
-        self.assertEqual(req.session.authinfo, {'password': origsession.authinfo['password']})
         self.assertRaises(LogOut, self.app_publish, req, 'logout')
         self.assertEqual(len(self.open_sessions), 0)
 
@@ -382,7 +388,6 @@
         asession = req.session
         self.assertEqual(len(self.open_sessions), 1)
         self.assertEqual(asession.login, 'anon')
-        self.assertEqual(asession.authinfo['password'], 'anon')
         self.failUnless(asession.anonymous_session)
         self._reset_cookie(req)
 
@@ -400,10 +405,9 @@
         authstr = base64.encodestring('toto:pouet')
         req._headers['Authorization'] = 'basic %s' % authstr
         self._test_anon_auth_fail(req)
-        authstr = base64.encodestring('%s:%s' % (origsession.login, origsession.authinfo['password']))
+        authstr = base64.encodestring('%s:%s' % (self.admlogin, self.admpassword))
         req._headers['Authorization'] = 'basic %s' % authstr
         self.assertAuthSuccess(req, origsession)
-        self.assertEqual(req.session.authinfo, {'password': origsession.authinfo['password']})
         self.assertRaises(LogOut, self.app_publish, req, 'logout')
         self.assertEqual(len(self.open_sessions), 0)
 
@@ -413,11 +417,9 @@
         req.form['__login'] = 'toto'
         req.form['__password'] = 'pouet'
         self._test_anon_auth_fail(req)
-        req.form['__login'] = origsession.login
-        req.form['__password'] = origsession.authinfo['password']
+        req.form['__login'] = self.admlogin
+        req.form['__password'] = self.admpassword
         self.assertAuthSuccess(req, origsession)
-        self.assertEqual(req.session.authinfo,
-                          {'password': origsession.authinfo['password']})
         self.assertRaises(LogOut, self.app_publish, req, 'logout')
         self.assertEqual(len(self.open_sessions), 0)
 
--- a/web/views/authentication.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/authentication.py	Tue Feb 01 11:52:10 2011 +0100
@@ -100,17 +100,13 @@
             self.anoninfo = (self.anoninfo[0], {'password': self.anoninfo[1]})
 
     def validate_session(self, req, session):
-        """check session validity, reconnecting it to the repository if the
-        associated connection expired in the repository side (hence the
-        necessity for this method). Return the connected user on success.
+        """check session validity and return the connected user on success.
 
         raise :exc:`InvalidSession` if session is corrupted for a reason or
         another and should be closed
 
         also invoked while going from anonymous to logged in
         """
-        # with this authentication manager, session is actually a dbapi
-        # connection
         for retriever in self.authinforetrievers:
             if retriever.request_has_auth_info(req):
                 login = retriever.revalidate_login(req)
@@ -135,8 +131,7 @@
     def authenticate(self, req):
         """authenticate user using connection information found in the request,
         and return corresponding a :class:`~cubicweb.dbapi.Connection` instance,
-        as well as login and authentication information dictionary used to open
-        the connection.
+        as well as login used to open the connection.
 
         raise :exc:`cubicweb.AuthenticationError` if authentication failed
         (no authentication info found or wrong user/password)
@@ -152,8 +147,7 @@
                 continue # the next one may succeed
             for retriever_ in self.authinforetrievers:
                 retriever_.authenticated(retriever, req, cnx, login, authinfo)
-            return cnx, login, authinfo
-
+            return cnx, login
         # false if no authentication info found, eg this is not an
         # authentication failure
         if 'login' in locals():
@@ -162,7 +156,7 @@
         if login:
             cnx = self._authenticate(login, authinfo)
             cnx.anonymous_connection = True
-            return cnx, login, authinfo
+            return cnx, login
         raise AuthenticationError()
 
     def _authenticate(self, login, authinfo):
--- a/web/views/baseviews.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/baseviews.py	Tue Feb 01 11:52:10 2011 +0100
@@ -31,7 +31,7 @@
 
 from rql import nodes
 
-from logilab.mtconverter import TransformError, xml_escape, xml_escape
+from logilab.mtconverter import TransformError, xml_escape
 
 from cubicweb import NoSelectableObject, tags
 from cubicweb.selectors import yes, empty_rset, one_etype_rset, match_kwargs
--- a/web/views/boxes.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/boxes.py	Tue Feb 01 11:52:10 2011 +0100
@@ -208,7 +208,6 @@
             raise component.EmptyComponent()
         self.items = []
 
-
 class RsetBox(component.CtxComponent):
     """helper view class to display an rset in a sidebox"""
     __select__ = nonempty_rset() & match_kwargs('title', 'vid')
--- a/web/views/calendar.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/calendar.py	Tue Feb 01 11:52:10 2011 +0100
@@ -20,15 +20,28 @@
 __docformat__ = "restructuredtext en"
 _ = unicode
 
-from datetime import datetime, date, timedelta
+import copy
+from datetime import timedelta
 
 from logilab.mtconverter import xml_escape
-from logilab.common.date import ONEDAY, strptime, date_range, todate, todatetime
+from logilab.common.date import todatetime
 
+from cubicweb.utils import json_dumps
 from cubicweb.interfaces import ICalendarable
 from cubicweb.selectors import implements, adaptable
 from cubicweb.view import EntityView, EntityAdapter, implements_adapter_compat
 
+# useful constants & functions ################################################
+
+ONEDAY = timedelta(1)
+
+WEEKDAYS = (_("monday"), _("tuesday"), _("wednesday"), _("thursday"),
+            _("friday"), _("saturday"), _("sunday"))
+MONTHNAMES = ( _('january'), _('february'), _('march'), _('april'), _('may'),
+               _('june'), _('july'), _('august'), _('september'), _('october'),
+               _('november'), _('december')
+               )
+
 
 class ICalendarableAdapter(EntityAdapter):
     __needs_bw_compat__ = True
@@ -44,21 +57,10 @@
     @property
     @implements_adapter_compat('ICalendarable')
     def stop(self):
-        """return stop state"""
+        """return stop date"""
         raise NotImplementedError
 
 
-# useful constants & functions ################################################
-
-ONEDAY = timedelta(1)
-
-WEEKDAYS = (_("monday"), _("tuesday"), _("wednesday"), _("thursday"),
-            _("friday"), _("saturday"), _("sunday"))
-MONTHNAMES = ( _('january'), _('february'), _('march'), _('april'), _('may'),
-               _('june'), _('july'), _('august'), _('september'), _('october'),
-               _('november'), _('december')
-               )
-
 # Calendar views ##############################################################
 
 try:
@@ -146,9 +148,6 @@
                 self.w('<br/>%s'%self._cw.format_date(icalendarable.start
                                                       or icalendarable.stop))
 
-class CalendarLargeItemView(CalendarItemView):
-    __regid__ = 'calendarlargeitem'
-
 
 class _TaskEntry(object):
     def __init__(self, task, color, index=0):
@@ -170,413 +169,91 @@
         return self.start and self.stop and self.start.isocalendar() == self.stop.isocalendar()
 
 
-class OneMonthCal(EntityView):
-    """At some point, this view will probably replace ampm calendars"""
-    __regid__ = 'onemonthcal'
-    __select__ = adaptable('ICalendarable')
-
-    paginable = False
-    title = _('one month')
-
-    def call(self):
-        self._cw.add_js('cubicweb.ajax.js')
-        self._cw.add_css('cubicweb.calendar.css')
-        # XXX: restrict courses directy with RQL
-        _today =  datetime.today()
-
-        if 'year' in self._cw.form:
-            year = int(self._cw.form['year'])
-        else:
-            year = _today.year
-        if 'month' in self._cw.form:
-            month = int(self._cw.form['month'])
-        else:
-            month = _today.month
-
-        first_day_of_month = date(year, month, 1)
-        firstday = first_day_of_month - timedelta(first_day_of_month.weekday())
-        if month >= 12:
-            last_day_of_month = date(year + 1, 1, 1) - timedelta(1)
-        else:
-            last_day_of_month = date(year, month + 1, 1) - timedelta(1)
-        # date range exclude last day so we should at least add one day, hence
-        # the 7
-        lastday = last_day_of_month + timedelta(7 - last_day_of_month.weekday())
-        month_dates = list(date_range(firstday, lastday))
-        dates = {}
-        task_max = 0
-        for row in xrange(self.cw_rset.rowcount):
-            task = self.cw_rset.get_entity(row, 0)
-            if len(self.cw_rset[row]) > 1 and self.cw_rset.description[row][1] == 'CWUser':
-                user = self.cw_rset.get_entity(row, 1)
-            else:
-                user = None
-            the_dates = []
-            icalendarable = task.cw_adapt_to('ICalendarable')
-            tstart = icalendarable.start
-            if tstart:
-                tstart = todate(icalendarable.start)
-                if tstart > lastday:
-                    continue
-                the_dates = [tstart]
-            tstop = icalendarable.stop
-            if tstop:
-                tstop = todate(tstop)
-                if tstop < firstday:
-                    continue
-                the_dates = [tstop]
-            if tstart and tstop:
-                if tstart.isocalendar() == tstop.isocalendar():
-                    if firstday <= tstart <= lastday:
-                        the_dates = [tstart]
-                else:
-                    the_dates = date_range(max(tstart, firstday),
-                                           min(tstop + ONEDAY, lastday))
-            if not the_dates:
-                continue
-
-            for d in the_dates:
-                d_tasks = dates.setdefault((d.year, d.month, d.day), {})
-                t_users = d_tasks.setdefault(task, set())
-                t_users.add( user )
-                if len(d_tasks) > task_max:
-                    task_max = len(d_tasks)
-
-        days = []
-        nrows = max(3, task_max)
-        # colors here are class names defined in cubicweb.css
-        colors = [ "col%x" % i for i in range(12) ]
-        next_color_index = 0
-
-        visited_tasks = {} # holds a description of a task
-        task_colors = {}   # remember a color assigned to a task
-        for mdate in month_dates:
-            d_tasks = dates.get((mdate.year, mdate.month, mdate.day), {})
-            rows = [None] * nrows
-            # every task that is "visited" for the first time
-            # require a special treatment, so we put them in
-            # 'postpone'
-            postpone = []
-            for task in d_tasks:
-                if task in visited_tasks:
-                    task_descr = visited_tasks[ task ]
-                    rows[task_descr.index] = task_descr
-                else:
-                    postpone.append(task)
-            for task in postpone:
-                # to every 'new' task we must affect a color
-                # (which must be the same for every user concerned
-                # by the task)
-                for i, t in enumerate(rows):
-                    if t is None:
-                        if task in task_colors:
-                            color = task_colors[task]
-                        else:
-                            color = colors[next_color_index]
-                            next_color_index = (next_color_index+1)%len(colors)
-                            task_colors[task] = color
-                        task_descr = _TaskEntry(task, color, i)
-                        rows[i] = task_descr
-                        visited_tasks[task] = task_descr
-                        break
-                else:
-                    raise RuntimeError("is it possible we got it wrong?")
-
-            days.append( rows )
-
-        curdate = first_day_of_month
-        self.w(u'<div id="onemonthcalid">')
-        # build schedule
-        self.w(u'<table class="omcalendar">')
-        prevlink, nextlink = self._prevnext_links(curdate)  # XXX
-        self.w(u'<tr><th><a href="%s">&lt;&lt;</a></th><th colspan="5">%s %s</th>'
-               u'<th><a href="%s">&gt;&gt;</a></th></tr>' %
-               (xml_escape(prevlink), self._cw._(curdate.strftime('%B').lower()),
-                curdate.year, xml_escape(nextlink)))
-
-        # output header
-        self.w(u'<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>' %
-               tuple(self._cw._(day) for day in WEEKDAYS))
-        # build calendar
-        for mdate, task_rows in zip(month_dates, days):
-            if mdate.weekday() == 0:
-                self.w(u'<tr>')
-            self._build_calendar_cell(mdate, task_rows, curdate)
-            if mdate.weekday() == 6:
-                self.w(u'</tr>')
-        self.w(u'</table></div>')
-
-    def _prevnext_links(self, curdate):
-        prevdate = curdate - timedelta(31)
-        nextdate = curdate + timedelta(31)
-        rql = self.cw_rset.printable_rql()
-        prevlink = self._cw.ajax_replace_url('onemonthcalid', rql=rql,
-                                             vid='onemonthcal',
-                                             year=prevdate.year,
-                                             month=prevdate.month)
-        nextlink = self._cw.ajax_replace_url('onemonthcalid', rql=rql,
-                                             vid='onemonthcal',
-                                             year=nextdate.year,
-                                             month=nextdate.month)
-        return prevlink, nextlink
-
-    def _build_calendar_cell(self, celldate, rows, curdate):
-        curmonth = curdate.month
-        classes = ""
-        if celldate.month != curmonth:
-            classes += " outOfRange"
-        if celldate == date.today():
-            classes += " today"
-        self.w(u'<td class="cell%s">' % classes)
-        self.w(u'<div class="calCellTitle%s">' % classes)
-        self.w(u'<div class="day">%s</div>' % celldate.day)
-
-        if len(self.cw_rset.column_types(0)) == 1:
-            etype = list(self.cw_rset.column_types(0))[0]
-            url = self._cw.build_url(vid='creation', etype=etype,
-                                     schedule=True,
-                                     start=self._cw.format_date(celldate), stop=self._cw.format_date(celldate),
-                                     __redirectrql=self.cw_rset.printable_rql(),
-                                     __redirectparams=self._cw.build_url_params(year=curdate.year, month=curmonth),
-                                     __redirectvid=self.__regid__
-                                     )
-            self.w(u'<div class="cmd"><a href="%s">%s</a></div>' % (xml_escape(url), self._cw._(u'add')))
-            self.w(u'&#160;')
-        self.w(u'</div>')
-        self.w(u'<div class="cellContent">')
-        for task_descr in rows:
-            if task_descr:
-                task = task_descr.task
-                self.w(u'<div class="task %s">' % task_descr.color)
-                task.view('calendaritem', w=self.w )
-                url = task.absolute_url(vid='edition',
-                                        __redirectrql=self.cw_rset.printable_rql(),
-                                        __redirectparams=self._cw.build_url_params(year=curdate.year, month=curmonth),
-                                        __redirectvid=self.__regid__
-                                        )
-
-                self.w(u'<div class="tooltip" ondblclick="stopPropagation(event); window.location.assign(\'%s\'); return false;">' % xml_escape(url))
-                task.view('tooltip', w=self.w )
-                self.w(u'</div>')
-            else:
-                self.w(u'<div class="task">')
-                self.w(u"&#160;")
-            self.w(u'</div>')
-        self.w(u'</div>')
-        self.w(u'</td>')
-
-
-class OneWeekCal(EntityView):
-    """At some point, this view will probably replace ampm calendars"""
-    __regid__ = 'oneweekcal'
+class CalendarView(EntityView):
+    __regid__ = 'calendar'
     __select__ = adaptable('ICalendarable')
 
     paginable = False
-    title = _('one week')
+    title = _('calendar')
+
+    fullcalendar_options = {
+        'firstDay': 1,
+        'header': {'left': 'prev,next today',
+                   'center': 'title',
+                   'right': 'month,agendaWeek,agendaDay',
+                   },
+        'editable': True,
+        'defaultView': 'month',
+        'timeFormat': {'month': '',
+                       '': 'H:mm'},
+        'firstHour': 8,
+        'axisFormat': 'H:mm',
+        'columnFormat': {'month': 'dddd',
+                         'agendaWeek': 'dddd yyyy/M/dd',
+                         'agendaDay': 'dddd yyyy/M/dd'}
+        }
+
 
     def call(self):
-        self._cw.add_js( ('cubicweb.ajax.js', 'cubicweb.calendar.js') )
-        self._cw.add_css('cubicweb.calendar.css')
-        # XXX: restrict directly with RQL
-        _today =  datetime.today()
-        if 'year' in self._cw.form:
-            year = int(self._cw.form['year'])
-        else:
-            year = _today.year
-        if 'week' in self._cw.form:
-            week = int(self._cw.form['week'])
-        else:
-            week = _today.isocalendar()[1]
-        # week - 1 since we get week number > 0 while we want it to start from 0
-        first_day_of_week = todate(strptime('%s-%s-1' % (year, week - 1), '%Y-%U-%w'))
-        lastday = first_day_of_week + timedelta(6)
-        firstday = first_day_of_week
-        dates = [[] for i in range(7)]
-        task_colors = {}   # remember a color assigned to a task
-        # colors here are class names defined in cubicweb.css
-        colors = [ "col%x" % i for i in range(12) ]
-        next_color_index = 0
-        done_tasks = set()
-        for row in xrange(self.cw_rset.rowcount):
-            task = self.cw_rset.get_entity(row, 0)
-            if task.eid in done_tasks:
-                continue
-            done_tasks.add(task.eid)
-            the_dates = []
-            icalendarable = task.cw_adapt_to('ICalendarable')
-            tstart = icalendarable.start
-            tstop = icalendarable.stop
-            if tstart:
-                tstart = todate(tstart)
-                if tstart > lastday:
-                    continue
-                the_dates = [tstart]
-            if tstop:
-                tstop = todate(tstop)
-                if tstop < firstday:
-                    continue
-                the_dates = [tstop]
-            if tstart and tstop:
-                the_dates = date_range(max(tstart, firstday),
-                                       min(tstop + ONEDAY, lastday))
-            if not the_dates:
-                continue
+        self._cw.demote_to_html()
+        self._cw.add_css(('fullcalendar.css', 'cubicweb.calendar.css'))
+        self._cw.add_js(('jquery.ui.js', 'fullcalendar.min.js', 'jquery.qtip.min.js'))
+        self.add_onload()
+        # write calendar div to load jquery fullcalendar object
+        self.w(u'<div id="calendar"></div>')
 
-            if task not in task_colors:
-                task_colors[task] = colors[next_color_index]
-                next_color_index = (next_color_index+1) % len(colors)
-
-            for d in the_dates:
-                day = d.weekday()
-                task_descr = _TaskEntry(task, task_colors[task])
-                dates[day].append(task_descr)
-
-        self.w(u'<div id="oneweekcalid">')
-        # build schedule
-        self.w(u'<table class="omcalendar" id="week">')
-        prevlink, nextlink = self._prevnext_links(first_day_of_week)  # XXX
-        self.w(u'<tr><th class="transparent"></th>')
-        self.w(u'<th><a href="%s">&lt;&lt;</a></th><th colspan="5">%s %s %s</th>'
-               u'<th><a href="%s">&gt;&gt;</a></th></tr>' %
-               (xml_escape(prevlink), first_day_of_week.year,
-                self._cw._(u'week'), first_day_of_week.isocalendar()[1],
-                xml_escape(nextlink)))
-
-        # output header
-        self.w(u'<tr>')
-        self.w(u'<th class="transparent"></th>') # column for hours
-        _today = date.today()
-        for i, day in enumerate(WEEKDAYS):
-            wdate = first_day_of_week + timedelta(i)
-            if wdate.isocalendar() == _today.isocalendar():
-                self.w(u'<th class="today">%s<br/>%s</th>' % (self._cw._(day), self._cw.format_date(wdate)))
-            else:
-                self.w(u'<th>%s<br/>%s</th>' % (self._cw._(day), self._cw.format_date(wdate)))
-        self.w(u'</tr>')
-
-        # build week calendar
-        self.w(u'<tr>')
-        self.w(u'<td style="width:5em;">') # column for hours
-        extra = ""
-        for h in range(8, 20):
-            self.w(u'<div class="hour" %s>'%extra)
-            self.w(u'%02d:00'%h)
-            self.w(u'</div>')
-        self.w(u'</td>')
 
-        for i, day in enumerate(WEEKDAYS):
-            wdate = first_day_of_week + timedelta(i)
-            classes = ""
-            if wdate.isocalendar() == _today.isocalendar():
-                classes = " today"
-            self.w(u'<td class="column %s" id="%s">' % (classes, day))
-            if len(self.cw_rset.column_types(0)) == 1:
-                etype = list(self.cw_rset.column_types(0))[0]
-                url = self._cw.build_url(vid='creation', etype=etype,
-                                         schedule=True,
-                                         __redirectrql=self.cw_rset.printable_rql(),
-                                         __redirectparams=self._cw.build_url_params(year=year, week=week),
-                                         __redirectvid=self.__regid__
-                                         )
-                extra = ' ondblclick="addCalendarItem(event, hmin=8, hmax=20, year=%s, month=%s, day=%s, duration=2, baseurl=\'%s\')"' % (
-                    wdate.year, wdate.month, wdate.day, xml_escape(url))
-            else:
-                extra = ""
-            self.w(u'<div class="columndiv"%s>'% extra)
-            for h in range(8, 20):
-                self.w(u'<div class="hourline" style="top:%sex;">'%((h-7)*8))
-                self.w(u'</div>')
-            if dates[i]:
-                self._build_calendar_cell(wdate, dates[i])
-            self.w(u'</div>')
-            self.w(u'</td>')
-        self.w(u'</tr>')
-        self.w(u'</table></div>')
-        self.w(u'<div id="coord"></div>')
-        self.w(u'<div id="debug">&#160;</div>')
-
-    def _build_calendar_cell(self, date, task_descrs):
-        inday_tasks = [t for t in task_descrs if t.is_one_day_task() and  t.in_working_hours()]
-        wholeday_tasks = [t for t in task_descrs if not t.is_one_day_task()]
-        inday_tasks.sort(key=lambda t:t.start)
-        sorted_tasks = []
-        for i, t in enumerate(wholeday_tasks):
-            t.index = i
-        ncols = len(wholeday_tasks)
-        while inday_tasks:
-            t = inday_tasks.pop(0)
-            for i, c in enumerate(sorted_tasks):
-                if not c or c[-1].stop <= t.start:
-                    c.append(t)
-                    t.index = i+ncols
-                    break
-            else:
-                t.index = len(sorted_tasks) + ncols
-                sorted_tasks.append([t])
-        ncols += len(sorted_tasks)
-        if ncols == 0:
-            return
-
-        inday_tasks = []
-        for tasklist in sorted_tasks:
-            inday_tasks += tasklist
-        width = 100.0/ncols
-        for task_desc in wholeday_tasks + inday_tasks:
-            task = task_desc.task
-            start_hour = 8
-            start_min = 0
-            stop_hour = 20
-            stop_min = 0
-            if task_desc.start:
-                if date < todate(task_desc.start) < date + ONEDAY:
-                    start_hour = max(8, task_desc.start.hour)
-                    start_min = task_desc.start.minute
-            if task_desc.stop:
-                if date < todate(task_desc.stop) < date + ONEDAY:
-                    stop_hour = min(20, task_desc.stop.hour)
-                    if stop_hour < 20:
-                        stop_min = task_desc.stop.minute
-
-            height = 100.0*(stop_hour+stop_min/60.0-start_hour-start_min/60.0)/(20-8)
-            top = 100.0*(start_hour+start_min/60.0-8)/(20-8)
-            left = width*task_desc.index
-            style = "height: %s%%; width: %s%%; top: %s%%; left: %s%%; " % \
-                (height, width, top, left)
-            self.w(u'<div class="task %s" style="%s">' % \
-                       (task_desc.color, style))
-            task.view('calendaritem', dates=False, w=self.w)
-            url = task.absolute_url(vid='edition',
-                                    __redirectrql=self.cw_rset.printable_rql(),
-                                    __redirectparams=self._cw.build_url_params(year=date.year, week=date.isocalendar()[1]),
-                                    __redirectvid=self.__regid__
-                                 )
-
-            self.w(u'<div class="tooltip" ondblclick="stopPropagation(event); window.location.assign(\'%s\'); return false;">' % xml_escape(url))
-            task.view('tooltip', w=self.w)
-            self.w(u'</div>')
-            if task_desc.start is None:
-                self.w(u'<div class="bottommarker">')
-                self.w(u'<div class="bottommarkerline" style="margin: 0px 3px 0px 3px; height: 1px;">')
-                self.w(u'</div>')
-                self.w(u'<div class="bottommarkerline" style="margin: 0px 2px 0px 2px; height: 1px;">')
-                self.w(u'</div>')
-                self.w(u'<div class="bottommarkerline" style="margin: 0px 1px 0px 1px; height: 3ex; color: white; font-size: x-small; vertical-align: center; text-align: center;">')
-                self.w(u'end')
-                self.w(u'</div>')
-                self.w(u'</div>')
-            self.w(u'</div>')
+    def add_onload(self):
+        fullcalendar_options = self.fullcalendar_options.copy()
+        fullcalendar_options['events'] = self.get_events()
+        fullcalendar_options['buttonText'] = {'today': self._cw._('today'),
+                                              'month': self._cw._('month'),
+                                              'week': self._cw._('week'),
+                                              'day': self._cw._('day')}
+        # js callback to add a tooltip and to put html in event's title
+        js = """
+        var options = %s;
+        options.eventRender = function(event, $element) {
+          // add a tooltip for each event
+          var div = '<div class="tooltip">'+ event.description+ '</div>';
+          $element.append(div);
+          // allow to have html tags in event's title
+          $element.find('span.fc-event-title').html($element.find('span.fc-event-title').text());
+        };
+        $("#calendar").fullCalendar(options);
+        """ #"
+        self._cw.add_onload(js % json_dumps(fullcalendar_options))
 
 
-    def _prevnext_links(self, curdate):
-        prevdate = curdate - timedelta(7)
-        nextdate = curdate + timedelta(7)
-        rql = self.cw_rset.printable_rql()
-        prevlink = self._cw.ajax_replace_url('oneweekcalid', rql=rql,
-                                             vid='oneweekcal',
-                                             year=prevdate.year,
-                                             week=prevdate.isocalendar()[1])
-        nextlink = self._cw.ajax_replace_url('oneweekcalid', rql=rql,
-                                             vid='oneweekcal',
-                                             year=nextdate.year,
-                                             week=nextdate.isocalendar()[1])
-        return prevlink, nextlink
+    def get_events(self):
+        events = []
+        for entity in self.cw_rset.entities():
+            icalendarable = entity.cw_adapt_to('ICalendarable')
+            event = {'eid': entity.eid,
+                     'title': entity.view('calendaritem'),
+                     'url': xml_escape(entity.absolute_url()),
+                     'className': 'calevent',
+                     'description': entity.view('tooltip'),
+                     }
+            start_date = icalendarable.start
+            if not start_date:
+                start_date = icalendarable.stop
+            event['start'] = start_date.strftime('%Y-%m-%dT%H:%M')
+            event['allDay'] = True
+            if icalendarable.stop:
+                event['end'] = icalendarable.stop.strftime('%Y-%m-%dT%H:%M')
+                event['allDay'] = False
+            events.append(event)
+        return events
+
+class OneMonthCal(CalendarView):
+    __regid__ = 'onemonthcal'
+
+    title = _('one month')
+
+class OneWeekCal(CalendarView):
+    __regid__ = 'oneweekcal'
+
+    title = _('one week')
+    fullcalendar_options = CalendarView.fullcalendar_options.copy()
+    fullcalendar_options['defaultView'] = 'agendaWeek'
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/views/cwsources.py	Tue Feb 01 11:52:10 2011 +0100
@@ -0,0 +1,171 @@
+# copyright 2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of CubicWeb.
+#
+# CubicWeb is free software: you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
+"""Specific views for data sources"""
+
+__docformat__ = "restructuredtext en"
+_ = unicode
+
+from itertools import repeat, chain
+
+from cubicweb.selectors import is_instance, score_entity
+from cubicweb.view import EntityView
+from cubicweb.schema import META_RTYPES, VIRTUAL_RTYPES, display_name
+from cubicweb.web import uicfg
+from cubicweb.web.views import tabs
+
+for rtype in ('cw_support', 'cw_may_cross', 'cw_dont_cross'):
+    uicfg.primaryview_section.tag_subject_of(('CWSource', rtype, '*'),
+                                             'hidden')
+
+class CWSourcePrimaryView(tabs.TabbedPrimaryView):
+    __select__ = is_instance('CWSource')
+    tabs = [_('cwsource-main'), _('cwsource-mapping')]
+    default_tab = 'cwsource-main'
+
+
+class CWSourceMainTab(tabs.PrimaryTab):
+    __regid__ = 'cwsource-main'
+    __select__ = tabs.PrimaryTab.__select__ & is_instance('CWSource')
+
+
+class CWSourceMappingTab(EntityView):
+    __regid__ = 'cwsource-mapping'
+    __select__ = (tabs.PrimaryTab.__select__ & is_instance('CWSource')
+                  & score_entity(lambda x:x.type == 'pyrorql'))
+
+    def entity_call(self, entity):
+        _ = self._cw._
+        self.w('<h3>%s</h3>' % _('Entity and relation types supported by this source'))
+        self.wview('list', entity.related('cw_support'), 'noresult')
+        self.w('<h3>%s</h3>' % _('Relations that should not be crossed'))
+        self.w('<p>%s</p>' % _(
+            'By default, when a relation is not supported by a source, it is '
+            'supposed that a local relation may point to an entity from the '
+            'external source. Relations listed here won\'t have this '
+            '"crossing" behaviour.'))
+        self.wview('list', entity.related('cw_dont_cross'), 'noresult')
+        self.w('<h3>%s</h3>' % _('Relations that can be crossed'))
+        self.w('<p>%s</p>' % _(
+            'By default, when a relation is supported by a source, it is '
+            'supposed that a local relation can\'t point to an entity from the '
+            'external source. Relations listed here may have this '
+            '"crossing" behaviour anyway.'))
+        self.wview('list', entity.related('cw_may_cross'), 'noresult')
+        if self._cw.user.is_in_group('managers'):
+            errors, warnings, infos = check_mapping(entity)
+            if (errors or warnings or infos):
+                self.w('<h2>%s</h2>' % _('Detected problems'))
+                errors = zip(repeat(_('error'), errors))
+                warnings = zip(repeat(_('warning'), warnings))
+                infos = zip(repeat(_('warning'), infos))
+                self.wview('pyvaltable', pyvalue=chain(errors, warnings, infos))
+
+def check_mapping(cwsource):
+    req = cwsource._cw
+    _ = req._
+    errors = []
+    error = errors.append
+    warnings = []
+    warning = warnings.append
+    infos = []
+    info = infos.append
+    srelations = set()
+    sentities = set()
+    maycross = set()
+    dontcross = set()
+    # first check supported stuff / meta & virtual types and get mapping as sets
+    for cwertype in cwsource.cw_support:
+        if cwertype.name in META_RTYPES:
+            error(_('meta relation %s can not be supported') % cwertype.name)
+        else:
+            if cwertype.__regid__ == 'CWEType':
+                sentities.add(cwertype.name)
+            else:
+                srelations.add(cwertype.name)
+    for attr, attrset in (('cw_may_cross', maycross),
+                          ('cw_dont_cross', dontcross)):
+        for cwrtype in getattr(cwsource, attr):
+            if cwrtype.name in VIRTUAL_RTYPES:
+                error(_('virtual relation %(rtype)s can not be referenced by '
+                        'the "%(srel)s" relation') %
+                      {'rtype': cwrtype.name,
+                       'srel': display_name(req, attr, context='CWSource')})
+            else:
+                attrset.add(cwrtype.name)
+    # check relation in dont_cross_relations aren't in support_relations
+    for rtype in dontcross & maycross:
+        info(_('relation %(rtype)s is supported but in %(dontcross)s') %
+             {'rtype': rtype,
+              'dontcross': display_name(req, 'cw_dont_cross',
+                                        context='CWSource')})
+    # check relation in cross_relations are in support_relations
+    for rtype in maycross & srelations:
+        info(_('relation %(rtype)s isn\'t supported but in %(maycross)s') %
+             {'rtype': rtype,
+              'dontcross': display_name(req, 'cw_may_cross',
+                                        context='CWSource')})
+    # now check for more handy things
+    seen = set()
+    for etype in sentities:
+        eschema = req.vreg.schema[etype]
+        for rschema, ttypes, role in eschema.relation_definitions():
+            if rschema in META_RTYPES:
+                continue
+            ttypes = [ttype for ttype in ttypes if ttype in sentities]
+            if not rschema in srelations:
+                somethingprinted = False
+                for ttype in ttypes:
+                    rdef = rschema.role_rdef(etype, ttype, role)
+                    seen.add(rdef)
+                    if rdef.role_cardinality(role) in '1+':
+                        error(_('relation %(type)s with %(etype)s as %(role)s '
+                                'and target type %(target)s is mandatory but '
+                                'not supported') %
+                              {'rtype': rschema, 'etype': etype, 'role': role,
+                               'target': ttype})
+                        somethingprinted = True
+                    elif ttype in sentities:
+                        if rdef not in seen:
+                            warning(_('%s could be supported') % rdef)
+                        somethingprinted = True
+                if rschema not in dontcross:
+                    if role == 'subject' and rschema.inlined:
+                        error(_('inlined relation %(rtype)s of %(etype)s '
+                                'should be supported') %
+                              {'rtype': rschema, 'etype': etype})
+                    elif (not somethingprinted and rschema not in seen
+                          and rschema not in maycross):
+                        info(_('you may want to specify something for %s') %
+                             rschema)
+                        seen.add(rschema)
+            else:
+                if not ttypes:
+                    warning(_('relation %(rtype)s with %(etype)s as %(role)s '
+                              'is supported but no target type supported') %
+                            {'rtype': rschema, 'role': role, 'etype': etype})
+                if rschema in maycross and rschema.inlined:
+                    error(_('you should un-inline relation %s which is '
+                            'supported and may be crossed ') % rschema)
+    for rschema in srelations:
+        for subj, obj in rschema.rdefs:
+            if subj in sentities and obj in sentities:
+                break
+        else:
+            error(_('relation %s is supported but none if its definitions '
+                    'matches supported entities') % rschema)
+    return errors, warnings, infos
--- a/web/views/old_calendar.py	Tue Feb 01 10:10:46 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,575 +0,0 @@
-# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
-# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
-#
-# This file is part of CubicWeb.
-#
-# CubicWeb is free software: you can redistribute it and/or modify it under the
-# terms of the GNU Lesser General Public License as published by the Free
-# Software Foundation, either version 2.1 of the License, or (at your option)
-# any later version.
-#
-# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Lesser General Public License along
-# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
-"""html calendar views"""
-
-__docformat__ = "restructuredtext en"
-_ = unicode
-
-from datetime import date, time, timedelta
-
-from logilab.mtconverter import xml_escape
-from logilab.common.date import (ONEDAY, ONEWEEK, days_in_month, previous_month,
-                                 next_month, first_day, last_day, date_range)
-
-from cubicweb.interfaces import ICalendarViews
-from cubicweb.selectors import implements, adaptable
-from cubicweb.view import EntityView, EntityAdapter, implements_adapter_compat
-
-class ICalendarViewsAdapter(EntityAdapter):
-    """calendar views interface"""
-    __needs_bw_compat__ = True
-    __regid__ = 'ICalendarViews'
-    __select__ = implements(ICalendarViews, warn=False) # XXX for bw compat, should be abstract
-
-    @implements_adapter_compat('ICalendarViews')
-    def matching_dates(self, begin, end):
-        """
-        :param begin: day considered as begin of the range (`DateTime`)
-        :param end: day considered as end of the range (`DateTime`)
-
-        :return:
-          a list of dates (`DateTime`) in the range [`begin`, `end`] on which
-          this entity apply
-        """
-        raise NotImplementedError
-
-
-# used by i18n tools
-WEEKDAYS = [_("monday"), _("tuesday"), _("wednesday"), _("thursday"),
-            _("friday"), _("saturday"), _("sunday")]
-MONTHNAMES = [ _('january'), _('february'), _('march'), _('april'), _('may'),
-               _('june'), _('july'), _('august'), _('september'), _('october'),
-               _('november'), _('december')
-               ]
-
-class _CalendarView(EntityView):
-    """base calendar view containing helpful methods to build calendar views"""
-    __select__ = adaptable('ICalendarViews')
-    paginable = False
-
-    # Navigation building methods / views ####################################
-
-    PREV = u'<a href="%s">&lt;&lt;</a>&#160;&#160;<a href="%s">&lt;</a>'
-    NEXT = u'<a href="%s">&gt;</a>&#160;&#160;<a href="%s">&gt;&gt;</a>'
-    NAV_HEADER = u"""<table class="calendarPageHeader">
-<tr><td class="prev">%s</td><td class="next">%s</td></tr>
-</table>
-""" % (PREV, NEXT)
-
-    def nav_header(self, date, smallshift=3, bigshift=9):
-        """prints shortcut links to go to previous/next steps (month|week)"""
-        prev1 = previous_month(date, smallshift)
-        next1 = next_month(date, smallshift)
-        prev2 = previous_month(date, bigshift)
-        next2 = next_month(date, bigshift)
-        rql = self.cw_rset.printable_rql()
-        return self.NAV_HEADER % (
-            xml_escape(self._cw.build_url(rql=rql, vid=self.__regid__, year=prev2.year,
-                                          month=prev2.month)),
-            xml_escape(self._cw.build_url(rql=rql, vid=self.__regid__, year=prev1.year,
-                                          month=prev1.month)),
-            xml_escape(self._cw.build_url(rql=rql, vid=self.__regid__, year=next1.year,
-                                          month=next1.month)),
-            xml_escape(self._cw.build_url(rql=rql, vid=self.__regid__, year=next2.year,
-                                          month=next2.month)))
-
-
-    # Calendar building methods ##############################################
-
-    def build_calendars(self, schedule, begin, end):
-        """build several HTML calendars at once, one for each month
-        between begin and end
-        """
-        return [self.build_calendar(schedule, date)
-                for date in date_range(begin, end, incmonth=1)]
-
-    def build_calendar(self, schedule, first_day):
-        """method responsible for building *one* HTML calendar"""
-        # FIXME  iterates between [first_day-first_day.day_of_week ;
-        #                          last_day+6-last_day.day_of_week]
-        umonth = self._cw.format_date(first_day, '%B %Y') # localized month name
-        rows = []
-        current_row = [NO_CELL] * first_day.weekday()
-        for daynum in xrange(0, days_in_month(first_day)):
-            # build cell day
-            day = first_day + timedelta(daynum)
-            events = schedule.get(day)
-            if events:
-                events = [u'\n'.join(event) for event in events.values()]
-                current_row.append(CELL % (daynum+1, '\n'.join(events)))
-            else:
-                current_row.append(EMPTY_CELL % (daynum+1))
-            # store & reset current row on Sundays
-            if day.weekday() == 6:
-                rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.isocalendar()[1], ''.join(current_row)))
-                current_row = []
-        current_row.extend([NO_CELL] * (6-day.weekday()))
-        rql = self.cw_rset.printable_rql()
-        if day.weekday() != 6:
-            rows.append(u'<tr>%s%s</tr>' % (WEEKNUM_CELL % day.isocalendar()[1], ''.join(current_row)))
-        url = self._cw.build_url(rql=rql, vid='calendarmonth',
-                                 year=first_day.year, month=first_day.month)
-        monthlink = u'<a href="%s">%s</a>' % (xml_escape(url), umonth)
-        return CALENDAR(self._cw) % (monthlink, '\n'.join(rows))
-
-    def _mk_schedule(self, begin, end, itemvid='calendaritem'):
-        """private method that gathers information from resultset
-        and builds calendars according to it
-
-        :param begin: begin of date range
-        :param end: end of date rangs
-        :param itemvid: which view to call to render elements in cells
-
-        returns { day1 : { hour : [views] },
-                  day2 : { hour : [views] } ... }
-        """
-        # put this here since all sub views are calling this method
-        self._cw.add_css('cubicweb.calendar.css')
-        schedule = {}
-        for row in xrange(len(self.cw_rset.rows)):
-            entity = self.cw_rset.get_entity(row, 0)
-            infos = u'<div class="event">'
-            infos += self._cw.view(itemvid, self.cw_rset, row=row)
-            infos += u'</div>'
-            for date_ in entity.cw_adapt_to('ICalendarViews').matching_dates(begin, end):
-                day = date(date_.year, date_.month, date_.day)
-                try:
-                    dt = time(date_.hour, date_.minute, date_.second)
-                except AttributeError:
-                    # date instance
-                    dt = time(0, 0, 0)
-                schedule.setdefault(day, {})
-                schedule[day].setdefault(dt, []).append(infos)
-        return schedule
-
-
-    @staticmethod
-    def get_date_range(day, shift=4):
-        """returns a couple (begin, end)
-
-        <begin> is the first day of current_month - shift
-        <end> is the last day of current_month + (shift+1)
-        """
-        begin = first_day(previous_month(day, shift))
-        end = last_day(next_month(day, shift))
-        return begin, end
-
-    def _build_ampm_cells(self, events):
-        """create a view without any hourly details.
-
-        :param events: dictionnary with all events classified by hours
-        """
-        # split events according am/pm
-        am_events = [event for e_time, e_list in events.iteritems()
-                     if 0 <= e_time.hour < 12
-                     for event in e_list]
-        pm_events = [event for e_time, e_list in events.iteritems()
-                     if 12 <= e_time.hour < 24
-                     for event in e_list]
-        # format each am/pm cell
-        if am_events:
-            am_content = AMPM_CONTENT % ("amCell", "am", '\n'.join(am_events))
-        else:
-            am_content = AMPM_EMPTY % ("amCell", "am")
-        if pm_events:
-            pm_content = AMPM_CONTENT % ("pmCell", "pm", '\n'.join(pm_events))
-        else:
-            pm_content = AMPM_EMPTY % ("pmCell", "pm")
-        return am_content, pm_content
-
-
-
-class YearCalendarView(_CalendarView):
-    __regid__ = 'calendaryear'
-    title = _('calendar (year)')
-
-    def call(self, year=None, month=None):
-        """this view renders a 3x3 calendars' table"""
-        year = year or int(self._cw.form.get('year', date.today().year))
-        month = month or int(self._cw.form.get('month', date.today().month))
-        center_date = date(year, month, 1)
-        begin, end = self.get_date_range(day=center_date)
-        schedule = self._mk_schedule(begin, end)
-        self.w(self.nav_header(center_date))
-        calendars = tuple(self.build_calendars(schedule, begin, end))
-        self.w(SMALL_CALENDARS_PAGE % calendars)
-
-
-class SemesterCalendarView(_CalendarView):
-    """this view renders three semesters as three rows of six columns,
-    one column per month
-    """
-    __regid__ = 'calendarsemester'
-    title = _('calendar (semester)')
-
-    def call(self, year=None, month=None):
-        year = year or int(self._cw.form.get('year', date.today().year))
-        month = month or int(self._cw.form.get('month', date.today().month))
-        begin = previous_month(date(year, month, 1), 2)
-        end = next_month(date(year, month, 1), 3)
-        schedule = self._mk_schedule(begin, end)
-        self.w(self.nav_header(date(year, month, 1), 1, 6))
-        self.w(u'<table class="semesterCalendar">')
-        self.build_calendars(schedule, begin, end)
-        self.w(u'</table>')
-        self.w(self.nav_header(date(year, month, 1), 1, 6))
-
-    def build_calendars(self, schedule, begin, end):
-        self.w(u'<tr>')
-        rql = self.cw_rset.printable_rql()
-        for cur_month in date_range(begin, end, incmonth=1):
-            umonth = u'%s&#160;%s' % (self._cw.format_date(cur_month, '%B'), cur_month.year)
-            url = self._cw.build_url(rql=rql, vid=self.__regid__,
-                                     year=cur_month.year, month=cur_month.month)
-            self.w(u'<th colspan="2"><a href="%s">%s</a></th>' % (xml_escape(url),
-                                                                  umonth))
-        self.w(u'</tr>')
-        _ = self._cw._
-        for day_num in xrange(31):
-            self.w(u'<tr>')
-            for cur_month in date_range(begin, end, incmonth=1):
-                if day_num >= days_in_month(cur_month):
-                    self.w(u'%s%s' % (NO_CELL, NO_CELL))
-                else:
-                    day = date(cur_month.year, cur_month.month, day_num+1)
-                    events = schedule.get(day)
-                    self.w(u'<td>%s&#160;%s</td>\n' % (_(WEEKDAYS[day.weekday()])[0].upper(), day_num+1))
-                    self.format_day_events(day, events)
-            self.w(u'</tr>')
-
-    def format_day_events(self, day, events):
-        if events:
-            events = ['\n'.join(event) for event in events.values()]
-            self.w(WEEK_CELL % '\n'.join(events))
-        else:
-            self.w(WEEK_EMPTY_CELL)
-
-
-class MonthCalendarView(_CalendarView):
-    """this view renders a 3x1 calendars' table"""
-    __regid__ = 'calendarmonth'
-    title = _('calendar (month)')
-
-    def call(self, year=None, month=None):
-        year = year or int(self._cw.form.get('year', date.today().year))
-        month = month or int(self._cw.form.get('month', date.today().month))
-        center_date = date(year, month, 1)
-        begin, end = self.get_date_range(day=center_date, shift=1)
-        schedule = self._mk_schedule(begin, end)
-        calendars = self.build_calendars(schedule, begin, end)
-        self.w(self.nav_header(center_date, 1, 3))
-        self.w(BIG_CALENDARS_PAGE % tuple(calendars))
-        self.w(self.nav_header(center_date, 1, 3))
-
-
-class WeekCalendarView(_CalendarView):
-    """this view renders a calendar for week events"""
-    __regid__ = 'calendarweek'
-    title = _('calendar (week)')
-
-    def call(self, year=None, week=None):
-        year = year or int(self._cw.form.get('year', date.today().year))
-        week = week or int(self._cw.form.get('week', date.today().isocalendar()[1]))
-        day0 = date(year, 1, 1)
-        first_day_of_week = day0 - day0.weekday()*ONEDAY + ONEWEEK
-        begin, end = first_day_of_week- ONEWEEK, first_day_of_week + 2*ONEWEEK
-        schedule = self._mk_schedule(begin, end, itemvid='calendarlargeitem')
-        self.w(self.nav_header(first_day_of_week))
-        self.w(u'<table class="weekCalendar">')
-        _weeks = [(first_day_of_week-ONEWEEK, first_day_of_week-ONEDAY),
-                  (first_day_of_week, first_day_of_week+6*ONEDAY),
-                  (first_day_of_week+ONEWEEK, first_day_of_week+13*ONEDAY)]
-        self.build_calendar(schedule, _weeks)
-        self.w(u'</table>')
-        self.w(self.nav_header(first_day_of_week))
-
-    def build_calendar(self, schedule, weeks):
-        rql = self.cw_rset.printable_rql()
-        _ = self._cw._
-        for monday, sunday in weeks:
-            umonth = self._cw.format_date(monday, '%B %Y')
-            url = self._cw.build_url(rql=rql, vid='calendarmonth',
-                                     year=monday.year, month=monday.month)
-            monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth)
-            self.w(u'<tr><th colspan="3">%s %s (%s)</th></tr>' \
-                  % (_('week'), monday.isocalendar()[1], monthlink))
-            for day in date_range(monday, sunday+ONEDAY):
-                self.w(u'<tr>')
-                self.w(u'<td>%s</td>' % _(WEEKDAYS[day.weekday()]))
-                self.w(u'<td>%s</td>' % (day.strftime('%Y-%m-%d')))
-                events = schedule.get(day)
-                if events:
-                    events = ['\n'.join(event) for event in events.values()]
-                    self.w(WEEK_CELL % '\n'.join(events))
-                else:
-                    self.w(WEEK_EMPTY_CELL)
-                self.w(u'</tr>')
-
-    def nav_header(self, date, smallshift=1, bigshift=3):
-        """prints shortcut links to go to previous/next steps (month|week)"""
-        prev1 = date - ONEWEEK * smallshift
-        prev2 = date - ONEWEEK * bigshift
-        next1 = date + ONEWEEK * smallshift
-        next2 = date + ONEWEEK * bigshift
-        rql = self.cw_rset.printable_rql()
-        return self.NAV_HEADER % (
-            xml_escape(self._cw.build_url(rql=rql, vid=self.__regid__, year=prev2.year, week=prev2.isocalendar()[1])),
-            xml_escape(self._cw.build_url(rql=rql, vid=self.__regid__, year=prev1.year, week=prev1.isocalendar()[1])),
-            xml_escape(self._cw.build_url(rql=rql, vid=self.__regid__, year=next1.year, week=next1.isocalendar()[1])),
-            xml_escape(self._cw.build_url(rql=rql, vid=self.__regid__, year=next2.year, week=next2.isocalendar()[1])))
-
-
-
-class AMPMYearCalendarView(YearCalendarView):
-    __regid__ = 'ampmcalendaryear'
-    title = _('am/pm calendar (year)')
-
-    def build_calendar(self, schedule, first_day):
-        """method responsible for building *one* HTML calendar"""
-        umonth = self._cw.format_date(first_day, '%B %Y') # localized month name
-        rows = [] # each row is: (am,pm), (am,pm) ... week_title
-        current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.weekday()
-        rql = self.cw_rset.printable_rql()
-        for daynum in xrange(0, days_in_month(first_day)):
-            # build cells day
-            day = first_day + timedelta(daynum)
-            events = schedule.get(day)
-            if events:
-                current_row.append((AMPM_DAY % (daynum+1),) + self._build_ampm_cells(events))
-            else:
-                current_row.append((AMPM_DAY % (daynum+1),
-                                    AMPM_EMPTY % ("amCell", "am"),
-                                    AMPM_EMPTY % ("pmCell", "pm")))
-            # store & reset current row on Sundays
-            if day.weekday() == 6:
-                url = self._cw.build_url(rql=rql, vid='ampmcalendarweek',
-                                     year=day.year, week=day.isocalendar()[1])
-                weeklink = '<a href="%s">%s</a>' % (xml_escape(url),
-                                                    day.isocalendar()[1])
-                current_row.append(WEEKNUM_CELL % weeklink)
-                rows.append(current_row)
-                current_row = []
-        current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (6-day.weekday()))
-        url = self._cw.build_url(rql=rql, vid='ampmcalendarweek',
-                             year=day.year, week=day.isocalendar()[1])
-        weeklink = '<a href="%s">%s</a>' % (xml_escape(url), day.isocalendar()[1])
-        current_row.append(WEEKNUM_CELL % weeklink)
-        rows.append(current_row)
-        # build two rows for each week: am & pm
-        formatted_rows = []
-        for row in rows:
-            week_title = row.pop()
-            day_row = [day for day, am, pm in row]
-            am_row = [am for day, am, pm in row]
-            pm_row = [pm for day, am, pm in row]
-            formatted_rows.append('<tr>%s%s</tr>'% (week_title, '\n'.join(day_row)))
-            formatted_rows.append('<tr class="amRow"><td>&#160;</td>%s</tr>'% '\n'.join(am_row))
-            formatted_rows.append('<tr class="pmRow"><td>&#160;</td>%s</tr>'% '\n'.join(pm_row))
-        # tigh everything together
-        url = self._cw.build_url(rql=rql, vid='ampmcalendarmonth',
-                             year=first_day.year, month=first_day.month)
-        monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth)
-        return CALENDAR(self._cw) % (monthlink, '\n'.join(formatted_rows))
-
-
-
-class AMPMSemesterCalendarView(SemesterCalendarView):
-    """this view renders a 3x1 calendars' table"""
-    __regid__ = 'ampmcalendarsemester'
-    title = _('am/pm calendar (semester)')
-
-    def build_calendars(self, schedule, begin, end):
-        self.w(u'<tr>')
-        rql = self.cw_rset.printable_rql()
-        for cur_month in date_range(begin, end, incmonth=1):
-            umonth = u'%s&#160;%s' % (self._cw.format_date(cur_month, '%B'), cur_month.year)
-            url = self._cw.build_url(rql=rql, vid=self.__regid__,
-                                 year=cur_month.year, month=cur_month.month)
-            self.w(u'<th colspan="3"><a href="%s">%s</a></th>' % (xml_escape(url),
-                                                                  umonth))
-        self.w(u'</tr>')
-        _ = self._cw._
-        for day_num in xrange(31):
-            self.w(u'<tr>')
-            for cur_month in date_range(begin, end, incmonth=1):
-                if day_num >= days_in_month(cur_month):
-                    self.w(u'%s%s%s' % (NO_CELL, NO_CELL, NO_CELL))
-                else:
-                    day = date(cur_month.year, cur_month.month, day_num+1)
-                    events = schedule.get(day)
-                    self.w(u'<td>%s&#160;%s</td>\n' % (_(WEEKDAYS[day.weekday()])[0].upper(),
-                                                       day_num+1))
-                    self.format_day_events(day, events)
-            self.w(u'</tr>')
-
-    def format_day_events(self, day, events):
-        if events:
-            self.w(u'\n'.join(self._build_ampm_cells(events)))
-        else:
-            self.w(u'%s %s'% (AMPM_EMPTY % ("amCell", "am"),
-                              AMPM_EMPTY % ("pmCell", "pm")))
-
-
-class AMPMMonthCalendarView(MonthCalendarView):
-    """this view renders a 3x1 calendars' table"""
-    __regid__ = 'ampmcalendarmonth'
-    title = _('am/pm calendar (month)')
-
-    def build_calendar(self, schedule, first_day):
-        """method responsible for building *one* HTML calendar"""
-        umonth = self._cw.format_date(first_day, '%B %Y') # localized month name
-        rows = [] # each row is: (am,pm), (am,pm) ... week_title
-        current_row = [(NO_CELL, NO_CELL, NO_CELL)] * first_day.weekday()
-        rql = self.cw_rset.printable_rql()
-        for daynum in xrange(0, days_in_month(first_day)):
-            # build cells day
-            day = first_day + timedelta(daynum)
-            events = schedule.get(day)
-            if events:
-                current_row.append((AMPM_DAY % (daynum+1),) + self._build_ampm_cells(events))
-            else:
-                current_row.append((AMPM_DAY % (daynum+1),
-                                    AMPM_EMPTY % ("amCell", "am"),
-                                    AMPM_EMPTY % ("pmCell", "pm")))
-            # store & reset current row on Sundays
-            if day.weekday() == 6:
-                url = self._cw.build_url(rql=rql, vid='ampmcalendarweek',
-                                         year=day.year, week=day.isocalendar()[1])
-                weeklink = '<a href="%s">%s</a>' % (xml_escape(url),
-                                                    day.isocalendar()[1])
-                current_row.append(WEEKNUM_CELL % weeklink)
-                rows.append(current_row)
-                current_row = []
-        current_row.extend([(NO_CELL, NO_CELL, NO_CELL)] * (6-day.weekday()))
-        url = self._cw.build_url(rql=rql, vid='ampmcalendarweek',
-                                 year=day.year, week=day.isocalendar()[1])
-        weeklink = '<a href="%s">%s</a>' % (xml_escape(url),
-                                            day.isocalendar()[1])
-        current_row.append(WEEKNUM_CELL % weeklink)
-        rows.append(current_row)
-        # build two rows for each week: am & pm
-        formatted_rows = []
-        for row in rows:
-            week_title = row.pop()
-            day_row = [day for day, am, pm in row]
-            am_row = [am for day, am, pm in row]
-            pm_row = [pm for day, am, pm in row]
-            formatted_rows.append('<tr>%s%s</tr>'% (week_title, '\n'.join(day_row)))
-            formatted_rows.append('<tr class="amRow"><td>&#160;</td>%s</tr>'% '\n'.join(am_row))
-            formatted_rows.append('<tr class="pmRow"><td>&#160;</td>%s</tr>'% '\n'.join(pm_row))
-        # tigh everything together
-        url = self._cw.build_url(rql=rql, vid='ampmcalendarmonth',
-                                 year=first_day.year, month=first_day.month)
-        monthlink = '<a href="%s">%s</a>' % (xml_escape(url),
-                                             umonth)
-        return CALENDAR(self._cw) % (monthlink, '\n'.join(formatted_rows))
-
-
-
-class AMPMWeekCalendarView(WeekCalendarView):
-    """this view renders a 3x1 calendars' table"""
-    __regid__ = 'ampmcalendarweek'
-    title = _('am/pm calendar (week)')
-
-    def build_calendar(self, schedule, weeks):
-        rql = self.cw_rset.printable_rql()
-        w = self.w
-        _ = self._cw._
-        for monday, sunday in weeks:
-            umonth = self._cw.format_date(monday, '%B %Y')
-            url = self._cw.build_url(rql=rql, vid='ampmcalendarmonth',
-                                     year=monday.year, month=monday.month)
-            monthlink = '<a href="%s">%s</a>' % (xml_escape(url), umonth)
-            w(u'<tr>%s</tr>' % (
-                WEEK_TITLE % (_('week'), monday.isocalendar()[1], monthlink)))
-            w(u'<tr><th>%s</th><th>&#160;</th></tr>'% _(u'Date'))
-            for day in date_range(monday, sunday+ONEDAY):
-                events = schedule.get(day)
-                style = day.weekday() % 2 and "even" or "odd"
-                w(u'<tr class="%s">' % style)
-                if events:
-                    hours = events.keys()
-                    hours.sort()
-                    w(AMPM_DAYWEEK % (
-                        len(hours), _(WEEKDAYS[day.weekday()]),
-                        self._cw.format_date(day)))
-                    w(AMPM_WEEK_CELL % (
-                        hours[0].hour, hours[0].minute,
-                        '\n'.join(events[hours[0]])))
-                    w(u'</tr>')
-                    for hour in hours[1:]:
-                        w(u'<tr class="%s">%s</tr>'% (
-                            style, AMPM_WEEK_CELL % (hour.hour, hour.minute,
-                                                     '\n'.join(events[hour]))))
-                else:
-                    w(AMPM_DAYWEEK_EMPTY % (
-                        _(WEEKDAYS[day.weekday()]),
-                        self._cw.format_date(day)))
-                    w(WEEK_EMPTY_CELL)
-                    w(u'</tr>')
-
-
-SMALL_CALENDARS_PAGE = u"""<table class="smallCalendars">
-<tr><td class="calendar">%s</td><td class="calendar">%s</td><td class="calendar">%s</td></tr>
-<tr><td class="calendar">%s</td><td class="calendar">%s</td><td class="calendar">%s</td></tr>
-<tr><td class="calendar">%s</td><td class="calendar">%s</td><td class="calendar">%s</td></tr>
-</table>
-"""
-
-BIG_CALENDARS_PAGE = u"""<table class="bigCalendars">
-<tr><td class="calendar">%s</td></tr>
-<tr><td class="calendar">%s</td></tr>
-<tr><td class="calendar">%s</td></tr>
-</table>
-"""
-
-WEEKNUM_CELL = u'<td class="weeknum">%s</td>'
-
-def CALENDAR(req):
-    _ = req._
-    WEEKNUM_HEADER = u'<th class="weeknum">%s</th>' % _('week')
-    CAL_HEADER = WEEKNUM_HEADER + u' \n'.join([u'<th class="weekday">%s</th>' % _(day)[0].upper()
-                                               for day in WEEKDAYS])
-    return u"""<table>
-<tr><th class="month" colspan="8">%%s</th></tr>
-<tr>
-  %s
-</tr>
-%%s
-</table>
-""" % (CAL_HEADER,)
-
-
-DAY_TEMPLATE = """<tr><td class="weekday">%(daylabel)s</td><td>%(dmydate)s</td><td>%(dayschedule)s</td>
-"""
-
-NO_CELL = u'<td class="noday"></td>'
-EMPTY_CELL = u'<td class="cellEmpty"><span class="cellTitle">%s</span></td>'
-CELL = u'<td class="cell"><span class="cellTitle">%s</span><div class="cellContent">%s</div></td>'
-
-AMPM_DAY = u'<td class="cellDay">%d</td>'
-AMPM_EMPTY = u'<td class="%sEmpty"><span class="cellTitle">%s</span></td>'
-AMPM_CONTENT = u'<td class="%s"><span class="cellTitle">%s</span><div class="cellContent">%s</div></td>'
-
-WEEK_TITLE = u'<th class="weekTitle" colspan="2">%s %s (%s)</th>'
-WEEK_EMPTY_CELL = u'<td class="weekEmptyCell">&#160;</td>'
-WEEK_CELL = u'<td class="weekCell"><div class="cellContent">%s</div></td>'
-
-AMPM_DAYWEEK_EMPTY = u'<td>%s&#160;%s</td>'
-AMPM_DAYWEEK = u'<td rowspan="%d">%s&#160;%s</td>'
-AMPM_WEEK_CELL = u'<td class="ampmWeekCell"><div class="cellContent">%02d:%02d - %s</div></td>'
--- a/web/views/primary.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/primary.py	Tue Feb 01 11:52:10 2011 +0100
@@ -52,10 +52,8 @@
         """
         return []
 
-    def cell_call(self, row, col):
-        self.cw_row = row
-        self.cw_col = col
-        entity = self.cw_rset.complete_entity(row, col)
+    def entity_call(self, entity):
+        entity.complete()
         self.render_entity(entity)
 
     def render_entity(self, entity):
--- a/web/views/schema.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/schema.py	Tue Feb 01 11:52:10 2011 +0100
@@ -145,7 +145,7 @@
     __regid__ = 'schema'
     title = _('instance schema')
     tabs = [_('schema-diagram'), _('schema-entity-types'),
-            _('schema-relation-types'), _('schema-security')]
+            _('schema-relation-types')]
     default_tab = 'schema-diagram'
 
     def call(self):
@@ -183,110 +183,6 @@
         self.wview('table', self._cw.execute(
             'Any X ORDERBY N WHERE X is CWRType, X name N, X final FALSE'))
 
-
-class SchemaPermissionsTab(SecurityViewMixIn, StartupView):
-    __regid__ = 'schema-security'
-    __select__ = StartupView.__select__ & match_user_groups('managers')
-
-    def call(self, display_relations=True):
-        skiptypes = skip_types(self._cw)
-        schema = self._cw.vreg.schema
-        # compute entities
-        entities = sorted(eschema for eschema in schema.entities()
-                          if not (eschema.final or eschema in skiptypes))
-        # compute relations
-        if display_relations:
-            relations = sorted(rschema for rschema in schema.relations()
-                               if not (rschema.final
-                                       or rschema in skiptypes
-                                       or rschema in META_RTYPES))
-        else:
-            relations = []
-        # index
-        _ = self._cw._
-        url = xml_escape(self._cw.build_url('schema'))
-        self.w(u'<div id="schema_security">')
-        self.w(u'<h2 class="schema">%s</h2>' % _('Index'))
-        self.w(u'<h3 id="entities">%s</h3>' % _('Entity types'))
-        ents = []
-        for eschema in sorted(entities):
-            ents.append(u'<a class="grey" href="%s#%s">%s</a>' % (
-                url,  eschema.type, eschema.type))
-        self.w(u', '.join(ents))
-        self.w(u'<h3 id="relations">%s</h3>' % _('Relation types'))
-        rels = []
-        for rschema in sorted(relations):
-            rels.append(u'<a class="grey" href="%s#%s">%s</a>' %  (
-                url , rschema.type, rschema.type))
-        self.w(u', '.join(rels))
-        # permissions tables
-        self.display_entities(entities)
-        if relations:
-            self.display_relations(relations)
-        self.w(u'</div>')
-
-    def has_non_default_perms(self, rdef):
-        """return true if the given *attribute* relation definition has custom
-        permission
-        """
-        for action in rdef.ACTIONS:
-            def_rqlexprs = []
-            def_groups = []
-            for perm in DEFAULT_ATTRPERMS[action]:
-                if not isinstance(perm, basestring):
-                    def_rqlexprs.append(perm.expression)
-                else:
-                    def_groups.append(perm)
-            rqlexprs = [rql.expression for rql in rdef.get_rqlexprs(action)]
-            groups = rdef.get_groups(action)
-            if groups != frozenset(def_groups) or \
-                frozenset(rqlexprs) != frozenset(def_rqlexprs):
-                return True
-        return False
-
-    def display_entities(self, entities):
-        _ = self._cw._
-        url = xml_escape(self._cw.build_url('schema'))
-        self.w(u'<h2 id="entities" class="schema">%s</h2>' % _('Permissions for entity types'))
-        for eschema in entities:
-            self.w(u'<h3 id="%s" class="schema"><a href="%s">%s (%s)</a> ' % (
-                eschema.type, self._cw.build_url('cwetype/%s' % eschema.type),
-                eschema.type, _(eschema.type)))
-            self.w(u'<a href="%s#schema_security"><img src="%s" alt="%s"/></a>' % (
-                url,  self._cw.uiprops['UP_ICON'], _('up')))
-            self.w(u'</h3>')
-            self.w(u'<div style="margin: 0px 1.5em">')
-            self.permissions_table(eschema)
-            # display entity attributes only if they have some permissions modified
-            modified_attrs = []
-            for attr, etype in  eschema.attribute_definitions():
-                rdef = eschema.rdef(attr)
-                if attr not in META_RTYPES and self.has_non_default_perms(rdef):
-                    modified_attrs.append(rdef)
-            if modified_attrs:
-                self.w(u'<h4>%s</h4>' % _('Attributes with non default permissions:'))
-                self.w(u'</div>')
-                self.w(u'<div style="margin: 0px 6em">')
-                for rdef in modified_attrs:
-                    attrtype = str(rdef.rtype)
-                    self.w(u'<h4 class="schema">%s (%s)</h4> ' % (attrtype, _(attrtype)))
-                    self.permissions_table(rdef)
-            self.w(u'</div>')
-
-    def display_relations(self, relations):
-        _ = self._cw._
-        url = xml_escape(self._cw.build_url('schema'))
-        self.w(u'<h2 id="relations" class="schema">%s</h2>' % _('Permissions for relations'))
-        for rschema in relations:
-            self.w(u'<h3 id="%s" class="schema"><a href="%s">%s (%s)</a> ' % (
-                rschema.type, self._cw.build_url('cwrtype/%s' % rschema.type),
-                rschema.type, _(rschema.type)))
-            self.w(u'<a href="%s#schema_security"><img src="%s" alt="%s"/></a>' % (
-                url,  self._cw.uiprops['UP_ICON'], _('up')))
-            self.w(u'</h3>')
-            self.grouped_permissions_table(rschema)
-
-
 # CWEType ######################################################################
 
 # register msgid generated in entity relations tables
--- a/web/views/sessions.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/sessions.py	Tue Feb 01 11:52:10 2011 +0100
@@ -69,8 +69,8 @@
         raise :exc:`cubicweb.AuthenticationError` if authentication failed
         (no authentication info found or wrong user/password)
         """
-        cnx, login, authinfo = self.authmanager.authenticate(req)
-        session = DBAPISession(cnx, login, authinfo)
+        cnx, login = self.authmanager.authenticate(req)
+        session = DBAPISession(cnx, login)
         self._sessions[session.sessionid] = session
         # associate the connection to the current request
         req.set_session(session)
--- a/web/views/startup.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/startup.py	Tue Feb 01 11:52:10 2011 +0100
@@ -120,10 +120,6 @@
             self.w(u'<tr><th colspan="4">%s</th></tr>\n' % self._cw._('system entities'))
             self.entity_types_table(eschema for eschema in schema.entities()
                                 if uicfg.indexview_etype_section.get(eschema) == 'system')
-            if 'CWAttribute' in schema: # check schema support
-                self.w(u'<tr><th colspan="4">%s</th></tr>\n' % self._cw._('schema entities'))
-                self.entity_types_table(eschema for eschema in schema.entities()
-                                        if uicfg.indexview_etype_section.get(eschema) == 'schema')
         self.w(u'</table>')
 
     def entity_types_table(self, eschemas):
--- a/web/views/urlpublishing.py	Tue Feb 01 10:10:46 2011 +0100
+++ b/web/views/urlpublishing.py	Tue Feb 01 11:52:10 2011 +0100
@@ -156,7 +156,7 @@
 
         <etype>[[/<attribute name>]/<attribute value>]*
     """
-    priority = 2
+    priority = 3
 
     def evaluate_path(self, req, parts):
         if not (0 < len(parts) < 4):
@@ -214,7 +214,8 @@
 
     URL rewrite rule definitions are stored in URLRewriter objects
     """
-    priority = 3
+    priority = 2
+
     def evaluate_path(self, req, parts):
         # uri <=> req._twreq.path or req._twreq.uri
         uri = req.url_unquote('/' + '/'.join(parts))
@@ -236,6 +237,7 @@
     <any evaluator path>/<action>
     """
     priority = 4
+
     def evaluate_path(self, req, parts):
         if len(parts) < 2:
             raise PathDontMatch()