Adds a category to comments, painted with colored vertical bar.
authorgibus
Tue, 25 Jun 2013 11:56:01 +0200
changeset 504 b2e0186daa5b
parent 502 8ec189cc214d
child 505 f0e614705a1e
Adds a category to comments, painted with colored vertical bar.
src/cm/client.py
src/cm/locale/bg/LC_MESSAGES/django.mo
src/cm/locale/bg/LC_MESSAGES/django.po
src/cm/locale/bg/LC_MESSAGES/djangojs.mo
src/cm/locale/bg/LC_MESSAGES/djangojs.po
src/cm/locale/en/LC_MESSAGES/django.po
src/cm/locale/en/LC_MESSAGES/djangojs.po
src/cm/locale/es/LC_MESSAGES/django.mo
src/cm/locale/es/LC_MESSAGES/django.po
src/cm/locale/es/LC_MESSAGES/djangojs.mo
src/cm/locale/es/LC_MESSAGES/djangojs.po
src/cm/locale/fr/LC_MESSAGES/django.mo
src/cm/locale/fr/LC_MESSAGES/django.po
src/cm/locale/fr/LC_MESSAGES/djangojs.mo
src/cm/locale/fr/LC_MESSAGES/djangojs.po
src/cm/locale/it/LC_MESSAGES/django.mo
src/cm/locale/it/LC_MESSAGES/django.po
src/cm/locale/it/LC_MESSAGES/djangojs.mo
src/cm/locale/it/LC_MESSAGES/djangojs.po
src/cm/locale/no/LC_MESSAGES/django.mo
src/cm/locale/no/LC_MESSAGES/django.po
src/cm/locale/no/LC_MESSAGES/djangojs.mo
src/cm/locale/no/LC_MESSAGES/djangojs.po
src/cm/locale/pt_BR/LC_MESSAGES/django.mo
src/cm/locale/pt_BR/LC_MESSAGES/django.po
src/cm/locale/pt_BR/LC_MESSAGES/djangojs.mo
src/cm/locale/pt_BR/LC_MESSAGES/djangojs.po
src/cm/media/css/site/text_view_comments/c-style-comment.css
src/cm/media/css/site/text_view_comments/c-text-styles.css
src/cm/media/js/client/c_addcomment_form.js
src/cm/media/js/client/c_client-min.js
src/cm/media/js/client/c_db.js
src/cm/media/js/client/c_edit_form.js
src/cm/media/js/client/c_icomment.js
src/cm/media/js/client/c_interface_forms.js
src/cm/media/js/client/c_scopes.js
src/cm/media/js/client/f_client-min.js
src/cm/media/js/site/f_text_view_frame.js
src/cm/migrations/0009_auto__chg_field_attachment_text_version.py
src/cm/migrations/0010_auto__add_field_textversion_category_1__add_field_textversion_category.py
src/cm/migrations/0011_auto__add_field_comment_category.py
src/cm/models.py
src/cm/monkey_patches.py
src/cm/templates/site/text_view_comments.html
src/cm/templates/site/text_view_frame.html
src/cm/views/site.py
src/cm/views/texts.py
--- a/src/cm/client.py	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/client.py	Tue Jun 25 11:56:01 2013 +0200
@@ -75,6 +75,7 @@
                    'content':comment.content, 
                    'content_html':comment.content_html, 
                    'tags': ', '.join(parse_tag_input(comment.tags)), 
+                   'category': comment.category,
                    'format': comment.format, 
                    'start_wrapper' : comment.start_wrapper, 
                    'end_wrapper' : comment.end_wrapper,
@@ -113,6 +114,8 @@
     
     tags = request.POST['tags']
 
+    category = request.POST.get('category', 0);
+
     reply_to_id = request.POST.get('reply_to_id', None)
     
     format = request.POST['format'] 
@@ -131,7 +134,7 @@
     if end_offset :
         end_offset = int(end_offset.strip())
     
-    return name, email, title, content, tags, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset
+    return name, email, title, content, tags, category, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset
 
 def validate_comment_args(name, email, title, content, tags):
     errors = {}
@@ -176,7 +179,7 @@
     if not change_state : # moderation action
         change_scope = request.POST.get('change_scope', None)
     
-        name, email, title, content, tags, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset = read_comment_args(request)
+        name, email, title, content, tags, category, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset = read_comment_args(request)
     
         errors = validate_comment_args(name, email, title, content, tags)
          
@@ -202,6 +205,7 @@
             comment.content = content
             comment.content_html = content_html
             comment.tags = tags
+            comment.category = category
 
             if change_scope :
                 comment.start_wrapper = start_wrapper
@@ -237,7 +241,7 @@
 #    if self.request.user.is_anonymous() : # accessing via an admin url ?
 #    and comment.user == self.request.user
     user = None if request.user.is_anonymous() else request.user 
-    name, email, title, content, tags, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset = read_comment_args(request)
+    name, email, title, content, tags, category, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset = read_comment_args(request)
     errors = {} 
     errors = validate_comment_args(name, email, title, content, tags)
 
@@ -261,7 +265,7 @@
         text_version = TextVersion.objects.get(key=version_key)
         
         comment_state = 'approved' if text_version.mod_posteriori else 'pending'
-        comment = Comment.objects.create(state=comment_state, text_version=text_version, user=user, name=name, email=email, title=title, content=content, content_html=content_html, tags = tags, start_wrapper = start_wrapper, end_wrapper = end_wrapper, start_offset = start_offset, end_offset = end_offset, reply_to=reply_to)
+        comment = Comment.objects.create(state=comment_state, text_version=text_version, user=user, name=name, email=email, title=title, content=content, content_html=content_html, tags = tags, category = category, start_wrapper = start_wrapper, end_wrapper = end_wrapper, start_offset = start_offset, end_offset = end_offset, reply_to=reply_to)
         
         ask_for_notification = True
         if user : 
@@ -347,12 +351,17 @@
     comment_ids = [c.id for c in allowed_comments]
     tags = list(Tag.objects.filter(items__content_type = ContentType.objects.get_for_model(Comment),items__object_id__in=comment_ids).values("name").annotate(nb_comments=Count('id')).distinct().order_by('name'))
 
+    # categories
+    categories = []
+    for category in [0, 1, 2, 3, 4, 5] :
+        categories.append({'cat' : category, 'nb_comments':allowed_comments.filter(category = category).count()})
+    
     # states
     states = []
     for state in comment_states :
         states.append({'state' : state, 'nb_comments':allowed_comments.filter(state = state).count()})
     
-    return {'names':names, 'dates':dates, 'tags':tags, 'states':states}
+    return {'names':names, 'dates':dates, 'tags':tags, 'categories':categories, 'states':states}
 
 #def get_ordered_ids(text_version_id):
 #    comments_and_replies = Comment.objects.filter(text_version__id=text_version_id)
Binary file src/cm/locale/bg/LC_MESSAGES/django.mo has changed
--- a/src/cm/locale/bg/LC_MESSAGES/django.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/bg/LC_MESSAGES/django.po	Tue Jun 25 11:56:01 2013 +0200
@@ -2161,3 +2161,43 @@
 
 #~ msgid "How do you want to print?"
 #~ msgstr "Как искате да бъде напечатано?"
+
+#: models.py:266 views/site.py:191
+#, fuzzy
+msgid "Label for the first category of comments"
+msgstr "Етикет за първата категория на коментари"
+
+#: models.py:267 views/site.py:197
+#, fuzzy
+msgid "Label for the second category of comments"
+msgstr "Етикет за втората категория на коментари"
+
+#: models.py:268 views/site.py:203
+#, fuzzy
+msgid "Label for the third category of comments"
+msgstr "Етикет за трета категория коментари"
+
+#: models.py:269 views/site.py:209
+#, fuzzy
+msgid "Label for the fourth category of comments"
+msgstr "Етикет за четвърта категория на коментари"
+
+#: models.py:270 views/site.py:215
+#, fuzzy
+msgid "Label for the fifth category of comments"
+msgstr "Етикет за пета категория на коментари"
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270 views/site.py:192 views/site.py:198 views/site.py:204 views/site.py:210 views/site.py:216
+#, fuzzy
+msgid "Paragraphs including at least one comment of this category will have a vertical bar with this color: "
+msgstr "Параграфи включително най-малко един коментар на тази категория ще има вертикална лента с този цвят: "
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "Leave blank to use the value configured for the workspace."
+msgstr "Оставете празно, за да използвате стойността конфигуриран за работната площ."
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "To disable this category for this text whatever the configuration for the workspace, enter: "
+msgstr "За да деактивирате тази категория за този текст, независимо от конфигурацията на работната област, въведете: "
Binary file src/cm/locale/bg/LC_MESSAGES/djangojs.mo has changed
--- a/src/cm/locale/bg/LC_MESSAGES/djangojs.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/bg/LC_MESSAGES/djangojs.po	Tue Jun 25 11:56:01 2013 +0200
@@ -634,3 +634,18 @@
 #~ msgid_plural " replies"
 #~ msgstr[0] "отговор"
 #~ msgstr[1] "отговор"
+
+#: media/js/client/c_icomment.js:330
+#, fuzzy
+msgid "category"
+msgstr "категория"
+
+#: media/js/client/c_interface_form.js:52
+#, fuzzy
+msgid "Category:"
+msgstr "Категория:"
+
+#: media/js/site/f_text_view_frame.js:123
+#, fuzzy
+msgid "Categories"
+msgstr "Категории"
--- a/src/cm/locale/en/LC_MESSAGES/django.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/en/LC_MESSAGES/django.po	Tue Jun 25 11:56:01 2013 +0200
@@ -2038,3 +2038,35 @@
 msgid ""
 "You've been registered, please check your email for the confirm message."
 msgstr ""
+
+#: models.py:266 views/site.py:191
+msgid "Label for the first category of comments"
+msgstr ""
+
+#: models.py:267 views/site.py:197
+msgid "Label for the second category of comments"
+msgstr ""
+
+#: models.py:268 views/site.py:203
+msgid "Label for the third category of comments"
+msgstr ""
+
+#: models.py:269 views/site.py:209
+msgid "Label for the fourth category of comments"
+msgstr ""
+
+#: models.py:270 views/site.py:215
+msgid "Label for the fifth category of comments"
+msgstr ""
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270 views/site.py:192 views/site.py:198 views/site.py:204 views/site.py:210 views/site.py:216
+msgid "Paragraphs including at least one comment of this category will have a vertical bar with this color: "
+msgstr ""
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+msgid "Leave blank to use the value configured for the workspace."
+msgstr ""
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+msgid "To disable this category for this text whatever the configuration for the workspace, enter: "
+msgstr ""
--- a/src/cm/locale/en/LC_MESSAGES/djangojs.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/en/LC_MESSAGES/djangojs.po	Tue Jun 25 11:56:01 2013 +0200
@@ -618,3 +618,15 @@
 #: media/js/client/c_toc.js:45
 msgid "Table of contents"
 msgstr ""
+
+#: media/js/client/c_icomment.js:330
+msgid "category"
+msgstr ""
+
+#: media/js/client/c_interface_form.js:52
+msgid "Category:"
+msgstr ""
+
+#: media/js/site/f_text_view_frame.js:123
+msgid "Categories"
+msgstr ""
Binary file src/cm/locale/es/LC_MESSAGES/django.mo has changed
--- a/src/cm/locale/es/LC_MESSAGES/django.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/es/LC_MESSAGES/django.po	Tue Jun 25 11:56:01 2013 +0200
@@ -2325,3 +2325,43 @@
 
 #~ msgid "Local role"
 #~ msgstr "Perfil local"
+
+#: models.py:266 views/site.py:191
+#, fuzzy
+msgid "Label for the first category of comments"
+msgstr "Etiqueta para la primera categoría de los comentarios"
+
+#: models.py:267 views/site.py:197
+#, fuzzy
+msgid "Label for the second category of comments"
+msgstr "Etiqueta para la segunda categoría de los comentarios"
+
+#: models.py:268 views/site.py:203
+#, fuzzy
+msgid "Label for the third category of comments"
+msgstr "Etiqueta para la tercera categoría de los comentarios"
+
+#: models.py:269 views/site.py:209
+#, fuzzy
+msgid "Label for the fourth category of comments"
+msgstr "Etiqueta para la cuarta categoría de los comentarios"
+
+#: models.py:270 views/site.py:215
+#, fuzzy
+msgid "Label for the fifth category of comments"
+msgstr "Etiqueta para la quinta categoría de los comentarios"
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270 views/site.py:192 views/site.py:198 views/site.py:204 views/site.py:210 views/site.py:216
+#, fuzzy
+msgid "Paragraphs including at least one comment of this category will have a vertical bar with this color: "
+msgstr "Los párrafos que incluyen al menos un comentario de esta categoría tendrán una barra vertical, con este color: "
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "Leave blank to use the value configured for the workspace."
+msgstr "Déjelo en blanco para utilizar el valor configurado para el espacio de trabajo."
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "To disable this category for this text whatever the configuration for the workspace, enter: "
+msgstr "Para desactivar esta categoría para este texto sea cual sea la configuración del espacio de trabajo, escriba: "
Binary file src/cm/locale/es/LC_MESSAGES/djangojs.mo has changed
--- a/src/cm/locale/es/LC_MESSAGES/djangojs.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/es/LC_MESSAGES/djangojs.po	Tue Jun 25 11:56:01 2013 +0200
@@ -644,3 +644,18 @@
 
 #~ msgid "Use padding to show discussion threads"
 #~ msgstr "Usar espacios en blanco para separar los diferentes hilos de debate"
+
+#: media/js/client/c_icomment.js:330
+#, fuzzy
+msgid "category"
+msgstr "categoría"
+
+#: media/js/client/c_interface_form.js:52
+#, fuzzy
+msgid "Category:"
+msgstr "Categoría:"
+
+#: media/js/site/f_text_view_frame.js:123
+#, fuzzy
+msgid "Categories"
+msgstr "Categorías"
Binary file src/cm/locale/fr/LC_MESSAGES/django.mo has changed
--- a/src/cm/locale/fr/LC_MESSAGES/django.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/fr/LC_MESSAGES/django.po	Tue Jun 25 11:56:01 2013 +0200
@@ -2259,3 +2259,35 @@
 
 #~ msgid "%(title)s"
 #~ msgstr "%(title)s"
+
+#: models.py:266 views/site.py:191
+msgid "Label for the first category of comments"
+msgstr "Intitulé pour la première catégorie de commentaires"
+
+#: models.py:267 views/site.py:197
+msgid "Label for the second category of comments"
+msgstr "Intitulé pour la deuxième catégorie de commentaires"
+
+#: models.py:268 views/site.py:203
+msgid "Label for the third category of comments"
+msgstr "Intitulé pour la troisième catégorie de commentaires"
+
+#: models.py:269 views/site.py:209
+msgid "Label for the fourth category of comments"
+msgstr "Intitulé pour la quatrième catégorie de commentaires"
+
+#: models.py:270 views/site.py:215
+msgid "Label for the fifth category of comments"
+msgstr "Intitulé pour la cinquième catégorie de commentaires"
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270 views/site.py:192 views/site.py:198 views/site.py:204 views/site.py:210 views/site.py:216
+msgid "Paragraphs including at least one comment of this category will have a vertical bar with this color: "
+msgstr "Paragraphes dont au moins un commentaire de cette catégorie auront une barre verticale avec cette couleur : "
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+msgid "Leave blank to use the value configured for the workspace."
+msgstr "Laissez vide pour utiliser la valeur configurée pour l'espace de travail."
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+msgid "To disable this category for this text whatever the configuration for the workspace, enter: "
+msgstr "Pour désactiver cette catégorie pour ce texte quelle que soit la configuration de l'espace de travail, entrez : "
Binary file src/cm/locale/fr/LC_MESSAGES/djangojs.mo has changed
--- a/src/cm/locale/fr/LC_MESSAGES/djangojs.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/fr/LC_MESSAGES/djangojs.po	Tue Jun 25 11:56:01 2013 +0200
@@ -639,3 +639,15 @@
 #~ msgid_plural " replies"
 #~ msgstr[0] " réponse"
 #~ msgstr[1] " réponses"
+
+#: media/js/client/c_icomment.js:330
+msgid "category"
+msgstr "catégorie"
+
+#: media/js/client/c_interface_form.js:52
+msgid "Category:"
+msgstr "Catégorie :"
+
+#: media/js/site/f_text_view_frame.js:123
+msgid "Categories"
+msgstr "Catégories"
Binary file src/cm/locale/it/LC_MESSAGES/django.mo has changed
--- a/src/cm/locale/it/LC_MESSAGES/django.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/it/LC_MESSAGES/django.po	Tue Jun 25 11:56:01 2013 +0200
@@ -2287,3 +2287,43 @@
 msgstr ""
 "Sei registrato, per cortesia controlla la tua casella di posta elettronica "
 "per il messaggio di conferma."
+
+#: models.py:266 views/site.py:191
+#, fuzzy
+msgid "Label for the first category of comments"
+msgstr "Etichetta per la prima categoria di commenti"
+
+#: models.py:267 views/site.py:197
+#, fuzzy
+msgid "Label for the second category of comments"
+msgstr "Etichetta per la seconda categoria di commenti"
+
+#: models.py:268 views/site.py:203
+#, fuzzy
+msgid "Label for the third category of comments"
+msgstr "Etichetta per la terza categoria di commenti"
+
+#: models.py:269 views/site.py:209
+#, fuzzy
+msgid "Label for the fourth category of comments"
+msgstr "Etichetta per la quarta categoria di commenti"
+
+#: models.py:270 views/site.py:215
+#, fuzzy
+msgid "Label for the fifth category of comments"
+msgstr "Etichetta per la quinta categoria di commenti"
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270 views/site.py:192 views/site.py:198 views/site.py:204 views/site.py:210 views/site.py:216
+#, fuzzy
+msgid "Paragraphs including at least one comment of this category will have a vertical bar with this color: "
+msgstr "I paragrafi tra cui almeno un commento di questa categoria avranno una barra verticale con questo colore: "
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "Leave blank to use the value configured for the workspace."
+msgstr "Lasciare vuoto per utilizzare il valore configurato per l'area di lavoro."
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "To disable this category for this text whatever the configuration for the workspace, enter: "
+msgstr "Per disabilitare questa categoria per questo testo qualunque sia la configurazione per l'area di lavoro, digitare: "
Binary file src/cm/locale/it/LC_MESSAGES/djangojs.mo has changed
--- a/src/cm/locale/it/LC_MESSAGES/djangojs.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/it/LC_MESSAGES/djangojs.po	Tue Jun 25 11:56:01 2013 +0200
@@ -632,3 +632,18 @@
 #: media/js/site/text_edit.js:103
 msgid "Remove"
 msgstr "Cancella"
+
+#: media/js/client/c_icomment.js:330
+#, fuzzy
+msgid "category"
+msgstr "categoria"
+
+#: media/js/client/c_interface_form.js:52
+#, fuzzy
+msgid "Category:"
+msgstr "Categoria:"
+
+#: media/js/site/f_text_view_frame.js:123
+#, fuzzy
+msgid "Categories"
+msgstr "Categorie"
Binary file src/cm/locale/no/LC_MESSAGES/django.mo has changed
--- a/src/cm/locale/no/LC_MESSAGES/django.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/no/LC_MESSAGES/django.po	Tue Jun 25 11:56:01 2013 +0200
@@ -2148,3 +2148,43 @@
 
 #~ msgid "Local role"
 #~ msgstr "Tekstrolle"
+
+#: models.py:266 views/site.py:191
+#, fuzzy
+msgid "Label for the first category of comments"
+msgstr "Etiketten for den første kategorien av kommentarer"
+
+#: models.py:267 views/site.py:197
+#, fuzzy
+msgid "Label for the second category of comments"
+msgstr "Etiketten for den andre kategorien av kommentarer"
+
+#: models.py:268 views/site.py:203
+#, fuzzy
+msgid "Label for the third category of comments"
+msgstr "Etiketten for tredje kategorien av kommentarer"
+
+#: models.py:269 views/site.py:209
+#, fuzzy
+msgid "Label for the fourth category of comments"
+msgstr "Etiketten for fjerde kategori av kommentarer"
+
+#: models.py:270 views/site.py:215
+#, fuzzy
+msgid "Label for the fifth category of comments"
+msgstr "Etiketten for femte kategorien av kommentarer"
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270 views/site.py:192 views/site.py:198 views/site.py:204 views/site.py:210 views/site.py:216
+#, fuzzy
+msgid "Paragraphs including at least one comment of this category will have a vertical bar with this color: "
+msgstr "Avsnitt inkludert minst én kommentar av denne kategorien vil ha en loddrett strek med denne fargen: "
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "Leave blank to use the value configured for the workspace."
+msgstr "La stå tomt for å bruke verdien konfigurert for arbeidsområdet."
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "To disable this category for this text whatever the configuration for the workspace, enter: "
+msgstr "For å deaktivere denne kategorien for denne teksten uansett konfigurasjon for arbeidsområdet, skriver du: "
Binary file src/cm/locale/no/LC_MESSAGES/djangojs.mo has changed
--- a/src/cm/locale/no/LC_MESSAGES/djangojs.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/no/LC_MESSAGES/djangojs.po	Tue Jun 25 11:56:01 2013 +0200
@@ -648,3 +648,18 @@
 #~ msgstr[1] ""
 #~ "%(nb_comments)s merknader vil bli slettet, fordi teksten som de er "
 #~ "knyttet til har blitt endret."
+
+#: media/js/client/c_icomment.js:330
+#, fuzzy
+msgid "category"
+msgstr "kategori"
+
+#: media/js/client/c_interface_form.js:52
+#, fuzzy
+msgid "Category:"
+msgstr "Kategori:"
+
+#: media/js/site/f_text_view_frame.js:123
+#, fuzzy
+msgid "Categories"
+msgstr "Kategorier"
Binary file src/cm/locale/pt_BR/LC_MESSAGES/django.mo has changed
--- a/src/cm/locale/pt_BR/LC_MESSAGES/django.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/pt_BR/LC_MESSAGES/django.po	Tue Jun 25 11:56:01 2013 +0200
@@ -2165,3 +2165,43 @@
 #, fuzzy
 #~ msgid "Contact from user: %(name)s / %(email)s"
 #~ msgstr "Ajouter un utilisateur"
+
+#: models.py:266 views/site.py:191
+#, fuzzy
+msgid "Label for the first category of comments"
+msgstr "Rótulo para a primeira categoria dos comentários"
+
+#: models.py:267 views/site.py:197
+#, fuzzy
+msgid "Label for the second category of comments"
+msgstr "Rótulo para a segunda categoria dos comentários"
+
+#: models.py:268 views/site.py:203
+#, fuzzy
+msgid "Label for the third category of comments"
+msgstr "Rótulo para a terceira categoria dos comentários"
+
+#: models.py:269 views/site.py:209
+#, fuzzy
+msgid "Label for the fourth category of comments"
+msgstr "Rótulo para a quarta categoria de comentários"
+
+#: models.py:270 views/site.py:215
+#, fuzzy
+msgid "Label for the fifth category of comments"
+msgstr "Rótulo para a quinta categoria dos comentários"
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270 views/site.py:192 views/site.py:198 views/site.py:204 views/site.py:210 views/site.py:216
+#, fuzzy
+msgid "Paragraphs including at least one comment of this category will have a vertical bar with this color: "
+msgstr "Números, incluindo pelo menos um comentário desta categoria terão uma barra vertical com esta cor: "
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "Leave blank to use the value configured for the workspace."
+msgstr "Deixe em branco para usar o valor configurado para o espaço de trabalho."
+
+#: models.py:266 models.py:267 models.py:268 models.py:269 models.py:270
+#, fuzzy
+msgid "To disable this category for this text whatever the configuration for the workspace, enter: "
+msgstr "Para desativar esta categoria para este texto seja qual for a configuração do espaço de trabalho, digite: "
Binary file src/cm/locale/pt_BR/LC_MESSAGES/djangojs.mo has changed
--- a/src/cm/locale/pt_BR/LC_MESSAGES/djangojs.po	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/locale/pt_BR/LC_MESSAGES/djangojs.po	Tue Jun 25 11:56:01 2013 +0200
@@ -653,3 +653,18 @@
 #~ msgstr[1] ""
 #~ "%(nb_comments)s os comentários serão removidos porque o texto a que eles "
 #~ "se referem foi alterado"
+
+#: media/js/client/c_icomment.js:330
+#, fuzzy
+msgid "category"
+msgstr "categoria"
+
+#: media/js/client/c_interface_form.js:52
+#, fuzzy
+msgid "Category:"
+msgstr "Categoria:"
+
+#: media/js/site/f_text_view_frame.js:123
+#, fuzzy
+msgid "Categories"
+msgstr "Categorias"
--- a/src/cm/media/css/site/text_view_comments/c-style-comment.css	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/css/site/text_view_comments/c-style-comment.css	Tue Jun 25 11:56:01 2013 +0200
@@ -28,7 +28,7 @@
     font-weight: bold;
 }
 
-.c-infos, .c-tags-infos, .c-state-actions,.c-iactions {
+.c-infos, .c-tags-infos, .c-cat, .c-state-actions,.c-iactions {
     font-size: 77%;
     color: #565656;
 }
@@ -158,10 +158,31 @@
 .icomment-header .c-infos,
 .icomment-header .c-state-actions,
 .icomment-header .c-state-actions,
-.icomment-header .c-tags {
+.icomment-header .c-tags,
+.icomment-header .c-cat-val {
   font: 11px/13px 'PT Sans', Verdana, sans-serif;
 }
 
+.icomment-header .c-cat-val.c-cat-1 {
+  color: #1523f4;
+}
+
+.icomment-header .c-cat-val.c-cat-2 {
+  color: #f4154f;
+}
+
+.icomment-header .c-cat-val.c-cat-3 {
+  color: #09ff09;
+}
+
+.icomment-header .c-cat-val.c-cat-4 {
+  color: #bc39cf;
+}
+
+.icomment-header .c-cat-val.c-cat-5 {
+  color: #ffbd08;
+}
+
 .icomment-body {
   font: 13px/18px 'PT Sans', Verdana, sans-serif;
 }
--- a/src/cm/media/css/site/text_view_comments/c-text-styles.css	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/css/site/text_view_comments/c-text-styles.css	Tue Jun 25 11:56:01 2013 +0200
@@ -2,6 +2,7 @@
 #textcontainer {
   font-size: 14px;
   line-height: 20px;
+  padding-left: 30px;
 }
   
 #textcontainer.modern {
@@ -95,3 +96,127 @@
   top: -0.25em;
   font-size: 0.75em;
 }
+
+.cat1 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4;
+}
+
+.cat2 {
+  box-shadow: -15px 0 0 0 white, -17px 0 0 0 #f4154f;
+}
+
+.cat3 {
+  box-shadow: -18px 0 0 0 white, -20px 0 0 0 #09ff09;
+}
+
+.cat4 {
+  box-shadow: -21px 0 0 0 white, -23px 0 0 0 #bc39cf;
+}
+
+.cat5 {
+  box-shadow: -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat1.cat2 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -15px 0 0 0 white, -17px 0 0 0 #f4154f;
+}
+
+.cat1.cat3 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -18px 0 0 0 white, -20px 0 0 0 #09ff09;
+}
+
+.cat1.cat4 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -21px 0 0 0 white, -23px 0 0 0 #bc39cf;
+}
+
+.cat1.cat5 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat2.cat3 {
+  box-shadow: -15px 0 0 0 white, -17px 0 0 0 #f4154f, -18px 0 0 0 white, -20px 0 0 0 #09ff09;
+}
+
+.cat2.cat4 {
+  box-shadow: -15px 0 0 0 white, -17px 0 0 0 #f4154f, -21px 0 0 0 white, -23px 0 0 0 #bc39cf;
+}
+
+.cat2.cat5 {
+  box-shadow: -15px 0 0 0 white, -17px 0 0 0 #f4154f, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat3.cat4 {
+  box-shadow: -18px 0 0 0 white, -20px 0 0 0 #09ff09, -21px 0 0 0 white, -23px 0 0 0 #bc39cf;
+}
+
+.cat3.cat5 {
+  box-shadow: -18px 0 0 0 white, -20px 0 0 0 #09ff09, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat4.cat5 {
+  box-shadow: -21px 0 0 0 white, -23px 0 0 0 #bc39cf, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat1.cat2.cat3 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -15px 0 0 0 white, -17px 0 0 0 #f4154f, -18px 0 0 0 white, -20px 0 0 0 #09ff09;
+}
+
+.cat1.cat2.cat4 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -15px 0 0 0 white, -17px 0 0 0 #f4154f, -21px 0 0 0 white, -23px 0 0 0 #bc39cf;
+}
+
+.cat1.cat2.cat5 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -15px 0 0 0 white, -17px 0 0 0 #f4154f, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat1.cat3.cat4 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -21px 0 0 0 white, -23px 0 0 0 #bc39cf;
+}
+
+.cat1.cat3.cat5 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat1.cat4.cat5 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -21px 0 0 0 white, -23px 0 0 0 #bc39cf, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat2.cat3.cat4 {
+  box-shadow: -15px 0 0 0 white, -17px 0 0 0 #f4154f, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -21px 0 0 0 white, -23px 0 0 0 #bc39cf;
+}
+
+.cat2.cat3.cat5 {
+  box-shadow: -15px 0 0 0 white, -17px 0 0 0 #f4154f, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat2.cat4.cat5 {
+  box-shadow: -15px 0 0 0 white, -17px 0 0 0 #f4154f, -21px 0 0 0 white, -23px 0 0 0 #bc39cf, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat3.cat4.cat5 {
+  box-shadow: -18px 0 0 0 white, -20px 0 0 0 #09ff09, -21px 0 0 0 white, -23px 0 0 0 #bc39cf, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat1.cat2.cat3.cat4 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -15px 0 0 0 white, -17px 0 0 0 #f4154f, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -21px 0 0 0 white, -23px 0 0 0 #bc39cf;
+}
+
+.cat1.cat2.cat3.cat5 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -15px 0 0 0 white, -17px 0 0 0 #f4154f, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat1.cat2.cat4.cat5 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -15px 0 0 0 white, -17px 0 0 0 #f4154f, -21px 0 0 0 white, -23px 0 0 0 #bc39cf, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat1.cat3.cat4.cat5 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -21px 0 0 0 white, -23px 0 0 0 #bc39cf, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat2.cat3.cat4.cat5 {
+  box-shadow: -15px 0 0 0 white, -17px 0 0 0 #f4154f, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -21px 0 0 0 white, -23px 0 0 0 #bc39cf, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
+
+.cat1.cat2.cat3.cat4.cat5 {
+  box-shadow: -12px 0 0 0 white, -14px 0 0 0 #1523f4, -15px 0 0 0 white, -17px 0 0 0 #f4154f, -18px 0 0 0 white, -20px 0 0 0 #09ff09, -21px 0 0 0 white, -23px 0 0 0 #bc39cf, -24px 0 0 0 white, -26px 0 0 0 #ffbd08;
+}
--- a/src/cm/media/js/client/c_addcomment_form.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/client/c_addcomment_form.js	Tue Jun 25 11:56:01 2013 +0200
@@ -8,6 +8,7 @@
       'titleInputId':CY.guid(),
       'contentInputId':CY.guid(),
       'tagsInputId':CY.guid(),
+      'categoryInputId':CY.guid(),
       'formatInputId':CY.guid(),
       'startWrapperInputId':CY.guid(),
       'endWrapperInputId':CY.guid(),
--- a/src/cm/media/js/client/c_client-min.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/client/c_client-min.js	Tue Jun 25 11:56:01 2013 +0200
@@ -1,1 +1,1 @@
-_afterDlg=function(d){var a=d[0];var c=d[1];var b=d[2];a.call(c,b);};_abortNewCommentConfirmed=function(a){if(isICommentFormVisible()){if(gLayout.isInFrame()){gSync.hideICommentForm({fn:function(){_afterDlg(a);}});gSync.resume();}}};_abortNewReplyConfirmed=function(a){if(gNewReplyHost!=null){if(gLayout.isInFrame()){cancelNewReplyForm();_afterDlg(a);}}};_abortNewEditConfirmed=function(a){if(gEditICommentHost!=null){if(gLayout.isInFrame()){cancelEditForm();_afterDlg(a);}}};checkForOpenedDialog=function(e,b,d,c){var a=[];if(e!=null){a=CY.Array.map(gDb.getThreads([gDb.getComment(e.commentId)]),function(f){return f.id;});}if(isICommentFormVisible()||(gNewReplyHost!=null&&(e==null||CY.Array.indexOf(a,gNewReplyHost.commentId)!=-1))||(gEditICommentHost!=null&&(e==null||CY.Array.indexOf(a,gEditICommentHost.commentId)!=-1))){if(gLayout.isInFrame()){if(isICommentFormVisible()){parent.f_yesNoDialog(gettext("New comment will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewCommentConfirmed,this,[b,d,c]);}else{if(gNewReplyHost!=null){parent.f_yesNoDialog(gettext("Started reply will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewReplyConfirmed,this,[b,d,c]);}else{if(gEditICommentHost!=null){parent.f_yesNoDialog(gettext("Started comment edition will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewEditConfirmed,this,[b,d,c]);}}}}}else{b.call(d,[]);}};gToc=null;instanciateToc=function(){gToc={tocId:CY.guid(),tocTitleId:CY.guid(),closeBtnId:CY.guid(),empty:false};var c={};c.headerContent='<div id="'+gToc.tocId+'"><h3 id="'+gToc.tocTitleId+'"></h3>';var a=getElementsByTagNames("h2,h3,h4,h5,h6",document.getElementById("maincontainer"));var h=document.createElement("div");if(a.length>=2){for(var f=0;f<a.length;f++){var g=document.createElement("a");g.innerHTML=a[f].innerHTML.replace(/<\/?a[^>]*>/ig,"");g.className="page indent"+a[f].nodeName;h.appendChild(g);var j=a[f].id||"link"+f;g.href="#"+j;a[f].id=j;}}else{h.innerHTML="";gToc.empty=true;}c.bodyContent=h.innerHTML;var b=gLayout.getTopICommentsWidth();var e=new CY.Overlay({zIndex:3,shim:false,visible:false,headerContent:c.headerContent,bodyContent:c.bodyContent,xy:[3,30],width:b});e.get("contentBox").addClass("c-toc");e.get("contentBox").set("id","the-toc");e.render("#leftcolumn");CY.get("#"+gToc.tocTitleId).set("innerHTML",gettext("Table of contents"));gToc.overlay=e;var k=null;k=new CY.Anim({node:e.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gToc.animationHide=k;k.set("to",{opacity:0});gToc["animationHide-handle"]=k.on("end",onTocHideAnimEnd,gToc);var d=null;d=new CY.Anim({node:e.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gToc.animationShow=d;d.set("to",{opacity:1});gToc["animationShow-handle"]=d.on("end",onTocShowAnimEnd,gToc);getElementsByClassName("c-toc")[0].style.width=b+"px";};toggleTocFn=function(){if(isTocVisible()){hideToc();}else{showToc();}};hideToc=function(){gToc.overlay.hide();};onTocHideAnimEnd=function(){this.overlay.hide();gSync.resume();};onTocShowAnimEnd=function(){gSync.resume();};showToc=function(){removeFormErrMsg(gToc.tocId);gIComments.hide();gToc.overlay.show();};isTocVisible=function(){if(gToc!=null){return gToc.overlay.get("visible");}return false;};function getElementsByTagNames(g,h){if(!h){var h=document;}var a=g.split(",");var f=new Array();for(var e=0;e<a.length;e++){var d=h.getElementsByTagName(a[e]);for(var c=0;c<d.length;c++){f.push(d[c]);}}var b=f[0];if(!b){return[];}if(b.sourceIndex){f.sort(function(j,i){return j.sourceIndex-i.sourceIndex;});}else{if(b.compareDocumentPosition){f.sort(function(j,i){return 3-(j.compareDocumentPosition(i)&6);});}}return f;}var getElementsByClassName=function(b,a,c){if(document.getElementsByClassName){getElementsByClassName=function(j,m,h){h=h||document;var d=h.getElementsByClassName(j),l=(m)?new RegExp("\\b"+m+"\\b","i"):null,e=[],g;for(var f=0,k=d.length;f<k;f+=1){g=d[f];if(!l||l.test(g.nodeName)){e.push(g);}}return e;};}else{if(document.evaluate){getElementsByClassName=function(o,r,n){r=r||"*";n=n||document;var g=o.split(" "),p="",l="http://www.w3.org/1999/xhtml",q=(document.documentElement.namespaceURI===l)?l:null,h=[],d,f;for(var i=0,k=g.length;i<k;i+=1){p+="[contains(concat(' ', @class, ' '), ' "+g[i]+" ')]";}try{d=document.evaluate(".//"+r+p,n,q,0,null);}catch(m){d=document.evaluate(".//"+r+p,n,null,0,null);}while((f=d.iterateNext())){h.push(f);}return h;};}else{getElementsByClassName=function(r,u,q){u=u||"*";q=q||document;var h=r.split(" "),t=[],d=(u==="*"&&q.all)?q.all:q.getElementsByTagName(u),p,j=[],o;for(var i=0,e=h.length;i<e;i+=1){t.push(new RegExp("(^|\\s)"+h[i]+"(\\s|$)"));}for(var g=0,s=d.length;g<s;g+=1){p=d[g];o=false;for(var f=0,n=t.length;f<n;f+=1){o=t[f].test(p.className);if(!o){break;}}if(o){j.push(p);}}return j;};}}return getElementsByClassName(b,a,c);};IComment=function(){this.commentId=null;var l=gLayout.getTopICommentsWidth();var a=gConf.iCommentLeftPadding;var r=gettext("change comment state to pending");var n=gettext("change comment state to approved");var e=gettext("change comment state to unapproved");var q=gettext("cancel changing the state of this comment");var c=gettext("pending");var d=gettext("approved");var m=gettext("unapproved");var b=gettext("cancel");var p=gettext("show replies");var s=gettext("change to:");var i=ngettext("reply","replies",1);var g=gettext("edit comment");var j=gettext("delete comment");var o=gettext("edit");var f=gettext("delete");var k=gettext("close");var h=gettext("show scope");var t=gettext("Comment is detached: it was created on a previous version and text it applied to has been modified or removed.");this.overlay=new CY.Overlay({zIndex:3,shim:false,visible:false,width:l,xy:[a,0],headerContent:'<div class="icomment-header"><div class="c-iactions"><a class="c-moderate c-action" title="">vis</a> <a class="c-edit c-action" title="'+g+'" alt="'+g+'">'+o+'</a> <a class="c-delete c-action" title="'+j+'" alt="'+j+'">'+f+'</a> </div><div class="c-state-actions displaynone">'+s+'&nbsp;<a class="c-state-pending c-action" title="'+r+'" alt="'+r+'">'+c+'</a> <a class="c-state-approved c-action" title="'+n+'" alt="'+n+'">'+d+'</a> <a class="c-state-unapproved c-action" title="'+e+'" alt="'+e+'">'+m+'</a> <a class="c-state-cancel c-action" title="'+q+'" alt="'+q+'">'+b+'</a> </div><div class="c-no-scope-msg">'+t+'</div><a class="c-show-scope c-action" title="'+h+'" alt="'+h+'"><em>-</em></a><a class="c-close c-action" title="'+k+'" alt="'+k+'"><em>X</em></a></div>',bodyContent:'<div class="icomment-body"><span class="c-content"></span><span class="c-ireplyactions"><a class="c-readreplies c-action" title="'+p+'" alt="'+p+'">'+p+'</a> <a class="c-reply c-action" title="'+i+'" alt="'+i+'">'+i+"</a>&nbsp;</span></div>"});this.overlay.get("contentBox").addClass("c-comment");this.overlay.render("#leftcolumn");this.animation=new CY.Anim({node:this.overlay.get("boundingBox"),duration:gPrefs.get("general","animduration"),easing:CY.Easing.easeOut});this.overlay.get("contentBox").query(".c-close").on("click",this.onCloseCommentClick,this);this.overlay.get("contentBox").query(".c-moderate").on("click",this.onModerateCommentClick,this);this.overlay.get("contentBox").query(".c-state-pending").on("click",this.onPendingCommentClick,this);this.overlay.get("contentBox").query(".c-state-approved").on("click",this.onApprovedCommentClick,this);this.overlay.get("contentBox").query(".c-state-unapproved").on("click",this.onUnapprovedCommentClick,this);this.overlay.get("contentBox").query(".c-state-cancel").on("click",this.onCancelStateChangeClick,this);this.overlay.get("contentBox").query(".c-edit").on("click",this.onEditCommentClick,this);this.overlay.get("contentBox").query(".c-delete").on("click",this.onDeleteCommentClick,this);this.overlay.get("contentBox").query(".c-reply").on("click",this.onReplyCommentClick,this);this.overlay.get("contentBox").query(".c-readreplies").on("click",this.onReadRepliesCommentClick,this);this.overlay.get("contentBox").query(".icomment-header").on("mouseenter",this.onMouseEnterHeader,this);this.overlay.get("contentBox").query(".icomment-header").on("mouseleave",this.onMouseLeaveHeader,this);this.overlay.get("contentBox").on("click",this.onCommentClick,this);};IComment.prototype={onCloseCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.closeComment(this);}},onModerateCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-iactions").addClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").removeClass("displaynone");}},onPendingCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"pending");}},onApprovedCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"approved");}},onUnapprovedCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"unapproved");}},onCancelStateChangeClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-iactions").removeClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").addClass("displaynone");}},onDeleteCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.removeComment(this);}},onEditCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.showEditForm(this);}},onReplyCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.showReplyForm(this);}},onReadRepliesCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.openComment(this);}},onCommentClick:function(d){if(readyForAction()&&this.isVisible()){if(d.target.get("target")=="_blank"){var b=d.target;var g=sv_site_url+sv_text_view_show_comment_url;if(b.get("href").indexOf(g)==0){var a=(new RegExp("comment_id_key=([^&]*)","g")).exec(b.get("href"));if(a!=null){var c=a[1];var f=gDb.getCommentByIdKey(c);if(f!=null){d.halt();if(!b.hasClass("c-permalink")){checkForOpenedDialog(null,function(){gSync.showSingleComment(f);});}}}}}else{if(gShowingAllComments){if(!this._isHostingAForm()){var f=gDb.getComment(this.commentId);checkForOpenedDialog(null,function(){if(f!=null){gSync.showSingleComment(f);}});}}else{gSync.activate(this);}}}},onMouseEnterHeader:function(){if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-permalink").removeClass("displaynone");}},onMouseLeaveHeader:function(){if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-permalink").addClass("displaynone");}},setWidth:function(a){this.overlay.get("boundingBox").setStyle("width",a+"px");},activate:function(){this.overlay.get("boundingBox").addClass("c-focus-comment");},deactivate:function(){this.overlay.get("boundingBox").removeClass("c-focus-comment");},hide:function(){if(gIComments.isTopActive(this.commentId)){if(!gIComments.activateVisibleNext()){gIComments.deactivate();}}if(this.isVisible()){this.overlay.hide();this.overlay.blur();}},hideContent:function(){this.overlay.get("contentBox").query(".icomment-header").addClass("displaynone");this.overlay.get("contentBox").query(".icomment-body").addClass("displaynone");},showContent:function(){this.overlay.get("contentBox").query(".icomment-header").removeClass("displaynone");this.overlay.get("contentBox").query(".icomment-body").removeClass("displaynone");},isVisible:function(){return this.overlay.get("visible");},show:function(){this.hideReadRepliesLnk();return this.overlay.show();},showReadRepliesLnk:function(){this.overlay.get("contentBox").query(".c-readreplies").removeClass("displaynone");},hideReadRepliesLnk:function(){this.overlay.get("contentBox").query(".c-readreplies").addClass("displaynone");},changeModeration:function(b){var a=this.overlay.get("contentBox").query(".c-moderate");a.set("innerHTML",gettext(b.state));a.removeClass("c-state-approved");a.removeClass("c-state-pending");a.removeClass("c-state-unapproved");a.addClass("c-state-"+b.state);this.overlay.get("contentBox").query(".c-iactions").removeClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").addClass("displaynone");},isfetched:function(){return(this.commentId!=null);},unfetch:function(){this.commentId=null;},fetch:function(h){this.commentId=h.id;var b=this.overlay.get("boundingBox");if(h.start_wrapper!=-1){b.addClass("c-has-scope");b.removeClass("c-has-no-scope");}else{b.addClass("c-has-no-scope");b.removeClass("c-has-scope");}if(h.reply_to_id!=null){b.addClass("c-is-reply");}else{b.removeClass("c-is-reply");}var f=interpolate(gettext("last modified on %(date)s"),{date:h.modified_user_str},true);var k=(h.modified==h.created)?"":'<a title="'+f+'"> * </a>';var i=gettext("Permalink to this comment");var n='<a class="c-permalink displaynone c-action" target="_blank" title="'+i+'" href="" >¶&nbsp;</a>';var j=interpolate(gettext("by %(name)s, created on %(date)s"),{name:h.name,date:h.created_user_str},true);var c='<span class="c-header"><div class="c-header-title">'+h.title+n+'</div><div class="c-infos">'+j+"</div></span>";var d=CY.Node.create(c);var o=b.query(".c-header");if(o==null){b.query(".icomment-header").insertBefore(d,b.one(".c-iactions"));}else{o.get("parentNode").replaceChild(d,o);}var g=CY.Node.create('<div class="c-tags"><span class="c-tags-infos">tags:</span>'+h.tags+"</div>");var m=b.query(".c-tags");if(m==null){b.query(".icomment-header").appendChild(g);}else{m.get("parentNode").replaceChild(g,m);}if(h.tags==""){g.addClass("displaynone");}var e=CY.Node.create('<span class="c-content">'+h.content_html+"</span>");var a=b.query(".c-content");if(a==null){b.query(".icomment-body").appendChild(e);}else{a.get("parentNode").replaceChild(e,a);}if(sv_prefix==""){b.query(".c-permalink").set("href",sv_site_url+h.permalink);}else{comment_id_delta_prefix=sv_delta!=""?Array(parseInt(sv_delta)+1).join(","):"";b.query(".c-permalink").set("href",top.location.protocol+"//"+top.location.hostname+top.location.pathname+"?comment_id_key="+comment_id_delta_prefix+h.id_key);}this.changeModeration(h);var l=b.queryAll(".c-content a");if(l!=null){l.setAttribute("target","_blank");}l=b.queryAll(".c-header-title a");if(l!=null){l.setAttribute("target","_blank");}this.permAdapt(h);},permAdapt:function(e){var b=this.overlay.get("contentBox").query(".c-delete");if(b){if(!e.can_delete){b.addClass("displaynone");}else{b.removeClass("displaynone");}}var a=this.overlay.get("contentBox").query(".c-edit");if(a){if(!e.can_edit){a.addClass("displaynone");}else{a.removeClass("displaynone");}}var d=this.overlay.get("contentBox").query(".c-reply");if(d){if(!hasPerm("can_create_comment")){d.addClass("displaynone");}else{d.removeClass("displaynone");}}var c=this.overlay.get("contentBox").query(".c-moderate");if(c){if(!e.can_moderate){c.addClass("displaynone");}else{c.removeClass("displaynone");}}},setThreadPad:function(a){this.overlay.get("contentBox").query(".yui-widget-hd").setStyle("paddingLeft",a+"px");this.overlay.get("contentBox").query(".yui-widget-bd").setStyle("paddingLeft",a+"px");},setPosition:function(b){var a=this.overlay.get("boundingBox");a.setStyle("opacity",1);a.setXY(b);},getPosition:function(b){var a=this.overlay.get("boundingBox");return a.getXY();},onAnimationEnd:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEnd();}},onAnimationEndFocus:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEndFocus();}},onAnimationEndReply:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEndReply();}},setAnimationToPosition:function(d,a,c){var b=this.overlay.get("boundingBox");if(gPrefs.get("general","animduration")<0.011){b.setXY(d);}this.animation.set("to",{xy:d});this.animation.set("duration",gPrefs.get("general","animduration"));if(a){if(c){this["animation-handle"]=this.animation.on("end",this.onAnimationEndReply,this);}else{this["animation-handle"]=this.animation.on("end",this.onAnimationEndFocus,this);}}else{this["animation-handle"]=this.animation.on("end",this.onAnimationEnd,this);}return this.animation;},getHeight:function(){return this.overlay.get("boundingBox").get("offsetHeight");},scrollIntoView:function(){if(!this.overlay.get("contentBox").inViewportRegion()){this.overlay.get("contentBox").scrollIntoView(true);}},_isHostingAForm:function(){return(this.isVisible()&&((gNewReplyHost!=null&&gNewReplyHost==this)||(gEditICommentHost!=null&&gEditICommentHost==this)));}};hasPerm=function(a){return(-1!=CY.Array.indexOf(sv_user_permissions,a));};_afterDlg=function(g){var f=g[0];var h=g[1];var e=g[2];f.call(h,e);};_abortNewCommentConfirmed=function(b){if(isICommentFormVisible()){if(gLayout.isInFrame()){gSync.hideICommentForm({fn:function(){_afterDlg(b);}});gSync.resume();}}};_abortNewReplyConfirmed=function(b){if(gNewReplyHost!=null){if(gLayout.isInFrame()){cancelNewReplyForm();_afterDlg(b);}}};_abortNewEditConfirmed=function(b){if(gEditICommentHost!=null){if(gLayout.isInFrame()){cancelEditForm();_afterDlg(b);}}};checkForOpenedDialog=function(h,f,i,j){var g=[];if(h!=null){g=CY.Array.map(gDb.getThreads([gDb.getComment(h.commentId)]),function(a){return a.id;});}if(isICommentFormVisible()||(gNewReplyHost!=null&&(h==null||CY.Array.indexOf(g,gNewReplyHost.commentId)!=-1))||(gEditICommentHost!=null&&(h==null||CY.Array.indexOf(g,gEditICommentHost.commentId)!=-1))){if(gLayout.isInFrame()){if(isICommentFormVisible()){parent.f_yesNoDialog(gettext("New comment will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewCommentConfirmed,this,[f,i,j]);}else{if(gNewReplyHost!=null){parent.f_yesNoDialog(gettext("Started reply will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewReplyConfirmed,this,[f,i,j]);}else{if(gEditICommentHost!=null){parent.f_yesNoDialog(gettext("Started comment edition will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewEditConfirmed,this,[f,i,j]);}}}}}else{f.call(i,[]);}};gToc=null;instanciateToc=function(){gToc={tocId:CY.guid(),tocTitleId:CY.guid(),closeBtnId:CY.guid(),empty:false};var r={};r.headerContent='<div id="'+gToc.tocId+'"><h3 id="'+gToc.tocTitleId+'"></h3>';var t=getElementsByTagNames("h2,h3,h4,h5,h6",document.getElementById("maincontainer"));var m=document.createElement("div");if(t.length>=2){for(var o=0;o<t.length;o++){var n=document.createElement("a");n.innerHTML=t[o].innerHTML.replace(/<\/?a[^>]*>/ig,"");n.className="page indent"+t[o].nodeName;m.appendChild(n);var l=t[o].id||"link"+o;n.href="#"+l;t[o].id=l;}}else{m.innerHTML="";gToc.empty=true;}r.bodyContent=m.innerHTML;var s=gLayout.getTopICommentsWidth();var p=new CY.Overlay({zIndex:3,shim:false,visible:false,headerContent:r.headerContent,bodyContent:r.bodyContent,xy:[3,30],width:s});p.get("contentBox").addClass("c-toc");p.get("contentBox").set("id","the-toc");p.render("#leftcolumn");CY.get("#"+gToc.tocTitleId).set("innerHTML",gettext("Table of contents"));gToc.overlay=p;var i=null;i=new CY.Anim({node:p.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gToc.animationHide=i;i.set("to",{opacity:0});gToc["animationHide-handle"]=i.on("end",onTocHideAnimEnd,gToc);var q=null;q=new CY.Anim({node:p.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gToc.animationShow=q;q.set("to",{opacity:1});gToc["animationShow-handle"]=q.on("end",onTocShowAnimEnd,gToc);getElementsByClassName("c-toc")[0].style.width=s+"px";};toggleTocFn=function(){if(isTocVisible()){hideToc();}else{showToc();}};hideToc=function(){gToc.overlay.hide();};onTocHideAnimEnd=function(){this.overlay.hide();gSync.resume();};onTocShowAnimEnd=function(){gSync.resume();};showToc=function(){removeFormErrMsg(gToc.tocId);gIComments.hide();gToc.overlay.show();};isTocVisible=function(){if(gToc!=null){return gToc.overlay.get("visible");}return false;};function getElementsByTagNames(l,k){if(!k){var k=document;}var j=l.split(",");var m=new Array();for(var n=0;n<j.length;n++){var o=k.getElementsByTagName(j[n]);for(var p=0;p<o.length;p++){m.push(o[p]);}}var i=m[0];if(!i){return[];}if(i.sourceIndex){m.sort(function(a,b){return a.sourceIndex-b.sourceIndex;});}else{if(i.compareDocumentPosition){m.sort(function(a,b){return 3-(a.compareDocumentPosition(b)&6);});}}return m;}var getElementsByClassName=function(d,e,f){if(document.getElementsByClassName){getElementsByClassName=function(i,a,n){n=n||document;var r=n.getElementsByClassName(i),b=(a)?new RegExp("\\b"+a+"\\b","i"):null,q=[],o;for(var p=0,c=r.length;p<c;p+=1){o=r[p];if(!b||b.test(o.nodeName)){q.push(o);}}return q;};}else{if(document.evaluate){getElementsByClassName=function(j,a,s){a=a||"*";s=s||document;var y=j.split(" "),c="",u="http://www.w3.org/1999/xhtml",b=(document.documentElement.namespaceURI===u)?u:null,x=[],A,z;for(var w=0,v=y.length;w<v;w+=1){c+="[contains(concat(' ', @class, ' '), ' "+y[w]+" ')]";}try{A=document.evaluate(".//"+a+c,s,b,0,null);}catch(t){A=document.evaluate(".//"+a+c,s,null,0,null);}while((z=A.iterateNext())){x.push(z);}return x;};}else{getElementsByClassName=function(a,B,b){B=B||"*";b=b||document;var w=a.split(" "),C=[],A=(B==="*"&&b.all)?b.all:b.getElementsByTagName(B),c,m=[],k;for(var v=0,z=w.length;v<z;v+=1){C.push(new RegExp("(^|\\s)"+w[v]+"(\\s|$)"));}for(var x=0,D=A.length;x<D;x+=1){c=A[x];k=false;for(var y=0,l=C.length;y<l;y+=1){k=C[y].test(c.className);if(!k){break;}}if(k){m.push(c);}}return m;};}}return getElementsByClassName(d,e,f);};IComment=function(){this.commentId=null;var C=gLayout.getTopICommentsWidth();var N=gConf.iCommentLeftPadding;var w=gettext("change comment state to pending");var A=gettext("change comment state to approved");var J=gettext("change comment state to unapproved");var x=gettext("cancel changing the state of this comment");var L=gettext("pending");var K=gettext("approved");var B=gettext("unapproved");var M=gettext("cancel");var y=gettext("show replies");var v=gettext("change to:");var F=ngettext("reply","replies",1);var H=gettext("edit comment");var E=gettext("delete comment");var z=gettext("edit");var I=gettext("delete");var D=gettext("close");var G=gettext("show scope");var u=gettext("Comment is detached: it was created on a previous version and text it applied to has been modified or removed.");this.overlay=new CY.Overlay({zIndex:3,shim:false,visible:false,width:C,xy:[N,0],headerContent:'<div class="icomment-header"><div class="c-iactions"><a class="c-moderate c-action" title="">vis</a> <a class="c-edit c-action" title="'+H+'" alt="'+H+'">'+z+'</a> <a class="c-delete c-action" title="'+E+'" alt="'+E+'">'+I+'</a> </div><div class="c-state-actions displaynone">'+v+'&nbsp;<a class="c-state-pending c-action" title="'+w+'" alt="'+w+'">'+L+'</a> <a class="c-state-approved c-action" title="'+A+'" alt="'+A+'">'+K+'</a> <a class="c-state-unapproved c-action" title="'+J+'" alt="'+J+'">'+B+'</a> <a class="c-state-cancel c-action" title="'+x+'" alt="'+x+'">'+M+'</a> </div><div class="c-no-scope-msg">'+u+'</div><a class="c-show-scope c-action" title="'+G+'" alt="'+G+'"><em>-</em></a><a class="c-close c-action" title="'+D+'" alt="'+D+'"><em>X</em></a></div>',bodyContent:'<div class="icomment-body"><span class="c-content"></span><span class="c-ireplyactions"><a class="c-readreplies c-action" title="'+y+'" alt="'+y+'">'+y+'</a> <a class="c-reply c-action" title="'+F+'" alt="'+F+'">'+F+"</a>&nbsp;</span></div>"});this.overlay.get("contentBox").addClass("c-comment");this.overlay.render("#leftcolumn");this.animation=new CY.Anim({node:this.overlay.get("boundingBox"),duration:gPrefs.get("general","animduration"),easing:CY.Easing.easeOut});this.overlay.get("contentBox").query(".c-close").on("click",this.onCloseCommentClick,this);this.overlay.get("contentBox").query(".c-moderate").on("click",this.onModerateCommentClick,this);this.overlay.get("contentBox").query(".c-state-pending").on("click",this.onPendingCommentClick,this);this.overlay.get("contentBox").query(".c-state-approved").on("click",this.onApprovedCommentClick,this);this.overlay.get("contentBox").query(".c-state-unapproved").on("click",this.onUnapprovedCommentClick,this);this.overlay.get("contentBox").query(".c-state-cancel").on("click",this.onCancelStateChangeClick,this);this.overlay.get("contentBox").query(".c-edit").on("click",this.onEditCommentClick,this);this.overlay.get("contentBox").query(".c-delete").on("click",this.onDeleteCommentClick,this);this.overlay.get("contentBox").query(".c-reply").on("click",this.onReplyCommentClick,this);this.overlay.get("contentBox").query(".c-readreplies").on("click",this.onReadRepliesCommentClick,this);this.overlay.get("contentBox").query(".icomment-header").on("mouseenter",this.onMouseEnterHeader,this);this.overlay.get("contentBox").query(".icomment-header").on("mouseleave",this.onMouseLeaveHeader,this);this.overlay.get("contentBox").on("click",this.onCommentClick,this);};IComment.prototype={onCloseCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.closeComment(this);}},onModerateCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-iactions").addClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").removeClass("displaynone");}},onPendingCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"pending");}},onApprovedCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"approved");}},onUnapprovedCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"unapproved");}},onCancelStateChangeClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-iactions").removeClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").addClass("displaynone");}},onDeleteCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.removeComment(this);}},onEditCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.showEditForm(this);}},onReplyCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.showReplyForm(this);}},onReadRepliesCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.openComment(this);}},onCommentClick:function(k){if(readyForAction()&&this.isVisible()){if(k.target.get("target")=="_blank"){var e=k.target;var i=sv_site_url+sv_text_view_show_comment_url;if(e.get("href").indexOf(i)==0){var h=(new RegExp("comment_id_key=([^&]*)","g")).exec(e.get("href"));if(h!=null){var l=h[1];var j=gDb.getCommentByIdKey(l);if(j!=null){k.halt();if(!e.hasClass("c-permalink")){checkForOpenedDialog(null,function(){gSync.showSingleComment(j);});}}}}}else{if(gShowingAllComments){if(!this._isHostingAForm()){var j=gDb.getComment(this.commentId);checkForOpenedDialog(null,function(){if(j!=null){gSync.showSingleComment(j);}});}}else{gSync.activate(this);}}}},onMouseEnterHeader:function(){if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-permalink").removeClass("displaynone");}},onMouseLeaveHeader:function(){if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-permalink").addClass("displaynone");}},setWidth:function(b){this.overlay.get("boundingBox").setStyle("width",b+"px");},activate:function(){this.overlay.get("boundingBox").addClass("c-focus-comment");},deactivate:function(){this.overlay.get("boundingBox").removeClass("c-focus-comment");},hide:function(){if(gIComments.isTopActive(this.commentId)){if(!gIComments.activateVisibleNext()){gIComments.deactivate();}}if(this.isVisible()){this.overlay.hide();this.overlay.blur();}},hideContent:function(){this.overlay.get("contentBox").query(".icomment-header").addClass("displaynone");this.overlay.get("contentBox").query(".icomment-body").addClass("displaynone");},showContent:function(){this.overlay.get("contentBox").query(".icomment-header").removeClass("displaynone");this.overlay.get("contentBox").query(".icomment-body").removeClass("displaynone");},isVisible:function(){return this.overlay.get("visible");},show:function(){this.hideReadRepliesLnk();return this.overlay.show();},showReadRepliesLnk:function(){this.overlay.get("contentBox").query(".c-readreplies").removeClass("displaynone");},hideReadRepliesLnk:function(){this.overlay.get("contentBox").query(".c-readreplies").addClass("displaynone");},changeModeration:function(c){var d=this.overlay.get("contentBox").query(".c-moderate");d.set("innerHTML",gettext(c.state));d.removeClass("c-state-approved");d.removeClass("c-state-pending");d.removeClass("c-state-unapproved");d.addClass("c-state-"+c.state);this.overlay.get("contentBox").query(".c-iactions").removeClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").addClass("displaynone");},isfetched:function(){return(this.commentId!=null);},unfetch:function(){this.commentId=null;},fetch:function(w){this.commentId=w.id;var C=this.overlay.get("boundingBox");if(w.start_wrapper!=-1){C.addClass("c-has-scope");C.removeClass("c-has-no-scope");}else{C.addClass("c-has-no-scope");C.removeClass("c-has-scope");}if(w.reply_to_id!=null){C.addClass("c-is-reply");}else{C.removeClass("c-is-reply");}var y=interpolate(gettext("last modified on %(date)s"),{date:w.modified_user_str},true);var t=(w.modified==w.created)?"":'<a title="'+y+'"> * </a>';var v=gettext("Permalink to this comment");var q='<a class="c-permalink displaynone c-action" target="_blank" title="'+v+'" href="" >¶&nbsp;</a>';var u=interpolate(gettext("by %(name)s, created on %(date)s"),{name:w.name,date:w.created_user_str},true);var B='<span class="c-header"><div class="c-header-title">'+w.title+q+'</div><div class="c-infos">'+u+"</div></span>";var A=CY.Node.create(B);var p=C.query(".c-header");if(p==null){C.query(".icomment-header").insertBefore(A,C.one(".c-iactions"));}else{p.get("parentNode").replaceChild(A,p);}var x=CY.Node.create('<div class="c-tags"><span class="c-tags-infos">tags:</span>'+w.tags+"</div>");var r=C.query(".c-tags");if(r==null){C.query(".icomment-header").appendChild(x);}else{r.get("parentNode").replaceChild(x,r);}if(w.tags==""){x.addClass("displaynone");}var z=CY.Node.create('<span class="c-content">'+w.content_html+"</span>");var D=C.query(".c-content");if(D==null){C.query(".icomment-body").appendChild(z);}else{D.get("parentNode").replaceChild(z,D);}if(sv_prefix==""){C.query(".c-permalink").set("href",sv_site_url+w.permalink);}else{comment_id_delta_prefix=sv_delta!=""?Array(parseInt(sv_delta)+1).join(","):"";C.query(".c-permalink").set("href",top.location.protocol+"//"+top.location.hostname+top.location.pathname+"?comment_id_key="+comment_id_delta_prefix+w.id_key);}this.changeModeration(w);var s=C.queryAll(".c-content a");if(s!=null){s.setAttribute("target","_blank");}s=C.queryAll(".c-header-title a");if(s!=null){s.setAttribute("target","_blank");}this.permAdapt(w);},permAdapt:function(h){var f=this.overlay.get("contentBox").query(".c-delete");if(f){if(!h.can_delete){f.addClass("displaynone");}else{f.removeClass("displaynone");}}var g=this.overlay.get("contentBox").query(".c-edit");if(g){if(!h.can_edit){g.addClass("displaynone");}else{g.removeClass("displaynone");}}var i=this.overlay.get("contentBox").query(".c-reply");if(i){if(!hasPerm("can_create_comment")){i.addClass("displaynone");}else{i.removeClass("displaynone");}}var j=this.overlay.get("contentBox").query(".c-moderate");if(j){if(!h.can_moderate){j.addClass("displaynone");}else{j.removeClass("displaynone");}}},setThreadPad:function(b){this.overlay.get("contentBox").query(".yui-widget-hd").setStyle("paddingLeft",b+"px");this.overlay.get("contentBox").query(".yui-widget-bd").setStyle("paddingLeft",b+"px");},setPosition:function(c){var d=this.overlay.get("boundingBox");d.setStyle("opacity",1);d.setXY(c);},getPosition:function(c){var d=this.overlay.get("boundingBox");return d.getXY();},onAnimationEnd:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEnd();}},onAnimationEndFocus:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEndFocus();}},onAnimationEndReply:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEndReply();}},setAnimationToPosition:function(g,f,h){var e=this.overlay.get("boundingBox");if(gPrefs.get("general","animduration")<0.011){e.setXY(g);}this.animation.set("to",{xy:g});this.animation.set("duration",gPrefs.get("general","animduration"));if(f){if(h){this["animation-handle"]=this.animation.on("end",this.onAnimationEndReply,this);}else{this["animation-handle"]=this.animation.on("end",this.onAnimationEndFocus,this);}}else{this["animation-handle"]=this.animation.on("end",this.onAnimationEnd,this);}return this.animation;},getHeight:function(){return this.overlay.get("boundingBox").get("offsetHeight");},scrollIntoView:function(){if(!this.overlay.get("contentBox").inViewportRegion()){this.overlay.get("contentBox").scrollIntoView(true);}},_isHostingAForm:function(){return(this.isVisible()&&((gNewReplyHost!=null&&gNewReplyHost==this)||(gEditICommentHost!=null&&gEditICommentHost==this)));}};hasPerm=function(b){return(-1!=CY.Array.indexOf(sv_user_permissions,b));};paintCommentScope=function(b){if(b.reply_to_id==null&&b.start_wrapper!=-1){var a={start:{elt:document.getElementById("sv_"+b.start_wrapper),offset:b.start_offset},end:{elt:document.getElementById("sv_"+b.end_wrapper),offset:b.end_offset}};if(document.getElementById("sv_"+b.start_wrapper)==null){warn_server({from:"paintCommentScope",start_wrapper:b.start_wrapper});}else{if(document.getElementById("sv_"+b.end_wrapper)==null){warn_server({from:"paintCommentScope",end_wrapper:b.end_wrapper});}else{a.start=_convertSelectionFromCSToCC(a.start);a.end=_convertSelectionFromCSToCC(a.end);renderComment(a,b.id);}}}};getCommentIdsFromClasses=function(b){var a=[];var e=b.className.split(" ");for(var d=0,c=e.length;d<c;d++){if(e[d].indexOf("c-id-")==0){a.push(parseInt(e[d].substring("c-id-".length)));}}return a;};renderComment=function(d,c){var a=d.start["offset"];var b=d.end["offset"];var f=d.start["elt"];var e=d.end["elt"];if((f!=null)&&(e!=null)&&_getTextNodeContent(f)!=""&&_getTextNodeContent(e)!=""){markWholeNodesAsComments(f,e,c);markEndsAsComments(f,a,e,b,c);}};markWholeNodesAsComments=function(d,c,b){var a=_findCommonAncestor(d,c);_dynSpanToAnc(d,a,b,false);_dynSpanToAnc(c,a,b,true);_dynSpanInBetween(a,d,c,b);};_setTextNodeContent=function(a,b){CY.DOM.setText(a,b);};_getTextNodeContent=function(a){return CY.DOM.getText(a);};markEndsAsComments=function(d,i,l,j,h){var n=_getTextNodeContent(d).substring(0,i);var o=_getTextNodeContent(d).substring(i);var p=_getTextNodeContent(l).substring(0,j);var g=_getTextNodeContent(l).substring(j);var b=(d===l);if(o!=""){if(CY.DOM.hasClass(d,"c-c")){var f=null,k=null,c=null,a=null;var m=(b)?_getTextNodeContent(d).substring(i,j):o;if(b&&(g!="")){c=d;f=c;}if(m!=""){if(f==null){k=d;}else{k=_yuiCloneNode(d);f.parentNode.insertBefore(k,f);}f=k;}if(n!=""){if(f==null){a=d;}else{a=_yuiCloneNode(d);f.parentNode.insertBefore(a,f);}f=a;}if(c!=null){_setTextNodeContent(c,g);}if(k!=null){_setTextNodeContent(k,m);_addIdClass(k,h);}if(a!=null){_setTextNodeContent(a,n);}}}if((!b)&&(p!="")){if(CY.DOM.hasClass(l,"c-c")){var f=null,e=null,c=null;if(g!=""){c=l;f=l;}if(p!=""){if(f==null){e=l;}else{e=_yuiCloneNode(l);f.parentNode.insertBefore(e,f);}f=e;}if(c!=null){_setTextNodeContent(c,g);}if(e!=null){_addIdClass(e,h);_setTextNodeContent(e,p);}}}};_yuiCloneNode=function(b){var a=CY.Node.getDOMNode(CY.get("#"+b.id).cloneNode(true));a.id=CY.guid();return a;};_dynSpanToAnc=function(a,e,d,f){var g=a;while((g!=null)&&(g!==e)&&(g.parentNode!==e)){var b=null;if(f){b=g.previousSibling;}else{b=g.nextSibling;}if(b==null){g=g.parentNode;}else{g=b;_recAddComment(g,d);}}};_dynSpanInBetween=function(g,h,f,d){var b=h;var e=null;while(b){if(b.parentNode===g){e=b;break;}b=b.parentNode;}if(e!=null){b=f;var c=null;while(b){if(b.parentNode===g){c=b;break;}b=b.parentNode;}if(c!=null){b=e.nextSibling;while((b!=null)&&(b!==c)){_recAddComment(b,d);b=b.nextSibling;}}}};_bruteContains=function(a,b){while(b){if(a===b){return true;}b=b.parentNode;}return false;},_addIdClass=function(a,b){CY.DOM.addClass(a,"c-id-"+b);_updateCommentCounter(a);};_removeIdClass=function(a,b){CY.DOM.removeClass(a,"c-id-"+b);_updateCommentCounter(a);};_removeIdClasses=function(a){var b=_cgetRegExp("(?:^|\\s+)c-id-(?:\\d+)","g");a.className=a.className.replace(b," ");_updateCommentCounter(a);};_recAddComment=function(a,b){if(CY.DOM.hasClass(a,"c-c")){_addIdClass(a,b);}else{var d=a.firstChild;while(d!=null){_recAddComment(d,b);d=d.nextSibling;}}};_findCommonAncestor=function(c,a){if(_bruteContains(c,a)){return c;}else{var b=a;while((b!=null)&&!_bruteContains(b,c)){b=b.parentNode;}return b;}};_cregexCache={};_cgetRegExp=function(b,a){a=a||"";if(!_cregexCache[b+a]){_cregexCache[b+a]=new RegExp(b,a);}return _cregexCache[b+a];};_updateCommentCounter=function(b){var c=_cgetRegExp("(?:^|\\s+)c-id-(?:\\d+)","g");var d=b.className.match(c);var a=(d==null)?0:d.length;c=_cgetRegExp("(?:^|\\s+)c-count-(?:\\d+)","g");b.className=b.className.replace(c," ");CY.DOM.addClass(b,"c-count-"+a+" ");if(a>0){b.setAttribute("title",a+ngettext(" comment"," comments",a));if(a>25){CY.DOM.addClass(b,"c-count-25");}}};_convertSelectionFromCCToCS=function(b){var d=b.offset;var a=b.elt.parentNode;var c=b.elt.previousSibling;while(c!=null){d+=_getTextNodeContent(c).length;c=c.previousSibling;}return{elt:a,offset:d};};_convertSelectionFromCSToCC=function(d){var a={elt:null,offset:-1};var f=null;var e=d.elt.firstChild;var c=0;while(e!=null){var b=c;c+=_getTextNodeContent(e).length;if(c>=d.offset){a.elt=e;a.offset=d.offset-b;break;}e=e.nextSibling;}return a;};unpaintCommentScope=function(k){var j=k.id;var r="c-id-"+j;var m=[];var t=CY.all("."+r);if(t!=null){for(var h=0,d=t.size();h<d;h++){var q=t.item(h);if(q.hasClass("c-c")){var l=CY.Node.getDOMNode(q);_removeIdClass(l,j);var f=getCommentIdsFromClasses(l);quicksort(f);var a=q.get("previousSibling");if(a!=null){var b=CY.Node.getDOMNode(a);var s=getCommentIdsFromClasses(b);quicksort(s);if(areSortedArraysEqual(f,s)){_setTextNodeContent(l,_getTextNodeContent(b)+_getTextNodeContent(l));m.push(b);}}var e=q.get("nextSibling");if(e!=null){var o=CY.Node.getDOMNode(e);var g=getCommentIdsFromClasses(o);quicksort(g);if(areSortedArraysEqual(f,g)){l.firstChild.data=l.firstChild.data+o.firstChild.data;m.push(o);}}}else{alert("HAS NO c-c ? : "+commentNode.get("id")+" , innerHTML :"+commentNode.get("innerHTML"));return;}}}for(var h=0,d=m.length;h<d;h++){m[h].parentNode.removeChild(m[h]);}};unpaintAllComments=function(){var k=CY.all(".c-s");var f=[];for(var e=0,a=k.size();e<a;e++){var h=k.item(e);var d=h.get("firstChild");var j=CY.Node.getDOMNode(h.get("firstChild"));_removeIdClasses(j);var b=d.get("nextSibling");while(b!=null){var g=CY.Node.getDOMNode(b);j.firstChild.data=j.firstChild.data+g.firstChild.data;f.push(g);b=b.get("nextSibling");}}for(var e=0,a=f.length;e<a;e++){f[e].parentNode.removeChild(f[e]);}};showScope=function(b){var a=CY.all(".c-id-"+b);if(a!=null){a.addClass("c-scope");}};hideScopeAnyway=function(){var a=CY.all(".c-scope");if(a!=null){a.removeClass("c-scope");}};getWrapperAncestor=function(a){var b=a;while(b!=null){if(CY.DOM.hasClass(b,"c-s")){return b;}b=b.parentNode;}return null;};hasWrapperAncestor=function(a){return(getWrapperAncestor(a)!=null);};getSelectionInfo=function(){var J=null,m=null,D=0,c=0,h="";if(window.getSelection){var r=window.getSelection();if(r.rangeCount>0){var l=r.getRangeAt(0);h=l.toString();if(h!=""){var E=document.createRange();E.setStart(r.anchorNode,r.anchorOffset);E.collapse(true);var B=document.createRange();B.setEnd(r.focusNode,r.focusOffset);B.collapse(false);var I=(B.compareBoundaryPoints(2,E)==1);J=(I)?r.anchorNode.parentNode:r.focusNode.parentNode;if(J.nodeName=="mi"||J.nodeName=="mo"){J=J.parentElement.parentElement.parentElement.parentElement;}innerStartNode=(I)?r.anchorNode:r.focusNode;m=(I)?r.focusNode.parentNode:r.anchorNode.parentNode;if(m.nodeName=="mi"||m.nodeName=="mo"){m=m.parentElement.parentElement.parentElement.parentElement;}innerEndNode=(I)?r.focusNode:r.anchorNode;D=(I)?r.anchorOffset:r.focusOffset;c=(I)?r.focusOffset:r.anchorOffset;if(!hasWrapperAncestor(m)&&hasWrapperAncestor(J)){var z=document.createRange();z.setStart(innerStartNode,D);var b=getWrapperAncestor(J);var q=b;z.setEndAfter(q);var f=parseInt(b.id.substring("sv_".length));while(z.toString().length<l.toString().length){f++;var t=CY.get("#sv_"+f);if(t){q=CY.Node.getDOMNode(t);z.setEndAfter(q);}else{break;}}m=q.lastChild;c=CY.DOM.getText(m).length;}else{if(!hasWrapperAncestor(J)&&hasWrapperAncestor(m)){var z=document.createRange();z.setEnd(innerEndNode,c);var g=getWrapperAncestor(m);var p=g;z.setStartBefore(p);var f=parseInt(g.id.substring("sv_".length));while(z.toString().length<l.toString().length){f--;var t=CY.get("#sv_"+f);if(t){p=CY.Node.getDOMNode(t);z.setStartBefore(p);}else{break;}}J=p.firstChild;D=0;}else{if(!hasWrapperAncestor(J)&&!hasWrapperAncestor(m)){var o=h.length;var n=[];for(var f=0;;f++){var G=CY.get("#sv_"+f);if(G==null){break;}else{var x=G.get("text");if(h.indexOf(x)==0){n.push(f);}}}var y=[];for(var f=0;;f++){var G=CY.get("#sv_"+f);if(G==null){break;}else{var x=G.get("text");if(h.indexOf(x)==(o-x.length)){y.push(f);}}}var w=false;for(var C=0;C<n.length;C++){for(var A=0;A<y.length;A++){var v=document.createRange();var k=CY.Node.getDOMNode(CY.get("#sv_"+n[C]));var F=CY.Node.getDOMNode(CY.get("#sv_"+y[A]));v.setStartBefore(k);v.setEndAfter(CY.Node.getDOMNode(F));if((-1<v.compareBoundaryPoints(0,l))&&(1>v.compareBoundaryPoints(2,l))){J=k.firstChild;D=0;m=F.lastChild;c=CY.DOM.getText(F).length;w=true;break;}}if(w){break;}}}}}E.detach();B.detach();}else{return null;}}else{return null;}}else{if(document.selection){var d=document.selection.createRange();if(d.text.length==0){return null;}var a=d.parentElement();var H=d.duplicate();var u=d.duplicate();H.collapse(true);u.collapse(false);J=H.parentElement();while(H.moveStart("character",-1)!=0){if(H.parentElement()!=J){break;}D++;}m=u.parentElement();while(u.moveEnd("character",-1)!=0){if(u.parentElement()!=m){break;}c++;}h=d.text;}}if(!hasWrapperAncestor(J)||!hasWrapperAncestor(m)){return null;}return{text:h,start:{elt:J,offset:D},end:{elt:m,offset:c}};};Preferences=function(){this.prefs={};};Preferences.prototype={init:function(){this._read();},_read:function(){for(var b in gConf.defaultPrefs){this.prefs[b]={};for(var a in gConf.defaultPrefs[b]){var c=null;if(b=="user"&&(a=="name"||a=="email")){c=CY.Cookie.get("user_"+a);}else{c=CY.Cookie.getSub(b,a);}this.prefs[b][a]=(c==null)?gConf.defaultPrefs[b][a]:c;}}},persist:function(b,a,d){var c={path:"/",expires:(new Date()).setFullYear(2100,0,1)};if(b=="user"&&(a=="name"||a=="email")){CY.Cookie.set("user_"+a,d,c);}else{CY.Cookie.setSub(b,a,d,c);}this.prefs[b][a]=d;},get:function(b,a){return this.prefs[b][a];},readDefault:function(b,a){return gConf.defaultPrefs[b][a];},reset:function(a){for(var b=0;b<a.length;b++){var d=a[b];for(var c in gConf.defaultPrefs[d]){this.persist(d,c,gConf.defaultPrefs[d][c]);}}}};gNoSelectionYet=gettext("No selection yet");gFormHtml={formStart:'<form id="###" onsubmit="return false;">',nameInput:gettext("Username:")+'<center><input id="###" name="name" class="n_name user_input" style="padding:1px;" type="text"></input></center>',emailInput:gettext("E-mail address:")+'<center><input id="###" name="email" class="n_email user_input" style="padding:1px;" type="text"></input></center>',titleInput:gettext("Title:")+'<center><input id="###" name="title" class="n_title comment_input" style="padding:1px;" type="text"></input></center>',contentInput:gettext("Content:")+'<center><textarea id="###" name="content" class="n_content comment_input" rows="10" style="padding:1px;"></textarea></center>',tagsInput:gettext("Tag:")+'<center><input id="###" name="tags" class="n_tags comment_input" style="padding:1px;" type="text"></input></center>',hidden:'<input id="###" class="comment_input" name="???" type="hidden" value=""></input>',formEnd:"</form>",changeScope:'<div id="###">'+gettext("Modify comment's scope:")+'<input type="checkbox" name="change_scope"></input></div>',headerTitle:'<center><div id="###" class="c-header-title"></div></center>',currentSel:'<div id="###">'+gettext("Comment will apply to this selection:")+'<br/><div class="current_sel"><div id="???" class="current_sel_ins">'+gNoSelectionYet+"</div></div>#hiddeninput#</div>",btns:'<center><input id="###" type="button" value="'+gettext("Save")+'" /><input id="???" type="button" value="'+gettext("Cancel")+'" /></center>',closeIcon:'<a id="###" class="c-close" title="'+gettext("close")+'"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</em></a>'};getHtml=function(f){ret={};ret.headerContent="";if("closeBtnId" in f){ret.headerContent+=gFormHtml.closeIcon.replace("###",f.closeBtnId);}ret.headerContent+=gFormHtml.headerTitle.replace("###",f.formTitleId);var b="";if("changeScopeInputId" in f){b=gFormHtml.changeScope.replace("###",f.changeScopeInputId);}var e="<center>"+gFormHtml.hidden.replace("###",f.selectionPlaceId).replace("???","selection_place")+"</center>";var a=gFormHtml.currentSel.replace("###",f.currentSelId).replace("???",f.currentSelIdI).replace("#hiddeninput#",e);var d=gFormHtml.btns.replace("###",f.addBtnId).replace("???",f.cancelBtnId);var c=gFormHtml.formStart.replace("###",f.formId)+b+a;if("nameInputId" in f){c=c+gFormHtml.nameInput.replace("###",f.nameInputId);}if("emailInputId" in f){c=c+gFormHtml.emailInput.replace("###",f.emailInputId);}c=c+gFormHtml.titleInput.replace("###",f.titleInputId)+gFormHtml.contentInput.replace("###",f.contentInputId)+gFormHtml.tagsInput.replace("###",f.tagsInputId);c=c+gFormHtml.hidden.replace("###",f.formatInputId).replace("???","format");c=c+gFormHtml.hidden.replace("###",f.startWrapperInputId).replace("???","start_wrapper");c=c+gFormHtml.hidden.replace("###",f.endWrapperInputId).replace("???","end_wrapper");c=c+gFormHtml.hidden.replace("###",f.startOffsetInputId).replace("???","start_offset");c=c+gFormHtml.hidden.replace("###",f.endOffsetInputId).replace("???","end_offset");c=c+gFormHtml.hidden.replace("###",f.keyId).replace("???","comment_key");c=c+gFormHtml.hidden.replace("###",f.editCommentId).replace("???","edit_comment_id");c=c+d+gFormHtml.formEnd;ret.bodyContent=c;return ret;};changeFormFieldsWidth=function(d,c){var a=(c-20)+"px";var b=CY.all("#"+d+" input[type='text']");if(b!=null){b.setStyle("width",a);}b=CY.all("#"+d+" textarea");if(b!=null){b.setStyle("width",a);}};addFormErrMsg=function(j,g,d){var f=document.getElementById(j);var b,h,c,a;for(b=0,a=f.elements.length;b<a;++b){h=f.elements[b];if(h.name==g){c=document.createElement("DIV");CY.DOM.addClass(c,"c-error");c.id=h.id+"-err";c.appendChild(document.createTextNode(d));if(h.parentNode.nextSibling){h.parentNode.parentNode.insertBefore(c,h.parentNode.nextSibling);}else{h.parentNode.parentNode.appendChild(c);}}}};removeFormErrMsg=function(b){var a=CY.all("#"+b+" .c-error");if(a!=null){a.each(function(c){c.get("parentNode").removeChild(c);});}};Layout=function(){};Layout.prototype={init:function(){},isInFrame:function(){return(!CY.Lang.isUndefined(parent)&&parent.location!=location&&CY.Lang.isFunction(parent.f_getFrameFilterData));},isInComentSite:function(){var b=false;try{if(!CY.Lang.isUndefined(sv_site_url)&&!CY.Lang.isUndefined(parent)&&!CY.Lang.isUndefined(parent.parent)){var a=new String(parent.parent.location);b=(a.indexOf(sv_site_url)==0);}}catch(c){b=false;}return b;},sliderValToPx:function(d){var a=CY.DOM.winWidth();if(this.isInFrame()){a=parent.$(parent).width();}var b=d/100;b=Math.min(b,gConf.sliderFixedMin);b=Math.max(b,gConf.sliderFixedMax);var c=b*a;return Math.floor(c);},getTopICommentsWidth:function(){return this.getTopICommentsWidthFromWidth(this.sliderValToPx(gPrefs.get("layout","comments_col_width")));},getTopICommentsWidthFromWidth:function(b){var a=b-(2*gConf.iCommentThreadPadding);return a-7;},setLeftColumnWidth:function(a){CY.get("#contentcolumn").setStyle("marginLeft",a+"px");CY.get("#leftcolumn").setStyle("width",a+"px");},parentInterfaceUnfreeze:function(){if(this.isInFrame()){parent.f_interfaceUnfreeze();}}};_changeIds=function(a,b){if(a.id){a.id=a.id+b;}var d=a.firstChild;while(d!=null){_changeIds(d,b);d=d.nextSibling;}};suffix=0;domDuplicate=function(a){var b=a.cloneNode(true);suffix++;_changeIds(b,"-"+suffix);return b;};getDuplicated=function(a){return document.getElementById(a.id+"-"+suffix);};logSel=function(a){log("text :"+a.text+", start id : "+a.start["elt"].id+" , start offset : "+a.start["offset"]+" , end id : "+a.end["elt"].id+"end offset : "+a.end["offset"]);};log=function(b){var a=document.getElementById("log");a.innerHTML=a.innerHTML+"<li>"+b+"</li>";};urlEncode=function(h){if(!h){return"";}var c=[];for(var f in h){var e=h[f],b=encodeURIComponent(f);var g=typeof e;if(g=="undefined"){c.push(b,"=&");}else{if(g!="function"&&g!="object"){c.push(b,"=",encodeURIComponent(e),"&");}else{if(CY.Lang.isArray(e)){if(e.length){for(var d=0,a=e.length;d<a;d++){c.push(b,"=",encodeURIComponent(e[d]===undefined?"":e[d]),"&");}}else{c.push(b,"=&");}}}}}c.pop();return c.join("");};urlDecode=function(f,h){if(!f||!f.length){return{};}var d={};var b=f.split("&");var c,a,j;for(var e=0,g=b.length;e<g;e++){c=b[e].split("=");a=decodeURIComponent(c[0]);j=decodeURIComponent(c[1]);if(h!==true){if(typeof d[a]=="undefined"){d[a]=j;}else{if(typeof d[a]=="string"){d[a]=[d[a]];d[a].push(j);}else{d[a].push(j);}}}else{d[a]=j;}}return d;};areSortedArraysEqual=function(b,a){if(b.length!=a.length){return false;}for(var d=0,c=b.length;d<c;d++){if(b[d]!=a[d]){return false;}}return true;};quicksort=function(a){_quicksort(a,0,a.length-1);};_quicksort=function(e,g,d){var a,c,f,b;if(d-g==1){if(e[g]>e[d]){b=e[g];e[g]=e[d];e[d]=b;}return;}a=e[parseInt((g+d)/2)];e[parseInt((g+d)/2)]=e[g];e[g]=a;c=g+1;f=d;do{while(c<=f&&e[c]<=a){c++;}while(e[f]>a){f--;}if(c<f){b=e[c];e[c]=e[f];e[f]=b;}}while(c<f);e[g]=e[f];e[f]=a;if(g<f-1){_quicksort(e,g,f-1);}if(f+1<d){_quicksort(e,f+1,d);}};gShowingAllComments=false;if(!Array.prototype.indexOf){Array.prototype.indexOf=function(c,d){for(var b=(d||0),a=this.length;b<a;b++){if(this[b]===c){return b;}}return -1;};}Sync=function(){this._q=null;this._iPreventClick=false;};Sync.prototype={init:function(a){this._q=new CY.AsyncQueue();},setPreventClickOn:function(){CY.log("setPreventClickOn !");if(gLayout.isInFrame()){parent.f_interfaceFreeze();}this._iPreventClick=true;},setPreventClickOff:function(){CY.log("setPreventClickOff !");if(gLayout.isInFrame()){parent.f_interfaceUnfreeze();}this._iPreventClick=false;},removeCommentRet:function(b){var d=b.successfull;var a=(d)?b.failure["iComment"]:b.success["iComment"];if(d){var c=b.returned["filterData"];if(gLayout.isInFrame()){parent.f_updateFilterData(c);}var f=gIComments.getTopPosition()[1];var e=gDb.getComment(a.commentId);this._q.add(function(){unpaintCommentScope(e);gIComments.close(e.id);gIComments.remove(e.id);if(e.reply_to_id!=null){gIComments.refresh(e.reply_to_id);}gDb.del(e);if(gLayout.isInFrame()){if(gDb.comments.length==0&&gDb.allComments.length!=0){parent.f_enqueueMsg(gettext("no filtered comments left"));parent.resetFilter();}else{var g=gDb.computeFilterResults();updateFilterResultsCount(g.nbDiscussions,g.nbComments,g.nbReplies);}}});this._animateTo(f);}this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this.resume();},moderateCommentRet:function(c){var e=c.successfull;var a=(e)?c.failure["iComment"]:c.success["iComment"];if(e){var b=c.returned;var f=b.comment;gDb.upd(f);var d=gLayout.isInFrame()&&!parent.f_isFrameFilterFieldsInit();if(d){parent.resetFilter();this._showSingleComment(f);}else{a.changeModeration(f);}}this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this.resume();},saveCommentRet:function(h){var i=h.successfull;if(i){var l=h.success["formId"];var g=h.returned;removeFormErrMsg(l);if("errors" in g){var k=g.errors;for(var d in k){addFormErrMsg(l,d,k[d]);}this._animateToTop();}else{var b=function(){return(gNewReply!=null)&&(l==gNewReply.ids["formId"]);};var c=function(){return(gICommentForm!=null)&&(l==gICommentForm.formId);};var e=function(){return(gEdit!=null)&&(l==gEdit.ids["formId"]);};if(c()){this.hideICommentForm(cleanICommentForm());}else{if(e()){this._hideEditForm();}else{if(b()){this._hideNewReplyForm();}}}if("ask_for_notification" in g){if(g.ask_for_notification){parent.f_yesNoDialog(gettext("Do you want to be notified of all replies in all discussions you participated in?"),gettext("Reply notification"),function(){var m={method:"POST",data:urlEncode({fun:"ownNotify",key:sv_key,version_key:sv_version_key,email:g.email,active:false})};CY.io(sv_client_url,m);},this,null,function(){var m={method:"POST",data:urlEncode({fun:"ownNotify",key:sv_key,version_key:sv_version_key,email:g.email,active:true})};CY.io(sv_client_url,m);},this,null);}}if("comment" in g){var f=g.comment;gDb.upd(f);var a=gLayout.isInFrame()&&parent.f_isFrameFilterFieldsInit();if(a){parent.resetFilter();}else{if(f.reply_to_id==null){unpaintCommentScope(f);paintCommentScope(f);}}var j=g.filterData;if(gLayout.isInFrame()){parent.f_updateFilterData(j);updateResetFilterResultsCount();}if(b()){if(!a){this._insertReply(f);}}else{this._showSingleComment(f);}}else{this._animateToTop();}}}else{this._q.add({id:"expl",fn:function(){CY.log("in example .........");}});this._q.promote("expl");}this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this.resume();},example:function(){CY.log("in example .........");},moderateComment:function(a,b){var c=gDb.getComment(a.commentId);this._q.add({fn:CY.bind(this.setPreventClickOn,this)},{autoContinue:false,fn:CY.bind(doExchange,null,"editComment",{comment_key:c.key,state:b},null,this.moderateCommentRet,this,{iComment:a},gettext("could not save comment"))}).run();},_saveComment:function(b,a){this._q.add({fn:CY.bind(this.setPreventClickOn,this)},{autoContinue:false,fn:CY.bind(doExchange,null,b,{},a,this.saveCommentRet,this,{formId:a},gettext("could not save comment"))}).run();},editComment:function(){this._saveComment("editComment",gEdit.ids["formId"]);},saveComment:function(a){if(readyForAction()){this._saveComment("addComment",a);}},removeComment:function(a){checkForOpenedDialog(a,function(){if(gLayout.isInFrame()){parent.f_yesNoDialog(gettext("Are you sure you want to delete this comment?"),gettext("Warning"),function(){this.animateToTop();},this,null,function(){var b=gDb.getComment(a.commentId);this._q.add({fn:CY.bind(this.setPreventClickOn,this)},{autoContinue:false,fn:CY.bind(doExchange,null,"removeComment",{comment_key:b.key},null,this.removeCommentRet,this,{iComment:a},gettext("could not remove comment"))}).run();},this,null);}},this,null);},resume:function(b,a){this._q.run();},resetAutoContinue:function(a){this._q.getCallback(a).autoContinue=true;},hideICommentForm:function(a){this._q.add({autoContinue:false,fn:CY.bind(gICommentForm.animationHide.run,gICommentForm.animationHide)});if(a){this._q.add(a);}},showCommentForm:function(a){checkForOpenedDialog(null,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){if(a==null){var b=getSelectionInfo();updateICommentFormSelection(b);}showICommentForm(a);}});this._q.add({autoContinue:false,fn:CY.bind(gICommentForm.animationShow.run,gICommentForm.animationShow)},{fn:CY.bind(this.setPreventClickOff,this)}).run();},this,null);},showEditForm:function(a){checkForOpenedDialog(null,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){showEditForm(a);}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},this,null);},showReplyForm:function(a){checkForOpenedDialog(null,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){instanciateNewReplyForm(a);}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},this,null);},cancelICommentForm:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this.hideICommentForm();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},cancelEdit:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){cancelEditForm();}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},cancelReply:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){cancelNewReplyForm();}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},changeScopeFormClick:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){changeScopeFormClick();}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},_hideNewReplyForm:function(){this._q.add({fn:function(){cleanNewReplyForm();cancelNewReplyForm();}});},_hideEditForm:function(){this._q.add({fn:function(){cancelEditForm();}});},_insertReply:function(a){this._q.add({fn:function(){var g=gDb.getComment(a.reply_to_id);var e=gDb.getThreads([g]);var c=e[e.length-2];var d=gIComments.insertAfter(c,a);var h=gIComments.getPosition(a.reply_to_id);d.setPosition(h);var b=gDb.getPath(a);var f=b[b.length-1];if(gIComments.isTopActive(f.id)){d.activate();}d.show();}});this._animateToTop();},_showSingleComment:function(d){if(d!=null){var c=gDb.getPath(d);var b=c[c.length-1];var a=0;if(d.start_wrapper!=-1){a=CY.get(".c-id-"+b.id).getY();}else{a=CY.get("document").get("scrollTop");}this._showComments([b.id],a,false);if(b.replies.length>0){this._animateTo(a);}}},_showFocusSingleComment:function(d,c,b){if(d!=null){var a=0;if(d.start_wrapper!=-1){a=CY.get(".c-id-"+d.id).getY();}else{a=CY.get("document").get("scrollTop");}this._showComments([d.id],a,false);if(d.replies.length>0||b){this._animateToAndFocus(a,c.id,b);}}},showSingleComment:function(a){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._showSingleComment(a);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},showFocusSingleComment:function(c,b,a){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._showFocusSingleComment(c,b,a);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},browse:function(a,b){var c=gIComments.browse(a,b);if(c!=null){this.showSingleComment(c);}},_showComments:function(c,b,a){this._q.add({fn:function(){gShowingAllComments=a;gIComments.hide();hideToc();var d=CY.Array.map(c,function(g){return gDb.getComment(g);});var f=gDb.getThreads(d);gIComments.fetch(f);if(c.length>0){if(a){CY.get("document").set("scrollTop",0);}else{gIComments.activate(c[0]);var e=CY.get(".c-id-"+c[0]);if(e&&!e.inViewportRegion()){e.scrollIntoView(true);if(parent){parent.document.getElementById("outer-north").scrollIntoView(true);}}}}gIComments.setPosition([gConf.iCommentLeftPadding,b]);gIComments.show();}});},_animateTo:function(a){this._q.add({fn:function(){gIComments.setAnimationToPositions(a);}},{id:"animationRun",autoContinue:false,fn:CY.bind(gIComments.runAnimations,gIComments)});},_animateToAndFocus:function(a,c,b){this._q.add({fn:function(){gIComments.setAnimationToPositionsAndFocus(a,c,b);}},{id:"animationRun",autoContinue:false,fn:CY.bind(gIComments.runAnimations,gIComments)});},_animateToTop:function(){var a=gIComments.getTopPosition();if(a!=null){this._animateTo(a[1]);}},animateToTop:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},showAllComments:function(){checkForOpenedDialog(null,function(){gShowingAllComments=true;var a=CY.Array.map(gDb.comments,function(b){return b.id;});if(parent.$("#browse_by").val()=="scope"){a.sort(function(d,c){if(gDb.ordered_comment_ids.scope.indexOf(d)<gDb.ordered_comment_ids.scope.indexOf(c)){return -1;}if(gDb.ordered_comment_ids.scope.indexOf(d)>gDb.ordered_comment_ids.scope.indexOf(c)){return 1;}return 0;});}this.showComments(a,[0,30],true);},this,null);},showScopeRemovedComments:function(){checkForOpenedDialog(null,function(){gShowingAllComments=true;var b=CY.Array.filter(gDb.comments,function(c){return(c.start_wrapper==-1);});var a=CY.Array.map(b,function(d){return d.id;});if(parent.$("#browse_by").val()=="scope"){a.sort(function(d,c){if(gDb.ordered_comment_ids.scope.indexOf(d)<gDb.ordered_comment_ids.scope.indexOf(c)){return -1;}if(gDb.ordered_comment_ids.scope.indexOf(d)>gDb.ordered_comment_ids.scope.indexOf(c)){return 1;}return 0;});}this.showComments(a,[0,30],true);},this,null);},showComments:function(c,b,a){checkForOpenedDialog(null,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._showComments(c,b[1],a);this._animateTo(b[1]);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},this,null);},openComment:function(a){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});var b=gIComments.getTopPosition()[1];this._q.add({fn:function(){gIComments.open(a.commentId);gIComments.refresh(a.commentId);}});this._animateTo(b);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},closeComment:function(a){checkForOpenedDialog(a,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});var b=gIComments.getTopPosition()[1];this._q.add({fn:function(){var c=gDb.getComment(a.commentId);gIComments.close(a.commentId);if(c.reply_to_id!=null){gIComments.refresh(c.reply_to_id);}}});this._animateTo(b);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},this,null);},activate:function(a){gIComments.activate(a.commentId);}};readyForAction=function(){return !gSync._iPreventClick;};gEditICommentHost=null;gEdit=null;dbgc=null;showEditForm=function(a){if(gEdit==null){gEdit={ids:{formId:CY.guid(),formTitleId:CY.guid(),nameInputId:CY.guid(),emailInputId:CY.guid(),titleInputId:CY.guid(),contentInputId:CY.guid(),tagsInputId:CY.guid(),formatInputId:CY.guid(),startWrapperInputId:CY.guid(),endWrapperInputId:CY.guid(),startOffsetInputId:CY.guid(),endOffsetInputId:CY.guid(),changeScopeInputId:CY.guid(),changeScopeInputWrapper:CY.guid(),selectionPlaceId:CY.guid(),keyId:CY.guid(),editCommentId:CY.guid(),currentSelId:CY.guid(),currentSelIdI:CY.guid(),addBtnId:CY.guid(),cancelBtnId:CY.guid()},handlers:{}};}gEditICommentHost=a;gEditICommentHost.hideContent();var c=getHtml(gEdit.ids);var b='<div class="icomment-edit-header">'+c.headerContent+"</div>";var e='<div class="icomment-edit-body">'+c.bodyContent+"</div>";gEditICommentHost.overlay.setStdModContent(CY.WidgetStdMod.HEADER,CY.Node.create(b),CY.WidgetStdMod.AFTER);gEditICommentHost.overlay.setStdModContent(CY.WidgetStdMod.BODY,CY.Node.create(e),CY.WidgetStdMod.AFTER);CY.get("#"+gEdit.ids["formTitleId"]).set("innerHTML",gettext("Edit comment"));var f=gDb.getComment(gEditICommentHost.commentId);CY.get("#"+gEdit.ids["editCommentId"]).set("value",f.id);CY.get("#"+gEdit.ids["keyId"]).set("value",f.key);CY.get("#"+gEdit.ids["changeScopeInputId"]+" input").set("checked",false);if(f.reply_to_id!=null){CY.get("#"+gEdit.ids["changeScopeInputId"]).addClass("displaynone");}changeScopeFormClick();CY.get("#"+gEdit.ids["nameInputId"]).set("value",f.name);CY.get("#"+gEdit.ids["emailInputId"]).set("value",f.email);if(f.logged_author){CY.get("#"+gEdit.ids["nameInputId"]).setAttribute("disabled",true);CY.get("#"+gEdit.ids["emailInputId"]).setAttribute("disabled",true);}CY.get("#"+gEdit.ids["titleInputId"]).set("value",f.title);CY.get("#"+gEdit.ids["contentInputId"]).set("value",f.content);CY.get("#"+gEdit.ids["tagsInputId"]).set("value",f.tags);CY.get("#"+gEdit.ids["formatInputId"]).set("value",gConf.defaultCommentFormat);var d=gLayout.getTopICommentsWidth();changeFormFieldsWidth(gEdit.ids["formId"],d);gEdit.handlers["addBtnId"]=CY.on("click",onEditSaveClick,"#"+gEdit.ids["addBtnId"]);gEdit.handlers["cancelBtnId"]=CY.on("click",onEditCancelClick,"#"+gEdit.ids["cancelBtnId"]);gEdit.handlers["changeScope"]=CY.on("click",onChangeScopeClick,"#"+gEdit.ids["changeScopeInputId"]);};onEditSaveClick=function(a){if(readyForAction()){gSync.editComment();}};onEditCancelClick=function(a){if(readyForAction()){gSync.cancelEdit();}};onChangeScopeClick=function(){if(readyForAction()){gSync.changeScopeFormClick();}else{var a=CY.get("#"+gEdit.ids["changeScopeInputId"]+" input");var b=a.get("checked");a.set("checked",!b);}};changeScopeFormClick=function(){var a=CY.get("#"+gEdit.ids["currentSelId"]);if(CY.get("#"+gEdit.ids["changeScopeInputId"]+" input").get("checked")){a.removeClass("displaynone");}else{a.addClass("displaynone");}};cancelEditForm=function(){if(gEditICommentHost!=null){for(var b in gEdit.handlers){if(gEdit.handlers[b]!=null){gEdit.handlers[b].detach();gEdit.handlers[b]=null;}}var a=gEditICommentHost.overlay.get("contentBox").query(".icomment-edit-body");a.get("parentNode").removeChild(a);a=gEditICommentHost.overlay.get("contentBox").query(".icomment-edit-header");a.get("parentNode").removeChild(a);gEditICommentHost.showContent();gEditICommentHost=null;}};gICommentForm=null;instanciateICommentForm=function(){gICommentForm={position:[CY.WidgetPositionExt.TL,CY.WidgetPositionExt.TL],formId:CY.guid(),formTitleId:CY.guid(),titleInputId:CY.guid(),contentInputId:CY.guid(),tagsInputId:CY.guid(),formatInputId:CY.guid(),startWrapperInputId:CY.guid(),endWrapperInputId:CY.guid(),startOffsetInputId:CY.guid(),endOffsetInputId:CY.guid(),selectionPlaceId:CY.guid(),keyId:CY.guid(),currentSelId:CY.guid(),currentSelIdI:CY.guid(),addBtnId:CY.guid(),cancelBtnId:CY.guid(),closeBtnId:CY.guid()};if(!sv_loggedIn){gICommentForm.nameInputId=CY.guid();gICommentForm.emailInputId=CY.guid();}var c=getHtml(gICommentForm);var e=gLayout.getTopICommentsWidth();var b=new CY.Overlay({zIndex:3,shim:false,visible:false,headerContent:c.headerContent,bodyContent:c.bodyContent,xy:[10,10],width:e});b.get("contentBox").addClass("c-newcomment");b.render("#leftcolumn");if(!sv_loggedIn){CY.get("#"+gICommentForm.nameInputId).set("value",gPrefs.get("user","name"));CY.get("#"+gICommentForm.emailInputId).set("value",gPrefs.get("user","email"));}CY.get("#"+gICommentForm.formTitleId).set("innerHTML",gettext("New comment"));CY.get("#"+gICommentForm.formatInputId).set("value",gConf.defaultCommentFormat);CY.on("click",onSubmitICommentFormClick,"#"+gICommentForm.addBtnId);CY.on("click",onCancelICommentFormClick,"#"+gICommentForm.cancelBtnId);CY.on("click",onCancelICommentFormClick,"#"+gICommentForm.closeBtnId);gICommentForm.overlay=b;var d=null;d=new CY.Anim({node:b.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gICommentForm.animationHide=d;d.set("to",{opacity:0});gICommentForm["animationHide-handle"]=d.on("end",onICommentFormHideAnimEnd,gICommentForm);var a=null;a=new CY.Anim({node:b.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gICommentForm.animationShow=a;a.set("to",{opacity:1});gICommentForm["animationShow-handle"]=a.on("end",onICommentFormShowAnimEnd,gICommentForm);changeFormFieldsWidth(gICommentForm.formId,e);};cleanICommentForm=function(){CY.get("#"+gICommentForm.currentSelIdI).set("innerHTML",gNoSelectionYet);var a=gICommentForm.overlay.getStdModNode(CY.WidgetStdMod.BODY);a.queryAll(".comment_input").set("value","");CY.get("#"+gICommentForm.formatInputId).set("value",gConf.defaultCommentFormat);if(!sv_loggedIn){a.queryAll(".user_input").set("value","");}};onICommentFormHideAnimEnd=function(){this.overlay.hide();gSync.resume();};onICommentFormShowAnimEnd=function(){gSync.resume();};onSubmitICommentFormClick=function(){if(!sv_loggedIn){var b=CY.get("#"+gICommentForm.nameInputId).get("value");gPrefs.persist("user","name",b);var a=CY.get("#"+gICommentForm.emailInputId).get("value");gPrefs.persist("user","email",a);}gSync.saveComment(gICommentForm.formId);};onCancelICommentFormClick=function(){gSync.cancelICommentForm();};_updateICommentFormSelection=function(c,e,b,a){var d=CY.Node.get("#"+c.currentSelIdI);if(d!=null){d.set("innerHTML",e);}d=CY.get("#"+c.startWrapperInputId);if(d!=null){d.set("value",b.elt.id.substring("sv_".length));}d=CY.get("#"+c.startOffsetInputId);if(d!=null){d.set("value",b.offset);}d=CY.get("#"+c.endWrapperInputId);if(d!=null){d.set("value",a.elt.id.substring("sv_".length));}d=CY.get("#"+c.endOffsetInputId);if(d!=null){d.set("value",a.offset);}};updateICommentFormSelection=function(h){var i=(h==null)?"":h.text;if(i!=""){var f=i;var b=100;if(i.length>b){var a=i.substring(0,(i.substring(0,b/2)).lastIndexOf(" "));var d=i.substring(i.length-b/2);var c=d.substring(d.indexOf(" "));f=a+" ... "+c;}var e=_convertSelectionFromCCToCS(h.start);var g=_convertSelectionFromCCToCS(h.end);_updateICommentFormSelection(gICommentForm,f,e,g);if(gEdit!=null){_updateICommentFormSelection(gEdit.ids,f,e,g);}positionICommentForm();}};showICommentForm=function(){removeFormErrMsg(gICommentForm.formId);if(!sv_loggedIn){if(CY.get("#"+gICommentForm.nameInputId).get("value")==""){CY.get("#"+gICommentForm.nameInputId).set("value",gPrefs.get("user","name"));}if(CY.get("#"+gICommentForm.emailInputId).get("value")==""){CY.get("#"+gICommentForm.emailInputId).set("value",gPrefs.get("user","email"));}}gIComments.hide();hideToc();positionICommentForm();gICommentForm.overlay.show();CY.get("#"+gICommentForm.titleInputId).focus();};isICommentFormVisible=function(){if(gICommentForm!=null){return gICommentForm.overlay.get("visible");}return false;};positionICommentForm=function(){if(gICommentForm!=null){var b=gICommentForm.overlay;var a=b.get("boundingBox");var c=a.get("offsetHeight");var e=a.get("winHeight");var d=gICommentForm.position;if(c>e){d=[CY.WidgetPositionExt.BL,CY.WidgetPositionExt.BL];}b.set("align",{points:d});if(c<=e){b.set("y",b.get("y")+30);}a.setX(a.getX()+gConf.iCommentLeftPadding);}};Db=function(){this.comments=null;this.allComments=null;this.commentsByDbId={};this.allCommentsByDbId={};this.ordered_comment_ids={};};Db.prototype={init:function(){this.allComments=CY.JSON.parse(sv_comments);if(sv_read_only){this.initToReadOnly();}this._computeAllCommentsByDbId();this._reorder();},_del:function(a,e,g){var f=e[g];for(var c=0;c<f.replies.length;c++){var d=f.replies[c].id;this._del(f.replies,e,d);c--;}for(var c=0,b=a.length;c<b;c++){if(a[c].id==g){a.splice(c,1);delete e[g];break;}}},del:function(b){var a=(b.reply_to_id==null)?this.comments:this.commentsByDbId[b.reply_to_id].replies;this._del(a,this.commentsByDbId,b.id);a=(b.reply_to_id==null)?this.allComments:this.allCommentsByDbId[b.reply_to_id].replies;this._del(a,this.allCommentsByDbId,b.id);this._reorder();},_reorder:function(){var l=[];for(var g=0,c=this.allComments.length;g<c;g++){var h=this.allComments[g];var p=false;for(var e=0,o=l.length;e<o;e++){var b=l[e];var d=this.allCommentsByDbId[b];if((h.start_wrapper<d.start_wrapper)||((h.start_wrapper==d.start_wrapper)&&(h.start_offset<d.start_offset))||((h.start_wrapper==d.start_wrapper)&&(h.start_offset==d.start_offset)&&(h.end_wrapper<d.end_wrapper))||((h.start_wrapper==d.start_wrapper)&&(h.start_offset==d.start_offset)&&(h.end_wrapper==d.end_wrapper)&&(h.end_offset<d.end_offset))){l.splice(e,0,h.id);p=true;break;}}if(!p){l.push(h.id);}}this.ordered_comment_ids.scope=l;l=[];var k={};for(var g=0,c=this.allComments.length;g<c;g++){var h=this.allComments[g];var m=h.modified;k[h.id]=this._latest_mod(h);}for(var b in k){var f=this.allCommentsByDbId[b].id;var p=false;for(var g=0,c=l.length;g<c;g++){var n=l[g];if(k[b]<k[n]){l.splice(g,0,f);p=true;break;}}if(!p){l.push(f);}}this.ordered_comment_ids.modif_thread=l;},_latest_mod:function(e){var c=e.modified;for(var b=0;b<e.replies.length;b++){var d=e.replies[b];var a=this._latest_mod(d);if(a>c){c=a;}}return c;},_upd:function(a,f,g){var e=false;for(var d=0,b=a.length;d<b;d++){if(a[d].id==g.id){a.splice(d,1,g);e=true;break;}}if(!e){a.push(g);}f[g.id]=g;},upd:function(c){var a=(c.reply_to_id==null)?this.allComments:this.allCommentsByDbId[c.reply_to_id].replies;this._upd(a,this.allCommentsByDbId,c);var b=CY.clone(c);a=(c.reply_to_id==null)?this.comments:this.commentsByDbId[c.reply_to_id].replies;this._upd(a,this.commentsByDbId,b);this._reorder();},initComments:function(a){this.comments=[];for(var d=0,c=this.allComments.length;d<c;d++){var b=CY.Array.indexOf(a,this.allComments[d].id);if(b!=-1){var e=CY.clone(this.allComments[d]);this.comments.push(e);}}this._computeCommentsByDbId();},_computeCommentsByDbId:function(){this.commentsByDbId={};var b=this.getThreads(this.comments);for(var a=0;a<b.length;a++){this.commentsByDbId[b[a].id]=b[a];}},_computeAllCommentsByDbId:function(){this.allCommentsByDbId={};var b=this.getThreads(this.allComments);for(var a=0;a<b.length;a++){this.allCommentsByDbId[b[a].id]=b[a];}},getThreads:function(c){var a=[];for(var b=0;b<c.length;b++){a.push(c[b]);if(c[b].replies.length>0){a=a.concat(this.getThreads(c[b].replies));}}return a;},_getPath:function(b,e){var a=[e];var d=e;while(d.reply_to_id!=null){d=b[d.reply_to_id];a.push(d);}return a;},getPath:function(a){return this._getPath(this.commentsByDbId,a);},getComment:function(a){return this.commentsByDbId[a];},getCommentByIdKey:function(a){for(var c in this.commentsByDbId){var b=this.commentsByDbId[c];if(b.id_key==a){return b;}}return null;},isChild:function(d,b){var c=this.commentsByDbId[d];var a=(d==b);while((!a)&&(c.reply_to_id!=null)){c=this.commentsByDbId[c.reply_to_id];a=(c.id==b);}return a;},initToReadOnly:function(f,c){for(var b=0,a=this.allComments.length;b<a;b++){var e=this.allComments[b];for(var d in e){if(0==d.indexOf("can_")&&typeof e[d]==="boolean"){e[d]=false;}}}},browsingIndex:function(b){var c={};for(var a in this.ordered_comment_ids){var d=CY.Array.filter(this.ordered_comment_ids[a],function(e){return(e in this.commentsByDbId);},this);c[a]=CY.Array.indexOf(d,b);}return c;},browse:function(b,f,c){var a=this.ordered_comment_ids[b];if(a.length>0){var g=-1;if((f=="prev")||(f=="next")){for(var e=0;e<a.length;e++){var h=a[e];if(h==c){g=(f=="prev")?e-1:e+1;g=(a.length+g)%a.length;break;}}if(g==-1){CY.error("internal error in db browse (was called with a dbId that isn't among the filtered ones)");return null;}}if(f=="last"){g=a.length-1;}if(f=="first"){g=0;}for(var e=g,d=0;(e>=0)&&(e<a.length);d++){var h=a[e];if(h in this.commentsByDbId){return this.commentsByDbId[h];}if((f=="prev")||(f=="last")){e=e-1;}else{e=e+1;}e=(a.length+e)%a.length;if(d>a.length){break;}}CY.error("internal error in db browse (could not find any filtered comment)");}return null;},computeFilterResults:function(n){var a={};if(n){for(key in n){if(key.indexOf("filter_")==0){a[key.substr("filter_".length)]=n[key];}}}else{if(gLayout.isInFrame()){a=parent.f_getFrameFilterData();}}var v=[];var w=[];var b="";if("name" in a){b=a.name;}this.filterByName(b,v,w);var p=[];var c=[];var C="";if("date" in a){C=a.date;}this.filterByDate(C,p,c);var g=[];var f=[];var t="";if("text" in a){t=a.text;}this.filterByText(t,g,f);var x=[];var m=[];var A="";if("tag" in a){A=a.tag;}this.filterByTag(A,x,m);var u=[];var e=[];var k="";if("state" in a){k=a.state;}this.filterByState(k,u,e);var d=[];var z=[];for(var y=0,j=v.length;y<j;y++){var s=v[y];if((CY.Array.indexOf(p,s)!=-1)&&(CY.Array.indexOf(g,s)!=-1)&&(CY.Array.indexOf(x,s)!=-1)&&(CY.Array.indexOf(u,s)!=-1)){d.push(s);}}for(var y=0,j=w.length;y<j;y++){var s=w[y];if((CY.Array.indexOf(c,s)!=-1)&&(CY.Array.indexOf(f,s)!=-1)&&(CY.Array.indexOf(m,s)!=-1)&&(CY.Array.indexOf(e,s)!=-1)){z.push(s);}}var q=z.length,l=d.length;var r=l;for(var y=0,j=z.length;y<j;y++){var s=z[y];var o=this.allCommentsByDbId[s];var B=this._getPath(this.allCommentsByDbId,o);var h=B[B.length-1];var s=h.id;if(CY.Array.indexOf(d,s)==-1){d.push(s);r++;}}return{commentIds:d,nbDiscussions:r,nbComments:l,nbReplies:q};},filterByText:function(c,f,b){var a=new RegExp(c,"gi");for(var e in this.allCommentsByDbId){var d=this.allCommentsByDbId[e];if(c==""||a.exec(d.title)!=null||a.exec(d.content)!=null){if(d.reply_to_id==null){f.push(d.id);}else{b.push(d.id);}}}},filterByName:function(a,c,b){for(var e in this.allCommentsByDbId){var d=this.allCommentsByDbId[e];if(a==""||d.name==a){if(d.reply_to_id==null){c.push(d.id);}else{b.push(d.id);}}}},filterByTag:function(i,e,b){var h=new RegExp("^"+i+"$","");var g=new RegExp("^"+i+", ","");var d=new RegExp(", "+i+", ","");var c=new RegExp(", "+i+"$","");for(var a in this.allCommentsByDbId){var f=this.allCommentsByDbId[a];if((i=="")||h.exec(f.tags)!=null||g.exec(f.tags)!=null||d.exec(f.tags)!=null||c.exec(f.tags)!=null){if(f.reply_to_id==null){e.push(f.id);}else{b.push(f.id);}}}},filterByState:function(c,a,b){for(var e in this.allCommentsByDbId){var d=this.allCommentsByDbId[e];if(c==""||d.state==c){if(d.reply_to_id==null){a.push(d.id);}else{b.push(d.id);}}}},filterByDate:function(b,d,a){var c=(b=="")?0:parseInt(b);for(var f in this.allCommentsByDbId){var e=this.allCommentsByDbId[f];if(e.modified>c){if(e.reply_to_id==null){d.push(e.id);}else{a.push(e.id);}}}},getCommentsAndRepliesCounts:function(d){var b=0;var f=0;var a=(d)?this.allComments:this.comments;var e=this.getThreads(a);for(var c=0;c<e.length;c++){if(e[c].reply_to_id==null){b++;}else{f++;}}return[b,f];},getCommentsNb:function(b){var a=(b)?this.allComments:this.comments;return this.getThreads(a).length;},getFilteredCommentIdsAsString:function(){var a="";for(var b in this.commentsByDbId){a=a+b+",";}return a;}};var gtest={renaud:"RENAUD",random:Math.random(),bernard:"BERNARD",myFunc:function(){doExchange("theServerFun",{},null,this.myRetFunc,this,["foo","bar"]);},myRetFunc:function(a){CY.log("this.renaud : "+this.renaud);CY.log("this.random : "+this.random);CY.log("arg.returned : "+a.returned);CY.log(a.returned);CY.log("arg.success : "+a.success);CY.log(a.success);}};doExchange=function(h,e,g,f,d,c,b){e.fun=h;e.key=sv_key;e.version_key=sv_version_key;var a={method:"POST",data:urlEncode(e),on:{success:function(l,k,j){var i={};if(k.responseText){i=CY.JSON.parse(k.responseText);}if(gLayout.isInFrame()&&("msg" in i)){parent.f_enqueueMsg(i.msg);}j.returned=i;j.successfull=true;f.call(d,j);},failure:function(k,j,i){if(gLayout.isInFrame()){parent.f_enqueueErrorMsg(gettext("error:")+b);}i.successfull=false;f.call(d,i);}},arguments:{success:c,failure:c}};if(g!=null){a.form={id:g};}CY.io(sv_client_url,a);};warn_server=function(c){c.fun="warn";c.key=sv_key;c.version_key=sv_version_key;var b=CY.UA;var a={method:"POST",data:urlEncode(CY.merge(c,b))};CY.io("/client/",a);};IComments=function(){this._c=[];this._a=[];this._nbEndedAnim=0;this._topActiveCommentDbId=null;};IComments.prototype={init:function(a){for(var b=0;b<gConf.iCommentsInitAlloc;b++){this._c.push(new IComment());}},getIComment:function(a){return CY.Array.find(this._c,function(b){return(b.isfetched()&&b.commentId==a);});},insertAfter:function(a,d){var c=CY.Array.map(this._c,function(e){return e.commentId;});var b=CY.Array.indexOf(c,a.id);if(b!=-1){this._c.splice(b+1,0,new IComment());this._c[b+1].fetch(d);return this._c[b+1];}return null;},_remove:function(c){var d=CY.Array.map(c,function(e){return e.commentId;});for(var b=0;b<this._c.length;b++){var a=this._c[b];if(a.isfetched()&&CY.Array.indexOf(d,a.commentId)!=-1){a.unfetch();this._c.push(this._c.splice(b,1)[0]);b--;}}},_getChildren:function(a){return CY.Array.filter(this._c,function(b){return(b.isfetched()&&gDb.isChild(b.commentId,a));});},_getInvisibleChildren:function(a){return CY.Array.filter(this._getChildren(a),function(b){return(!b.isVisible());});},refresh:function(c){var b=this.getIComment(c);var a=this._getInvisibleChildren(c);if(a.length>0){b.showReadRepliesLnk();}else{b.hideReadRepliesLnk();}},remove:function(a){this._remove(this._getChildren(a));},close:function(a){CY.Array.each(this._getChildren(a),function(b){b.hide();});},open:function(a){CY.Array.each(this._getChildren(a),function(b){b.show();});},fetch:function(b){for(var a=0;a<b.length;a++){if(a==this._c.length){this._c.push(new IComment());}this._c[a].fetch(b[a]);}for(var a=b.length;a<this._c.length;a++){this._c[a].unfetch();}},setPosition:function(a){CY.each(this._c,function(b){b.setPosition(a);});},show:function(){CY.each(this._c,function(a){if(a.isfetched()){a.show();}});},hide:function(){this.deactivate();CY.each(this._c,function(a){if(a.commentId!=null){a.hide();}});},setWidth:function(c){var e=null;for(var b=0;b<this._c.length;b++){var a=this._c[b];a.setWidth(c);if(a.commentId!=null&&a.isVisible()){var d=a.getPosition();if(e==null){e=d[1];}d[1]=e;a.setPosition(d);e+=a.getHeight();}}},getTopPosition:function(){for(var b=0;b<this._c.length;b++){var a=this._c[b];if(a.commentId!=null&&a.isVisible()){return a.getPosition();}}return null;},getPosition:function(c){for(var b=0;b<this._c.length;b++){var a=this._c[b];if(a.commentId==c&&a.isVisible()){return a.getPosition();}}return null;},setAnimationToPositions:function(h){this._initAnimations();var c=(gPrefs.get("comments","threadpad")=="1")?gConf.iCommentThreadPadding:0;var f=h;for(var d=0;d<this._c.length;d++){var b=this._c[d];if(b.isfetched&&b.isVisible()){var a=gDb.getPath(gDb.getComment(b.commentId));var g=((a.length-1)*c)+gConf.iCommentLeftPadding;if(f==null){var e=b.getPosition();f=e[1];}this._a.push(b.setAnimationToPosition([g,f]));f+=b.getHeight();}}},setAnimationToPositionsAndFocus:function(g,f,b){this._initAnimations();var a=(gPrefs.get("comments","threadpad")=="1")?gConf.iCommentThreadPadding:0;var h=g;for(var d=0;d<this._c.length;d++){var c=this._c[d];if(c.isfetched&&c.isVisible()){var e=gDb.getPath(gDb.getComment(c.commentId));var k=((e.length-1)*a)+gConf.iCommentLeftPadding;if(h==null){var j=c.getPosition();h=j[1];}if(c.commentId>=f){this._a.push(c.setAnimationToPosition([k,h],f,b));}else{this._a.push(c.setAnimationToPosition([k,h]));}h+=c.getHeight();}}},_initAnimations:function(){this._a=[];this._nbEndedAnim=0;},runAnimations:function(){if(this._a.length==0){gSync.resetAutoContinue("animationRun");}else{CY.each(this._a,function(a){a.run();});}},whenAnimationsEnd:function(){gSync.resume();},whenAnimationsEndFocus:function(){gGETValues=CY.JSON.parse(sv_get_params);if("comment_id_key" in gGETValues){var b=gGETValues.comment_id_key;var a=gDb.getCommentByIdKey(b);if(a!=null){gIComments.getIComment(a.id).overlay.focus();}}gSync.resume();},whenAnimationsEndReply:function(){gGETValues=CY.JSON.parse(sv_get_params);if("comment_id_key" in gGETValues){var b=gGETValues.comment_id_key;var a=gDb.getCommentByIdKey(b);if(a!=null){gSync.showReplyForm(gIComments.getIComment(a.id));}}gSync.resume();},animationsEnded:function(){return((this._a.length==0)||(this._a.length==this._nbEndedAnim));},signalAnimationEnd:function(){this._nbEndedAnim++;},isTopActive:function(a){return((a!=null)&&(this._topActiveCommentDbId==a));},isAnyActive:function(){return(this._topActiveCommentDbId!=null);},activate:function(f){if(this._topActiveCommentDbId!=null){this.deactivate();}var e=gDb.getComment(f);var b=gDb.getPath(e);var a=b[b.length-1];var c=this._getChildren(a.id);CY.Array.each(c,function(g){g.activate();});this._topActiveCommentDbId=a.id;if(gLayout.isInFrame()){var d=gDb.browsingIndex(this._topActiveCommentDbId);parent.$("#browse_by option").each(function(){var g=1+d[this.value];parent.$("#c_browse_indx_"+this.value).html(""+g);});}showScope(a.id);},deactivate:function(){if(this._topActiveCommentDbId!=null){parent.$("#browse_by option").each(function(){parent.$("#c_browse_indx_"+this.value).html("-");});hideScopeAnyway();var a=this._getChildren(this._topActiveCommentDbId);CY.Array.each(a,function(b){b.deactivate();});this._topActiveCommentDbId=null;}},activateVisibleNext:function(){if(this._topActiveCommentDbId!=null){for(var d=0;d<2;d++){var f=(d==0)?0:this._c.length-1;var a=false;for(var e=f;(e>=0)&&e<=(this._c.length-1);){var c=this._c[e];if(c.commentId!=null&&c.isVisible()){a=a||(gDb.isChild(c.commentId,this._topActiveCommentDbId));if(a&&(!gDb.isChild(c.commentId,this._topActiveCommentDbId))){this.activate(c.commentId);return true;}}e=(d==0)?e+1:e-1;}}}return false;},browse:function(b,c){var a=c;if((c=="prev")&&!this.isAnyActive()){a="last";}if((c=="next")&&!this.isAnyActive()){a="first";}return gDb.browse(b,a,this._topActiveCommentDbId);}};gNewReplyHost=null;gNewReply=null;instanciateNewReplyForm=function(i){if(gNewReply==null){gNewReply={val:{name:gPrefs.get("user","name"),email:gPrefs.get("user","email"),title:"",content:"",tags:""},ids:{name:gPrefs.get("user","name"),email:gPrefs.get("user","email"),title:"",content:"",tags:"",formId:CY.guid(),nameInputId:CY.guid(),emailInputId:CY.guid(),titleInputId:CY.guid(),contentInputId:CY.guid(),keyInputId:CY.guid(),formatInputId:CY.guid(),tagsInputId:CY.guid(),parentCommentId:CY.guid(),addBtnId:CY.guid(),cancelBtnId:CY.guid()},handlers:{}};}gNewReplyHost=i;var b='<hr/><center><div class="c-header-title">'+gettext("New reply")+"</div></center>";var e=gFormHtml.formStart.replace("###",gNewReply.ids["formId"]);if(!sv_loggedIn){e=e+gFormHtml.nameInput.replace("###",gNewReply.ids["nameInputId"])+gFormHtml.emailInput.replace("###",gNewReply.ids["emailInputId"]);}e=e+gFormHtml.titleInput.replace("###",gNewReply.ids["titleInputId"])+gFormHtml.contentInput.replace("###",gNewReply.ids["contentInputId"])+gFormHtml.tagsInput.replace("###",gNewReply.ids["tagsInputId"]);e=e+gFormHtml.hidden.replace("###",gNewReply.ids["keyInputId"]).replace("???","comment_key");e=e+gFormHtml.hidden.replace("###",gNewReply.ids["formatInputId"]).replace("???","format");e=e+gFormHtml.hidden.replace("###",gNewReply.ids["parentCommentId"]).replace("???","reply_to_id");var h=gFormHtml.btns.replace("###",gNewReply.ids["addBtnId"]).replace("???",gNewReply.ids["cancelBtnId"]);gNewReplyHost.overlay.setStdModContent(CY.WidgetStdMod.FOOTER,b+e+h);var c=gNewReplyHost.overlay.getStdModNode(CY.WidgetStdMod.FOOTER);var f=gDb.getComment(i.commentId);var a="Re: ";var g=(gNewReply.val["title"]==""||gNewReply.val["title"].substring(0,a.length)==a)?a+f.title:gNewReply.val["title"];if(!sv_loggedIn){c.query(".n_name").set("value",gNewReply.val["name"]);c.query(".n_email").set("value",gNewReply.val["email"]);}c.query(".n_title").set("value",g);c.query(".n_content").set("value",gNewReply.val["content"]);c.query(".n_tags").set("value",gNewReply.val["tags"]);c.query("#"+gNewReply.ids["parentCommentId"]).set("value",i.commentId);c.query("#"+gNewReply.ids["formatInputId"]).set("value",gConf.defaultCommentFormat);gNewReplyHost.overlay.get("contentBox").query(".c-reply").addClass("displaynone");gNewReply.handlers["addBtnId"]=CY.on("click",onAddNewReplyClick,"#"+gNewReply.ids["addBtnId"]);gNewReply.handlers["cancelBtnId"]=CY.on("click",onCancelNewReplyClick,"#"+gNewReply.ids["cancelBtnId"]);var d=gLayout.getTopICommentsWidth();changeFormFieldsWidth(gNewReply.ids["formId"],d);CY.get("#"+gNewReply.ids["contentInputId"]).focus();};cleanNewReplyForm=function(){if(gNewReplyHost!=null){var a=gNewReplyHost.overlay.getStdModNode(CY.WidgetStdMod.FOOTER);a.queryAll(".comment_input").set("value","");}};cancelNewReplyForm=function(){if(gNewReplyHost!=null){for(var b in gNewReply.handlers){if(gNewReply.handlers[b]!=null){gNewReply.handlers[b].detach();gNewReply.handlers[b]=null;}}gNewReplyHost.overlay.get("contentBox").query(".c-reply").removeClass("displaynone");var a=gNewReplyHost.overlay.getStdModNode(CY.WidgetStdMod.FOOTER);if(!sv_loggedIn){gNewReply.val["name"]=a.query(".n_name").get("value");gNewReply.val["email"]=a.query(".n_email").get("value");}gNewReply.val["title"]=a.query(".n_title").get("value");gNewReply.val["content"]=a.query(".n_content").get("value");gNewReply.val["tags"]=a.query(".n_tags").get("value");a.set("innerHTML","");gNewReplyHost=null;}};onAddNewReplyClick=function(){if(!sv_loggedIn){var b=CY.get("#"+gNewReply.ids["nameInputId"]).get("value");gPrefs.persist("user","name",b);var a=CY.get("#"+gNewReply.ids["emailInputId"]).get("value");gPrefs.persist("user","email",a);}gSync.saveComment(gNewReply.ids["formId"]);};onCancelNewReplyClick=function(){gSync.cancelReply();};c_persistPreference=function(b,a,c){gPrefs.persist(b,a,c);};c_readDefaultPreference=function(b,a){return gConf.defaultPrefs[b][a];};c_readPreference=function(b,a){return gPrefs.get(b,a);};c_resetPreferences=function(a){gPrefs.reset(a);};c_applyTextStyle=function(a){CY.use(a);};sliderValToPx=function(d){var a=CY.DOM.winWidth();if(gLayout.isInFrame()){a=parent.$(parent).width();}var b=d/100;b=Math.min(b,gConf.sliderFixedMin);b=Math.max(b,gConf.sliderFixedMax);var c=b*a;return Math.floor(c);};c_setCommentsColWidth=function(c){var a=sliderValToPx(c);gLayout.setLeftColumnWidth(a);var b=gLayout.getTopICommentsWidthFromWidth(a);gIComments.setWidth(b);gICommentForm.overlay.get("boundingBox").setStyle("width",b+"px");changeFormFieldsWidth(gICommentForm.formId,b);document.getElementById("the-toc").style.width=b+"px";if(gNewReply){changeFormFieldsWidth(gNewReply.ids["formId"],b);}if(gEdit){changeFormFieldsWidth(gEdit.ids["formId"],b);}};CY=null;gPrefs=null;gLayout=null;gDb=null;gIComments=null;gSync=null;gGETValues=null;gConf={iCommentLeftPadding:4,iCommentThreadPadding:12,defaultCommentFormat:"markdown",sliderFixedMin:0.9,sliderFixedMax:0.1,iCommentsInitAlloc:2,defaultPrefs:{text:{style:"text-modern-style"},user:{name:"",email:""},general:{animduration:"0.4"},comments:{threadpad:"1"},layout:{comments_col_width:"25"}}};if(sv_custom_font){gTextStyles={custom:gettext("custom"),modern:gettext("modern"),classic:gettext("classic"),code:gettext("code")};}else{gTextStyles={modern:gettext("modern"),classic:gettext("classic"),code:gettext("code")};}YUI({base:sv_media_url+"/js/lib/yui/"+c_yui_base+"/build/",timeout:10000}).use("text-modern-style","cookie","json","overlay","io-form","async-queue","event-mouseenter","anim","collection",function(a){CY=a;gPrefs=new Preferences();gPrefs.init();gLayout=new Layout();gLayout.init();if(sv_withComments){gDb=new Db();gDb.init();gIComments=new IComments();gIComments.init();}gSync=new Sync();gSync.init();CY.on("domready",onDomReady,this);});_reinit=function(a){gIComments.hide();gDb.initComments(a.commentIds);unpaintAllComments();renderCommentScopes();updateFilterResultsCount(a.nbDiscussions,a.nbComments,a.nbReplies);};reinit=function(b){var a=gDb.computeFilterResults(b);_reinit(a);};hideAll=function(){_reinit({commentIds:[],nbDiscussions:0,nbComments:0,nbReplies:0});};updateFilterResultsCount=function(f,a,b){var e=gDb.getCommentsAndRepliesCounts(true);var g=e[0],d=e[1];var c=(a!=0||b!=0)&&(g!=a||d!=b);if(gLayout.isInFrame()){parent.f_updateFilterCountDetailed(c);parent.f_updateFilterCountResult(f,a,b,g,d);}};updateResetFilterResultsCount=function(){var c=gDb.getCommentsAndRepliesCounts(false);var a=c[0],b=c[1];var d=a;updateFilterResultsCount(d,a,b);};renderCommentScopes=function(){for(var a=0;a<gDb.comments.length;a++){var b=gDb.comments[a];paintCommentScope(b);}};onTextMouseUp=function(f){if(readyForAction()){var c=getSelectionInfo();if(c!=null){updateICommentFormSelection(c);if(gEditICommentHost!=null){var g=CY.get("#"+gEdit.ids["changeScopeInputId"]+" input").get("checked");if(g){gEditICommentHost.scrollIntoView();}}}else{var d=f.target;if(d.hasClass("c-c")){var b=CY.Node.getDOMNode(d);var a=getCommentIdsFromClasses(b);if(a.length>0){checkForOpenedDialog(null,function(){gSync.showComments(a,[f.pageX,f.pageY],false);});}}}}};gLastScrollTime=null;checkForAlignement=function(){var a=(new Date()).getTime();if((gLastScrollTime!=null)&&(a-gLastScrollTime)>200){positionICommentForm();gLastScrollTime=null;}};onFrameScroll=function(){gLastScrollTime=(new Date()).getTime();};browse=function(a,b){gSync.browse(a,b);};initialConnect=function(){CY.on("mouseup",onTextMouseUp,"#textcontainer");gTimer=CY.Lang.later(200,this,checkForAlignement,[],true);CY.on("scroll",onFrameScroll,window,this,true);CY.on("resize",onFrameScroll,window,this,true);};preventLinksInText=function(){var a=function(g){var c=g.target;var d=null;while(c!=null&&d==null){c=c.get("parentNode");d=c.get("href");}if(c!=null&&d!=null){var b=window.location.href;var f=b.indexOf("#");if(f!=-1){b=b.substring(0,f);}if(d.indexOf(b)==-1){window.open(c.get("href"));g.preventDefault();}}};CY.all("#textcontainer a").on("click",a);};onDomReady=function(b){preventLinksInText();var a=new CY.AsyncQueue();a.add({fn:function(){if(gLayout.isInComentSite()){parent.toInitialSize();}if(sv_withComments){instanciateICommentForm();}instanciateToc();},timeout:5},{fn:function(){gGETValues=CY.JSON.parse(sv_get_params);CY.get("#maincontainer").setStyle("display","block");CY.get("#textcontainer").setStyle("display","block");var e=(sv_withComments)?gPrefs.get("layout","comments_col_width"):0;var d=sliderValToPx(e);gLayout.setLeftColumnWidth(d);if(gLayout.isInFrame()){parent.f_initFrame();parent.f_layoutFrames();if(sv_withComments){parent.f_fillTopToolbar();if(hasPerm("can_create_comment")){parent.$("#add_comment_btn").removeClass("initially_hidden");}parent.f_fillFilterTab();parent.f_fillPreferencesTab();var c=CY.JSON.parse(sv_filter_data);parent.f_updateFilterData(c);parent.f_setFilterValue(gGETValues);}parent.f_fillTextPreferencesTab();}if(gLayout.isInComentSite()){parent.$("#c_fullscreen_btn").show();}else{parent.$("#c_fullscreen_btn").hide();}if(gToc.empty){parent.$("#c_toc_btn").hide();}},timeout:5},{fn:function(){if(sv_withComments){reinit(gGETValues);initialConnect();}},timeout:5},{fn:function(){if(gLayout.isInFrame()){parent.f_interfaceUnfreeze();parent.f_removeLoadingMsg();}if("comment_id_key" in gGETValues){var e=gGETValues.comment_id_key;var g=gDb.getCommentByIdKey(e);if(g!=null){var f=gDb.getPath(g);var c=f[f.length-1];var d=gDb.getCommentByIdKey(e);if("comment_op" in gGETValues&&gGETValues.comment_op=="reply"){gSync.showFocusSingleComment(c,d,true);}else{gSync.showFocusSingleComment(c,d,false);}}}if("comments_auto_display" in gGETValues){gSync.showAllComments();}}});a.run();};
\ No newline at end of file
+_afterDlg=function(d){var a=d[0];var c=d[1];var b=d[2];a.call(c,b);};_abortNewCommentConfirmed=function(a){if(isICommentFormVisible()){if(gLayout.isInFrame()){gSync.hideICommentForm({fn:function(){_afterDlg(a);}});gSync.resume();}}};_abortNewReplyConfirmed=function(a){if(gNewReplyHost!=null){if(gLayout.isInFrame()){cancelNewReplyForm();_afterDlg(a);}}};_abortNewEditConfirmed=function(a){if(gEditICommentHost!=null){if(gLayout.isInFrame()){cancelEditForm();_afterDlg(a);}}};checkForOpenedDialog=function(e,b,d,c){var a=[];if(e!=null){a=CY.Array.map(gDb.getThreads([gDb.getComment(e.commentId)]),function(f){return f.id;});}if(isICommentFormVisible()||(gNewReplyHost!=null&&(e==null||CY.Array.indexOf(a,gNewReplyHost.commentId)!=-1))||(gEditICommentHost!=null&&(e==null||CY.Array.indexOf(a,gEditICommentHost.commentId)!=-1))){if(gLayout.isInFrame()){if(isICommentFormVisible()){parent.f_yesNoDialog(gettext("New comment will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewCommentConfirmed,this,[b,d,c]);}else{if(gNewReplyHost!=null){parent.f_yesNoDialog(gettext("Started reply will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewReplyConfirmed,this,[b,d,c]);}else{if(gEditICommentHost!=null){parent.f_yesNoDialog(gettext("Started comment edition will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewEditConfirmed,this,[b,d,c]);}}}}}else{b.call(d,[]);}};gToc=null;instanciateToc=function(){gToc={tocId:CY.guid(),tocTitleId:CY.guid(),closeBtnId:CY.guid(),empty:false};var c={};c.headerContent='<div id="'+gToc.tocId+'"><h3 id="'+gToc.tocTitleId+'"></h3>';var a=getElementsByTagNames("h2,h3,h4,h5,h6",document.getElementById("maincontainer"));var h=document.createElement("div");if(a.length>=2){for(var f=0;f<a.length;f++){var g=document.createElement("a");g.innerHTML=a[f].innerHTML.replace(/<\/?a[^>]*>/ig,"");g.className="page indent"+a[f].nodeName;h.appendChild(g);var j=a[f].id||"link"+f;g.href="#"+j;a[f].id=j;}}else{h.innerHTML="";gToc.empty=true;}c.bodyContent=h.innerHTML;var b=gLayout.getTopICommentsWidth();var e=new CY.Overlay({zIndex:3,shim:false,visible:false,headerContent:c.headerContent,bodyContent:c.bodyContent,xy:[3,30],width:b});e.get("contentBox").addClass("c-toc");e.get("contentBox").set("id","the-toc");e.render("#leftcolumn");CY.get("#"+gToc.tocTitleId).set("innerHTML",gettext("Table of contents"));gToc.overlay=e;var k=null;k=new CY.Anim({node:e.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gToc.animationHide=k;k.set("to",{opacity:0});gToc["animationHide-handle"]=k.on("end",onTocHideAnimEnd,gToc);var d=null;d=new CY.Anim({node:e.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gToc.animationShow=d;d.set("to",{opacity:1});gToc["animationShow-handle"]=d.on("end",onTocShowAnimEnd,gToc);getElementsByClassName("c-toc")[0].style.width=b+"px";};toggleTocFn=function(){if(isTocVisible()){hideToc();}else{showToc();}};hideToc=function(){gToc.overlay.hide();};onTocHideAnimEnd=function(){this.overlay.hide();gSync.resume();};onTocShowAnimEnd=function(){gSync.resume();};showToc=function(){removeFormErrMsg(gToc.tocId);gIComments.hide();gToc.overlay.show();};isTocVisible=function(){if(gToc!=null){return gToc.overlay.get("visible");}return false;};function getElementsByTagNames(g,h){if(!h){var h=document;}var a=g.split(",");var f=new Array();for(var e=0;e<a.length;e++){var d=h.getElementsByTagName(a[e]);for(var c=0;c<d.length;c++){f.push(d[c]);}}var b=f[0];if(!b){return[];}if(b.sourceIndex){f.sort(function(j,i){return j.sourceIndex-i.sourceIndex;});}else{if(b.compareDocumentPosition){f.sort(function(j,i){return 3-(j.compareDocumentPosition(i)&6);});}}return f;}var getElementsByClassName=function(b,a,c){if(document.getElementsByClassName){getElementsByClassName=function(j,m,h){h=h||document;var d=h.getElementsByClassName(j),l=(m)?new RegExp("\\b"+m+"\\b","i"):null,e=[],g;for(var f=0,k=d.length;f<k;f+=1){g=d[f];if(!l||l.test(g.nodeName)){e.push(g);}}return e;};}else{if(document.evaluate){getElementsByClassName=function(o,r,n){r=r||"*";n=n||document;var g=o.split(" "),p="",l="http://www.w3.org/1999/xhtml",q=(document.documentElement.namespaceURI===l)?l:null,h=[],d,f;for(var i=0,k=g.length;i<k;i+=1){p+="[contains(concat(' ', @class, ' '), ' "+g[i]+" ')]";}try{d=document.evaluate(".//"+r+p,n,q,0,null);}catch(m){d=document.evaluate(".//"+r+p,n,null,0,null);}while((f=d.iterateNext())){h.push(f);}return h;};}else{getElementsByClassName=function(r,u,q){u=u||"*";q=q||document;var h=r.split(" "),t=[],d=(u==="*"&&q.all)?q.all:q.getElementsByTagName(u),p,j=[],o;for(var i=0,e=h.length;i<e;i+=1){t.push(new RegExp("(^|\\s)"+h[i]+"(\\s|$)"));}for(var g=0,s=d.length;g<s;g+=1){p=d[g];o=false;for(var f=0,n=t.length;f<n;f+=1){o=t[f].test(p.className);if(!o){break;}}if(o){j.push(p);}}return j;};}}return getElementsByClassName(b,a,c);};IComment=function(){this.commentId=null;var l=gLayout.getTopICommentsWidth();var a=gConf.iCommentLeftPadding;var r=gettext("change comment state to pending");var n=gettext("change comment state to approved");var e=gettext("change comment state to unapproved");var q=gettext("cancel changing the state of this comment");var c=gettext("pending");var d=gettext("approved");var m=gettext("unapproved");var b=gettext("cancel");var p=gettext("show replies");var s=gettext("change to:");var i=ngettext("reply","replies",1);var g=gettext("edit comment");var j=gettext("delete comment");var o=gettext("edit");var f=gettext("delete");var k=gettext("close");var h=gettext("show scope");var t=gettext("Comment is detached: it was created on a previous version and text it applied to has been modified or removed.");this.overlay=new CY.Overlay({zIndex:3,shim:false,visible:false,width:l,xy:[a,0],headerContent:'<div class="icomment-header"><div class="c-iactions"><a class="c-moderate c-action" title="">vis</a> <a class="c-edit c-action" title="'+g+'" alt="'+g+'">'+o+'</a> <a class="c-delete c-action" title="'+j+'" alt="'+j+'">'+f+'</a> </div><div class="c-state-actions displaynone">'+s+'&nbsp;<a class="c-state-pending c-action" title="'+r+'" alt="'+r+'">'+c+'</a> <a class="c-state-approved c-action" title="'+n+'" alt="'+n+'">'+d+'</a> <a class="c-state-unapproved c-action" title="'+e+'" alt="'+e+'">'+m+'</a> <a class="c-state-cancel c-action" title="'+q+'" alt="'+q+'">'+b+'</a> </div><div class="c-no-scope-msg">'+t+'</div><a class="c-show-scope c-action" title="'+h+'" alt="'+h+'"><em>-</em></a><a class="c-close c-action" title="'+k+'" alt="'+k+'"><em>X</em></a></div>',bodyContent:'<div class="icomment-body"><span class="c-content"></span><span class="c-ireplyactions"><a class="c-readreplies c-action" title="'+p+'" alt="'+p+'">'+p+'</a> <a class="c-reply c-action" title="'+i+'" alt="'+i+'">'+i+"</a>&nbsp;</span></div>"});this.overlay.get("contentBox").addClass("c-comment");this.overlay.render("#leftcolumn");this.animation=new CY.Anim({node:this.overlay.get("boundingBox"),duration:gPrefs.get("general","animduration"),easing:CY.Easing.easeOut});this.overlay.get("contentBox").query(".c-close").on("click",this.onCloseCommentClick,this);this.overlay.get("contentBox").query(".c-moderate").on("click",this.onModerateCommentClick,this);this.overlay.get("contentBox").query(".c-state-pending").on("click",this.onPendingCommentClick,this);this.overlay.get("contentBox").query(".c-state-approved").on("click",this.onApprovedCommentClick,this);this.overlay.get("contentBox").query(".c-state-unapproved").on("click",this.onUnapprovedCommentClick,this);this.overlay.get("contentBox").query(".c-state-cancel").on("click",this.onCancelStateChangeClick,this);this.overlay.get("contentBox").query(".c-edit").on("click",this.onEditCommentClick,this);this.overlay.get("contentBox").query(".c-delete").on("click",this.onDeleteCommentClick,this);this.overlay.get("contentBox").query(".c-reply").on("click",this.onReplyCommentClick,this);this.overlay.get("contentBox").query(".c-readreplies").on("click",this.onReadRepliesCommentClick,this);this.overlay.get("contentBox").query(".icomment-header").on("mouseenter",this.onMouseEnterHeader,this);this.overlay.get("contentBox").query(".icomment-header").on("mouseleave",this.onMouseLeaveHeader,this);this.overlay.get("contentBox").on("click",this.onCommentClick,this);};IComment.prototype={onCloseCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.closeComment(this);}},onModerateCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-iactions").addClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").removeClass("displaynone");}},onPendingCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"pending");}},onApprovedCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"approved");}},onUnapprovedCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"unapproved");}},onCancelStateChangeClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-iactions").removeClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").addClass("displaynone");}},onDeleteCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.removeComment(this);}},onEditCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.showEditForm(this);}},onReplyCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.showReplyForm(this);}},onReadRepliesCommentClick:function(a){a.halt();if(readyForAction()&&this.isVisible()){gSync.openComment(this);}},onCommentClick:function(d){if(readyForAction()&&this.isVisible()){if(d.target.get("target")=="_blank"){var b=d.target;var g=sv_site_url+sv_text_view_show_comment_url;if(b.get("href").indexOf(g)==0){var a=(new RegExp("comment_id_key=([^&]*)","g")).exec(b.get("href"));if(a!=null){var c=a[1];var f=gDb.getCommentByIdKey(c);if(f!=null){d.halt();if(!b.hasClass("c-permalink")){checkForOpenedDialog(null,function(){gSync.showSingleComment(f);});}}}}}else{if(gShowingAllComments){if(!this._isHostingAForm()){var f=gDb.getComment(this.commentId);checkForOpenedDialog(null,function(){if(f!=null){gSync.showSingleComment(f);}});}}else{gSync.activate(this);}}}},onMouseEnterHeader:function(){if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-permalink").removeClass("displaynone");}},onMouseLeaveHeader:function(){if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-permalink").addClass("displaynone");}},setWidth:function(a){this.overlay.get("boundingBox").setStyle("width",a+"px");},activate:function(){this.overlay.get("boundingBox").addClass("c-focus-comment");},deactivate:function(){this.overlay.get("boundingBox").removeClass("c-focus-comment");},hide:function(){if(gIComments.isTopActive(this.commentId)){if(!gIComments.activateVisibleNext()){gIComments.deactivate();}}if(this.isVisible()){this.overlay.hide();this.overlay.blur();}},hideContent:function(){this.overlay.get("contentBox").query(".icomment-header").addClass("displaynone");this.overlay.get("contentBox").query(".icomment-body").addClass("displaynone");},showContent:function(){this.overlay.get("contentBox").query(".icomment-header").removeClass("displaynone");this.overlay.get("contentBox").query(".icomment-body").removeClass("displaynone");},isVisible:function(){return this.overlay.get("visible");},show:function(){this.hideReadRepliesLnk();return this.overlay.show();},showReadRepliesLnk:function(){this.overlay.get("contentBox").query(".c-readreplies").removeClass("displaynone");},hideReadRepliesLnk:function(){this.overlay.get("contentBox").query(".c-readreplies").addClass("displaynone");},changeModeration:function(b){var a=this.overlay.get("contentBox").query(".c-moderate");a.set("innerHTML",gettext(b.state));a.removeClass("c-state-approved");a.removeClass("c-state-pending");a.removeClass("c-state-unapproved");a.addClass("c-state-"+b.state);this.overlay.get("contentBox").query(".c-iactions").removeClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").addClass("displaynone");},isfetched:function(){return(this.commentId!=null);},unfetch:function(){this.commentId=null;},fetch:function(i){this.commentId=i.id;var c=this.overlay.get("boundingBox");if(i.start_wrapper!=-1){c.addClass("c-has-scope");c.removeClass("c-has-no-scope");}else{c.addClass("c-has-no-scope");c.removeClass("c-has-scope");}if(i.reply_to_id!=null){c.addClass("c-is-reply");}else{c.removeClass("c-is-reply");}var g=interpolate(gettext("last modified on %(date)s"),{date:i.modified_user_str},true);var m=(i.modified==i.created)?"":'<a title="'+g+'"> * </a>';var k=gettext("Permalink to this comment");var p='<a class="c-permalink displaynone c-action" target="_blank" title="'+k+'" href="" >¶&nbsp;</a>';var l=interpolate(gettext("by %(name)s, created on %(date)s"),{name:i.name,date:i.created_user_str},true);var d='<span class="c-header"><div class="c-header-title">'+i.title+p+'</div><div class="c-infos">'+l+"</div></span>";var e=CY.Node.create(d);var q=c.query(".c-header");if(q==null){c.query(".icomment-header").insertBefore(e,c.one(".c-iactions"));}else{q.get("parentNode").replaceChild(e,q);}var h=CY.Node.create('<div class="c-tags"><span class="c-tags-infos">tags:</span>'+i.tags+"</div>");var o=c.query(".c-tags");if(o==null){c.query(".icomment-header").appendChild(h);}else{o.get("parentNode").replaceChild(h,o);}if(i.tags==""){h.addClass("displaynone");}var a=CY.Node.create('<div class="c-cat">'+gettext("category")+':&nbsp;<span class="c-cat-val c-cat-'+i.category+'">'+categories[i.category]+"</span></div>");var j=c.query(".c-cat");if(j==null){c.query(".icomment-header").appendChild(a);}else{j.get("parentNode").replaceChild(a,j);}if(i.category==0){a.addClass("displaynone");}var f=CY.Node.create('<span class="c-content">'+i.content_html+"</span>");var b=c.query(".c-content");if(b==null){c.query(".icomment-body").appendChild(f);}else{b.get("parentNode").replaceChild(f,b);}if(sv_prefix==""){c.query(".c-permalink").set("href",sv_site_url+i.permalink);}else{comment_id_delta_prefix=sv_delta!=""?Array(parseInt(sv_delta)+1).join(","):"";c.query(".c-permalink").set("href",top.location.protocol+"//"+top.location.hostname+top.location.pathname+"?comment_id_key="+comment_id_delta_prefix+i.id_key);}this.changeModeration(i);var n=c.queryAll(".c-content a");if(n!=null){n.setAttribute("target","_blank");}n=c.queryAll(".c-header-title a");if(n!=null){n.setAttribute("target","_blank");}this.permAdapt(i);},permAdapt:function(e){var b=this.overlay.get("contentBox").query(".c-delete");if(b){if(!e.can_delete){b.addClass("displaynone");}else{b.removeClass("displaynone");}}var a=this.overlay.get("contentBox").query(".c-edit");if(a){if(!e.can_edit){a.addClass("displaynone");}else{a.removeClass("displaynone");}}var d=this.overlay.get("contentBox").query(".c-reply");if(d){if(!hasPerm("can_create_comment")){d.addClass("displaynone");}else{d.removeClass("displaynone");}}var c=this.overlay.get("contentBox").query(".c-moderate");if(c){if(!e.can_moderate){c.addClass("displaynone");}else{c.removeClass("displaynone");}}},setThreadPad:function(a){this.overlay.get("contentBox").query(".yui-widget-hd").setStyle("paddingLeft",a+"px");this.overlay.get("contentBox").query(".yui-widget-bd").setStyle("paddingLeft",a+"px");},setPosition:function(b){var a=this.overlay.get("boundingBox");a.setStyle("opacity",1);a.setXY(b);},getPosition:function(b){var a=this.overlay.get("boundingBox");return a.getXY();},onAnimationEnd:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEnd();}},onAnimationEndFocus:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEndFocus();}},onAnimationEndReply:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEndReply();}},setAnimationToPosition:function(d,a,c){var b=this.overlay.get("boundingBox");if(gPrefs.get("general","animduration")<0.011){b.setXY(d);}this.animation.set("to",{xy:d});this.animation.set("duration",gPrefs.get("general","animduration"));if(a){if(c){this["animation-handle"]=this.animation.on("end",this.onAnimationEndReply,this);}else{this["animation-handle"]=this.animation.on("end",this.onAnimationEndFocus,this);}}else{this["animation-handle"]=this.animation.on("end",this.onAnimationEnd,this);}return this.animation;},getHeight:function(){return this.overlay.get("boundingBox").get("offsetHeight");},scrollIntoView:function(){if(!this.overlay.get("contentBox").inViewportRegion()){this.overlay.get("contentBox").scrollIntoView(true);}},_isHostingAForm:function(){return(this.isVisible()&&((gNewReplyHost!=null&&gNewReplyHost==this)||(gEditICommentHost!=null&&gEditICommentHost==this)));}};hasPerm=function(a){return(-1!=CY.Array.indexOf(sv_user_permissions,a));};_afterDlg=function(g){var f=g[0];var h=g[1];var e=g[2];f.call(h,e);};_abortNewCommentConfirmed=function(b){if(isICommentFormVisible()){if(gLayout.isInFrame()){gSync.hideICommentForm({fn:function(){_afterDlg(b);}});gSync.resume();}}};_abortNewReplyConfirmed=function(b){if(gNewReplyHost!=null){if(gLayout.isInFrame()){cancelNewReplyForm();_afterDlg(b);}}};_abortNewEditConfirmed=function(b){if(gEditICommentHost!=null){if(gLayout.isInFrame()){cancelEditForm();_afterDlg(b);}}};checkForOpenedDialog=function(h,f,i,j){var g=[];if(h!=null){g=CY.Array.map(gDb.getThreads([gDb.getComment(h.commentId)]),function(a){return a.id;});}if(isICommentFormVisible()||(gNewReplyHost!=null&&(h==null||CY.Array.indexOf(g,gNewReplyHost.commentId)!=-1))||(gEditICommentHost!=null&&(h==null||CY.Array.indexOf(g,gEditICommentHost.commentId)!=-1))){if(gLayout.isInFrame()){if(isICommentFormVisible()){parent.f_yesNoDialog(gettext("New comment will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewCommentConfirmed,this,[f,i,j]);}else{if(gNewReplyHost!=null){parent.f_yesNoDialog(gettext("Started reply will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewReplyConfirmed,this,[f,i,j]);}else{if(gEditICommentHost!=null){parent.f_yesNoDialog(gettext("Started comment edition will be canceled, continue?"),gettext("Warning"),null,null,null,_abortNewEditConfirmed,this,[f,i,j]);}}}}}else{f.call(i,[]);}};gToc=null;instanciateToc=function(){gToc={tocId:CY.guid(),tocTitleId:CY.guid(),closeBtnId:CY.guid(),empty:false};var r={};r.headerContent='<div id="'+gToc.tocId+'"><h3 id="'+gToc.tocTitleId+'"></h3>';var t=getElementsByTagNames("h2,h3,h4,h5,h6",document.getElementById("maincontainer"));var m=document.createElement("div");if(t.length>=2){for(var o=0;o<t.length;o++){var n=document.createElement("a");n.innerHTML=t[o].innerHTML.replace(/<\/?a[^>]*>/ig,"");n.className="page indent"+t[o].nodeName;m.appendChild(n);var l=t[o].id||"link"+o;n.href="#"+l;t[o].id=l;}}else{m.innerHTML="";gToc.empty=true;}r.bodyContent=m.innerHTML;var s=gLayout.getTopICommentsWidth();var p=new CY.Overlay({zIndex:3,shim:false,visible:false,headerContent:r.headerContent,bodyContent:r.bodyContent,xy:[3,30],width:s});p.get("contentBox").addClass("c-toc");p.get("contentBox").set("id","the-toc");p.render("#leftcolumn");CY.get("#"+gToc.tocTitleId).set("innerHTML",gettext("Table of contents"));gToc.overlay=p;var i=null;i=new CY.Anim({node:p.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gToc.animationHide=i;i.set("to",{opacity:0});gToc["animationHide-handle"]=i.on("end",onTocHideAnimEnd,gToc);var q=null;q=new CY.Anim({node:p.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gToc.animationShow=q;q.set("to",{opacity:1});gToc["animationShow-handle"]=q.on("end",onTocShowAnimEnd,gToc);getElementsByClassName("c-toc")[0].style.width=s+"px";};toggleTocFn=function(){if(isTocVisible()){hideToc();}else{showToc();}};hideToc=function(){gToc.overlay.hide();};onTocHideAnimEnd=function(){this.overlay.hide();gSync.resume();};onTocShowAnimEnd=function(){gSync.resume();};showToc=function(){removeFormErrMsg(gToc.tocId);gIComments.hide();gToc.overlay.show();};isTocVisible=function(){if(gToc!=null){return gToc.overlay.get("visible");}return false;};function getElementsByTagNames(l,k){if(!k){var k=document;}var j=l.split(",");var m=new Array();for(var n=0;n<j.length;n++){var o=k.getElementsByTagName(j[n]);for(var p=0;p<o.length;p++){m.push(o[p]);}}var i=m[0];if(!i){return[];}if(i.sourceIndex){m.sort(function(a,b){return a.sourceIndex-b.sourceIndex;});}else{if(i.compareDocumentPosition){m.sort(function(a,b){return 3-(a.compareDocumentPosition(b)&6);});}}return m;}var getElementsByClassName=function(d,e,f){if(document.getElementsByClassName){getElementsByClassName=function(i,a,n){n=n||document;var r=n.getElementsByClassName(i),b=(a)?new RegExp("\\b"+a+"\\b","i"):null,q=[],o;for(var p=0,c=r.length;p<c;p+=1){o=r[p];if(!b||b.test(o.nodeName)){q.push(o);}}return q;};}else{if(document.evaluate){getElementsByClassName=function(j,a,s){a=a||"*";s=s||document;var y=j.split(" "),c="",u="http://www.w3.org/1999/xhtml",b=(document.documentElement.namespaceURI===u)?u:null,x=[],A,z;for(var w=0,v=y.length;w<v;w+=1){c+="[contains(concat(' ', @class, ' '), ' "+y[w]+" ')]";}try{A=document.evaluate(".//"+a+c,s,b,0,null);}catch(t){A=document.evaluate(".//"+a+c,s,null,0,null);}while((z=A.iterateNext())){x.push(z);}return x;};}else{getElementsByClassName=function(a,B,b){B=B||"*";b=b||document;var w=a.split(" "),C=[],A=(B==="*"&&b.all)?b.all:b.getElementsByTagName(B),c,m=[],k;for(var v=0,z=w.length;v<z;v+=1){C.push(new RegExp("(^|\\s)"+w[v]+"(\\s|$)"));}for(var x=0,D=A.length;x<D;x+=1){c=A[x];k=false;for(var y=0,l=C.length;y<l;y+=1){k=C[y].test(c.className);if(!k){break;}}if(k){m.push(c);}}return m;};}}return getElementsByClassName(d,e,f);};IComment=function(){this.commentId=null;var C=gLayout.getTopICommentsWidth();var N=gConf.iCommentLeftPadding;var w=gettext("change comment state to pending");var A=gettext("change comment state to approved");var J=gettext("change comment state to unapproved");var x=gettext("cancel changing the state of this comment");var L=gettext("pending");var K=gettext("approved");var B=gettext("unapproved");var M=gettext("cancel");var y=gettext("show replies");var v=gettext("change to:");var F=ngettext("reply","replies",1);var H=gettext("edit comment");var E=gettext("delete comment");var z=gettext("edit");var I=gettext("delete");var D=gettext("close");var G=gettext("show scope");var u=gettext("Comment is detached: it was created on a previous version and text it applied to has been modified or removed.");this.overlay=new CY.Overlay({zIndex:3,shim:false,visible:false,width:C,xy:[N,0],headerContent:'<div class="icomment-header"><div class="c-iactions"><a class="c-moderate c-action" title="">vis</a> <a class="c-edit c-action" title="'+H+'" alt="'+H+'">'+z+'</a> <a class="c-delete c-action" title="'+E+'" alt="'+E+'">'+I+'</a> </div><div class="c-state-actions displaynone">'+v+'&nbsp;<a class="c-state-pending c-action" title="'+w+'" alt="'+w+'">'+L+'</a> <a class="c-state-approved c-action" title="'+A+'" alt="'+A+'">'+K+'</a> <a class="c-state-unapproved c-action" title="'+J+'" alt="'+J+'">'+B+'</a> <a class="c-state-cancel c-action" title="'+x+'" alt="'+x+'">'+M+'</a> </div><div class="c-no-scope-msg">'+u+'</div><a class="c-show-scope c-action" title="'+G+'" alt="'+G+'"><em>-</em></a><a class="c-close c-action" title="'+D+'" alt="'+D+'"><em>X</em></a></div>',bodyContent:'<div class="icomment-body"><span class="c-content"></span><span class="c-ireplyactions"><a class="c-readreplies c-action" title="'+y+'" alt="'+y+'">'+y+'</a> <a class="c-reply c-action" title="'+F+'" alt="'+F+'">'+F+"</a>&nbsp;</span></div>"});this.overlay.get("contentBox").addClass("c-comment");this.overlay.render("#leftcolumn");this.animation=new CY.Anim({node:this.overlay.get("boundingBox"),duration:gPrefs.get("general","animduration"),easing:CY.Easing.easeOut});this.overlay.get("contentBox").query(".c-close").on("click",this.onCloseCommentClick,this);this.overlay.get("contentBox").query(".c-moderate").on("click",this.onModerateCommentClick,this);this.overlay.get("contentBox").query(".c-state-pending").on("click",this.onPendingCommentClick,this);this.overlay.get("contentBox").query(".c-state-approved").on("click",this.onApprovedCommentClick,this);this.overlay.get("contentBox").query(".c-state-unapproved").on("click",this.onUnapprovedCommentClick,this);this.overlay.get("contentBox").query(".c-state-cancel").on("click",this.onCancelStateChangeClick,this);this.overlay.get("contentBox").query(".c-edit").on("click",this.onEditCommentClick,this);this.overlay.get("contentBox").query(".c-delete").on("click",this.onDeleteCommentClick,this);this.overlay.get("contentBox").query(".c-reply").on("click",this.onReplyCommentClick,this);this.overlay.get("contentBox").query(".c-readreplies").on("click",this.onReadRepliesCommentClick,this);this.overlay.get("contentBox").query(".icomment-header").on("mouseenter",this.onMouseEnterHeader,this);this.overlay.get("contentBox").query(".icomment-header").on("mouseleave",this.onMouseLeaveHeader,this);this.overlay.get("contentBox").on("click",this.onCommentClick,this);};IComment.prototype={onCloseCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.closeComment(this);}},onModerateCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-iactions").addClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").removeClass("displaynone");}},onPendingCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"pending");}},onApprovedCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"approved");}},onUnapprovedCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.moderateComment(this,"unapproved");}},onCancelStateChangeClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-iactions").removeClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").addClass("displaynone");}},onDeleteCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.removeComment(this);}},onEditCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.showEditForm(this);}},onReplyCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.showReplyForm(this);}},onReadRepliesCommentClick:function(b){b.halt();if(readyForAction()&&this.isVisible()){gSync.openComment(this);}},onCommentClick:function(k){if(readyForAction()&&this.isVisible()){if(k.target.get("target")=="_blank"){var e=k.target;var i=sv_site_url+sv_text_view_show_comment_url;if(e.get("href").indexOf(i)==0){var h=(new RegExp("comment_id_key=([^&]*)","g")).exec(e.get("href"));if(h!=null){var l=h[1];var j=gDb.getCommentByIdKey(l);if(j!=null){k.halt();if(!e.hasClass("c-permalink")){checkForOpenedDialog(null,function(){gSync.showSingleComment(j);});}}}}}else{if(gShowingAllComments){if(!this._isHostingAForm()){var j=gDb.getComment(this.commentId);checkForOpenedDialog(null,function(){if(j!=null){gSync.showSingleComment(j);}});}}else{gSync.activate(this);}}}},onMouseEnterHeader:function(){if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-permalink").removeClass("displaynone");}},onMouseLeaveHeader:function(){if(readyForAction()&&this.isVisible()){this.overlay.get("contentBox").query(".c-permalink").addClass("displaynone");}},setWidth:function(b){this.overlay.get("boundingBox").setStyle("width",b+"px");},activate:function(){this.overlay.get("boundingBox").addClass("c-focus-comment");},deactivate:function(){this.overlay.get("boundingBox").removeClass("c-focus-comment");},hide:function(){if(gIComments.isTopActive(this.commentId)){if(!gIComments.activateVisibleNext()){gIComments.deactivate();}}if(this.isVisible()){this.overlay.hide();this.overlay.blur();}},hideContent:function(){this.overlay.get("contentBox").query(".icomment-header").addClass("displaynone");this.overlay.get("contentBox").query(".icomment-body").addClass("displaynone");},showContent:function(){this.overlay.get("contentBox").query(".icomment-header").removeClass("displaynone");this.overlay.get("contentBox").query(".icomment-body").removeClass("displaynone");},isVisible:function(){return this.overlay.get("visible");},show:function(){this.hideReadRepliesLnk();return this.overlay.show();},showReadRepliesLnk:function(){this.overlay.get("contentBox").query(".c-readreplies").removeClass("displaynone");},hideReadRepliesLnk:function(){this.overlay.get("contentBox").query(".c-readreplies").addClass("displaynone");},changeModeration:function(c){var d=this.overlay.get("contentBox").query(".c-moderate");d.set("innerHTML",gettext(c.state));d.removeClass("c-state-approved");d.removeClass("c-state-pending");d.removeClass("c-state-unapproved");d.addClass("c-state-"+c.state);this.overlay.get("contentBox").query(".c-iactions").removeClass("displaynone");this.overlay.get("contentBox").query(".c-state-actions").addClass("displaynone");},isfetched:function(){return(this.commentId!=null);},unfetch:function(){this.commentId=null;},fetch:function(z){this.commentId=z.id;var F=this.overlay.get("boundingBox");if(z.start_wrapper!=-1){F.addClass("c-has-scope");F.removeClass("c-has-no-scope");}else{F.addClass("c-has-no-scope");F.removeClass("c-has-scope");}if(z.reply_to_id!=null){F.addClass("c-is-reply");}else{F.removeClass("c-is-reply");}var B=interpolate(gettext("last modified on %(date)s"),{date:z.modified_user_str},true);var v=(z.modified==z.created)?"":'<a title="'+B+'"> * </a>';var x=gettext("Permalink to this comment");var s='<a class="c-permalink displaynone c-action" target="_blank" title="'+x+'" href="" >¶&nbsp;</a>';var w=interpolate(gettext("by %(name)s, created on %(date)s"),{name:z.name,date:z.created_user_str},true);var E='<span class="c-header"><div class="c-header-title">'+z.title+s+'</div><div class="c-infos">'+w+"</div></span>";var D=CY.Node.create(E);var r=F.query(".c-header");if(r==null){F.query(".icomment-header").insertBefore(D,F.one(".c-iactions"));}else{r.get("parentNode").replaceChild(D,r);}var A=CY.Node.create('<div class="c-tags"><span class="c-tags-infos">tags:</span>'+z.tags+"</div>");var t=F.query(".c-tags");if(t==null){F.query(".icomment-header").appendChild(A);}else{t.get("parentNode").replaceChild(A,t);}if(z.tags==""){A.addClass("displaynone");}var H=CY.Node.create('<div class="c-cat">'+gettext("category")+':&nbsp;<span class="c-cat-val c-cat-'+z.category+'">'+categories[z.category]+"</span></div>");var y=F.query(".c-cat");if(y==null){F.query(".icomment-header").appendChild(H);}else{y.get("parentNode").replaceChild(H,y);}if(z.category==0){H.addClass("displaynone");}var C=CY.Node.create('<span class="c-content">'+z.content_html+"</span>");var G=F.query(".c-content");if(G==null){F.query(".icomment-body").appendChild(C);}else{G.get("parentNode").replaceChild(C,G);}if(sv_prefix==""){F.query(".c-permalink").set("href",sv_site_url+z.permalink);}else{comment_id_delta_prefix=sv_delta!=""?Array(parseInt(sv_delta)+1).join(","):"";F.query(".c-permalink").set("href",top.location.protocol+"//"+top.location.hostname+top.location.pathname+"?comment_id_key="+comment_id_delta_prefix+z.id_key);}this.changeModeration(z);var u=F.queryAll(".c-content a");if(u!=null){u.setAttribute("target","_blank");}u=F.queryAll(".c-header-title a");if(u!=null){u.setAttribute("target","_blank");}this.permAdapt(z);},permAdapt:function(h){var f=this.overlay.get("contentBox").query(".c-delete");if(f){if(!h.can_delete){f.addClass("displaynone");}else{f.removeClass("displaynone");}}var g=this.overlay.get("contentBox").query(".c-edit");if(g){if(!h.can_edit){g.addClass("displaynone");}else{g.removeClass("displaynone");}}var i=this.overlay.get("contentBox").query(".c-reply");if(i){if(!hasPerm("can_create_comment")){i.addClass("displaynone");}else{i.removeClass("displaynone");}}var j=this.overlay.get("contentBox").query(".c-moderate");if(j){if(!h.can_moderate){j.addClass("displaynone");}else{j.removeClass("displaynone");}}},setThreadPad:function(b){this.overlay.get("contentBox").query(".yui-widget-hd").setStyle("paddingLeft",b+"px");this.overlay.get("contentBox").query(".yui-widget-bd").setStyle("paddingLeft",b+"px");},setPosition:function(c){var d=this.overlay.get("boundingBox");d.setStyle("opacity",1);d.setXY(c);},getPosition:function(c){var d=this.overlay.get("boundingBox");return d.getXY();},onAnimationEnd:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEnd();}},onAnimationEndFocus:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEndFocus();}},onAnimationEndReply:function(){if(!CY.Lang.isUndefined(this["animation-handle"])&&!CY.Lang.isNull(this["animation-handle"])){this["animation-handle"].detach();this["animation-handle"]=null;}gIComments.signalAnimationEnd();if(gIComments.animationsEnded()){gIComments.whenAnimationsEndReply();}},setAnimationToPosition:function(g,f,h){var e=this.overlay.get("boundingBox");if(gPrefs.get("general","animduration")<0.011){e.setXY(g);}this.animation.set("to",{xy:g});this.animation.set("duration",gPrefs.get("general","animduration"));if(f){if(h){this["animation-handle"]=this.animation.on("end",this.onAnimationEndReply,this);}else{this["animation-handle"]=this.animation.on("end",this.onAnimationEndFocus,this);}}else{this["animation-handle"]=this.animation.on("end",this.onAnimationEnd,this);}return this.animation;},getHeight:function(){return this.overlay.get("boundingBox").get("offsetHeight");},scrollIntoView:function(){if(!this.overlay.get("contentBox").inViewportRegion()){this.overlay.get("contentBox").scrollIntoView(true);}},_isHostingAForm:function(){return(this.isVisible()&&((gNewReplyHost!=null&&gNewReplyHost==this)||(gEditICommentHost!=null&&gEditICommentHost==this)));}};hasPerm=function(b){return(-1!=CY.Array.indexOf(sv_user_permissions,b));};paintCommentScope=function(b){if(b.reply_to_id==null&&b.start_wrapper!=-1){var a={start:{elt:document.getElementById("sv_"+b.start_wrapper),offset:b.start_offset},end:{elt:document.getElementById("sv_"+b.end_wrapper),offset:b.end_offset}};if(document.getElementById("sv_"+b.start_wrapper)==null){warn_server({from:"paintCommentScope",start_wrapper:b.start_wrapper});}else{if(document.getElementById("sv_"+b.end_wrapper)==null){warn_server({from:"paintCommentScope",end_wrapper:b.end_wrapper});}else{a.start=_convertSelectionFromCSToCC(a.start);a.end=_convertSelectionFromCSToCC(a.end);renderComment(a,b.id);}}}};getCommentIdsFromClasses=function(b){var a=[];var e=b.className.split(" ");for(var d=0,c=e.length;d<c;d++){if(e[d].indexOf("c-id-")==0){a.push(parseInt(e[d].substring("c-id-".length)));}}return a;};renderComment=function(d,c){var a=d.start["offset"];var b=d.end["offset"];var f=d.start["elt"];var e=d.end["elt"];if((f!=null)&&(e!=null)&&_getTextNodeContent(f)!=""&&_getTextNodeContent(e)!=""){markWholeNodesAsComments(f,e,c);markEndsAsComments(f,a,e,b,c);}};markWholeNodesAsComments=function(d,c,b){var a=_findCommonAncestor(d,c);_dynSpanToAnc(d,a,b,false);_dynSpanToAnc(c,a,b,true);_dynSpanInBetween(a,d,c,b);};_setTextNodeContent=function(a,b){CY.DOM.setText(a,b);};_getTextNodeContent=function(a){return CY.DOM.getText(a);};markEndsAsComments=function(d,i,l,j,h){var n=_getTextNodeContent(d).substring(0,i);var o=_getTextNodeContent(d).substring(i);var p=_getTextNodeContent(l).substring(0,j);var g=_getTextNodeContent(l).substring(j);var b=(d===l);if(o!=""){if(CY.DOM.hasClass(d,"c-c")){var f=null,k=null,c=null,a=null;var m=(b)?_getTextNodeContent(d).substring(i,j):o;if(b&&(g!="")){c=d;f=c;}if(m!=""){if(f==null){k=d;}else{k=_yuiCloneNode(d);f.parentNode.insertBefore(k,f);}f=k;}if(n!=""){if(f==null){a=d;}else{a=_yuiCloneNode(d);f.parentNode.insertBefore(a,f);}f=a;}if(c!=null){_setTextNodeContent(c,g);}if(k!=null){_setTextNodeContent(k,m);_addIdClass(k,h);}if(a!=null){_setTextNodeContent(a,n);}}}if((!b)&&(p!="")){if(CY.DOM.hasClass(l,"c-c")){var f=null,e=null,c=null;if(g!=""){c=l;f=l;}if(p!=""){if(f==null){e=l;}else{e=_yuiCloneNode(l);f.parentNode.insertBefore(e,f);}f=e;}if(c!=null){_setTextNodeContent(c,g);}if(e!=null){_addIdClass(e,h);_setTextNodeContent(e,p);}}}};_yuiCloneNode=function(b){var a=CY.Node.getDOMNode(CY.get("#"+b.id).cloneNode(true));a.id=CY.guid();return a;};_dynSpanToAnc=function(a,e,d,f){var g=a;while((g!=null)&&(g!==e)&&(g.parentNode!==e)){var b=null;if(f){b=g.previousSibling;}else{b=g.nextSibling;}if(b==null){g=g.parentNode;}else{g=b;_recAddComment(g,d);}}};_dynSpanInBetween=function(g,h,f,d){var b=h;var e=null;while(b){if(b.parentNode===g){e=b;break;}b=b.parentNode;}if(e!=null){b=f;var c=null;while(b){if(b.parentNode===g){c=b;break;}b=b.parentNode;}if(c!=null){b=e.nextSibling;while((b!=null)&&(b!==c)){_recAddComment(b,d);b=b.nextSibling;}}}};_bruteContains=function(a,b){while(b){if(a===b){return true;}b=b.parentNode;}return false;},_addIdClass=function(a,b){CY.DOM.addClass(a,"c-id-"+b);var c=_findParentBlockElt(a);if(c!=null){_unpaintCategories(c);_repaintCategories(a,c);}_updateCommentCounter(a);};_removeIdClass=function(a,b){CY.DOM.removeClass(a,"c-id-"+b);var c=_findParentBlockElt(a);if(c!=null){_unpaintCategories(c);_repaintCategories(a,c,b);}_updateCommentCounter(a);};_removeIdClasses=function(a){var b=_cgetRegExp("(?:^|\\s+)c-id-(?:\\d+)","g");a.className=a.className.replace(b," ");_updateCommentCounter(a);var c=_findParentBlockElt(a);if(c!=null){_unpaintCategories(c);}};_findParentBlockElt=function(a){var d=a;var c=d.currentStyle||window.getComputedStyle(d,"");var b=c.display;while(d!=null&&b!="block"){d=d.parentElement;c=d.currentStyle||window.getComputedStyle(d,"");b=c.display;}return d;};_unpaintCategories=function(a){CY.DOM.removeClass(a,"cat1");CY.DOM.removeClass(a,"cat2");CY.DOM.removeClass(a,"cat3");CY.DOM.removeClass(a,"cat4");CY.DOM.removeClass(a,"cat5");};_repaintCategories=function(b,f,d){var e=parseInt(getWrapperAncestor(b).id.substr(3));var a=gDb.comments.length;for(var c=0;c<a;c++){if(c in gDb.comments){var g=gDb.comments[c];if((d==null||g.id!=d)&&g.start_wrapper<=e&&g.end_wrapper>=e){if(g.category){CY.DOM.addClass(f,"cat"+g.category);}}}}};_recAddComment=function(a,b){if(CY.DOM.hasClass(a,"c-c")){_addIdClass(a,b);}else{var d=a.firstChild;while(d!=null){_recAddComment(d,b);d=d.nextSibling;}}};_findCommonAncestor=function(c,a){if(_bruteContains(c,a)){return c;}else{var b=a;while((b!=null)&&!_bruteContains(b,c)){b=b.parentNode;}return b;}};_cregexCache={};_cgetRegExp=function(b,a){a=a||"";if(!_cregexCache[b+a]){_cregexCache[b+a]=new RegExp(b,a);}return _cregexCache[b+a];};_updateCommentCounter=function(b){var c=_cgetRegExp("(?:^|\\s+)c-id-(?:\\d+)","g");var d=b.className.match(c);var a=(d==null)?0:d.length;c=_cgetRegExp("(?:^|\\s+)c-count-(?:\\d+)","g");b.className=b.className.replace(c," ");CY.DOM.addClass(b,"c-count-"+a+" ");if(a>0){b.setAttribute("title",a+ngettext(" comment"," comments",a));if(a>25){CY.DOM.addClass(b,"c-count-25");}}};_convertSelectionFromCCToCS=function(b){var d=b.offset;var a=b.elt.parentNode;var c=b.elt.previousSibling;while(c!=null){d+=_getTextNodeContent(c).length;c=c.previousSibling;}return{elt:a,offset:d};};_convertSelectionFromCSToCC=function(d){var a={elt:null,offset:-1};var f=null;var e=d.elt.firstChild;var c=0;while(e!=null){var b=c;c+=_getTextNodeContent(e).length;if(c>=d.offset){a.elt=e;a.offset=d.offset-b;break;}e=e.nextSibling;}return a;};unpaintCommentScope=function(k){var j=k.id;var r="c-id-"+j;var m=[];var t=CY.all("."+r);if(t!=null){for(var h=0,d=t.size();h<d;h++){var q=t.item(h);if(q.hasClass("c-c")){var l=CY.Node.getDOMNode(q);_removeIdClass(l,j);var f=getCommentIdsFromClasses(l);quicksort(f);var a=q.get("previousSibling");if(a!=null){var b=CY.Node.getDOMNode(a);var s=getCommentIdsFromClasses(b);quicksort(s);if(areSortedArraysEqual(f,s)){_setTextNodeContent(l,_getTextNodeContent(b)+_getTextNodeContent(l));m.push(b);}}var e=q.get("nextSibling");if(e!=null){var o=CY.Node.getDOMNode(e);var g=getCommentIdsFromClasses(o);quicksort(g);if(areSortedArraysEqual(f,g)){l.firstChild.data=l.firstChild.data+o.firstChild.data;m.push(o);}}}else{alert("HAS NO c-c ? : "+commentNode.get("id")+" , innerHTML :"+commentNode.get("innerHTML"));return;}}}for(var h=0,d=m.length;h<d;h++){m[h].parentNode.removeChild(m[h]);}};unpaintAllComments=function(){var k=CY.all(".c-s");var f=[];for(var e=0,a=k.size();e<a;e++){var h=k.item(e);var d=h.get("firstChild");var j=CY.Node.getDOMNode(h.get("firstChild"));_removeIdClasses(j);var b=d.get("nextSibling");while(b!=null){var g=CY.Node.getDOMNode(b);j.firstChild.data=j.firstChild.data+g.firstChild.data;f.push(g);b=b.get("nextSibling");}}for(var e=0,a=f.length;e<a;e++){f[e].parentNode.removeChild(f[e]);}};showScope=function(b){var a=CY.all(".c-id-"+b);if(a!=null){a.addClass("c-scope");}};hideScopeAnyway=function(){var a=CY.all(".c-scope");if(a!=null){a.removeClass("c-scope");}};getWrapperAncestor=function(a){var b=a;while(b!=null){if(CY.DOM.hasClass(b,"c-s")){return b;}b=b.parentNode;}return null;};hasWrapperAncestor=function(a){return(getWrapperAncestor(a)!=null);};getSelectionInfo=function(){var J=null,m=null,D=0,c=0,h="";if(window.getSelection){var r=window.getSelection();if(r.rangeCount>0){var l=r.getRangeAt(0);h=l.toString();if(h!=""){var E=document.createRange();E.setStart(r.anchorNode,r.anchorOffset);E.collapse(true);var B=document.createRange();B.setEnd(r.focusNode,r.focusOffset);B.collapse(false);var I=(B.compareBoundaryPoints(2,E)==1);J=(I)?r.anchorNode.parentNode:r.focusNode.parentNode;if(J.nodeName=="mi"||J.nodeName=="mo"){J=J.parentElement.parentElement.parentElement.parentElement;}innerStartNode=(I)?r.anchorNode:r.focusNode;m=(I)?r.focusNode.parentNode:r.anchorNode.parentNode;if(m.nodeName=="mi"||m.nodeName=="mo"){m=m.parentElement.parentElement.parentElement.parentElement;}innerEndNode=(I)?r.focusNode:r.anchorNode;D=(I)?r.anchorOffset:r.focusOffset;c=(I)?r.focusOffset:r.anchorOffset;if(!hasWrapperAncestor(m)&&hasWrapperAncestor(J)){var z=document.createRange();z.setStart(innerStartNode,D);var b=getWrapperAncestor(J);var q=b;z.setEndAfter(q);var f=parseInt(b.id.substring("sv_".length));while(z.toString().length<l.toString().length){f++;var t=CY.get("#sv_"+f);if(t){q=CY.Node.getDOMNode(t);z.setEndAfter(q);}else{break;}}m=q.lastChild;c=CY.DOM.getText(m).length;}else{if(!hasWrapperAncestor(J)&&hasWrapperAncestor(m)){var z=document.createRange();z.setEnd(innerEndNode,c);var g=getWrapperAncestor(m);var p=g;z.setStartBefore(p);var f=parseInt(g.id.substring("sv_".length));while(z.toString().length<l.toString().length){f--;var t=CY.get("#sv_"+f);if(t){p=CY.Node.getDOMNode(t);z.setStartBefore(p);}else{break;}}J=p.firstChild;D=0;}else{if(!hasWrapperAncestor(J)&&!hasWrapperAncestor(m)){var o=h.length;var n=[];for(var f=0;;f++){var G=CY.get("#sv_"+f);if(G==null){break;}else{var x=G.get("text");if(h.indexOf(x)==0){n.push(f);}}}var y=[];for(var f=0;;f++){var G=CY.get("#sv_"+f);if(G==null){break;}else{var x=G.get("text");if(h.indexOf(x)==(o-x.length)){y.push(f);}}}var w=false;for(var C=0;C<n.length;C++){for(var A=0;A<y.length;A++){var v=document.createRange();var k=CY.Node.getDOMNode(CY.get("#sv_"+n[C]));var F=CY.Node.getDOMNode(CY.get("#sv_"+y[A]));v.setStartBefore(k);v.setEndAfter(CY.Node.getDOMNode(F));if((-1<v.compareBoundaryPoints(0,l))&&(1>v.compareBoundaryPoints(2,l))){J=k.firstChild;D=0;m=F.lastChild;c=CY.DOM.getText(F).length;w=true;break;}}if(w){break;}}}}}E.detach();B.detach();}else{return null;}}else{return null;}}else{if(document.selection){var d=document.selection.createRange();if(d.text.length==0){return null;}var a=d.parentElement();var H=d.duplicate();var u=d.duplicate();H.collapse(true);u.collapse(false);J=H.parentElement();while(H.moveStart("character",-1)!=0){if(H.parentElement()!=J){break;}D++;}m=u.parentElement();while(u.moveEnd("character",-1)!=0){if(u.parentElement()!=m){break;}c++;}h=d.text;}}if(!hasWrapperAncestor(J)||!hasWrapperAncestor(m)){return null;}return{text:h,start:{elt:J,offset:D},end:{elt:m,offset:c}};};Preferences=function(){this.prefs={};};Preferences.prototype={init:function(){this._read();},_read:function(){for(var b in gConf.defaultPrefs){this.prefs[b]={};for(var a in gConf.defaultPrefs[b]){var c=null;if(b=="user"&&(a=="name"||a=="email")){c=CY.Cookie.get("user_"+a);}else{c=CY.Cookie.getSub(b,a);}this.prefs[b][a]=(c==null)?gConf.defaultPrefs[b][a]:c;}}},persist:function(b,a,d){var c={path:"/",expires:(new Date()).setFullYear(2100,0,1)};if(b=="user"&&(a=="name"||a=="email")){CY.Cookie.set("user_"+a,d,c);}else{CY.Cookie.setSub(b,a,d,c);}this.prefs[b][a]=d;},get:function(b,a){return this.prefs[b][a];},readDefault:function(b,a){return gConf.defaultPrefs[b][a];},reset:function(a){for(var b=0;b<a.length;b++){var d=a[b];for(var c in gConf.defaultPrefs[d]){this.persist(d,c,gConf.defaultPrefs[d][c]);}}}};gNoSelectionYet=gettext("No selection yet");gFormHtml={formStart:'<form id="###" onsubmit="return false;">',nameInput:gettext("Username:")+'<center><input id="###" name="name" class="n_name user_input" style="padding:1px;" type="text"></input></center>',emailInput:gettext("E-mail address:")+'<center><input id="###" name="email" class="n_email user_input" style="padding:1px;" type="text"></input></center>',titleInput:gettext("Title:")+'<center><input id="###" name="title" class="n_title comment_input" style="padding:1px;" type="text"></input></center>',contentInput:gettext("Content:")+'<center><textarea id="###" name="content" class="n_content comment_input" rows="10" style="padding:1px;"></textarea></center>',tagsInput:gettext("Tag:")+'<center><input id="###" name="tags" class="n_tags comment_input" style="padding:1px;" type="text"></input></center>',hidden:'<input id="###" class="comment_input" name="???" type="hidden" value=""></input>',formEnd:"</form>",changeScope:'<div id="###">'+gettext("Modify comment's scope:")+'<input type="checkbox" name="change_scope"></input></div>',headerTitle:'<center><div id="###" class="c-header-title"></div></center>',currentSel:'<div id="###">'+gettext("Comment will apply to this selection:")+'<br/><div class="current_sel"><div id="???" class="current_sel_ins">'+gNoSelectionYet+"</div></div>#hiddeninput#</div>",btns:'<center><input id="###" type="button" value="'+gettext("Save")+'" /><input id="???" type="button" value="'+gettext("Cancel")+'" /></center>',closeIcon:'<a id="###" class="c-close" title="'+gettext("close")+'"><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</em></a>'};getHtml=function(g){ret={};ret.headerContent="";if("closeBtnId" in g){ret.headerContent+=gFormHtml.closeIcon.replace("###",g.closeBtnId);}ret.headerContent+=gFormHtml.headerTitle.replace("###",g.formTitleId);var b="";if("changeScopeInputId" in g){b=gFormHtml.changeScope.replace("###",g.changeScopeInputId);}var f="<center>"+gFormHtml.hidden.replace("###",g.selectionPlaceId).replace("???","selection_place")+"</center>";var a=gFormHtml.currentSel.replace("###",g.currentSelId).replace("???",g.currentSelIdI).replace("#hiddeninput#",f);var e=gFormHtml.btns.replace("###",g.addBtnId).replace("???",g.cancelBtnId);var d=gFormHtml.formStart.replace("###",g.formId)+b+a;if("nameInputId" in g){d=d+gFormHtml.nameInput.replace("###",g.nameInputId);}if("emailInputId" in g){d=d+gFormHtml.emailInput.replace("###",g.emailInputId);}d=d+gFormHtml.titleInput.replace("###",g.titleInputId)+gFormHtml.contentInput.replace("###",g.contentInputId);categories=CY.JSON.parse(sv_categories);if(categories.hasOwnProperty("0")){category_options="";for(c in categories){category_options+='<option value="'+c+'">'+categories[c]+"</option>";}gFormHtml.categoryInput=gettext("Category:")+'&nbsp;<select id="###" name="category" class="n_category comment_input" style="padding:1px;" type="text">'+category_options+"</select>";d=d+'<span class="n_category_input">'+gFormHtml.categoryInput.replace("###",g.categoryInputId)+"<br /></span>";}d=d+gFormHtml.tagsInput.replace("###",g.tagsInputId);d=d+gFormHtml.hidden.replace("###",g.formatInputId).replace("???","format");d=d+gFormHtml.hidden.replace("###",g.startWrapperInputId).replace("???","start_wrapper");d=d+gFormHtml.hidden.replace("###",g.endWrapperInputId).replace("???","end_wrapper");d=d+gFormHtml.hidden.replace("###",g.startOffsetInputId).replace("???","start_offset");d=d+gFormHtml.hidden.replace("###",g.endOffsetInputId).replace("???","end_offset");d=d+gFormHtml.hidden.replace("###",g.keyId).replace("???","comment_key");d=d+gFormHtml.hidden.replace("###",g.editCommentId).replace("???","edit_comment_id");d=d+e+gFormHtml.formEnd;ret.bodyContent=d;return ret;};changeFormFieldsWidth=function(e,d){var a=(d-20)+"px";var b=CY.all("#"+e+" input[type='text']");if(b!=null){b.setStyle("width",a);}b=CY.all("#"+e+" textarea");if(b!=null){b.setStyle("width",a);}};addFormErrMsg=function(k,h,f){var g=document.getElementById(k);var b,j,d,a;for(b=0,a=g.elements.length;b<a;++b){j=g.elements[b];if(j.name==h){d=document.createElement("DIV");CY.DOM.addClass(d,"c-error");d.id=j.id+"-err";d.appendChild(document.createTextNode(f));if(j.parentNode.nextSibling){j.parentNode.parentNode.insertBefore(d,j.parentNode.nextSibling);}else{j.parentNode.parentNode.appendChild(d);}}}};removeFormErrMsg=function(b){var a=CY.all("#"+b+" .c-error");if(a!=null){a.each(function(d){d.get("parentNode").removeChild(d);});}};Layout=function(){};Layout.prototype={init:function(){},isInFrame:function(){return(!CY.Lang.isUndefined(parent)&&parent.location!=location&&CY.Lang.isFunction(parent.f_getFrameFilterData));},isInComentSite:function(){var b=false;try{if(!CY.Lang.isUndefined(sv_site_url)&&!CY.Lang.isUndefined(parent)&&!CY.Lang.isUndefined(parent.parent)){var a=new String(parent.parent.location);b=(a.indexOf(sv_site_url)==0);}}catch(c){b=false;}return b;},sliderValToPx:function(d){var a=CY.DOM.winWidth();if(this.isInFrame()){a=parent.$(parent).width();}var b=d/100;b=Math.min(b,gConf.sliderFixedMin);b=Math.max(b,gConf.sliderFixedMax);var c=b*a;return Math.floor(c);},getTopICommentsWidth:function(){return this.getTopICommentsWidthFromWidth(this.sliderValToPx(gPrefs.get("layout","comments_col_width")));},getTopICommentsWidthFromWidth:function(b){var a=b-(2*gConf.iCommentThreadPadding);return a-7;},setLeftColumnWidth:function(a){CY.get("#contentcolumn").setStyle("marginLeft",a+"px");CY.get("#leftcolumn").setStyle("width",a+"px");},parentInterfaceUnfreeze:function(){if(this.isInFrame()){parent.f_interfaceUnfreeze();}}};_changeIds=function(a,b){if(a.id){a.id=a.id+b;}var d=a.firstChild;while(d!=null){_changeIds(d,b);d=d.nextSibling;}};suffix=0;domDuplicate=function(a){var b=a.cloneNode(true);suffix++;_changeIds(b,"-"+suffix);return b;};getDuplicated=function(a){return document.getElementById(a.id+"-"+suffix);};logSel=function(a){log("text :"+a.text+", start id : "+a.start["elt"].id+" , start offset : "+a.start["offset"]+" , end id : "+a.end["elt"].id+"end offset : "+a.end["offset"]);};log=function(b){var a=document.getElementById("log");a.innerHTML=a.innerHTML+"<li>"+b+"</li>";};urlEncode=function(h){if(!h){return"";}var c=[];for(var f in h){var e=h[f],b=encodeURIComponent(f);var g=typeof e;if(g=="undefined"){c.push(b,"=&");}else{if(g!="function"&&g!="object"){c.push(b,"=",encodeURIComponent(e),"&");}else{if(CY.Lang.isArray(e)){if(e.length){for(var d=0,a=e.length;d<a;d++){c.push(b,"=",encodeURIComponent(e[d]===undefined?"":e[d]),"&");}}else{c.push(b,"=&");}}}}}c.pop();return c.join("");};urlDecode=function(f,h){if(!f||!f.length){return{};}var d={};var b=f.split("&");var c,a,j;for(var e=0,g=b.length;e<g;e++){c=b[e].split("=");a=decodeURIComponent(c[0]);j=decodeURIComponent(c[1]);if(h!==true){if(typeof d[a]=="undefined"){d[a]=j;}else{if(typeof d[a]=="string"){d[a]=[d[a]];d[a].push(j);}else{d[a].push(j);}}}else{d[a]=j;}}return d;};areSortedArraysEqual=function(b,a){if(b.length!=a.length){return false;}for(var d=0,c=b.length;d<c;d++){if(b[d]!=a[d]){return false;}}return true;};quicksort=function(a){_quicksort(a,0,a.length-1);};_quicksort=function(e,g,d){var a,c,f,b;if(d-g==1){if(e[g]>e[d]){b=e[g];e[g]=e[d];e[d]=b;}return;}a=e[parseInt((g+d)/2)];e[parseInt((g+d)/2)]=e[g];e[g]=a;c=g+1;f=d;do{while(c<=f&&e[c]<=a){c++;}while(e[f]>a){f--;}if(c<f){b=e[c];e[c]=e[f];e[f]=b;}}while(c<f);e[g]=e[f];e[f]=a;if(g<f-1){_quicksort(e,g,f-1);}if(f+1<d){_quicksort(e,f+1,d);}};gShowingAllComments=false;if(!Array.prototype.indexOf){Array.prototype.indexOf=function(c,d){for(var b=(d||0),a=this.length;b<a;b++){if(this[b]===c){return b;}}return -1;};}Sync=function(){this._q=null;this._iPreventClick=false;};Sync.prototype={init:function(a){this._q=new CY.AsyncQueue();},setPreventClickOn:function(){CY.log("setPreventClickOn !");if(gLayout.isInFrame()){parent.f_interfaceFreeze();}this._iPreventClick=true;},setPreventClickOff:function(){CY.log("setPreventClickOff !");if(gLayout.isInFrame()){parent.f_interfaceUnfreeze();}this._iPreventClick=false;},removeCommentRet:function(b){var d=b.successfull;var a=(d)?b.failure["iComment"]:b.success["iComment"];if(d){var c=b.returned["filterData"];if(gLayout.isInFrame()){parent.f_updateFilterData(c);}var f=gIComments.getTopPosition()[1];var e=gDb.getComment(a.commentId);this._q.add(function(){unpaintCommentScope(e);gIComments.close(e.id);gIComments.remove(e.id);if(e.reply_to_id!=null){gIComments.refresh(e.reply_to_id);}gDb.del(e);if(gLayout.isInFrame()){if(gDb.comments.length==0&&gDb.allComments.length!=0){parent.f_enqueueMsg(gettext("no filtered comments left"));parent.resetFilter();}else{var g=gDb.computeFilterResults();updateFilterResultsCount(g.nbDiscussions,g.nbComments,g.nbReplies);}}});this._animateTo(f);}this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this.resume();},moderateCommentRet:function(c){var e=c.successfull;var a=(e)?c.failure["iComment"]:c.success["iComment"];if(e){var b=c.returned;var f=b.comment;gDb.upd(f);var d=gLayout.isInFrame()&&!parent.f_isFrameFilterFieldsInit();if(d){parent.resetFilter();this._showSingleComment(f);}else{a.changeModeration(f);}}this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this.resume();},saveCommentRet:function(h){var i=h.successfull;if(i){var l=h.success["formId"];var g=h.returned;removeFormErrMsg(l);if("errors" in g){var k=g.errors;for(var d in k){addFormErrMsg(l,d,k[d]);}this._animateToTop();}else{var b=function(){return(gNewReply!=null)&&(l==gNewReply.ids["formId"]);};var c=function(){return(gICommentForm!=null)&&(l==gICommentForm.formId);};var e=function(){return(gEdit!=null)&&(l==gEdit.ids["formId"]);};if(c()){this.hideICommentForm(cleanICommentForm());}else{if(e()){this._hideEditForm();}else{if(b()){this._hideNewReplyForm();}}}if("ask_for_notification" in g){if(g.ask_for_notification){parent.f_yesNoDialog(gettext("Do you want to be notified of all replies in all discussions you participated in?"),gettext("Reply notification"),function(){var m={method:"POST",data:urlEncode({fun:"ownNotify",key:sv_key,version_key:sv_version_key,email:g.email,active:false})};CY.io(sv_client_url,m);},this,null,function(){var m={method:"POST",data:urlEncode({fun:"ownNotify",key:sv_key,version_key:sv_version_key,email:g.email,active:true})};CY.io(sv_client_url,m);},this,null);}}if("comment" in g){var f=g.comment;gDb.upd(f);var a=gLayout.isInFrame()&&parent.f_isFrameFilterFieldsInit();if(a){parent.resetFilter();}else{if(f.reply_to_id==null){unpaintCommentScope(f);paintCommentScope(f);}}var j=g.filterData;if(gLayout.isInFrame()){parent.f_updateFilterData(j);updateResetFilterResultsCount();}if(b()){if(!a){this._insertReply(f);}}else{this._showSingleComment(f);}}else{this._animateToTop();}}}else{this._q.add({id:"expl",fn:function(){CY.log("in example .........");}});this._q.promote("expl");}this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this.resume();},example:function(){CY.log("in example .........");},moderateComment:function(a,b){var c=gDb.getComment(a.commentId);this._q.add({fn:CY.bind(this.setPreventClickOn,this)},{autoContinue:false,fn:CY.bind(doExchange,null,"editComment",{comment_key:c.key,state:b},null,this.moderateCommentRet,this,{iComment:a},gettext("could not save comment"))}).run();},_saveComment:function(b,a){this._q.add({fn:CY.bind(this.setPreventClickOn,this)},{autoContinue:false,fn:CY.bind(doExchange,null,b,{},a,this.saveCommentRet,this,{formId:a},gettext("could not save comment"))}).run();},editComment:function(){this._saveComment("editComment",gEdit.ids["formId"]);},saveComment:function(a){if(readyForAction()){this._saveComment("addComment",a);}},removeComment:function(a){checkForOpenedDialog(a,function(){if(gLayout.isInFrame()){parent.f_yesNoDialog(gettext("Are you sure you want to delete this comment?"),gettext("Warning"),function(){this.animateToTop();},this,null,function(){var b=gDb.getComment(a.commentId);this._q.add({fn:CY.bind(this.setPreventClickOn,this)},{autoContinue:false,fn:CY.bind(doExchange,null,"removeComment",{comment_key:b.key},null,this.removeCommentRet,this,{iComment:a},gettext("could not remove comment"))}).run();},this,null);}},this,null);},resume:function(b,a){this._q.run();},resetAutoContinue:function(a){this._q.getCallback(a).autoContinue=true;},hideICommentForm:function(a){this._q.add({autoContinue:false,fn:CY.bind(gICommentForm.animationHide.run,gICommentForm.animationHide)});if(a){this._q.add(a);}},showCommentForm:function(a){checkForOpenedDialog(null,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){if(a==null){var b=getSelectionInfo();updateICommentFormSelection(b);}showICommentForm(a);}});this._q.add({autoContinue:false,fn:CY.bind(gICommentForm.animationShow.run,gICommentForm.animationShow)},{fn:CY.bind(this.setPreventClickOff,this)}).run();},this,null);},showEditForm:function(a){checkForOpenedDialog(null,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){showEditForm(a);}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},this,null);},showReplyForm:function(a){checkForOpenedDialog(null,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){instanciateNewReplyForm(a);}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},this,null);},cancelICommentForm:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this.hideICommentForm();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},cancelEdit:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){cancelEditForm();}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},cancelReply:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){cancelNewReplyForm();}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},changeScopeFormClick:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._q.add({fn:function(){changeScopeFormClick();}});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},_hideNewReplyForm:function(){this._q.add({fn:function(){cleanNewReplyForm();cancelNewReplyForm();}});},_hideEditForm:function(){this._q.add({fn:function(){cancelEditForm();}});},_insertReply:function(a){this._q.add({fn:function(){var g=gDb.getComment(a.reply_to_id);var e=gDb.getThreads([g]);var c=e[e.length-2];var d=gIComments.insertAfter(c,a);var h=gIComments.getPosition(a.reply_to_id);d.setPosition(h);var b=gDb.getPath(a);var f=b[b.length-1];if(gIComments.isTopActive(f.id)){d.activate();}d.show();}});this._animateToTop();},_showSingleComment:function(d){if(d!=null){var c=gDb.getPath(d);var b=c[c.length-1];var a=0;if(d.start_wrapper!=-1){a=CY.get(".c-id-"+b.id).getY();}else{a=CY.get("document").get("scrollTop");}this._showComments([b.id],a,false);if(b.replies.length>0){this._animateTo(a);}}},_showFocusSingleComment:function(d,c,b){if(d!=null){var a=0;if(d.start_wrapper!=-1){a=CY.get(".c-id-"+d.id).getY();}else{a=CY.get("document").get("scrollTop");}this._showComments([d.id],a,false);if(d.replies.length>0||b){this._animateToAndFocus(a,c.id,b);}}},showSingleComment:function(a){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._showSingleComment(a);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},showFocusSingleComment:function(c,b,a){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._showFocusSingleComment(c,b,a);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},browse:function(a,b){var c=gIComments.browse(a,b);if(c!=null){this.showSingleComment(c);}},_showComments:function(c,b,a){this._q.add({fn:function(){gShowingAllComments=a;gIComments.hide();hideToc();var d=CY.Array.map(c,function(g){return gDb.getComment(g);});var f=gDb.getThreads(d);gIComments.fetch(f);if(c.length>0){if(a){CY.get("document").set("scrollTop",0);}else{gIComments.activate(c[0]);var e=CY.get(".c-id-"+c[0]);if(e&&!e.inViewportRegion()){e.scrollIntoView(true);if(parent){parent.document.getElementById("outer-north").scrollIntoView(true);}}}}gIComments.setPosition([gConf.iCommentLeftPadding,b]);gIComments.show();}});},_animateTo:function(a){this._q.add({fn:function(){gIComments.setAnimationToPositions(a);}},{id:"animationRun",autoContinue:false,fn:CY.bind(gIComments.runAnimations,gIComments)});},_animateToAndFocus:function(a,c,b){this._q.add({fn:function(){gIComments.setAnimationToPositionsAndFocus(a,c,b);}},{id:"animationRun",autoContinue:false,fn:CY.bind(gIComments.runAnimations,gIComments)});},_animateToTop:function(){var a=gIComments.getTopPosition();if(a!=null){this._animateTo(a[1]);}},animateToTop:function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._animateToTop();this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},showAllComments:function(){checkForOpenedDialog(null,function(){gShowingAllComments=true;var a=CY.Array.map(gDb.comments,function(b){return b.id;});if(parent.$("#browse_by").val()=="scope"){a.sort(function(d,c){if(gDb.ordered_comment_ids.scope.indexOf(d)<gDb.ordered_comment_ids.scope.indexOf(c)){return -1;}if(gDb.ordered_comment_ids.scope.indexOf(d)>gDb.ordered_comment_ids.scope.indexOf(c)){return 1;}return 0;});}this.showComments(a,[0,30],true);},this,null);},showScopeRemovedComments:function(){checkForOpenedDialog(null,function(){gShowingAllComments=true;var b=CY.Array.filter(gDb.comments,function(c){return(c.start_wrapper==-1);});var a=CY.Array.map(b,function(d){return d.id;});if(parent.$("#browse_by").val()=="scope"){a.sort(function(d,c){if(gDb.ordered_comment_ids.scope.indexOf(d)<gDb.ordered_comment_ids.scope.indexOf(c)){return -1;}if(gDb.ordered_comment_ids.scope.indexOf(d)>gDb.ordered_comment_ids.scope.indexOf(c)){return 1;}return 0;});}this.showComments(a,[0,30],true);},this,null);},showComments:function(c,b,a){checkForOpenedDialog(null,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});this._showComments(c,b[1],a);this._animateTo(b[1]);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},this,null);},openComment:function(a){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});var b=gIComments.getTopPosition()[1];this._q.add({fn:function(){gIComments.open(a.commentId);gIComments.refresh(a.commentId);}});this._animateTo(b);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},closeComment:function(a){checkForOpenedDialog(a,function(){this._q.add({fn:CY.bind(this.setPreventClickOn,this)});var b=gIComments.getTopPosition()[1];this._q.add({fn:function(){var c=gDb.getComment(a.commentId);gIComments.close(a.commentId);if(c.reply_to_id!=null){gIComments.refresh(c.reply_to_id);}}});this._animateTo(b);this._q.add({fn:CY.bind(this.setPreventClickOff,this)});this._q.run();},this,null);},activate:function(a){gIComments.activate(a.commentId);}};readyForAction=function(){return !gSync._iPreventClick;};gEditICommentHost=null;gEdit=null;dbgc=null;showEditForm=function(a){if(gEdit==null){gEdit={ids:{formId:CY.guid(),formTitleId:CY.guid(),nameInputId:CY.guid(),emailInputId:CY.guid(),titleInputId:CY.guid(),contentInputId:CY.guid(),tagsInputId:CY.guid(),categoryInputId:CY.guid(),formatInputId:CY.guid(),startWrapperInputId:CY.guid(),endWrapperInputId:CY.guid(),startOffsetInputId:CY.guid(),endOffsetInputId:CY.guid(),changeScopeInputId:CY.guid(),changeScopeInputWrapper:CY.guid(),selectionPlaceId:CY.guid(),keyId:CY.guid(),editCommentId:CY.guid(),currentSelId:CY.guid(),currentSelIdI:CY.guid(),addBtnId:CY.guid(),cancelBtnId:CY.guid()},handlers:{}};}gEditICommentHost=a;gEditICommentHost.hideContent();var c=getHtml(gEdit.ids);var b='<div class="icomment-edit-header">'+c.headerContent+"</div>";var e='<div class="icomment-edit-body">'+c.bodyContent+"</div>";gEditICommentHost.overlay.setStdModContent(CY.WidgetStdMod.HEADER,CY.Node.create(b),CY.WidgetStdMod.AFTER);gEditICommentHost.overlay.setStdModContent(CY.WidgetStdMod.BODY,CY.Node.create(e),CY.WidgetStdMod.AFTER);CY.get("#"+gEdit.ids["formTitleId"]).set("innerHTML",gettext("Edit comment"));var f=gDb.getComment(gEditICommentHost.commentId);CY.get("#"+gEdit.ids["editCommentId"]).set("value",f.id);CY.get("#"+gEdit.ids["keyId"]).set("value",f.key);CY.get("#"+gEdit.ids["changeScopeInputId"]+" input").set("checked",false);if(f.reply_to_id!=null){CY.get("#"+gEdit.ids["changeScopeInputId"]).addClass("displaynone");CY.get("#"+gEdit.ids["categoryInputId"]).addClass("displaynone");CY.get("#"+gEdit.ids["categoryInputId"]).ancestor().addClass("displaynone");}changeScopeFormClick();CY.get("#"+gEdit.ids["nameInputId"]).set("value",f.name);CY.get("#"+gEdit.ids["emailInputId"]).set("value",f.email);if(f.logged_author){CY.get("#"+gEdit.ids["nameInputId"]).setAttribute("disabled",true);CY.get("#"+gEdit.ids["emailInputId"]).setAttribute("disabled",true);}CY.get("#"+gEdit.ids["titleInputId"]).set("value",f.title);CY.get("#"+gEdit.ids["contentInputId"]).set("value",f.content);CY.get("#"+gEdit.ids["tagsInputId"]).set("value",f.tags);if(CY.get("#"+gEdit.ids["categoryInputId"])){CY.get("#"+gEdit.ids["categoryInputId"]).set("value",f.category);}CY.get("#"+gEdit.ids["formatInputId"]).set("value",gConf.defaultCommentFormat);var d=gLayout.getTopICommentsWidth();changeFormFieldsWidth(gEdit.ids["formId"],d);gEdit.handlers["addBtnId"]=CY.on("click",onEditSaveClick,"#"+gEdit.ids["addBtnId"]);gEdit.handlers["cancelBtnId"]=CY.on("click",onEditCancelClick,"#"+gEdit.ids["cancelBtnId"]);gEdit.handlers["changeScope"]=CY.on("click",onChangeScopeClick,"#"+gEdit.ids["changeScopeInputId"]);};onEditSaveClick=function(a){if(readyForAction()){gSync.editComment();}};onEditCancelClick=function(a){if(readyForAction()){gSync.cancelEdit();}};onChangeScopeClick=function(){if(readyForAction()){gSync.changeScopeFormClick();}else{var a=CY.get("#"+gEdit.ids["changeScopeInputId"]+" input");var b=a.get("checked");a.set("checked",!b);}};changeScopeFormClick=function(){var a=CY.get("#"+gEdit.ids["currentSelId"]);if(CY.get("#"+gEdit.ids["changeScopeInputId"]+" input").get("checked")){a.removeClass("displaynone");}else{a.addClass("displaynone");}};cancelEditForm=function(){if(gEditICommentHost!=null){for(var b in gEdit.handlers){if(gEdit.handlers[b]!=null){gEdit.handlers[b].detach();gEdit.handlers[b]=null;}}var a=gEditICommentHost.overlay.get("contentBox").query(".icomment-edit-body");a.get("parentNode").removeChild(a);a=gEditICommentHost.overlay.get("contentBox").query(".icomment-edit-header");a.get("parentNode").removeChild(a);gEditICommentHost.showContent();gEditICommentHost=null;}};gICommentForm=null;instanciateICommentForm=function(){gICommentForm={position:[CY.WidgetPositionExt.TL,CY.WidgetPositionExt.TL],formId:CY.guid(),formTitleId:CY.guid(),titleInputId:CY.guid(),contentInputId:CY.guid(),tagsInputId:CY.guid(),categoryInputId:CY.guid(),formatInputId:CY.guid(),startWrapperInputId:CY.guid(),endWrapperInputId:CY.guid(),startOffsetInputId:CY.guid(),endOffsetInputId:CY.guid(),selectionPlaceId:CY.guid(),keyId:CY.guid(),currentSelId:CY.guid(),currentSelIdI:CY.guid(),addBtnId:CY.guid(),cancelBtnId:CY.guid(),closeBtnId:CY.guid()};if(!sv_loggedIn){gICommentForm.nameInputId=CY.guid();gICommentForm.emailInputId=CY.guid();}var c=getHtml(gICommentForm);var e=gLayout.getTopICommentsWidth();var b=new CY.Overlay({zIndex:3,shim:false,visible:false,headerContent:c.headerContent,bodyContent:c.bodyContent,xy:[10,10],width:e});b.get("contentBox").addClass("c-newcomment");b.render("#leftcolumn");if(!sv_loggedIn){CY.get("#"+gICommentForm.nameInputId).set("value",gPrefs.get("user","name"));CY.get("#"+gICommentForm.emailInputId).set("value",gPrefs.get("user","email"));}CY.get("#"+gICommentForm.formTitleId).set("innerHTML",gettext("New comment"));CY.get("#"+gICommentForm.formatInputId).set("value",gConf.defaultCommentFormat);CY.on("click",onSubmitICommentFormClick,"#"+gICommentForm.addBtnId);CY.on("click",onCancelICommentFormClick,"#"+gICommentForm.cancelBtnId);CY.on("click",onCancelICommentFormClick,"#"+gICommentForm.closeBtnId);gICommentForm.overlay=b;var d=null;d=new CY.Anim({node:b.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gICommentForm.animationHide=d;d.set("to",{opacity:0});gICommentForm["animationHide-handle"]=d.on("end",onICommentFormHideAnimEnd,gICommentForm);var a=null;a=new CY.Anim({node:b.get("boundingBox"),duration:0.3,easing:CY.Easing.easeOut});gICommentForm.animationShow=a;a.set("to",{opacity:1});gICommentForm["animationShow-handle"]=a.on("end",onICommentFormShowAnimEnd,gICommentForm);changeFormFieldsWidth(gICommentForm.formId,e);};cleanICommentForm=function(){CY.get("#"+gICommentForm.currentSelIdI).set("innerHTML",gNoSelectionYet);var a=gICommentForm.overlay.getStdModNode(CY.WidgetStdMod.BODY);a.queryAll(".comment_input").set("value","");CY.get("#"+gICommentForm.formatInputId).set("value",gConf.defaultCommentFormat);if(!sv_loggedIn){a.queryAll(".user_input").set("value","");}};onICommentFormHideAnimEnd=function(){this.overlay.hide();gSync.resume();};onICommentFormShowAnimEnd=function(){gSync.resume();};onSubmitICommentFormClick=function(){if(!sv_loggedIn){var b=CY.get("#"+gICommentForm.nameInputId).get("value");gPrefs.persist("user","name",b);var a=CY.get("#"+gICommentForm.emailInputId).get("value");gPrefs.persist("user","email",a);}gSync.saveComment(gICommentForm.formId);};onCancelICommentFormClick=function(){gSync.cancelICommentForm();};_updateICommentFormSelection=function(c,e,b,a){var d=CY.Node.get("#"+c.currentSelIdI);if(d!=null){d.set("innerHTML",e);}d=CY.get("#"+c.startWrapperInputId);if(d!=null){d.set("value",b.elt.id.substring("sv_".length));}d=CY.get("#"+c.startOffsetInputId);if(d!=null){d.set("value",b.offset);}d=CY.get("#"+c.endWrapperInputId);if(d!=null){d.set("value",a.elt.id.substring("sv_".length));}d=CY.get("#"+c.endOffsetInputId);if(d!=null){d.set("value",a.offset);}};updateICommentFormSelection=function(h){var i=(h==null)?"":h.text;if(i!=""){var f=i;var b=100;if(i.length>b){var a=i.substring(0,(i.substring(0,b/2)).lastIndexOf(" "));var d=i.substring(i.length-b/2);var c=d.substring(d.indexOf(" "));f=a+" ... "+c;}var e=_convertSelectionFromCCToCS(h.start);var g=_convertSelectionFromCCToCS(h.end);_updateICommentFormSelection(gICommentForm,f,e,g);if(gEdit!=null){_updateICommentFormSelection(gEdit.ids,f,e,g);}positionICommentForm();}};showICommentForm=function(){removeFormErrMsg(gICommentForm.formId);if(!sv_loggedIn){if(CY.get("#"+gICommentForm.nameInputId).get("value")==""){CY.get("#"+gICommentForm.nameInputId).set("value",gPrefs.get("user","name"));}if(CY.get("#"+gICommentForm.emailInputId).get("value")==""){CY.get("#"+gICommentForm.emailInputId).set("value",gPrefs.get("user","email"));}}gIComments.hide();hideToc();positionICommentForm();gICommentForm.overlay.show();CY.get("#"+gICommentForm.titleInputId).focus();};isICommentFormVisible=function(){if(gICommentForm!=null){return gICommentForm.overlay.get("visible");}return false;};positionICommentForm=function(){if(gICommentForm!=null){var b=gICommentForm.overlay;var a=b.get("boundingBox");var c=a.get("offsetHeight");var e=a.get("winHeight");var d=gICommentForm.position;if(c>e){d=[CY.WidgetPositionExt.BL,CY.WidgetPositionExt.BL];}b.set("align",{points:d});if(c<=e){b.set("y",b.get("y")+30);}a.setX(a.getX()+gConf.iCommentLeftPadding);}};Db=function(){this.comments=null;this.allComments=null;this.commentsByDbId={};this.allCommentsByDbId={};this.ordered_comment_ids={};};Db.prototype={init:function(){this.allComments=CY.JSON.parse(sv_comments);if(sv_read_only){this.initToReadOnly();}this._computeAllCommentsByDbId();this._reorder();},_del:function(a,e,g){var f=e[g];for(var c=0;c<f.replies.length;c++){var d=f.replies[c].id;this._del(f.replies,e,d);c--;}for(var c=0,b=a.length;c<b;c++){if(a[c].id==g){a.splice(c,1);delete e[g];break;}}},del:function(b){var a=(b.reply_to_id==null)?this.comments:this.commentsByDbId[b.reply_to_id].replies;this._del(a,this.commentsByDbId,b.id);a=(b.reply_to_id==null)?this.allComments:this.allCommentsByDbId[b.reply_to_id].replies;this._del(a,this.allCommentsByDbId,b.id);this._reorder();},_reorder:function(){var l=[];for(var g=0,c=this.allComments.length;g<c;g++){var h=this.allComments[g];var p=false;for(var e=0,o=l.length;e<o;e++){var b=l[e];var d=this.allCommentsByDbId[b];if((h.start_wrapper<d.start_wrapper)||((h.start_wrapper==d.start_wrapper)&&(h.start_offset<d.start_offset))||((h.start_wrapper==d.start_wrapper)&&(h.start_offset==d.start_offset)&&(h.end_wrapper<d.end_wrapper))||((h.start_wrapper==d.start_wrapper)&&(h.start_offset==d.start_offset)&&(h.end_wrapper==d.end_wrapper)&&(h.end_offset<d.end_offset))){l.splice(e,0,h.id);p=true;break;}}if(!p){l.push(h.id);}}this.ordered_comment_ids.scope=l;l=[];var k={};for(var g=0,c=this.allComments.length;g<c;g++){var h=this.allComments[g];var m=h.modified;k[h.id]=this._latest_mod(h);}for(var b in k){var f=this.allCommentsByDbId[b].id;var p=false;for(var g=0,c=l.length;g<c;g++){var n=l[g];if(k[b]<k[n]){l.splice(g,0,f);p=true;break;}}if(!p){l.push(f);}}this.ordered_comment_ids.modif_thread=l;},_latest_mod:function(e){var c=e.modified;for(var b=0;b<e.replies.length;b++){var d=e.replies[b];var a=this._latest_mod(d);if(a>c){c=a;}}return c;},_upd:function(a,f,g){var e=false;for(var d=0,b=a.length;d<b;d++){if(a[d].id==g.id){a.splice(d,1,g);e=true;break;}}if(!e){a.push(g);}f[g.id]=g;},upd:function(c){var a=(c.reply_to_id==null)?this.allComments:this.allCommentsByDbId[c.reply_to_id].replies;this._upd(a,this.allCommentsByDbId,c);var b=CY.clone(c);a=(c.reply_to_id==null)?this.comments:this.commentsByDbId[c.reply_to_id].replies;this._upd(a,this.commentsByDbId,b);this._reorder();},initComments:function(a){this.comments=[];for(var d=0,c=this.allComments.length;d<c;d++){var b=CY.Array.indexOf(a,this.allComments[d].id);if(b!=-1){var e=CY.clone(this.allComments[d]);this.comments.push(e);}}this._computeCommentsByDbId();},_computeCommentsByDbId:function(){this.commentsByDbId={};var b=this.getThreads(this.comments);for(var a=0;a<b.length;a++){this.commentsByDbId[b[a].id]=b[a];}},_computeAllCommentsByDbId:function(){this.allCommentsByDbId={};var b=this.getThreads(this.allComments);for(var a=0;a<b.length;a++){this.allCommentsByDbId[b[a].id]=b[a];}},getThreads:function(c){var a=[];for(var b=0;b<c.length;b++){a.push(c[b]);if(c[b].replies.length>0){a=a.concat(this.getThreads(c[b].replies));}}return a;},_getPath:function(b,e){var a=[e];var d=e;while(d.reply_to_id!=null){d=b[d.reply_to_id];a.push(d);}return a;},getPath:function(a){return this._getPath(this.commentsByDbId,a);},getComment:function(a){return this.commentsByDbId[a];},getCommentByIdKey:function(a){for(var c in this.commentsByDbId){var b=this.commentsByDbId[c];if(b.id_key==a){return b;}}return null;},isChild:function(d,b){var c=this.commentsByDbId[d];var a=(d==b);while((!a)&&(c.reply_to_id!=null)){c=this.commentsByDbId[c.reply_to_id];a=(c.id==b);}return a;},initToReadOnly:function(f,c){for(var b=0,a=this.allComments.length;b<a;b++){var e=this.allComments[b];for(var d in e){if(0==d.indexOf("can_")&&typeof e[d]==="boolean"){e[d]=false;}}}},browsingIndex:function(b){var c={};for(var a in this.ordered_comment_ids){var d=CY.Array.filter(this.ordered_comment_ids[a],function(e){return(e in this.commentsByDbId);},this);c[a]=CY.Array.indexOf(d,b);}return c;},browse:function(b,f,c){var a=this.ordered_comment_ids[b];if(a.length>0){var g=-1;if((f=="prev")||(f=="next")){for(var e=0;e<a.length;e++){var h=a[e];if(h==c){g=(f=="prev")?e-1:e+1;g=(a.length+g)%a.length;break;}}if(g==-1){CY.error("internal error in db browse (was called with a dbId that isn't among the filtered ones)");return null;}}if(f=="last"){g=a.length-1;}if(f=="first"){g=0;}for(var e=g,d=0;(e>=0)&&(e<a.length);d++){var h=a[e];if(h in this.commentsByDbId){return this.commentsByDbId[h];}if((f=="prev")||(f=="last")){e=e-1;}else{e=e+1;}e=(a.length+e)%a.length;if(d>a.length){break;}}CY.error("internal error in db browse (could not find any filtered comment)");}return null;},computeFilterResults:function(q){var a={};if(q){for(key in q){if(key.indexOf("filter_")==0){a[key.substr("filter_".length)]=q[key];}}}else{if(gLayout.isInFrame()){a=parent.f_getFrameFilterData();}}var y=[];var z=[];var c="";if("name" in a){c=a.name;}this.filterByName(c,y,z);var s=[];var e=[];var F="";if("date" in a){F=a.date;}this.filterByDate(F,s,e);var k=[];var j=[];var w="";if("text" in a){w=a.text;}this.filterByText(w,k,j);var A=[];var p=[];var D="";if("tag" in a){D=a.tag;}this.filterByTag(D,A,p);var b=[];var g=[];var d="";if("cat" in a){d=a.cat;}this.filterByCat(d,b,g);var x=[];var h=[];var n="";if("state" in a){n=a.state;}this.filterByState(n,x,h);var f=[];var C=[];for(var B=0,m=y.length;B<m;B++){var v=y[B];if((CY.Array.indexOf(s,v)!=-1)&&(CY.Array.indexOf(k,v)!=-1)&&(CY.Array.indexOf(A,v)!=-1)&&(CY.Array.indexOf(b,v)!=-1)&&(CY.Array.indexOf(x,v)!=-1)){f.push(v);}}for(var B=0,m=z.length;B<m;B++){var v=z[B];if((CY.Array.indexOf(e,v)!=-1)&&(CY.Array.indexOf(j,v)!=-1)&&(CY.Array.indexOf(p,v)!=-1)&&(CY.Array.indexOf(g,v)!=-1)&&(CY.Array.indexOf(h,v)!=-1)){C.push(v);}}var t=C.length,o=f.length;var u=o;for(var B=0,m=C.length;B<m;B++){var v=C[B];var r=this.allCommentsByDbId[v];var E=this._getPath(this.allCommentsByDbId,r);var l=E[E.length-1];var v=l.id;if(CY.Array.indexOf(f,v)==-1){f.push(v);u++;}}return{commentIds:f,nbDiscussions:u,nbComments:o,nbReplies:t};},filterByText:function(c,f,b){var a=new RegExp(c,"gi");for(var e in this.allCommentsByDbId){var d=this.allCommentsByDbId[e];if(c==""||a.exec(d.title)!=null||a.exec(d.content)!=null){if(d.reply_to_id==null){f.push(d.id);}else{b.push(d.id);}}}},filterByName:function(a,c,b){for(var e in this.allCommentsByDbId){var d=this.allCommentsByDbId[e];if(a==""||d.name==a){if(d.reply_to_id==null){c.push(d.id);}else{b.push(d.id);}}}},filterByTag:function(i,e,b){var h=new RegExp("^"+i+"$","");var g=new RegExp("^"+i+", ","");var d=new RegExp(", "+i+", ","");var c=new RegExp(", "+i+"$","");for(var a in this.allCommentsByDbId){var f=this.allCommentsByDbId[a];if((i=="")||h.exec(f.tags)!=null||g.exec(f.tags)!=null||d.exec(f.tags)!=null||c.exec(f.tags)!=null){if(f.reply_to_id==null){e.push(f.id);}else{b.push(f.id);}}}},filterByCat:function(a,f,c){for(var e in this.allCommentsByDbId){var d=this.allCommentsByDbId[e];if(a==""||d.category==a){if(d.reply_to_id==null){f.push(d.id);if(d.replies.length){for(var b in d.replies){c.push(d.replies[b].id);}}}}}},filterByState:function(c,a,b){for(var e in this.allCommentsByDbId){var d=this.allCommentsByDbId[e];if(c==""||d.state==c){if(d.reply_to_id==null){a.push(d.id);}else{b.push(d.id);}}}},filterByDate:function(b,d,a){var c=(b=="")?0:parseInt(b);for(var f in this.allCommentsByDbId){var e=this.allCommentsByDbId[f];if(e.modified>c){if(e.reply_to_id==null){d.push(e.id);}else{a.push(e.id);}}}},getCommentsAndRepliesCounts:function(d){var b=0;var f=0;var a=(d)?this.allComments:this.comments;var e=this.getThreads(a);for(var c=0;c<e.length;c++){if(e[c].reply_to_id==null){b++;}else{f++;}}return[b,f];},getCommentsNb:function(b){var a=(b)?this.allComments:this.comments;return this.getThreads(a).length;},getFilteredCommentIdsAsString:function(){var a="";for(var b in this.commentsByDbId){a=a+b+",";}return a;}};var gtest={renaud:"RENAUD",random:Math.random(),bernard:"BERNARD",myFunc:function(){doExchange("theServerFun",{},null,this.myRetFunc,this,["foo","bar"]);},myRetFunc:function(a){CY.log("this.renaud : "+this.renaud);CY.log("this.random : "+this.random);CY.log("arg.returned : "+a.returned);CY.log(a.returned);CY.log("arg.success : "+a.success);CY.log(a.success);}};doExchange=function(h,e,g,f,d,c,b){e.fun=h;e.key=sv_key;e.version_key=sv_version_key;var a={method:"POST",data:urlEncode(e),on:{success:function(l,k,j){var i={};if(k.responseText){i=CY.JSON.parse(k.responseText);}if(gLayout.isInFrame()&&("msg" in i)){parent.f_enqueueMsg(i.msg);}j.returned=i;j.successfull=true;f.call(d,j);},failure:function(k,j,i){if(gLayout.isInFrame()){parent.f_enqueueErrorMsg(gettext("error:")+b);}i.successfull=false;f.call(d,i);}},arguments:{success:c,failure:c}};if(g!=null){a.form={id:g};}CY.io(sv_client_url,a);};warn_server=function(c){c.fun="warn";c.key=sv_key;c.version_key=sv_version_key;var b=CY.UA;var a={method:"POST",data:urlEncode(CY.merge(c,b))};CY.io("/client/",a);};IComments=function(){this._c=[];this._a=[];this._nbEndedAnim=0;this._topActiveCommentDbId=null;};IComments.prototype={init:function(a){for(var b=0;b<gConf.iCommentsInitAlloc;b++){this._c.push(new IComment());}},getIComment:function(a){return CY.Array.find(this._c,function(b){return(b.isfetched()&&b.commentId==a);});},insertAfter:function(a,d){var c=CY.Array.map(this._c,function(e){return e.commentId;});var b=CY.Array.indexOf(c,a.id);if(b!=-1){this._c.splice(b+1,0,new IComment());this._c[b+1].fetch(d);return this._c[b+1];}return null;},_remove:function(c){var d=CY.Array.map(c,function(e){return e.commentId;});for(var b=0;b<this._c.length;b++){var a=this._c[b];if(a.isfetched()&&CY.Array.indexOf(d,a.commentId)!=-1){a.unfetch();this._c.push(this._c.splice(b,1)[0]);b--;}}},_getChildren:function(a){return CY.Array.filter(this._c,function(b){return(b.isfetched()&&gDb.isChild(b.commentId,a));});},_getInvisibleChildren:function(a){return CY.Array.filter(this._getChildren(a),function(b){return(!b.isVisible());});},refresh:function(c){var b=this.getIComment(c);var a=this._getInvisibleChildren(c);if(a.length>0){b.showReadRepliesLnk();}else{b.hideReadRepliesLnk();}},remove:function(a){this._remove(this._getChildren(a));},close:function(a){CY.Array.each(this._getChildren(a),function(b){b.hide();});},open:function(a){CY.Array.each(this._getChildren(a),function(b){b.show();});},fetch:function(b){for(var a=0;a<b.length;a++){if(a==this._c.length){this._c.push(new IComment());}this._c[a].fetch(b[a]);}for(var a=b.length;a<this._c.length;a++){this._c[a].unfetch();}},setPosition:function(a){CY.each(this._c,function(b){b.setPosition(a);});},show:function(){CY.each(this._c,function(a){if(a.isfetched()){a.show();}});},hide:function(){this.deactivate();CY.each(this._c,function(a){if(a.commentId!=null){a.hide();}});},setWidth:function(c){var e=null;for(var b=0;b<this._c.length;b++){var a=this._c[b];a.setWidth(c);if(a.commentId!=null&&a.isVisible()){var d=a.getPosition();if(e==null){e=d[1];}d[1]=e;a.setPosition(d);e+=a.getHeight();}}},getTopPosition:function(){for(var b=0;b<this._c.length;b++){var a=this._c[b];if(a.commentId!=null&&a.isVisible()){return a.getPosition();}}return null;},getPosition:function(c){for(var b=0;b<this._c.length;b++){var a=this._c[b];if(a.commentId==c&&a.isVisible()){return a.getPosition();}}return null;},setAnimationToPositions:function(h){this._initAnimations();var c=(gPrefs.get("comments","threadpad")=="1")?gConf.iCommentThreadPadding:0;var f=h;for(var d=0;d<this._c.length;d++){var b=this._c[d];if(b.isfetched&&b.isVisible()){var a=gDb.getPath(gDb.getComment(b.commentId));var g=((a.length-1)*c)+gConf.iCommentLeftPadding;if(f==null){var e=b.getPosition();f=e[1];}this._a.push(b.setAnimationToPosition([g,f]));f+=b.getHeight();}}},setAnimationToPositionsAndFocus:function(g,f,b){this._initAnimations();var a=(gPrefs.get("comments","threadpad")=="1")?gConf.iCommentThreadPadding:0;var h=g;for(var d=0;d<this._c.length;d++){var c=this._c[d];if(c.isfetched&&c.isVisible()){var e=gDb.getPath(gDb.getComment(c.commentId));var k=((e.length-1)*a)+gConf.iCommentLeftPadding;if(h==null){var j=c.getPosition();h=j[1];}if(c.commentId>=f){this._a.push(c.setAnimationToPosition([k,h],f,b));}else{this._a.push(c.setAnimationToPosition([k,h]));}h+=c.getHeight();}}},_initAnimations:function(){this._a=[];this._nbEndedAnim=0;},runAnimations:function(){if(this._a.length==0){gSync.resetAutoContinue("animationRun");}else{CY.each(this._a,function(a){a.run();});}},whenAnimationsEnd:function(){gSync.resume();},whenAnimationsEndFocus:function(){gGETValues=CY.JSON.parse(sv_get_params);if("comment_id_key" in gGETValues){var b=gGETValues.comment_id_key;var a=gDb.getCommentByIdKey(b);if(a!=null){gIComments.getIComment(a.id).overlay.focus();}}gSync.resume();},whenAnimationsEndReply:function(){gGETValues=CY.JSON.parse(sv_get_params);if("comment_id_key" in gGETValues){var b=gGETValues.comment_id_key;var a=gDb.getCommentByIdKey(b);if(a!=null){gSync.showReplyForm(gIComments.getIComment(a.id));}}gSync.resume();},animationsEnded:function(){return((this._a.length==0)||(this._a.length==this._nbEndedAnim));},signalAnimationEnd:function(){this._nbEndedAnim++;},isTopActive:function(a){return((a!=null)&&(this._topActiveCommentDbId==a));},isAnyActive:function(){return(this._topActiveCommentDbId!=null);},activate:function(f){if(this._topActiveCommentDbId!=null){this.deactivate();}var e=gDb.getComment(f);var b=gDb.getPath(e);var a=b[b.length-1];var c=this._getChildren(a.id);CY.Array.each(c,function(g){g.activate();});this._topActiveCommentDbId=a.id;if(gLayout.isInFrame()){var d=gDb.browsingIndex(this._topActiveCommentDbId);parent.$("#browse_by option").each(function(){var g=1+d[this.value];parent.$("#c_browse_indx_"+this.value).html(""+g);});}showScope(a.id);},deactivate:function(){if(this._topActiveCommentDbId!=null){parent.$("#browse_by option").each(function(){parent.$("#c_browse_indx_"+this.value).html("-");});hideScopeAnyway();var a=this._getChildren(this._topActiveCommentDbId);CY.Array.each(a,function(b){b.deactivate();});this._topActiveCommentDbId=null;}},activateVisibleNext:function(){if(this._topActiveCommentDbId!=null){for(var d=0;d<2;d++){var f=(d==0)?0:this._c.length-1;var a=false;for(var e=f;(e>=0)&&e<=(this._c.length-1);){var c=this._c[e];if(c.commentId!=null&&c.isVisible()){a=a||(gDb.isChild(c.commentId,this._topActiveCommentDbId));if(a&&(!gDb.isChild(c.commentId,this._topActiveCommentDbId))){this.activate(c.commentId);return true;}}e=(d==0)?e+1:e-1;}}}return false;},browse:function(b,c){var a=c;if((c=="prev")&&!this.isAnyActive()){a="last";}if((c=="next")&&!this.isAnyActive()){a="first";}return gDb.browse(b,a,this._topActiveCommentDbId);}};gNewReplyHost=null;gNewReply=null;instanciateNewReplyForm=function(i){if(gNewReply==null){gNewReply={val:{name:gPrefs.get("user","name"),email:gPrefs.get("user","email"),title:"",content:"",tags:""},ids:{name:gPrefs.get("user","name"),email:gPrefs.get("user","email"),title:"",content:"",tags:"",formId:CY.guid(),nameInputId:CY.guid(),emailInputId:CY.guid(),titleInputId:CY.guid(),contentInputId:CY.guid(),keyInputId:CY.guid(),formatInputId:CY.guid(),tagsInputId:CY.guid(),parentCommentId:CY.guid(),addBtnId:CY.guid(),cancelBtnId:CY.guid()},handlers:{}};}gNewReplyHost=i;var b='<hr/><center><div class="c-header-title">'+gettext("New reply")+"</div></center>";var e=gFormHtml.formStart.replace("###",gNewReply.ids["formId"]);if(!sv_loggedIn){e=e+gFormHtml.nameInput.replace("###",gNewReply.ids["nameInputId"])+gFormHtml.emailInput.replace("###",gNewReply.ids["emailInputId"]);}e=e+gFormHtml.titleInput.replace("###",gNewReply.ids["titleInputId"])+gFormHtml.contentInput.replace("###",gNewReply.ids["contentInputId"])+gFormHtml.tagsInput.replace("###",gNewReply.ids["tagsInputId"]);e=e+gFormHtml.hidden.replace("###",gNewReply.ids["keyInputId"]).replace("???","comment_key");e=e+gFormHtml.hidden.replace("###",gNewReply.ids["formatInputId"]).replace("???","format");e=e+gFormHtml.hidden.replace("###",gNewReply.ids["parentCommentId"]).replace("???","reply_to_id");var h=gFormHtml.btns.replace("###",gNewReply.ids["addBtnId"]).replace("???",gNewReply.ids["cancelBtnId"]);gNewReplyHost.overlay.setStdModContent(CY.WidgetStdMod.FOOTER,b+e+h);var c=gNewReplyHost.overlay.getStdModNode(CY.WidgetStdMod.FOOTER);var f=gDb.getComment(i.commentId);var a="Re: ";var g=(gNewReply.val["title"]==""||gNewReply.val["title"].substring(0,a.length)==a)?a+f.title:gNewReply.val["title"];if(!sv_loggedIn){c.query(".n_name").set("value",gNewReply.val["name"]);c.query(".n_email").set("value",gNewReply.val["email"]);}c.query(".n_title").set("value",g);c.query(".n_content").set("value",gNewReply.val["content"]);c.query(".n_tags").set("value",gNewReply.val["tags"]);c.query("#"+gNewReply.ids["parentCommentId"]).set("value",i.commentId);c.query("#"+gNewReply.ids["formatInputId"]).set("value",gConf.defaultCommentFormat);gNewReplyHost.overlay.get("contentBox").query(".c-reply").addClass("displaynone");gNewReply.handlers["addBtnId"]=CY.on("click",onAddNewReplyClick,"#"+gNewReply.ids["addBtnId"]);gNewReply.handlers["cancelBtnId"]=CY.on("click",onCancelNewReplyClick,"#"+gNewReply.ids["cancelBtnId"]);var d=gLayout.getTopICommentsWidth();changeFormFieldsWidth(gNewReply.ids["formId"],d);CY.get("#"+gNewReply.ids["contentInputId"]).focus();};cleanNewReplyForm=function(){if(gNewReplyHost!=null){var a=gNewReplyHost.overlay.getStdModNode(CY.WidgetStdMod.FOOTER);a.queryAll(".comment_input").set("value","");}};cancelNewReplyForm=function(){if(gNewReplyHost!=null){for(var b in gNewReply.handlers){if(gNewReply.handlers[b]!=null){gNewReply.handlers[b].detach();gNewReply.handlers[b]=null;}}gNewReplyHost.overlay.get("contentBox").query(".c-reply").removeClass("displaynone");var a=gNewReplyHost.overlay.getStdModNode(CY.WidgetStdMod.FOOTER);if(!sv_loggedIn){gNewReply.val["name"]=a.query(".n_name").get("value");gNewReply.val["email"]=a.query(".n_email").get("value");}gNewReply.val["title"]=a.query(".n_title").get("value");gNewReply.val["content"]=a.query(".n_content").get("value");gNewReply.val["tags"]=a.query(".n_tags").get("value");a.set("innerHTML","");gNewReplyHost=null;}};onAddNewReplyClick=function(){if(!sv_loggedIn){var b=CY.get("#"+gNewReply.ids["nameInputId"]).get("value");gPrefs.persist("user","name",b);var a=CY.get("#"+gNewReply.ids["emailInputId"]).get("value");gPrefs.persist("user","email",a);}gSync.saveComment(gNewReply.ids["formId"]);};onCancelNewReplyClick=function(){gSync.cancelReply();};c_persistPreference=function(b,a,c){gPrefs.persist(b,a,c);};c_readDefaultPreference=function(b,a){return gConf.defaultPrefs[b][a];};c_readPreference=function(b,a){return gPrefs.get(b,a);};c_resetPreferences=function(a){gPrefs.reset(a);};c_applyTextStyle=function(a){CY.use(a);};sliderValToPx=function(d){var a=CY.DOM.winWidth();if(gLayout.isInFrame()){a=parent.$(parent).width();}var b=d/100;b=Math.min(b,gConf.sliderFixedMin);b=Math.max(b,gConf.sliderFixedMax);var c=b*a;return Math.floor(c);};c_setCommentsColWidth=function(c){var a=sliderValToPx(c);gLayout.setLeftColumnWidth(a);var b=gLayout.getTopICommentsWidthFromWidth(a);gIComments.setWidth(b);gICommentForm.overlay.get("boundingBox").setStyle("width",b+"px");changeFormFieldsWidth(gICommentForm.formId,b);document.getElementById("the-toc").style.width=b+"px";if(gNewReply){changeFormFieldsWidth(gNewReply.ids["formId"],b);}if(gEdit){changeFormFieldsWidth(gEdit.ids["formId"],b);}};CY=null;gPrefs=null;gLayout=null;gDb=null;gIComments=null;gSync=null;gGETValues=null;gConf={iCommentLeftPadding:4,iCommentThreadPadding:12,defaultCommentFormat:"markdown",sliderFixedMin:0.9,sliderFixedMax:0.1,iCommentsInitAlloc:2,defaultPrefs:{text:{style:"text-modern-style"},user:{name:"",email:""},general:{animduration:"0.4"},comments:{threadpad:"1"},layout:{comments_col_width:"25"}}};if(sv_custom_font){gTextStyles={custom:gettext("custom"),modern:gettext("modern"),classic:gettext("classic"),code:gettext("code")};}else{gTextStyles={modern:gettext("modern"),classic:gettext("classic"),code:gettext("code")};}YUI({base:sv_media_url+"/js/lib/yui/"+c_yui_base+"/build/",timeout:10000}).use("text-modern-style","cookie","json","overlay","io-form","async-queue","event-mouseenter","anim","collection",function(a){CY=a;gPrefs=new Preferences();gPrefs.init();gLayout=new Layout();gLayout.init();if(sv_withComments){gDb=new Db();gDb.init();gIComments=new IComments();gIComments.init();}gSync=new Sync();gSync.init();CY.on("domready",onDomReady,this);});_reinit=function(a){gIComments.hide();gDb.initComments(a.commentIds);unpaintAllComments();renderCommentScopes();updateFilterResultsCount(a.nbDiscussions,a.nbComments,a.nbReplies);};reinit=function(b){var a=gDb.computeFilterResults(b);_reinit(a);};hideAll=function(){_reinit({commentIds:[],nbDiscussions:0,nbComments:0,nbReplies:0});};updateFilterResultsCount=function(f,a,b){var e=gDb.getCommentsAndRepliesCounts(true);var g=e[0],d=e[1];var c=(a!=0||b!=0)&&(g!=a||d!=b);if(gLayout.isInFrame()){parent.f_updateFilterCountDetailed(c);parent.f_updateFilterCountResult(f,a,b,g,d);}};updateResetFilterResultsCount=function(){var c=gDb.getCommentsAndRepliesCounts(false);var a=c[0],b=c[1];var d=a;updateFilterResultsCount(d,a,b);};renderCommentScopes=function(){for(var a=0;a<gDb.comments.length;a++){var b=gDb.comments[a];paintCommentScope(b);}};onTextMouseUp=function(f){if(readyForAction()){var c=getSelectionInfo();if(c!=null){updateICommentFormSelection(c);if(gEditICommentHost!=null){var g=CY.get("#"+gEdit.ids["changeScopeInputId"]+" input").get("checked");if(g){gEditICommentHost.scrollIntoView();}}}else{var d=f.target;if(d.hasClass("c-c")){var b=CY.Node.getDOMNode(d);var a=getCommentIdsFromClasses(b);if(a.length>0){checkForOpenedDialog(null,function(){gSync.showComments(a,[f.pageX,f.pageY],false);});}}}}};gLastScrollTime=null;checkForAlignement=function(){var a=(new Date()).getTime();if((gLastScrollTime!=null)&&(a-gLastScrollTime)>200){positionICommentForm();gLastScrollTime=null;}};onFrameScroll=function(){gLastScrollTime=(new Date()).getTime();};browse=function(a,b){gSync.browse(a,b);};initialConnect=function(){CY.on("mouseup",onTextMouseUp,"#textcontainer");gTimer=CY.Lang.later(200,this,checkForAlignement,[],true);CY.on("scroll",onFrameScroll,window,this,true);CY.on("resize",onFrameScroll,window,this,true);};preventLinksInText=function(){var a=function(g){var c=g.target;var d=null;while(c!=null&&d==null){c=c.get("parentNode");d=c.get("href");}if(c!=null&&d!=null){var b=window.location.href;var f=b.indexOf("#");if(f!=-1){b=b.substring(0,f);}if(d.indexOf(b)==-1){window.open(c.get("href"));g.preventDefault();}}};CY.all("#textcontainer a").on("click",a);};onDomReady=function(b){preventLinksInText();var a=new CY.AsyncQueue();a.add({fn:function(){if(gLayout.isInComentSite()){parent.toInitialSize();}if(sv_withComments){instanciateICommentForm();}instanciateToc();},timeout:5},{fn:function(){gGETValues=CY.JSON.parse(sv_get_params);CY.get("#maincontainer").setStyle("display","block");CY.get("#textcontainer").setStyle("display","block");var e=(sv_withComments)?gPrefs.get("layout","comments_col_width"):0;var d=sliderValToPx(e);gLayout.setLeftColumnWidth(d);if(gLayout.isInFrame()){parent.f_initFrame();parent.f_layoutFrames();if(sv_withComments){parent.f_fillTopToolbar();if(hasPerm("can_create_comment")){parent.$("#add_comment_btn").removeClass("initially_hidden");}parent.f_fillFilterTab();parent.f_fillPreferencesTab();var c=CY.JSON.parse(sv_filter_data);parent.f_updateFilterData(c);parent.f_setFilterValue(gGETValues);}parent.f_fillTextPreferencesTab();}if(gLayout.isInComentSite()){parent.$("#c_fullscreen_btn").show();}else{parent.$("#c_fullscreen_btn").hide();}if(gToc.empty){parent.$("#c_toc_btn").hide();}},timeout:5},{fn:function(){if(sv_withComments){reinit(gGETValues);initialConnect();}},timeout:5},{fn:function(){if(gLayout.isInFrame()){parent.f_interfaceUnfreeze();parent.f_removeLoadingMsg();}if("comment_id_key" in gGETValues){var e=gGETValues.comment_id_key;var g=gDb.getCommentByIdKey(e);if(g!=null){var f=gDb.getPath(g);var c=f[f.length-1];var d=gDb.getCommentByIdKey(e);if("comment_op" in gGETValues&&gGETValues.comment_op=="reply"){gSync.showFocusSingleComment(c,d,true);}else{gSync.showFocusSingleComment(c,d,false);}}}if("comments_auto_display" in gGETValues){gSync.showAllComments();}}});a.run();};
\ No newline at end of file
--- a/src/cm/media/js/client/c_db.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/client/c_db.js	Tue Jun 25 11:56:01 2013 +0200
@@ -376,6 +376,13 @@
       filterTag = filterData['tag'] ;
     this.filterByTag(filterTag, cWithTagIds, rWithTagIds) ;
     
+    var cWithCatIds = [] ;
+    var rWithCatIds = [] ;
+    var filterCat = "" ;
+    if ('cat' in filterData)
+      filterCat = filterData['cat'] ;
+    this.filterByCat(filterCat, cWithCatIds, rWithCatIds) ;
+    
     var cWithStateIds = [] ;
     var rWithStateIds = [] ;
     var filterState = "" ;
@@ -389,14 +396,14 @@
     // find intersections
     for (var i = 0, ilen = cWithNameIds.length ; i < ilen ; i++) {
       var id = cWithNameIds[i] ;
-      if ((CY.Array.indexOf(cAfterDateIds, id) != -1) && (CY.Array.indexOf(cWithTextIds,id) != -1) && (CY.Array.indexOf(cWithTagIds,id) != -1) && (CY.Array.indexOf(cWithStateIds,id) != -1)) {
+      if ((CY.Array.indexOf(cAfterDateIds, id) != -1) && (CY.Array.indexOf(cWithTextIds,id) != -1) && (CY.Array.indexOf(cWithTagIds,id) != -1) && (CY.Array.indexOf(cWithCatIds,id) != -1) && (CY.Array.indexOf(cWithStateIds,id) != -1)) {
         commentIds.push(id) ; 
       }
     }
     
     for (var i = 0, ilen = rWithNameIds.length ; i < ilen ; i++) {
       var id = rWithNameIds[i] ;
-      if ((CY.Array.indexOf(rAfterDateIds,id) != -1) && (CY.Array.indexOf(rWithTextIds,id) != -1) && (CY.Array.indexOf(rWithTagIds,id) != -1) && (CY.Array.indexOf(rWithStateIds,id) != -1)) {
+      if ((CY.Array.indexOf(rAfterDateIds,id) != -1) && (CY.Array.indexOf(rWithTextIds,id) != -1) && (CY.Array.indexOf(rWithTagIds,id) != -1) && (CY.Array.indexOf(rWithCatIds,id) != -1) && (CY.Array.indexOf(rWithStateIds,id) != -1)) {
         replyIds.push(id) ; 
       }
     }
@@ -467,6 +474,22 @@
     }
   },
 
+  filterByCat : function(cat, cWithCatIds, rWithCatIds) {
+    for (var id in this.allCommentsByDbId) {
+      var comment = this.allCommentsByDbId[id] ;
+      if (cat == "" || comment.category == cat) { 
+        if (comment.reply_to_id == null) {
+          cWithCatIds.push(comment.id);
+          if (comment.replies.length) {
+            for (var reply in comment.replies) {
+              rWithCatIds.push(comment.replies[reply].id) ;
+            }
+          }
+        }
+      }
+    }
+  },
+
   filterByState : function(state, cWithStateIds, rWithStateIds) {
     for (var id in this.allCommentsByDbId) {
       var comment = this.allCommentsByDbId[id] ;
--- a/src/cm/media/js/client/c_edit_form.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/client/c_edit_form.js	Tue Jun 25 11:56:01 2013 +0200
@@ -14,6 +14,7 @@
           'titleInputId':CY.guid(),
           'contentInputId':CY.guid(),
           'tagsInputId':CY.guid(),
+          'categoryInputId':CY.guid(),
           'formatInputId':CY.guid(),
           'startWrapperInputId':CY.guid(),
           'endWrapperInputId':CY.guid(),
@@ -56,8 +57,13 @@
   CY.get("#"+gEdit['ids']['keyId']).set('value', comment.key) ;
 
   CY.get("#"+gEdit['ids']['changeScopeInputId']+" input").set('checked', false) ;
-  if (comment.reply_to_id != null) 
+  // Edit scope and category just for the first comment in a thread
+  // => hides these inputs for a reply.
+  if (comment.reply_to_id != null) {
     CY.get("#"+gEdit['ids']['changeScopeInputId']).addClass('displaynone')
+    CY.get("#"+gEdit['ids']['categoryInputId']).addClass('displaynone')
+    CY.get("#"+gEdit['ids']['categoryInputId']).ancestor().addClass('displaynone')
+  }
   changeScopeFormClick() ; // to adapt
 
   CY.get("#"+gEdit['ids']['nameInputId']).set('value', comment.name) ; 
@@ -72,6 +78,8 @@
   CY.get("#"+gEdit['ids']['titleInputId']).set('value', comment['title']) ;
   CY.get("#"+gEdit['ids']['contentInputId']).set('value', comment['content']) ;
   CY.get("#"+gEdit['ids']['tagsInputId']).set('value', comment['tags']) ;
+  if ( CY.get("#"+gEdit['ids']['categoryInputId']))
+    CY.get("#"+gEdit['ids']['categoryInputId']).set('value', comment['category']) ;
   
   CY.get("#"+gEdit['ids']['formatInputId']).set('value',gConf['defaultCommentFormat']) ;// for now ...
   
--- a/src/cm/media/js/client/c_icomment.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/client/c_icomment.js	Tue Jun 25 11:56:01 2013 +0200
@@ -326,6 +326,17 @@
     if (comment.tags == "")
       newTagNode.addClass('displaynone') ;
 
+    // CATEGORY
+    var newCatNode = CY.Node.create('<div class="c-cat">' + gettext("category") + ':&nbsp;<span class="c-cat-val c-cat-' + comment.category + '">' + categories[comment.category] + '</span></div>') ;
+    var prevCatNode = boundingBoxNode.query(".c-cat") ;
+    if (prevCatNode == null) 
+      boundingBoxNode.query('.icomment-header').appendChild(newCatNode) ;
+    else 
+      prevCatNode.get('parentNode').replaceChild(newCatNode, prevCatNode) ;
+    // NO CATEGORY ?
+    if (comment.category == 0) 
+      newCatNode.addClass('displaynone') ;
+
     // CONTENT
     var newContentNode = CY.Node.create('<span class="c-content">' + comment.content_html + '</span>') ;
     var prevContentNode = boundingBoxNode.query(".c-content") ;
--- a/src/cm/media/js/client/c_interface_forms.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/client/c_interface_forms.js	Tue Jun 25 11:56:01 2013 +0200
@@ -41,7 +41,20 @@
   if ('emailInputId' in ids)
     html = html + gFormHtml['emailInput'].replace('###', ids['emailInputId']) ;
   
-  html = html + gFormHtml['titleInput'].replace('###', ids['titleInputId']) + gFormHtml['contentInput'].replace('###', ids['contentInputId']) + gFormHtml['tagsInput'].replace('###', ids['tagsInputId']);
+  html = html + gFormHtml['titleInput'].replace('###', ids['titleInputId']) + gFormHtml['contentInput'].replace('###', ids['contentInputId']);
+
+  categories = CY.JSON.parse(sv_categories);
+  if (categories.hasOwnProperty('0')) {
+    category_options = '';
+    for (c in categories) {
+      category_options += '<option value="' + c + '">' + categories[c] + '</option>';
+    }
+    gFormHtml['categoryInput'] = gettext("Category:") + '&nbsp;<select id="###" name="category" class="n_category comment_input" style="padding:1px;" type="text">' + category_options + '</select>';
+    html = html + '<span class="n_category_input">' + gFormHtml['categoryInput'].replace('###', ids['categoryInputId']) + '<br /></span>';
+  }
+
+  html = html + gFormHtml['tagsInput'].replace('###', ids['tagsInputId']);
+
   html = html + gFormHtml['hidden'].replace('###', ids['formatInputId']).replace('???', 'format') ;
   html = html + gFormHtml['hidden'].replace('###', ids['startWrapperInputId']).replace('???', 'start_wrapper') ;
   html = html + gFormHtml['hidden'].replace('###', ids['endWrapperInputId']).replace('???', 'end_wrapper') ;
--- a/src/cm/media/js/client/c_scopes.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/client/c_scopes.js	Tue Jun 25 11:56:01 2013 +0200
@@ -266,12 +266,22 @@
 //elt is supposed to be c-c classed
 _addIdClass = function (elt, commentId) {
   CY.DOM.addClass(elt, 'c-id-' + commentId) ;
+  var block_elt = _findParentBlockElt(elt);
+  if (block_elt != null) {
+    _unpaintCategories(block_elt);
+    _repaintCategories(elt, block_elt);
+  }
   _updateCommentCounter(elt) ;
 } ;
 
 //elt is supposed to be c-c classed
 _removeIdClass = function (elt, commentId) {
   CY.DOM.removeClass(elt, 'c-id-' + commentId) ;
+  var block_elt = _findParentBlockElt(elt);
+  if (block_elt != null) {
+    _unpaintCategories(block_elt);
+    _repaintCategories(elt, block_elt, commentId);
+  }
   _updateCommentCounter(elt) ;
 } ;
 
@@ -280,8 +290,51 @@
   var re = _cgetRegExp('(?:^|\\s+)c-id-(?:\\d+)', 'g');
   elt['className'] = elt['className'].replace(re, " ") ;
   _updateCommentCounter(elt) ;
+  var block_elt = _findParentBlockElt(elt);
+  if (block_elt != null) {
+    _unpaintCategories(block_elt);
+  }
 } ;
 
+// Finds the closest parent of an element which is a block.
+_findParentBlockElt = function(elt) {
+  var block_elt = elt;
+  var block_elt_style = block_elt.currentStyle || window.getComputedStyle(block_elt, ""); 
+  var block_elt_display = block_elt_style.display;
+  while (block_elt != null && block_elt_display != 'block') {
+    block_elt = block_elt.parentElement;
+    block_elt_style = block_elt.currentStyle || window.getComputedStyle(block_elt, ""); 
+    block_elt_display = block_elt_style.display;
+  }
+  return block_elt;
+};
+
+// Removes all vertical bars from a block element.
+_unpaintCategories = function(block_elt) {
+  CY.DOM.removeClass(block_elt, 'cat1');
+  CY.DOM.removeClass(block_elt, 'cat2');
+  CY.DOM.removeClass(block_elt, 'cat3');
+  CY.DOM.removeClass(block_elt, 'cat4');
+  CY.DOM.removeClass(block_elt, 'cat5');
+}
+
+// Paints all vertical bars of a block element but the one for commentId if not null.
+_repaintCategories = function(elt, block_elt, commentId) {
+  // Loop through all comments in this wrapper id
+  var wrapper_id = parseInt(getWrapperAncestor(elt).id.substr(3));
+  var len = gDb.comments.length;
+  for (var i=0; i<len; i++) {
+    if (i in gDb.comments) {
+      var comment = gDb.comments[i];
+      if ((commentId == null || comment.id != commentId) && comment.start_wrapper <= wrapper_id && comment.end_wrapper >= wrapper_id) {
+        if (comment.category) {
+          CY.DOM.addClass(block_elt, 'cat' + comment.category);
+        }
+      }
+    }
+  }
+}
+
 _recAddComment = function (elt, commentId) {
   if (CY.DOM.hasClass(elt, 'c-c')) {
     _addIdClass(elt, commentId) ;
--- a/src/cm/media/js/client/f_client-min.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/client/f_client-min.js	Tue Jun 25 11:56:01 2013 +0200
@@ -1,1 +1,1 @@
-gFormats=[{actions:["print"],extension:"html",label:gettext("print from the browser")},{actions:["export"],extension:"html",label:gettext("download html file (.html)")},{actions:["export"],extension:"markdown",label:gettext("download markdown file (.mkd)")},{actions:["print"],extension:"pdf",label:gettext("print in PDF format")},{actions:["export"],extension:"pdf",label:gettext("download portable object format file (.pdf)")},{actions:["export"],extension:"latex",label:gettext("download latex file (.tex)")},{actions:["export"],extension:"odt",label:gettext("download open document file (.odt)")},{actions:["export"],extension:"doc",label:gettext("download microsoft word file (.doc)")},{actions:["export"],extension:"docx",label:gettext("download microsoft word 2007 file (.docx)")}];var pandoc_version_ary=sv_pandoc_version.split(".");if(parseInt(pandoc_version_ary[0])>1||(parseInt(pandoc_version_ary[0])==1&&parseInt(pandoc_version_ary[1])>8)){gFormats.push({actions:["export"],extension:"epub",label:gettext("download ebook (.epub)")});}gFormats.push({actions:["export"],extension:"xml",label:gettext("download XML file for re-importing text and comments")});gActions={print:{dialogTitle:gettext("Print text"),chooseFormatLabel:gettext("How do you want to print?"),defaultMethod:"pdf",defaultWithColors:"no",defaultWhichComments:"all"},"export":{dialogTitle:gettext("Export text"),chooseFormatLabel:gettext("Choose file format"),defaultMethod:"pdf",defaultWithColors:"no",defaultWhichComments:"all"}};gCurrentAction=null;_populateMethod=function(g){var f=$("#p_method").val();$("#p_method").html("");for(var d=0,c=gFormats.length;d<c;d++){var e=gFormats[d]["actions"];for(var b=0,a=gFormats.length;b<a;b++){if(e[b]==gCurrentAction){$("<option value='"+gFormats[d]["extension"]+"'>"+gFormats[d]["label"]+"</option>").appendTo("#p_method");}}}if(f){$("#p_method").val(f);}else{$("#p_method").val(gActions[gCurrentAction]["defaultMethod"]);}};_populateMarkersColorsChoice=function(b){var a=$("#p_color").val();$("#p_color").html("");$("<option value='0'>"+gettext("using markers only, no background colors")+"</option>").appendTo("#p_color");$("<option value='1'>"+gettext("using markers and background colors")+"</option>").appendTo("#p_color");if(a){$("#p_color").val(a);}else{$("#p_color").val(gActions[gCurrentAction]["defaultWithColors"]);}};_populateWhichComments=function(){var c=$("#p_comments").val();$("#p_comments").html("");var a=interpolate(gettext("all (%(nb_comments)s)"),{nb_comments:frames.text_view_comments.gDb.getCommentsNb(true)},true);var b=interpolate(gettext("current filtered ones (%(nb_comments)s)"),{nb_comments:frames.text_view_comments.gDb.getCommentsNb(false)},true);$("<option value='all' >"+a+"</option>").appendTo($("#p_comments"));$("<option value='none' >"+gettext("none (0)")+"</option>").appendTo($("#p_comments"));$("<option value='filtered' >"+b+"</option>").appendTo($("#p_comments"));if(c){$("#p_comments").val(c);}else{$("#p_comments").val(gActions[gCurrentAction]["defaultWhichComments"]);}};_manageMarkersColorsChoice=function(){var f=$("#p_method").val();var e=$("#p_comments").val();var c=frames.text_view_comments.gDb.getCommentsNb(true);var d=frames.text_view_comments.gDb.getCommentsNb(false);var b=(e=="all")?c:d;var a;if(gCurrentAction=="print"){a=((b==0)||(e=="none"));}if(gCurrentAction=="export"){a=((b==0)||(e=="none")||(f=="markdown")||(f=="latex")||(f=="epub")||(f=="odt")||(f=="doc")||(f=="xml"));}if(a){$("#p_color").val("no");}$("#p_color").attr("disabled",a);};_initPrintDialog=function(){$("#p_comments").add($("#p_method")).change(function(){_manageMarkersColorsChoice();_prepareOpenInNewWindow();});var a={};a[gettext("Go !")]=function(){var d=$("#p_comments").val();var c=$("#p_color").val();var e=$("#p_method").val();var b=(gCurrentAction=="export")?"1":(e=="html")?"0":"1";var f=$("#print_export_form").attr("target_action").replace(/FoRmAt/,e).replace(/DoWnLoAd/,b).replace(/WhIcHCoMmEnT/,d).replace(/WiThCoLoR/,c);$("#print_export_form").attr("action",f);document.print_export_form.submit();$(this).dialog("close");};a[gettext("Cancel")]=function(){$(this).dialog("close");};$("#dialog_print_export").dialog({bgiframe:true,autoOpen:false,width:500,modal:true,buttons:a,close:function(){}});};openPrintDialog=function(){_openPrintExportDialog("print");};openExportDialog=function(){_openPrintExportDialog("export");};_prepareOpenInNewWindow=function(){var a=$("#p_method").val();if((a=="html")&&(gCurrentAction=="print")){$("#print_export_form").attr("target","_blank");}else{$("#print_export_form").removeAttr("target");}};_openPrintExportDialog=function(a){gCurrentAction=a;$("#ui-dialog-title-dialog_print_export").html(gActions[gCurrentAction]["dialogTitle"]);$("#how").html(gActions[gCurrentAction]["chooseFormatLabel"]);$("#print_export_action").val(a);_populateWhichComments();_populateMarkersColorsChoice();_populateMethod();_manageMarkersColorsChoice();_prepareOpenInNewWindow();$("#dialog_print_export").dialog("open");};onFadeEnd=function(){$(this).remove();};gLoadingMsg=null;enqueueLoadingMsg=function(){gLoadingMsg=_enqueueMsg(gettext("loading..."),"",null);};removeLoadingMsg=function(){if(gLoadingMsg!=null){gLoadingMsg.remove();gLoadingMsg=null;}};_enqueueMsg=function(d,b,c){var a=$("<span>"+d+"</span>").appendTo("#c-msg-wrapper").addClass("f-msg-cls").addClass(b);if(c){a.animate({opacity:0.95},c).fadeOut(2000,onFadeEnd);}return a;};enqueueMsg=function(c){var a="f-msg";var b=8000;_enqueueMsg(c,a,b);};enqueueErrorMsg=function(c){var a="f-msg-e";var b=4000;_enqueueMsg(c,a,b);};var gResetOtherFieldsOnFilterFieldChange=true;var myDefaultOuterLayoutSettings={center:{paneSelector:".outer-center"},north:{size:50,spacing_open:0,closable:false,resizable:false}};var innerNorthPaneDefaults={innerNorthPaneOpened:"0",selectedTab:"0"};onInnerNorthPaneClose=function(){_setCookie("innerNorthPaneOpened","0");$("#add_comment_btn").css("top",63);if(document.getElementById("text_view_comments").contentDocument!=null){document.getElementById("text_view_comments").contentDocument.getElementById("the-toc").style.height=(parseInt(document.getElementById("text_view_comments").clientHeight)-50).toString()+"px";}return true;};onInnerNorthPaneOpen=function(){_setCookie("innerNorthPaneOpened","1");$("#add_comment_btn").css("top",149);if(document.getElementById("text_view_comments").contentDocument!=null){document.getElementById("text_view_comments").contentDocument.getElementById("the-toc").style.height=(parseInt(document.getElementById("text_view_comments").clientHeight)-50).toString()+"px";}return true;};var myDefaultInnerLayoutSettings={north:{size:88,spacing_open:8,spacing_closed:8,slidable:false,resizable:false,togglerLength_closed:"100%",togglerLength_open:"100%",togglerAlign_closed:"center",togglerTip_closed:gettext("click to show options"),togglerTip_open:gettext("click to hide options"),togglerContent_open:"<img alt='arrow up' src='"+sv_media_url+"img/arrow-up.png' />",togglerContent_closed:"<img alt='arrow down' src='"+sv_media_url+"img/arrow-down.png' />",initClosed:false,paneSelector:".inner-north",onopen:"onInnerNorthPaneOpen",onclose:"onInnerNorthPaneClose"}};var outerLayout,innerLayout;layoutFrames=function(){var a=$.cookie("innerNorthPaneOpened");myDefaultInnerLayoutSettings.north.initClosed=(a===null)?(innerNorthPaneDefaults.innerNorthPaneOpened=="0"):(a=="0");outerLayout=$("body").layout(myDefaultOuterLayoutSettings);innerLayout=$("div.outer-center").layout(myDefaultInnerLayoutSettings);if(myDefaultInnerLayoutSettings.north.initClosed){onInnerNorthPaneClose();}else{onInnerNorthPaneOpen();}};fillFilterTab=function(){var b=$("#c_filter");var a='<div style="float:right"><table><tr><td style="text-align:right;">'+gettext("Text")+'<td>&nbsp;</td><td><input id="filter_text" type="text"></input><input id="c_filter_btn" type="button" value="'+gettext("Search")+'"></input></td></tr><tr><td colspan="3" style="text-align:right;"><input id="c_filterreset_btn" type="button" value="'+gettext("Reset")+'"></input><input id="c_filterhideall_btn" type="button" value="'+gettext("Hide all Comments")+'"></input></td></tr></table></div><table><tr><td style="text-align:right;">'+gettext("Authors")+'</td><td>&nbsp;</td><td><select id="filter_name"></select></td><td>&nbsp;</td><td style="text-align:right;">'+gettext("States")+'</td><td>&nbsp;</td><td><select id="filter_state"></select></td></tr><tr><td style="text-align:right;">'+gettext("Dates")+'</td><td>&nbsp;</td><td><select id="filter_date"></select></td><td>&nbsp;</td><td style="text-align:right;">'+gettext("Tags")+'</td><td>&nbsp;</td><td><select id="filter_tag"></select></td></tr></table>';b.append($(a));$("#c_filter input[type='text']").add("#c_filter select").addClass("c_filter_field");$("#filter_name").add("#filter_date").add("#filter_tag").add("#filter_state").change(function(){if(frames.text_view_comments.readyForAction()){var c=$(this);frames.text_view_comments.checkForOpenedDialog(null,function(){applyFilter(c);});}});$("#c_filter_btn").click(function(){if(frames.text_view_comments.readyForAction()){var c=$("#filter_text");frames.text_view_comments.checkForOpenedDialog(null,function(){applyFilter(c);});}});$("#filter_text").keyup(function(c){if(c.keyCode==13){$("#c_filter_btn").click();}});$("#c_filterreset_btn").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){resetFilter();});}});$("#c_filterhideall_btn").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.hideAll();});}});};fillTopToolbar=function(){var l=$("#outer-north");var g=gettext("view previous comment");var h=gettext("view next comment");var k=gettext("view first comment");var b=gettext("view last next comment");var d=gettext("view all comments");var p=gettext("view all detached comments");var m=gettext("toggle advance interface");var r=gettext("toggle table of contents");var c=gettext("print document with/without comments");var q=gettext("export document with/without comments");var a=gettext("toggle full screen view");var i=gettext("text feed");var j=gettext("add a comment");var n='<div id="c-right-btn"><img id="c_fullscreen_btn" src="'+sv_media_url+'/img/arrow_out.png" title="'+a+'" alt="'+a+'"/><img id="c_print_btn" src="'+sv_media_url+'/img/printer.png" title="'+c+'" alt="'+c+'"/><img id="c_export_btn" src="'+sv_media_url+'/img/page_go.png" title="'+q+'" alt="'+q+'"/><a target="_blank" href="'+frames.text_view_comments.sv_text_feed_url+'"><img id="c_feed_btn" src="'+sv_media_url+'/img/feed.png" title="'+i+'" alt="'+i+'"/></a></div><div id="c-msg-wrapper"></div><table style="margin-bottom:.3em;"><tbody><tr><td><span id="c_filter_results" ><span id="c_browse_indx_scope">-</span><span id="c_browse_indx_modif_thread" style="display: none;">-</span>/<b>&nbsp;<span id="c_f_res_nb_dis"></span></b>&nbsp;<span id="c_f_res_nb_dis_txt"></span><span id="c_f_res_details">&nbsp;('+gettext("filter:")+'&nbsp;<span id="c_f_res_nb_com"></span>/<span id="c_f_res_nb_tot_com"></span>&nbsp;<span id="c_f_res_nb_com_txt"></span>&nbsp;<span id="c_f_res_nb_rep"></span>/<span id="c_f_res_nb_tot_rep"></span><span id="c_f_res_nb_rep_txt"></span>)</span></span></td><td><span id="browse_section">, '+gettext("browse by:")+' <select id="browse_by" style="margin-right: 7px;"><option value="scope">'+gettext("location")+'</option><option value="modif_thread">'+gettext("modification")+'</option></select></span></td><td style="width: 40px; text-align: right;"><a href="#" id="c_browse_first"><img title="'+k+'" alt="'+k+'" src="'+sv_media_url+'/img/control_fastbackward_blue.png"/></a><a href="#" id="c_browse_prev"><img title="'+g+'" alt="'+g+'" src="'+sv_media_url+'/img/control_playback_blue.png" style="margin-right: 3px;"/></a></td><td style="width: 44px; text-align: left; border-right: 1px dotted #b1b1b1;"><a href="#" id="c_browse_next"><img title="'+h+'" alt="'+h+'" src="'+sv_media_url+'/img/control_play_blue.png"/></a><a href="#" id="c_browse_last"><img title="'+b+'" alt="'+b+'" src="'+sv_media_url+'/img/control_fastforward_blue.png"/></a></td><td style="width: 20px; text-align: left;"><a href="#" id="c_browse_all"><img title="'+d+'" alt="'+d+'" src="'+sv_media_url+'/img/view_all.png" style="margin-left: 11px; margin-right: 8px;" /></a></td><td style="width: 20px; text-align: left;"><a href="#" id="c_browse_scope_removed"><img title="'+p+'" alt="'+p+'" src="'+sv_media_url+'/img/view_scope_removed2.png" style="margin-top: -8px; margin-right: 3px;" /></a></td><td style="width: 20px; text-align: left;"><a href="#" id="c_thread_unthread"><img id="c_thread_unthread_img" style="margin-right: 8px;"/></a></td><td style="width: 20px; text-align: left;"><a href="#" id="c_toc_btn"><img title="'+r+'" alt="'+r+'" src="'+sv_media_url+'/img/document_index.png"/></a></td></tr></tbody></table>';l.prepend($(n));$("#add_comment_btn").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.gSync.showCommentForm(null);});}});var f=function(){$("#browse_by option").each(function(){$("#c_browse_indx_"+this.value).hide();});$("#c_browse_indx_"+$("#browse_by").val()).show();};var e=$.cookie("browse_by");e=(e==null)?"location":e;_setCookie("browse_by",$("#browse_by").val());$("#browse_by option[value="+e+"]").attr("selected",true);f();$("#browse_by").change(function(){_setCookie("browse_by",$("#browse_by").val());f();});var o=function(s){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.browse($("#browse_by").val(),s);});}};$("#c_browse_prev").click(function(){o("prev");});$("#c_browse_next").click(function(){o("next");});$("#c_browse_first").click(function(){o("first");});$("#c_browse_last").click(function(){o("last");});$("#c_browse_all").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.gSync.showAllComments();});}});$("#c_browse_scope_removed").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.gSync.showScopeRemovedComments();});}});$("#c_print_btn").click(function(){if(frames.text_view_comments.readyForAction()){var s=frames.text_view_comments.gDb.getFilteredCommentIdsAsString();frames.text_view_comments.CY.log($("#filteredIds").val(s));openPrintDialog();}});$("#c_export_btn").click(function(){if(frames.text_view_comments.readyForAction()){var s=frames.text_view_comments.gDb.getFilteredCommentIdsAsString();frames.text_view_comments.CY.log($("#filteredIds").val(s));openExportDialog();}});if(frames.text_view_comments.gLayout.isInComentSite()){$("#c_fullscreen_btn").click(function(){toggleFrameSize();});}$("#c_advanced_btn").click(function(){$(".ui-layout-toggler").click();});setThreadPref=function(){var t=frames.text_view_comments.c_readPreference("comments","threadpad");var u=sv_media_url+"/img/unthread_box.png";var s=gettext("unthread discussions");if(t=="0"){u=sv_media_url+"/img/thread_box.png";s=gettext("thread discussions");}$("#c_thread_unthread_img").attr("src",u).attr("alt",s).attr("title",s);};setThreadPref();$("#c_thread_unthread").click(function(){var t=frames.text_view_comments.c_readPreference("comments","threadpad");var s=(t=="0")?"1":"0";frames.text_view_comments.c_persistPreference("comments","threadpad",s);setThreadPref();frames.text_view_comments.gSync.animateToTop();});$("#c_toc_btn").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.toggleTocFn();});}});};onSliderStop=function(){var a=$("#c_slider").slider("value");if(a>(frames.text_view_comments.gConf.sliderFixedMin*100)){$("#c_slider").slider("value",[90]);}if(a<(frames.text_view_comments.gConf.sliderFixedMax*100)){$("#c_slider").slider("value",[10]);}frames.text_view_comments.c_setCommentsColWidth(a);frames.text_view_comments.c_persistPreference("layout","comments_col_width",a);};fillTextPreferencesTab=function(){var d=$("#c_text_preferences");d.append($("<table><tr><td>"+gettext("Text style")+'</td><td>&nbsp;</td><td><select id="c_textpref_style"></select></td></tr></table>'));var e=frames.text_view_comments.gTextStyles;for(var c in e){$("#c_textpref_style").append($("<option value='"+c+"'>"+e[c]+"</option>"));}var a=function(){var g=frames.text_view_comments.gTextStyles;var h=$("#c_textpref_style").val();for(var f in g){if(f==h){frames.text_view_comments.CY.get("#textcontainer").addClass(f);}else{frames.text_view_comments.CY.get("#textcontainer").removeClass(f);}}};var b=function(){var f=frames.text_view_comments.c_readPreference("text","style");$("#c_textpref_style").val(f);};$("#c_textpref_style").change(function(f){frames.text_view_comments.c_persistPreference("text","style",$("#c_textpref_style").val());a();});b();a();};fillPreferencesTab=function(){var b=$("#c_preferences");var a='<div style="float:right"><input id="c_pref_save_btn" type="button" value="'+gettext("Save")+'"></input><input id="c_pref_reset_btn" type="button" value="'+gettext("Reset")+'"></input></div><table><tr><td>'+gettext("Animation duration")+'</td><td>&nbsp;</td><td><input id="c_pref_animduration" type="text" style="width:3em" value="" /></td></tr><tr><td><span class="frame_helptext">'+gettext("(0.001 to 1 second)")+"</span></td><td></td><td></td></tr></table>";b.append($(a));setPreferencesFieldsValue=function(){var c=frames.text_view_comments.c_readPreference("general","animduration");$("#c_pref_animduration").val(c);};setPreferencesFieldsValue();$("#c_pref_animduration").blur(function(){var c=parseFloat($(this).val());if(isNaN(c)||(c<=0)||(c>1)){c=frames.text_view_comments.c_readDefaultPreference("general","animduration");}$(this).val(c);});$("#c_pref_reset_btn").click(function(){frames.text_view_comments.c_resetPreferences(["general"]);setPreferencesFieldsValue();enqueueMsg(gettext("preferences reset (will apply on next load)"));});$("#c_pref_save_btn").click(function(){frames.text_view_comments.c_persistPreference("general","animduration",$("#c_pref_animduration").val());enqueueMsg(gettext("preferences saved (will apply on next load)"));});};initFrame=function(){_initYesNoDialog();_initPrintDialog();$(window).resize(function(){onSliderStop();});$("#c_slider").slider({animate:true,range:"min",value:frames.text_view_comments.c_readPreference("layout","comments_col_width"),min:1,iframeFix:true,max:100,slide:function(a,b){var c=b.value;frames.text_view_comments.c_setCommentsColWidth(c);},stop:function(a,b){onSliderStop();}});_initTabs();f_interfaceFreeze();};_initTabs=function(){$(".inner-north").tabs();var a=$.cookie("selectedTab");a=(a===null)?innerNorthPaneDefaults.selectedTab:parseInt(a);$(".inner-north").tabs("select",a);$(".inner-north").bind("tabsselect",function(b,c){_setCookie("selectedTab",c.index);});};_initYesNoDialog=function(){$("#dialog_h").dialog({autoOpen:false,modal:true});};_setCookie=function(a,c){var b=new Date();b.setFullYear(2100,0,1);$.cookie(a,c,{expires:b,path:"/"});};f_getFrameFilterData=function(){var c=$("#filter_name").val();var b=$("#filter_date").val();var e=$("#filter_text").val();var a=$("#filter_tag").val();var d=$("#filter_state").val();return{name:c,date:b,text:e,tag:a,state:d};};f_setFilterValue=function(a){for(key in a){if(key.indexOf("filter_")==0){$("#"+key).val(a[key]);}}};f_isFrameFilterFieldsInit=function(){var b=f_getFrameFilterData();var a=true;for(key in b){a=a&&(b[key]=="");}return a;};initFilterFields=function(){$(".c_filter_field").val("");};resetFilter=function(){initFilterFields();frames.text_view_comments.reinit();enqueueMsg(gettext("filter reset"));};applyFilter=function(a){var b=a.val();if(gResetOtherFieldsOnFilterFieldChange){initFilterFields();a.val(b);}frames.text_view_comments.reinit();enqueueMsg(gettext("filter applied"));};f_updateFilterCountResult=function(d,a,b,e,c){$("#c_f_res_nb_dis").html(d);$("#c_f_res_nb_dis_txt").html(ngettext("discussion","discussions",d));$("#c_f_res_nb_com").html(a);$("#c_f_res_nb_tot_com").html(e);$("#c_f_res_nb_com_txt").html(ngettext("comment","comments",a));$("#c_f_res_nb_rep").html(b);$("#c_f_res_nb_tot_rep").html(c);$("#c_f_res_nb_rep_txt").html("&nbsp;"+ngettext("reply","replies",b));$("#c_filter_results").show();};f_updateFilterCountDetailed=function(a){if(a){$("#c_f_res_details").show();$("c_browse_all").val("View all (filtered) comments");}else{$("#c_f_res_details").hide();$("#c_browse_all").val("View all comments");}};f_updateFilterData=function(e){var g=$("#filter_name option:selected").attr("name");var k=gettext("all");$("#filter_name option").remove();$("#filter_name").append($("<option name='c_f2_user_all' value=''>"+k+"</option>"));for(var c=0,b=e.names.length;c<b;c++){var l=e.names[c];$("#filter_name").append($("<option name='c_f2_user_"+l.name+"' value='"+l.name+"'>"+l.display+" ("+l.nb_comments+")</option>"));}$("#filter_name option[name="+g+"]").attr("selected",true);var a=$("#filter_date option:selected").attr("name");$("#filter_date option").remove();$("#filter_date").append($("<option name='c_f_date_all' value=''>"+k+"</option>"));for(var c=0,b=e.dates.length;c<b;c++){var l=e.dates[c];var f=ngettext("last 24 hours (%(nb_comments)s)","last %(nb_days)s days (%(nb_comments)s)",l.nb_day);var j=interpolate(f,{nb_days:l.nb_day,nb_comments:l.nb_comments},true);$("#filter_date").append($("<option name='c_f_date_"+l.nb_day+"' value='"+l.nb_day_date+"'>"+j+"</option>"));}$("#filter_date option[name="+a+"]").attr("selected",true);var h=$("#filter_tag option:selected").attr("name");$("#filter_tag option").remove();$("#filter_tag").append($("<option name='c_f2_tag_all' value=''>"+k+"</option>"));for(var c=0,b=e.tags.length;c<b;c++){var l=e.tags[c];$("#filter_tag").append($("<option name='c_f2_tag_"+l.name+"' value='"+l.name+"'>"+l.name+" ("+l.nb_comments+")</option>"));}$("#filter_tag option[name="+h+"]").attr("selected",true);var d=$("#filter_state option:selected").attr("state");$("#filter_state option").remove();$("#filter_state").append($("<option name='c_f2_state_all' value=''>"+k+"</option>"));for(var c=0,b=e.states.length;c<b;c++){var l=e.states[c];$("#filter_state").append($("<option name='c_f2_state_"+l.state+"' value='"+l.state+"'>"+gettext(l.state)+" ("+l.nb_comments+")</option>"));}$("#filter_state option[name="+d+"]").attr("selected",true);};f_interfaceUnfreeze=function(){for(var b=0,a=$(".c_tab").length;b<a;b++){$(".inner-north").tabs("enable",b);}$(".inner-north select").add(".inner-north input").add("#outer-north select").add("#outer-north input").each(function(){$(this).attr("disabled",false);});$("#c_slider").slider("enable");};f_interfaceFreeze=function(){for(var b=0,a=$(".c_tab").length;b<a;b++){$(".inner-north").tabs("disable",b);}$(".inner-north select").add(".inner-north input").add("#outer-north select").add("#outer-north input").each(function(){$(this).attr("disabled",true);});$("#c_slider").slider("disable");};f_enqueueMsg=function(a){enqueueMsg(a);};f_enqueueErrorMsg=function(a){enqueueErrorMsg(a);};f_removeLoadingMsg=function(){removeLoadingMsg();};f_initFrame=function(){initFrame();};f_layoutFrames=function(){layoutFrames();};f_fillTextPreferencesTab=function(){fillTextPreferencesTab();};f_fillPreferencesTab=function(){fillPreferencesTab();};f_fillBrowseSection=function(){fillBrowseSection();};f_fillFilterTab=function(){fillFilterTab();};f_fillTopToolbar=function(){fillTopToolbar();};f_yesNoDialog=function(d,g,e,b,c,h,a,j){$("#dialog_h").html(d);$("#dialog_h").dialog("option","title",g);function k(){if(e!=null){e.call(b,c);}}function i(){if(h!=null){h.call(a,j);}}var f={};f[gettext("No")]=function(){$(this).dialog("close");k();};f[gettext("Yes")]=function(){$(this).dialog("close");i();};$("#dialog_h").dialog("option","buttons",f);$("#dialog_h").dialog("open");};f_setCookie=function(a,b){_setCookie(a,b);};gInFullScreen=false;_setFrameSize=function(){if(parent!=window){if(gInFullScreen){var b=parent.$("#header").height();var f=parent.$(parent).height();var c=(f-b-2)+"px";var d=parent.$(parent).width();var a=(d-2)+"px";parent.$("#text_view_frame").css({position:"absolute",left:"0px",top:b,width:a,height:c});}else{var e=Math.ceil(parent.$("#autoexpand_text_view_frame_container").position()["top"]);var f=parent.$(parent).height();var c=(f-e-2)+"px";var d=parent.$(parent).width();var a=(d-2)+"px";parent.$("#text_view_frame").css({position:"relative",width:"99.9%",height:c,top:"0px"});}}};_toFullScreenSize=function(){gInFullScreen=true;_setFrameSize();$("#c_fullscreen_btn").attr("src",sv_media_url+"/img/arrow_in.png");f_setCookie("fullscreen","1");};_toNormalSize=function(){gInFullScreen=false;_setFrameSize();$("#c_fullscreen_btn").attr("src",sv_media_url+"img/arrow_out.png");f_setCookie("fullscreen","0");};_toInitialSize=function(){var a=($.cookie("fullscreen")=="1");if(a){_toFullScreenSize();}else{_toNormalSize();}};toInitialSize=function(){_toInitialSize();parent.$(parent).resize(function(){_setFrameSize();});};toggleFrameSize=function(){if(gInFullScreen){_toNormalSize();}else{_toFullScreenSize();}};
\ No newline at end of file
+gFormats=[{actions:["print"],extension:"html",label:gettext("print from the browser")},{actions:["export"],extension:"html",label:gettext("download html file (.html)")},{actions:["export"],extension:"markdown",label:gettext("download markdown file (.mkd)")},{actions:["print"],extension:"pdf",label:gettext("print in PDF format")},{actions:["export"],extension:"pdf",label:gettext("download portable object format file (.pdf)")},{actions:["export"],extension:"latex",label:gettext("download latex file (.tex)")},{actions:["export"],extension:"odt",label:gettext("download open document file (.odt)")},{actions:["export"],extension:"doc",label:gettext("download microsoft word file (.doc)")},{actions:["export"],extension:"docx",label:gettext("download microsoft word 2007 file (.docx)")}];var pandoc_version_ary=sv_pandoc_version.split(".");if(parseInt(pandoc_version_ary[0])>1||(parseInt(pandoc_version_ary[0])==1&&parseInt(pandoc_version_ary[1])>8)){gFormats.push({actions:["export"],extension:"epub",label:gettext("download ebook (.epub)")});}gFormats.push({actions:["export"],extension:"xml",label:gettext("download XML file for re-importing text and comments")});gActions={print:{dialogTitle:gettext("Print text"),chooseFormatLabel:gettext("How do you want to print?"),defaultMethod:"pdf",defaultWithColors:"no",defaultWhichComments:"all"},"export":{dialogTitle:gettext("Export text"),chooseFormatLabel:gettext("Choose file format"),defaultMethod:"pdf",defaultWithColors:"no",defaultWhichComments:"all"}};gCurrentAction=null;_populateMethod=function(g){var f=$("#p_method").val();$("#p_method").html("");for(var d=0,c=gFormats.length;d<c;d++){var e=gFormats[d]["actions"];for(var b=0,a=gFormats.length;b<a;b++){if(e[b]==gCurrentAction){$("<option value='"+gFormats[d]["extension"]+"'>"+gFormats[d]["label"]+"</option>").appendTo("#p_method");}}}if(f){$("#p_method").val(f);}else{$("#p_method").val(gActions[gCurrentAction]["defaultMethod"]);}};_populateMarkersColorsChoice=function(b){var a=$("#p_color").val();$("#p_color").html("");$("<option value='0'>"+gettext("using markers only, no background colors")+"</option>").appendTo("#p_color");$("<option value='1'>"+gettext("using markers and background colors")+"</option>").appendTo("#p_color");if(a){$("#p_color").val(a);}else{$("#p_color").val(gActions[gCurrentAction]["defaultWithColors"]);}};_populateWhichComments=function(){var c=$("#p_comments").val();$("#p_comments").html("");var a=interpolate(gettext("all (%(nb_comments)s)"),{nb_comments:frames.text_view_comments.gDb.getCommentsNb(true)},true);var b=interpolate(gettext("current filtered ones (%(nb_comments)s)"),{nb_comments:frames.text_view_comments.gDb.getCommentsNb(false)},true);$("<option value='all' >"+a+"</option>").appendTo($("#p_comments"));$("<option value='none' >"+gettext("none (0)")+"</option>").appendTo($("#p_comments"));$("<option value='filtered' >"+b+"</option>").appendTo($("#p_comments"));if(c){$("#p_comments").val(c);}else{$("#p_comments").val(gActions[gCurrentAction]["defaultWhichComments"]);}};_manageMarkersColorsChoice=function(){var f=$("#p_method").val();var e=$("#p_comments").val();var c=frames.text_view_comments.gDb.getCommentsNb(true);var d=frames.text_view_comments.gDb.getCommentsNb(false);var b=(e=="all")?c:d;var a;if(gCurrentAction=="print"){a=((b==0)||(e=="none"));}if(gCurrentAction=="export"){a=((b==0)||(e=="none")||(f=="markdown")||(f=="latex")||(f=="epub")||(f=="odt")||(f=="doc")||(f=="xml"));}if(a){$("#p_color").val("no");}$("#p_color").attr("disabled",a);};_initPrintDialog=function(){$("#p_comments").add($("#p_method")).change(function(){_manageMarkersColorsChoice();_prepareOpenInNewWindow();});var a={};a[gettext("Go !")]=function(){var d=$("#p_comments").val();var c=$("#p_color").val();var e=$("#p_method").val();var b=(gCurrentAction=="export")?"1":(e=="html")?"0":"1";var f=$("#print_export_form").attr("target_action").replace(/FoRmAt/,e).replace(/DoWnLoAd/,b).replace(/WhIcHCoMmEnT/,d).replace(/WiThCoLoR/,c);$("#print_export_form").attr("action",f);document.print_export_form.submit();$(this).dialog("close");};a[gettext("Cancel")]=function(){$(this).dialog("close");};$("#dialog_print_export").dialog({bgiframe:true,autoOpen:false,width:500,modal:true,buttons:a,close:function(){}});};openPrintDialog=function(){_openPrintExportDialog("print");};openExportDialog=function(){_openPrintExportDialog("export");};_prepareOpenInNewWindow=function(){var a=$("#p_method").val();if((a=="html")&&(gCurrentAction=="print")){$("#print_export_form").attr("target","_blank");}else{$("#print_export_form").removeAttr("target");}};_openPrintExportDialog=function(a){gCurrentAction=a;$("#ui-dialog-title-dialog_print_export").html(gActions[gCurrentAction]["dialogTitle"]);$("#how").html(gActions[gCurrentAction]["chooseFormatLabel"]);$("#print_export_action").val(a);_populateWhichComments();_populateMarkersColorsChoice();_populateMethod();_manageMarkersColorsChoice();_prepareOpenInNewWindow();$("#dialog_print_export").dialog("open");};onFadeEnd=function(){$(this).remove();};gLoadingMsg=null;enqueueLoadingMsg=function(){gLoadingMsg=_enqueueMsg(gettext("loading..."),"",null);};removeLoadingMsg=function(){if(gLoadingMsg!=null){gLoadingMsg.remove();gLoadingMsg=null;}};_enqueueMsg=function(d,b,c){var a=$("<span>"+d+"</span>").appendTo("#c-msg-wrapper").addClass("f-msg-cls").addClass(b);if(c){a.animate({opacity:0.95},c).fadeOut(2000,onFadeEnd);}return a;};enqueueMsg=function(c){var a="f-msg";var b=8000;_enqueueMsg(c,a,b);};enqueueErrorMsg=function(c){var a="f-msg-e";var b=4000;_enqueueMsg(c,a,b);};var gResetOtherFieldsOnFilterFieldChange=true;var myDefaultOuterLayoutSettings={center:{paneSelector:".outer-center"},north:{size:50,spacing_open:0,closable:false,resizable:false}};var innerNorthPaneDefaults={innerNorthPaneOpened:"0",selectedTab:"0"};onInnerNorthPaneClose=function(){_setCookie("innerNorthPaneOpened","0");$("#add_comment_btn").css("top",63);if(document.getElementById("text_view_comments").contentDocument!=null){document.getElementById("text_view_comments").contentDocument.getElementById("the-toc").style.height=(parseInt(document.getElementById("text_view_comments").clientHeight)-50).toString()+"px";}return true;};onInnerNorthPaneOpen=function(){_setCookie("innerNorthPaneOpened","1");$("#add_comment_btn").css("top",149);if(document.getElementById("text_view_comments").contentDocument!=null){document.getElementById("text_view_comments").contentDocument.getElementById("the-toc").style.height=(parseInt(document.getElementById("text_view_comments").clientHeight)-50).toString()+"px";}return true;};var myDefaultInnerLayoutSettings={north:{size:88,spacing_open:8,spacing_closed:8,slidable:false,resizable:false,togglerLength_closed:"100%",togglerLength_open:"100%",togglerAlign_closed:"center",togglerTip_closed:gettext("click to show options"),togglerTip_open:gettext("click to hide options"),togglerContent_open:"<img alt='arrow up' src='"+sv_media_url+"img/arrow-up.png' />",togglerContent_closed:"<img alt='arrow down' src='"+sv_media_url+"img/arrow-down.png' />",initClosed:false,paneSelector:".inner-north",onopen:"onInnerNorthPaneOpen",onclose:"onInnerNorthPaneClose"}};var outerLayout,innerLayout;layoutFrames=function(){var a=$.cookie("innerNorthPaneOpened");myDefaultInnerLayoutSettings.north.initClosed=(a===null)?(innerNorthPaneDefaults.innerNorthPaneOpened=="0"):(a=="0");outerLayout=$("body").layout(myDefaultOuterLayoutSettings);innerLayout=$("div.outer-center").layout(myDefaultInnerLayoutSettings);if(myDefaultInnerLayoutSettings.north.initClosed){onInnerNorthPaneClose();}else{onInnerNorthPaneOpen();}};fillFilterTab=function(){var b=$("#c_filter");var a='<div style="float:right"><table><tr><td style="text-align:right;">'+gettext("Text")+'<td>&nbsp;</td><td><input id="filter_text" type="text"></input><input id="c_filter_btn" type="button" value="'+gettext("Search")+'"></input></td></tr><tr><td colspan="3" style="text-align:right;"><input id="c_filterreset_btn" type="button" value="'+gettext("Reset")+'"></input><input id="c_filterhideall_btn" type="button" value="'+gettext("Hide all Comments")+'"></input></td></tr></table></div><table><tr><td style="text-align:right;">'+gettext("Authors")+'</td><td>&nbsp;</td><td><select id="filter_name"></select></td><td>&nbsp;</td><td style="text-align:right;">'+gettext("States")+'</td><td>&nbsp;</td><td><select id="filter_state"></select></td><td>&nbsp;</td><td style="text-align:right;"><span id="filter_cat_label">'+gettext("Categories")+'</span></td><td>&nbsp;</td><td><select id="filter_cat"></select></td></tr><tr><td style="text-align:right;">'+gettext("Dates")+'</td><td>&nbsp;</td><td><select id="filter_date"></select></td><td>&nbsp;</td><td style="text-align:right;">'+gettext("Tags")+'</td><td>&nbsp;</td><td><select id="filter_tag"></select></td></tr></table>';b.append($(a));$("#c_filter input[type='text']").add("#c_filter select").addClass("c_filter_field");$("#filter_name").add("#filter_date").add("#filter_tag").add("#filter_cat").add("#filter_state").change(function(){if(frames.text_view_comments.readyForAction()){var c=$(this);frames.text_view_comments.checkForOpenedDialog(null,function(){applyFilter(c);});}});$("#c_filter_btn").click(function(){if(frames.text_view_comments.readyForAction()){var c=$("#filter_text");frames.text_view_comments.checkForOpenedDialog(null,function(){applyFilter(c);});}});$("#filter_text").keyup(function(c){if(c.keyCode==13){$("#c_filter_btn").click();}});$("#c_filterreset_btn").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){resetFilter();});}});$("#c_filterhideall_btn").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.hideAll();});}});};fillTopToolbar=function(){var l=$("#outer-north");var g=gettext("view previous comment");var h=gettext("view next comment");var k=gettext("view first comment");var b=gettext("view last next comment");var d=gettext("view all comments");var p=gettext("view all detached comments");var m=gettext("toggle advance interface");var r=gettext("toggle table of contents");var c=gettext("print document with/without comments");var q=gettext("export document with/without comments");var a=gettext("toggle full screen view");var i=gettext("text feed");var j=gettext("add a comment");var n='<div id="c-right-btn"><img id="c_fullscreen_btn" src="'+sv_media_url+'/img/arrow_out.png" title="'+a+'" alt="'+a+'"/><img id="c_print_btn" src="'+sv_media_url+'/img/printer.png" title="'+c+'" alt="'+c+'"/><img id="c_export_btn" src="'+sv_media_url+'/img/page_go.png" title="'+q+'" alt="'+q+'"/><a target="_blank" href="'+frames.text_view_comments.sv_text_feed_url+'"><img id="c_feed_btn" src="'+sv_media_url+'/img/feed.png" title="'+i+'" alt="'+i+'"/></a></div><div id="c-msg-wrapper"></div><table style="margin-bottom:.3em;"><tbody><tr><td><span id="c_filter_results" ><span id="c_browse_indx_scope">-</span><span id="c_browse_indx_modif_thread" style="display: none;">-</span>/<b>&nbsp;<span id="c_f_res_nb_dis"></span></b>&nbsp;<span id="c_f_res_nb_dis_txt"></span><span id="c_f_res_details">&nbsp;('+gettext("filter:")+'&nbsp;<span id="c_f_res_nb_com"></span>/<span id="c_f_res_nb_tot_com"></span>&nbsp;<span id="c_f_res_nb_com_txt"></span>&nbsp;<span id="c_f_res_nb_rep"></span>/<span id="c_f_res_nb_tot_rep"></span><span id="c_f_res_nb_rep_txt"></span>)</span></span></td><td><span id="browse_section">, '+gettext("browse by:")+' <select id="browse_by" style="margin-right: 7px;"><option value="scope">'+gettext("location")+'</option><option value="modif_thread">'+gettext("modification")+'</option></select></span></td><td style="width: 40px; text-align: right;"><a href="#" id="c_browse_first"><img title="'+k+'" alt="'+k+'" src="'+sv_media_url+'/img/control_fastbackward_blue.png"/></a><a href="#" id="c_browse_prev"><img title="'+g+'" alt="'+g+'" src="'+sv_media_url+'/img/control_playback_blue.png" style="margin-right: 3px;"/></a></td><td style="width: 44px; text-align: left; border-right: 1px dotted #b1b1b1;"><a href="#" id="c_browse_next"><img title="'+h+'" alt="'+h+'" src="'+sv_media_url+'/img/control_play_blue.png"/></a><a href="#" id="c_browse_last"><img title="'+b+'" alt="'+b+'" src="'+sv_media_url+'/img/control_fastforward_blue.png"/></a></td><td style="width: 20px; text-align: left;"><a href="#" id="c_browse_all"><img title="'+d+'" alt="'+d+'" src="'+sv_media_url+'/img/view_all.png" style="margin-left: 11px; margin-right: 8px;" /></a></td><td style="width: 20px; text-align: left;"><a href="#" id="c_browse_scope_removed"><img title="'+p+'" alt="'+p+'" src="'+sv_media_url+'/img/view_scope_removed2.png" style="margin-top: -8px; margin-right: 3px;" /></a></td><td style="width: 20px; text-align: left;"><a href="#" id="c_thread_unthread"><img id="c_thread_unthread_img" style="margin-right: 8px;"/></a></td><td style="width: 20px; text-align: left;"><a href="#" id="c_toc_btn"><img title="'+r+'" alt="'+r+'" src="'+sv_media_url+'/img/document_index.png"/></a></td></tr></tbody></table>';l.prepend($(n));$("#add_comment_btn").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.gSync.showCommentForm(null);});}});var f=function(){$("#browse_by option").each(function(){$("#c_browse_indx_"+this.value).hide();});$("#c_browse_indx_"+$("#browse_by").val()).show();};var e=$.cookie("browse_by");e=(e==null)?"location":e;_setCookie("browse_by",$("#browse_by").val());$("#browse_by option[value="+e+"]").attr("selected",true);f();$("#browse_by").change(function(){_setCookie("browse_by",$("#browse_by").val());f();});var o=function(s){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.browse($("#browse_by").val(),s);});}};$("#c_browse_prev").click(function(){o("prev");});$("#c_browse_next").click(function(){o("next");});$("#c_browse_first").click(function(){o("first");});$("#c_browse_last").click(function(){o("last");});$("#c_browse_all").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.gSync.showAllComments();});}});$("#c_browse_scope_removed").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.gSync.showScopeRemovedComments();});}});$("#c_print_btn").click(function(){if(frames.text_view_comments.readyForAction()){var s=frames.text_view_comments.gDb.getFilteredCommentIdsAsString();frames.text_view_comments.CY.log($("#filteredIds").val(s));openPrintDialog();}});$("#c_export_btn").click(function(){if(frames.text_view_comments.readyForAction()){var s=frames.text_view_comments.gDb.getFilteredCommentIdsAsString();frames.text_view_comments.CY.log($("#filteredIds").val(s));openExportDialog();}});if(frames.text_view_comments.gLayout.isInComentSite()){$("#c_fullscreen_btn").click(function(){toggleFrameSize();});}$("#c_advanced_btn").click(function(){$(".ui-layout-toggler").click();});setThreadPref=function(){var t=frames.text_view_comments.c_readPreference("comments","threadpad");var u=sv_media_url+"/img/unthread_box.png";var s=gettext("unthread discussions");if(t=="0"){u=sv_media_url+"/img/thread_box.png";s=gettext("thread discussions");}$("#c_thread_unthread_img").attr("src",u).attr("alt",s).attr("title",s);};setThreadPref();$("#c_thread_unthread").click(function(){var t=frames.text_view_comments.c_readPreference("comments","threadpad");var s=(t=="0")?"1":"0";frames.text_view_comments.c_persistPreference("comments","threadpad",s);setThreadPref();frames.text_view_comments.gSync.animateToTop();});$("#c_toc_btn").click(function(){if(frames.text_view_comments.readyForAction()){frames.text_view_comments.checkForOpenedDialog(null,function(){frames.text_view_comments.toggleTocFn();});}});};onSliderStop=function(){var a=$("#c_slider").slider("value");if(a>(frames.text_view_comments.gConf.sliderFixedMin*100)){$("#c_slider").slider("value",[90]);}if(a<(frames.text_view_comments.gConf.sliderFixedMax*100)){$("#c_slider").slider("value",[10]);}frames.text_view_comments.c_setCommentsColWidth(a);frames.text_view_comments.c_persistPreference("layout","comments_col_width",a);};fillTextPreferencesTab=function(){var d=$("#c_text_preferences");d.append($("<table><tr><td>"+gettext("Text style")+'</td><td>&nbsp;</td><td><select id="c_textpref_style"></select></td></tr></table>'));var e=frames.text_view_comments.gTextStyles;for(var c in e){$("#c_textpref_style").append($("<option value='"+c+"'>"+e[c]+"</option>"));}var a=function(){var g=frames.text_view_comments.gTextStyles;var h=$("#c_textpref_style").val();for(var f in g){if(f==h){frames.text_view_comments.CY.get("#textcontainer").addClass(f);}else{frames.text_view_comments.CY.get("#textcontainer").removeClass(f);}}};var b=function(){var f=frames.text_view_comments.c_readPreference("text","style");$("#c_textpref_style").val(f);};$("#c_textpref_style").change(function(f){frames.text_view_comments.c_persistPreference("text","style",$("#c_textpref_style").val());a();});b();a();};fillPreferencesTab=function(){var b=$("#c_preferences");var a='<div style="float:right"><input id="c_pref_save_btn" type="button" value="'+gettext("Save")+'"></input><input id="c_pref_reset_btn" type="button" value="'+gettext("Reset")+'"></input></div><table><tr><td>'+gettext("Animation duration")+'</td><td>&nbsp;</td><td><input id="c_pref_animduration" type="text" style="width:3em" value="" /></td></tr><tr><td><span class="frame_helptext">'+gettext("(0.001 to 1 second)")+"</span></td><td></td><td></td></tr></table>";b.append($(a));setPreferencesFieldsValue=function(){var c=frames.text_view_comments.c_readPreference("general","animduration");$("#c_pref_animduration").val(c);};setPreferencesFieldsValue();$("#c_pref_animduration").blur(function(){var c=parseFloat($(this).val());if(isNaN(c)||(c<=0)||(c>1)){c=frames.text_view_comments.c_readDefaultPreference("general","animduration");}$(this).val(c);});$("#c_pref_reset_btn").click(function(){frames.text_view_comments.c_resetPreferences(["general"]);setPreferencesFieldsValue();enqueueMsg(gettext("preferences reset (will apply on next load)"));});$("#c_pref_save_btn").click(function(){frames.text_view_comments.c_persistPreference("general","animduration",$("#c_pref_animduration").val());enqueueMsg(gettext("preferences saved (will apply on next load)"));});};initFrame=function(){_initYesNoDialog();_initPrintDialog();$(window).resize(function(){onSliderStop();});$("#c_slider").slider({animate:true,range:"min",value:frames.text_view_comments.c_readPreference("layout","comments_col_width"),min:1,iframeFix:true,max:100,slide:function(a,b){var c=b.value;frames.text_view_comments.c_setCommentsColWidth(c);},stop:function(a,b){onSliderStop();}});_initTabs();f_interfaceFreeze();};_initTabs=function(){$(".inner-north").tabs();var a=$.cookie("selectedTab");a=(a===null)?innerNorthPaneDefaults.selectedTab:parseInt(a);$(".inner-north").tabs("select",a);$(".inner-north").bind("tabsselect",function(b,c){_setCookie("selectedTab",c.index);});};_initYesNoDialog=function(){$("#dialog_h").dialog({autoOpen:false,modal:true});};_setCookie=function(a,c){var b=new Date();b.setFullYear(2100,0,1);$.cookie(a,c,{expires:b,path:"/"});};f_getFrameFilterData=function(){var d=$("#filter_name").val();var c=$("#filter_date").val();var f=$("#filter_text").val();var b=$("#filter_tag").val();var a=$("#filter_cat").val();var e=$("#filter_state").val();return{name:d,date:c,text:f,tag:b,cat:a,state:e};};f_setFilterValue=function(a){for(key in a){if(key.indexOf("filter_")==0){$("#"+key).val(a[key]);}}};f_isFrameFilterFieldsInit=function(){var b=f_getFrameFilterData();var a=true;for(key in b){a=a&&(b[key]=="");}return a;};initFilterFields=function(){$(".c_filter_field").val("");};resetFilter=function(){initFilterFields();frames.text_view_comments.reinit();enqueueMsg(gettext("filter reset"));};applyFilter=function(a){var b=a.val();if(gResetOtherFieldsOnFilterFieldChange){initFilterFields();a.val(b);}frames.text_view_comments.reinit();enqueueMsg(gettext("filter applied"));};f_updateFilterCountResult=function(d,a,b,e,c){$("#c_f_res_nb_dis").html(d);$("#c_f_res_nb_dis_txt").html(ngettext("discussion","discussions",d));$("#c_f_res_nb_com").html(a);$("#c_f_res_nb_tot_com").html(e);$("#c_f_res_nb_com_txt").html(ngettext("comment","comments",a));$("#c_f_res_nb_rep").html(b);$("#c_f_res_nb_tot_rep").html(c);$("#c_f_res_nb_rep_txt").html("&nbsp;"+ngettext("reply","replies",b));$("#c_filter_results").show();};f_updateFilterCountDetailed=function(a){if(a){$("#c_f_res_details").show();$("c_browse_all").val("View all (filtered) comments");}else{$("#c_f_res_details").hide();$("#c_browse_all").val("View all comments");}};f_updateFilterData=function(f){var h=$("#filter_name option:selected").attr("name");var l=gettext("all");$("#filter_name option").remove();$("#filter_name").append($("<option name='c_f2_user_all' value=''>"+l+"</option>"));for(var c=0,b=f.names.length;c<b;c++){var m=f.names[c];$("#filter_name").append($("<option name='c_f2_user_"+m.name+"' value='"+m.name+"'>"+m.display+" ("+m.nb_comments+")</option>"));}$("#filter_name option[name="+h+"]").attr("selected",true);var a=$("#filter_date option:selected").attr("name");$("#filter_date option").remove();$("#filter_date").append($("<option name='c_f_date_all' value=''>"+l+"</option>"));for(var c=0,b=f.dates.length;c<b;c++){var m=f.dates[c];var g=ngettext("last 24 hours (%(nb_comments)s)","last %(nb_days)s days (%(nb_comments)s)",m.nb_day);var k=interpolate(g,{nb_days:m.nb_day,nb_comments:m.nb_comments},true);$("#filter_date").append($("<option name='c_f_date_"+m.nb_day+"' value='"+m.nb_day_date+"'>"+k+"</option>"));}$("#filter_date option[name="+a+"]").attr("selected",true);var j=$("#filter_tag option:selected").attr("name");$("#filter_tag option").remove();$("#filter_tag").append($("<option name='c_f2_tag_all' value=''>"+l+"</option>"));for(var c=0,b=f.tags.length;c<b;c++){var m=f.tags[c];$("#filter_tag").append($("<option name='c_f2_tag_"+m.name+"' value='"+m.name+"'>"+m.name+" ("+m.nb_comments+")</option>"));}$("#filter_tag option[name="+j+"]").attr("selected",true);var e=$("#filter_cat option:selected").attr("cat");$("#filter_cat option").remove();categories=frames.text_view_comments.CY.JSON.parse(frames.text_view_comments.sv_categories);if(categories.hasOwnProperty("0")){$("#filter_cat").append($("<option name='c_f2_cat_all' value=''>"+l+"</option>"));for(var c=0,b=f.categories.length;c<b;c++){var m=f.categories[c];$("#filter_cat").append($("<option name='c_f2_cat_"+m.cat+"' value='"+gettext(m.cat)+"'>"+categories[m.cat]+" ("+m.nb_comments+")</option>"));}$("#filter_cat option[name="+e+"]").attr("selected",true);}else{$("#filter_cat").remove();$("#filter_cat_label").remove();}var d=$("#filter_state option:selected").attr("state");$("#filter_state option").remove();$("#filter_state").append($("<option name='c_f2_state_all' value=''>"+l+"</option>"));for(var c=0,b=f.states.length;c<b;c++){var m=f.states[c];$("#filter_state").append($("<option name='c_f2_state_"+m.state+"' value='"+m.state+"'>"+gettext(m.state)+" ("+m.nb_comments+")</option>"));}$("#filter_state option[name="+d+"]").attr("selected",true);};f_interfaceUnfreeze=function(){for(var b=0,a=$(".c_tab").length;b<a;b++){$(".inner-north").tabs("enable",b);}$(".inner-north select").add(".inner-north input").add("#outer-north select").add("#outer-north input").each(function(){$(this).attr("disabled",false);});$("#c_slider").slider("enable");};f_interfaceFreeze=function(){for(var b=0,a=$(".c_tab").length;b<a;b++){$(".inner-north").tabs("disable",b);}$(".inner-north select").add(".inner-north input").add("#outer-north select").add("#outer-north input").each(function(){$(this).attr("disabled",true);});$("#c_slider").slider("disable");};f_enqueueMsg=function(a){enqueueMsg(a);};f_enqueueErrorMsg=function(a){enqueueErrorMsg(a);};f_removeLoadingMsg=function(){removeLoadingMsg();};f_initFrame=function(){initFrame();};f_layoutFrames=function(){layoutFrames();};f_fillTextPreferencesTab=function(){fillTextPreferencesTab();};f_fillPreferencesTab=function(){fillPreferencesTab();};f_fillBrowseSection=function(){fillBrowseSection();};f_fillFilterTab=function(){fillFilterTab();};f_fillTopToolbar=function(){fillTopToolbar();};f_yesNoDialog=function(d,g,e,b,c,h,a,j){$("#dialog_h").html(d);$("#dialog_h").dialog("option","title",g);function k(){if(e!=null){e.call(b,c);}}function i(){if(h!=null){h.call(a,j);}}var f={};f[gettext("No")]=function(){$(this).dialog("close");k();};f[gettext("Yes")]=function(){$(this).dialog("close");i();};$("#dialog_h").dialog("option","buttons",f);$("#dialog_h").dialog("open");};f_setCookie=function(a,b){_setCookie(a,b);};gInFullScreen=false;_setFrameSize=function(){if(parent!=window){if(gInFullScreen){var b=parent.$("#header").height();var f=parent.$(parent).height();var c=(f-b-2)+"px";var d=parent.$(parent).width();var a=(d-2)+"px";parent.$("#text_view_frame").css({position:"absolute",left:"0px",top:b,width:a,height:c});}else{var e=Math.ceil(parent.$("#autoexpand_text_view_frame_container").position()["top"]);var f=parent.$(parent).height();var c=(f-e-2)+"px";var d=parent.$(parent).width();var a=(d-2)+"px";parent.$("#text_view_frame").css({position:"relative",width:"99.9%",height:c,top:"0px"});}}};_toFullScreenSize=function(){gInFullScreen=true;_setFrameSize();$("#c_fullscreen_btn").attr("src",sv_media_url+"/img/arrow_in.png");f_setCookie("fullscreen","1");};_toNormalSize=function(){gInFullScreen=false;_setFrameSize();$("#c_fullscreen_btn").attr("src",sv_media_url+"img/arrow_out.png");f_setCookie("fullscreen","0");};_toInitialSize=function(){var a=($.cookie("fullscreen")=="1");if(a){_toFullScreenSize();}else{_toNormalSize();}};toInitialSize=function(){_toInitialSize();parent.$(parent).resize(function(){_setFrameSize();});};toggleFrameSize=function(){if(gInFullScreen){_toNormalSize();}else{_toFullScreenSize();}};
\ No newline at end of file
--- a/src/cm/media/js/site/f_text_view_frame.js	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/media/js/site/f_text_view_frame.js	Tue Jun 25 11:56:01 2013 +0200
@@ -118,6 +118,14 @@
           '<td>' +
             '<select id="filter_state"></select>' +
           '</td>' +
+          '<td>&nbsp;</td>' +
+          '<td style="text-align:right;"><span id="filter_cat_label">' +
+          gettext('Categories') +
+          '</span></td>' +
+          '<td>&nbsp;</td>' +
+          '<td>' +
+            '<select id="filter_cat"></select>' +
+          '</td>' +
         '</tr>' +
         '<tr>' +
           '<td style="text-align:right;">' +
@@ -141,7 +149,7 @@
   
   $("#c_filter input[type='text']").add("#c_filter select").addClass('c_filter_field') ;
 
-  $("#filter_name").add("#filter_date").add("#filter_tag").add("#filter_state").change(function() {
+  $("#filter_name").add("#filter_date").add("#filter_tag").add("#filter_cat").add("#filter_state").change(function() {
     if (frames['text_view_comments'].readyForAction()) {
       var elt = $(this) ;
       frames['text_view_comments'].checkForOpenedDialog(null, function() {
@@ -546,8 +554,9 @@
   var date_str = $('#filter_date').val(); ; 
   var text = $('#filter_text').val(); ; 
   var tag = $('#filter_tag').val(); ; 
+  var cat = $('#filter_cat').val(); ; 
   var state = $('#filter_state').val(); ; 
-  return {'name':name, 'date':date_str, 'text':text, 'tag':tag, 'state':state} ;
+  return {'name':name, 'date':date_str, 'text':text, 'tag':tag, 'cat':cat, 'state':state} ;
 }
 
 f_setFilterValue = function (obj) {
@@ -658,6 +667,25 @@
   }
   $("#filter_tag option[name="+selectedTagOption+"]").attr("selected", true);
   
+  // categories
+  var selectedCatOption = $("#filter_cat option:selected").attr("cat") ;
+
+  $("#filter_cat option").remove() ;
+  
+  categories = frames['text_view_comments'].CY.JSON.parse(frames['text_view_comments'].sv_categories);
+  if (categories.hasOwnProperty('0')) {
+    $("#filter_cat").append($("<option name='c_f2_cat_all' value=''>" + all + "</option>")) ;
+    for (var  i=0, ilen=newFilterData['categories'].length; i < ilen ; i++) {
+      var item = newFilterData['categories'][i] ;
+      $("#filter_cat").append($("<option name='c_f2_cat_"+ item.cat +"' value='"+ gettext(item.cat) +"'>" + categories[item.cat] +" ("+item.nb_comments+")</option>")) ;
+    }
+    $("#filter_cat option[name="+selectedCatOption+"]").attr("selected", true);
+  }
+  else {
+    $("#filter_cat").remove()
+    $("#filter_cat_label").remove()
+  }
+  
   // states
   var selectedStateOption = $("#filter_state option:selected").attr("state") ;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/migrations/0009_auto__chg_field_attachment_text_version.py	Tue Jun 25 11:56:01 2013 +0200
@@ -0,0 +1,199 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'Attachment.text_version'
+        db.alter_column('cm_attachment', 'text_version_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['cm.TextVersion'], null=True))
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'Attachment.text_version'
+        db.alter_column('cm_attachment', 'text_version_id', self.gf('django.db.models.fields.related.ForeignKey')(default=None, to=orm['cm.TextVersion']))
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '75'})
+        },
+        'cm.activity': {
+            'Meta': {'object_name': 'Activity'},
+            'comment': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.Comment']", 'null': 'True', 'blank': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'default': 'None', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
+            'originator_user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'originator_activity'", 'null': 'True', 'blank': 'True', 'to': "orm['auth.User']"}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.TextVersion']", 'null': 'True', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.attachment': {
+            'Meta': {'object_name': 'Attachment'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'data': ('django.db.models.fields.files.FileField', [], {'max_length': '1000'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.TextVersion']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.comment': {
+            'Meta': {'object_name': 'Comment'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'content_html': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'end_offset': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'end_wrapper': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'format': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '20'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'id_key': ('django.db.models.fields.CharField', [], {'default': "'QYwLbYEYNE8'", 'max_length': '20', 'db_index': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'reply_to': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Comment']", 'null': 'True', 'blank': 'True'}),
+            'start_offset': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'start_wrapper': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.TextVersion']"}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.configuration': {
+            'Meta': {'object_name': 'Configuration'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.TextField', [], {}),
+            'raw_value': ('django.db.models.fields.TextField', [], {})
+        },
+        'cm.email': {
+            'Meta': {'object_name': 'Email'},
+            'bcc': ('django.db.models.fields.TextField', [], {}),
+            'body': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'from_email': ('django.db.models.fields.TextField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'subject': ('django.db.models.fields.TextField', [], {}),
+            'to': ('django.db.models.fields.TextField', [], {})
+        },
+        'cm.notification': {
+            'Meta': {'object_name': 'Notification'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.role': {
+            'Meta': {'object_name': 'Role'},
+            'anon': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'description': ('django.db.models.fields.TextField', [], {}),
+            'global_scope': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'roles'", 'symmetrical': 'False', 'to': "orm['auth.Permission']"})
+        },
+        'cm.text': {
+            'Meta': {'object_name': 'Text'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'last_text_version': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'related_text'", 'null': 'True', 'to': "orm['cm.TextVersion']"}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'private_feed_key': ('django.db.models.fields.CharField', [], {'null': 'True', 'default': 'None', 'max_length': '20', 'blank': 'True', 'unique': 'True', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.textversion': {
+            'Meta': {'object_name': 'TextVersion'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'format': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '20'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'mod_posteriori': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'note': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'max_length': '1000'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']"}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.userprofile': {
+            'Meta': {'object_name': 'UserProfile'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_email_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_suspended': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_temp': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'preferred_language': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '2'}),
+            'tags': ('tagging.fields.TagField', [], {'max_length': '1000'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+        },
+        'cm.userrole': {
+            'Meta': {'unique_together': "(('role', 'user', 'text'),)", 'object_name': 'UserRole'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'role': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Role']", 'null': 'True', 'blank': 'True'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        }
+    }
+
+    complete_apps = ['cm']
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/migrations/0010_auto__add_field_textversion_category_1__add_field_textversion_category.py	Tue Jun 25 11:56:01 2013 +0200
@@ -0,0 +1,228 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding field 'TextVersion.category_1'
+        db.add_column('cm_textversion', 'category_1', self.gf('django.db.models.fields.CharField')(default=u'platinium', max_length=20, null=True, blank=True), keep_default=False)
+
+        # Adding field 'TextVersion.category_2'
+        db.add_column('cm_textversion', 'category_2', self.gf('django.db.models.fields.CharField')(default=u'gold', max_length=20, null=True, blank=True), keep_default=False)
+
+        # Adding field 'TextVersion.category_3'
+        db.add_column('cm_textversion', 'category_3', self.gf('django.db.models.fields.CharField')(default=u'silver', max_length=20, null=True, blank=True), keep_default=False)
+
+        # Adding field 'TextVersion.category_4'
+        db.add_column('cm_textversion', 'category_4', self.gf('django.db.models.fields.CharField')(default=u'bronze', max_length=20, null=True, blank=True), keep_default=False)
+
+        # Adding field 'TextVersion.category_5'
+        db.add_column('cm_textversion', 'category_5', self.gf('django.db.models.fields.CharField')(default=u'iron', max_length=20, null=True, blank=True), keep_default=False)
+
+
+    def backwards(self, orm):
+        
+        # Deleting field 'TextVersion.category_1'
+        db.delete_column('cm_textversion', 'category_1')
+
+        # Deleting field 'TextVersion.category_2'
+        db.delete_column('cm_textversion', 'category_2')
+
+        # Deleting field 'TextVersion.category_3'
+        db.delete_column('cm_textversion', 'category_3')
+
+        # Deleting field 'TextVersion.category_4'
+        db.delete_column('cm_textversion', 'category_4')
+
+        # Deleting field 'TextVersion.category_5'
+        db.delete_column('cm_textversion', 'category_5')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '75'})
+        },
+        'cm.activity': {
+            'Meta': {'object_name': 'Activity'},
+            'comment': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.Comment']", 'null': 'True', 'blank': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'default': 'None', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
+            'originator_user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'originator_activity'", 'null': 'True', 'blank': 'True', 'to': "orm['auth.User']"}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.TextVersion']", 'null': 'True', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.attachment': {
+            'Meta': {'object_name': 'Attachment'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'data': ('django.db.models.fields.files.FileField', [], {'max_length': '1000'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.TextVersion']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.comment': {
+            'Meta': {'object_name': 'Comment'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'content_html': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'end_offset': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'end_wrapper': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'format': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '20'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'id_key': ('django.db.models.fields.CharField', [], {'default': "'pDtCnVJJPgf'", 'max_length': '20', 'db_index': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'reply_to': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Comment']", 'null': 'True', 'blank': 'True'}),
+            'start_offset': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'start_wrapper': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.TextVersion']"}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.configuration': {
+            'Meta': {'object_name': 'Configuration'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.TextField', [], {}),
+            'raw_value': ('django.db.models.fields.TextField', [], {})
+        },
+        'cm.email': {
+            'Meta': {'object_name': 'Email'},
+            'bcc': ('django.db.models.fields.TextField', [], {}),
+            'body': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'from_email': ('django.db.models.fields.TextField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'subject': ('django.db.models.fields.TextField', [], {}),
+            'to': ('django.db.models.fields.TextField', [], {})
+        },
+        'cm.notification': {
+            'Meta': {'object_name': 'Notification'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.role': {
+            'Meta': {'object_name': 'Role'},
+            'anon': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'description': ('django.db.models.fields.TextField', [], {}),
+            'global_scope': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'roles'", 'symmetrical': 'False', 'to': "orm['auth.Permission']"})
+        },
+        'cm.text': {
+            'Meta': {'object_name': 'Text'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'last_text_version': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'related_text'", 'null': 'True', 'to': "orm['cm.TextVersion']"}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'private_feed_key': ('django.db.models.fields.CharField', [], {'null': 'True', 'default': 'None', 'max_length': '20', 'blank': 'True', 'unique': 'True', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.textversion': {
+            'Meta': {'object_name': 'TextVersion'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'category_1': ('django.db.models.fields.CharField', [], {'default': "u'platinium'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'category_2': ('django.db.models.fields.CharField', [], {'default': "u'gold'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'category_3': ('django.db.models.fields.CharField', [], {'default': "u'silver'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'category_4': ('django.db.models.fields.CharField', [], {'default': "u'bronze'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'category_5': ('django.db.models.fields.CharField', [], {'default': "u'iron'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'format': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '20'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'mod_posteriori': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'note': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'max_length': '1000'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']"}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.userprofile': {
+            'Meta': {'object_name': 'UserProfile'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_email_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_suspended': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_temp': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'preferred_language': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '2'}),
+            'tags': ('tagging.fields.TagField', [], {'max_length': '1000'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+        },
+        'cm.userrole': {
+            'Meta': {'unique_together': "(('role', 'user', 'text'),)", 'object_name': 'UserRole'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'role': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Role']", 'null': 'True', 'blank': 'True'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        }
+    }
+
+    complete_apps = ['cm']
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/migrations/0011_auto__add_field_comment_category.py	Tue Jun 25 11:56:01 2013 +0200
@@ -0,0 +1,205 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding field 'Comment.category'
+        db.add_column('cm_comment', 'category', self.gf('django.db.models.fields.PositiveSmallIntegerField')(default=0), keep_default=False)
+
+
+    def backwards(self, orm):
+        
+        # Deleting field 'Comment.category'
+        db.delete_column('cm_comment', 'category')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '75'})
+        },
+        'cm.activity': {
+            'Meta': {'object_name': 'Activity'},
+            'comment': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.Comment']", 'null': 'True', 'blank': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'default': 'None', 'max_length': '15', 'null': 'True', 'blank': 'True'}),
+            'originator_user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'originator_activity'", 'null': 'True', 'blank': 'True', 'to': "orm['auth.User']"}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.TextVersion']", 'null': 'True', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.attachment': {
+            'Meta': {'object_name': 'Attachment'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'data': ('django.db.models.fields.files.FileField', [], {'max_length': '1000'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['cm.TextVersion']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.comment': {
+            'Meta': {'object_name': 'Comment'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'category': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'content_html': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'end_offset': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'end_wrapper': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'format': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '20'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'id_key': ('django.db.models.fields.CharField', [], {'default': "'gDcMRuTvHtD'", 'max_length': '20', 'db_index': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'reply_to': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Comment']", 'null': 'True', 'blank': 'True'}),
+            'start_offset': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'start_wrapper': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'text_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.TextVersion']"}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.configuration': {
+            'Meta': {'object_name': 'Configuration'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.TextField', [], {}),
+            'raw_value': ('django.db.models.fields.TextField', [], {})
+        },
+        'cm.email': {
+            'Meta': {'object_name': 'Email'},
+            'bcc': ('django.db.models.fields.TextField', [], {}),
+            'body': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'from_email': ('django.db.models.fields.TextField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'subject': ('django.db.models.fields.TextField', [], {}),
+            'to': ('django.db.models.fields.TextField', [], {})
+        },
+        'cm.notification': {
+            'Meta': {'object_name': 'Notification'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.role': {
+            'Meta': {'object_name': 'Role'},
+            'anon': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'description': ('django.db.models.fields.TextField', [], {}),
+            'global_scope': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'roles'", 'symmetrical': 'False', 'to': "orm['auth.Permission']"})
+        },
+        'cm.text': {
+            'Meta': {'object_name': 'Text'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'last_text_version': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'related_text'", 'null': 'True', 'to': "orm['cm.TextVersion']"}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'private_feed_key': ('django.db.models.fields.CharField', [], {'null': 'True', 'default': 'None', 'max_length': '20', 'blank': 'True', 'unique': 'True', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.textversion': {
+            'Meta': {'object_name': 'TextVersion'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'category_1': ('django.db.models.fields.CharField', [], {'default': "u'platinium'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'category_2': ('django.db.models.fields.CharField', [], {'default': "u'gold'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'category_3': ('django.db.models.fields.CharField', [], {'default': "u'silver'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'category_4': ('django.db.models.fields.CharField', [], {'default': "u'bronze'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'category_5': ('django.db.models.fields.CharField', [], {'default': "u'iron'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'format': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '20'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'mod_posteriori': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'note': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'max_length': '1000'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']"}),
+            'title': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'cm.userprofile': {
+            'Meta': {'object_name': 'UserProfile'},
+            'adminkey': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_email_error': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_suspended': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_temp': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20', 'db_index': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'preferred_language': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '2'}),
+            'tags': ('tagging.fields.TagField', [], {'max_length': '1000'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
+        },
+        'cm.userrole': {
+            'Meta': {'unique_together': "(('role', 'user', 'text'),)", 'object_name': 'UserRole'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'role': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Role']", 'null': 'True', 'blank': 'True'}),
+            'text': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cm.Text']", 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        }
+    }
+
+    complete_apps = ['cm']
--- a/src/cm/models.py	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/models.py	Tue Jun 25 11:56:01 2013 +0200
@@ -26,6 +26,75 @@
 from django.db import connection
 from datetime import datetime
 
+# default conf values
+DEFAULT_CONF = {
+                'workspace_name' : 'Workspace',
+                'site_url' : settings.SITE_URL,
+                'email_from' : settings.DEFAULT_FROM_EMAIL,
+                }
+
+from cm.role_models import change_role_model
+
+class ConfigurationManager(models.Manager):
+    def set_workspace_name(self, workspace_name):
+        if workspace_name:
+            self.set_key('workspace_name', workspace_name)
+
+    def get_key(self, key, default_value=None):
+        try:
+            return self.get(key=key).value
+        except Configuration.DoesNotExist:
+            return DEFAULT_CONF.get(key, default_value)
+
+    def del_key(self, key):
+        try:
+            self.get(key=key).delete()
+        except Configuration.DoesNotExist:
+            return None
+        
+    def set_key(self, key, value):
+        conf, created = self.get_or_create(key=key)
+        if created or conf.value != value:
+            conf.value = value
+            conf.save()
+            if key == 'workspace_role_model':
+                change_role_model(value)
+
+    def __getitem__(self, key):
+        if not key.startswith('f_'):
+            return self.get_key(key, None)
+        else:
+            return getattr(self,key)()
+    
+    def f_get_logo_url(self):
+        key = self.get_key('workspace_logo_file_key', None)
+        if key:
+            attach = Attachment.objects.get(key=key)
+            return attach.data.url
+        else:
+            return None 
+    
+import base64
+
+class Configuration(models.Model):
+    key = models.TextField(blank=False) # , unique=True cannot be added: creates error on mysql (?)
+    raw_value = models.TextField(blank=False)
+    
+    def get_value(self):
+        return pickle.loads(base64.b64decode(self.raw_value.encode('utf8')))
+        
+    def set_value(self, value):        
+        self.raw_value = base64.b64encode(pickle.dumps(value, 0)).encode('utf8')
+                
+    value = property(get_value, set_value)
+                
+    objects = ConfigurationManager()
+    
+    def __unicode__(self):
+        return '%s: %s' % (self.key, self.value)    
+    
+ApplicationConfiguration = Configuration.objects     
+
 class TextManager(Manager):
     def create_text(self, title, format, content, note, name, email, tags, user=None, state='approved', **kwargs):
         content = on_content_receive(content, format)
@@ -192,6 +261,14 @@
 
     mod_posteriori = models.BooleanField(ugettext_lazy('Moderation a posteriori?'), default=True)
 
+    from django.utils.safestring import mark_safe
+
+    category_1 = models.CharField(ugettext_lazy("Label for the first category of comments"), help_text=mark_safe(_("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #1523f4">&nbsp;</span><br />' + _("Leave blank to use the value configured for the workspace.") + '<br />' + _("To disable this category for this text whatever the configuration for the workspace, enter: ") + '<em>none</em>'), max_length=20, null=True, blank=True, default=ApplicationConfiguration['workspace_category_1'])
+    category_2 = models.CharField(ugettext_lazy("Label for the second category of comments"), help_text=mark_safe(_("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #f4154f">&nbsp;</span><br />' + _("Leave blank to use the value configured for the workspace. ") + '<br />' + _("To disable this category for this text whatever the configuration for the workspace, enter: ") + '<em>none</em>'), max_length=20, null=True, blank=True, default=ApplicationConfiguration['workspace_category_2'])
+    category_3 = models.CharField(ugettext_lazy("Label for the third category of comments"), help_text=mark_safe(_("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #09ff09">&nbsp;</span><br />' + _("Leave blank to use the value configured for the workspace. ") + '<br />' + _("To disable this category for this text whatever the configuration for the workspace, enter: ") + '<em>none</em>'), max_length=20, null=True, blank=True, default=ApplicationConfiguration['workspace_category_3'])
+    category_4 = models.CharField(ugettext_lazy("Label for the fourth category of comments"), help_text=mark_safe(_("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #bc39cf">&nbsp;</span><br />' + _("Leave blank to use the value configured for the workspace. ") + '<br />' + _("To disable this category for this text whatever the configuration for the workspace, enter: ") + '<em>none</em>'), max_length=20, null=True, blank=True, default=ApplicationConfiguration['workspace_category_4'])
+    category_5 = models.CharField(ugettext_lazy("Label for the fifth category of comments"), help_text=mark_safe(_("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #ffbd08">&nbsp;</span><br />' + _("Leave blank to use the value configured for the workspace. ") + '<br />' + _("To disable this category for this text whatever the configuration for the workspace, enter: ") + '<em>none</em>'), max_length=20, null=True, blank=True, default=ApplicationConfiguration['workspace_category_5'])
+
     text = models.ForeignKey("Text")
 
     objects = TextVersionManager()
@@ -279,6 +356,8 @@
     format = models.CharField(_("Format:"), max_length=20, blank=False, default=DEFAULT_INPUT_FORMAT, choices=CHOICES_INPUT_FORMATS)
 
     tags = TagField()
+
+    category = models.PositiveSmallIntegerField(default=0)
         
     start_wrapper = models.IntegerField(null=True, blank=True)
     end_wrapper = models.IntegerField(null=True, blank=True)
@@ -340,75 +419,6 @@
         
 # http://docs.djangoproject.com/en/dev/topics/files/#topics-files
 
-# default conf values
-DEFAULT_CONF = {
-                'workspace_name' : 'Workspace',
-                'site_url' : settings.SITE_URL,
-                'email_from' : settings.DEFAULT_FROM_EMAIL,
-                }
-
-from cm.role_models import change_role_model
-
-class ConfigurationManager(models.Manager):
-    def set_workspace_name(self, workspace_name):
-        if workspace_name:
-            self.set_key('workspace_name', workspace_name)
-
-    def get_key(self, key, default_value=None):
-        try:
-            return self.get(key=key).value
-        except Configuration.DoesNotExist:
-            return DEFAULT_CONF.get(key, default_value)
-
-    def del_key(self, key):
-        try:
-            self.get(key=key).delete()
-        except Configuration.DoesNotExist:
-            return None
-        
-    def set_key(self, key, value):
-        conf, created = self.get_or_create(key=key)
-        if created or conf.value != value:
-            conf.value = value
-            conf.save()
-            if key == 'workspace_role_model':
-                change_role_model(value)
-
-    def __getitem__(self, key):
-        if not key.startswith('f_'):
-            return self.get_key(key, None)
-        else:
-            return getattr(self,key)()
-    
-    def f_get_logo_url(self):
-        key = self.get_key('workspace_logo_file_key', None)
-        if key:
-            attach = Attachment.objects.get(key=key)
-            return attach.data.url
-        else:
-            return None 
-    
-import base64
-
-class Configuration(models.Model):
-    key = models.TextField(blank=False) # , unique=True cannot be added: creates error on mysql (?)
-    raw_value = models.TextField(blank=False)
-    
-    def get_value(self):
-        return pickle.loads(base64.b64decode(self.raw_value.encode('utf8')))
-        
-    def set_value(self, value):        
-        self.raw_value = base64.b64encode(pickle.dumps(value, 0)).encode('utf8')
-                
-    value = property(get_value, set_value)
-                
-    objects = ConfigurationManager()
-    
-    def __unicode__(self):
-        return '%s: %s' % (self.key, self.value)    
-    
-ApplicationConfiguration = Configuration.objects     
-
 class AttachmentManager(KeyManager):
     def create_attachment(self, text_version, filename, data):
         attach = self.create(text_version=text_version)
@@ -418,7 +428,7 @@
     
 class Attachment(KeyModel):
     data = models.FileField(upload_to="attachments/%Y/%m/%d/", max_length=1000)
-    text_version = models.ForeignKey(TextVersion, null=True)
+    text_version = models.ForeignKey(TextVersion, null=True, blank=True, default=None)
 
     objects = AttachmentManager()
     
--- a/src/cm/monkey_patches.py	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/monkey_patches.py	Tue Jun 25 11:56:01 2013 +0200
@@ -1,4 +1,4 @@
-from south.management.commands.migrate import  Command
+from south.management.commands.migrate import  Command, list_migrations
 from south.db import DEFAULT_DB_ALIAS
 from south import migration
 import sys
--- a/src/cm/templates/site/text_view_comments.html	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/templates/site/text_view_comments.html	Tue Jun 25 11:56:01 2013 +0200
@@ -80,6 +80,7 @@
 sv_key = "{{ text.key|escapejs }}";
 sv_version_key = "{{ text_version.key|escapejs }}";
 sv_format = "{{ text_version.format }}";
+sv_categories = "{{ categories|escapejs }}";
 
 sv_withComments = true ; // TODO will bug when false (!)
 c_yui_base = "{{ YUI_VERSION  }}" ;
@@ -119,7 +120,7 @@
 <script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/site/c_text_view_comments.js"></script> 
 <script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/lib/asciimathtml/ASCIIMathML.js"></script>
 {% else %}
-<script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/client/c_client-min.js?1363624120"></script> 
+<script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/client/c_client-min.js?1372154044"></script> 
 <script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/lib/asciimathtml/ASCIIMathML.min.js"></script>
 {% endif %}
 
--- a/src/cm/templates/site/text_view_frame.html	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/templates/site/text_view_frame.html	Tue Jun 25 11:56:01 2013 +0200
@@ -37,7 +37,7 @@
     <script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/client/f_printDialog.js"></script>
     <script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/site/f_text_view_frame.js"></script>
 {% else %}
-    <script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/client/f_client-min.js?1363624120"></script> 
+    <script type="text/javascript" src="{{ CM_MEDIA_PREFIX }}js/client/f_client-min.js?1372154044"></script> 
 {% endif %}
     <style type="text/css">
         /*
--- a/src/cm/views/site.py	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/views/site.py	Tue Jun 25 11:56:01 2013 +0200
@@ -188,9 +188,39 @@
                                              required=False,
                                              )
 
+    workspace_category_1 = forms.CharField(label=ugettext_lazy("Label for the first category of comments"),
+                                        help_text=mark_safe(ugettext_lazy("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #1523f4">&nbsp;</span>'),
+                                        widget=forms.TextInput,
+                                        required=False,
+                                        max_length=20,
+                                        )
+    workspace_category_2 = forms.CharField(label=ugettext_lazy("Label for the second category of comments"),
+                                        help_text=mark_safe(ugettext_lazy("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #f4154f">&nbsp;</span>'),
+                                        widget=forms.TextInput,
+                                        required=False,
+                                        max_length=20,
+                                        )
+    workspace_category_3 = forms.CharField(label=ugettext_lazy("Label for the third category of comments"),
+                                        help_text=mark_safe(ugettext_lazy("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #09ff09">&nbsp;</span>'),
+                                        widget=forms.TextInput,
+                                        required=False,
+                                        max_length=20,
+                                        )
+    workspace_category_4 = forms.CharField(label=ugettext_lazy("Label for the fourth category of comments"),
+                                        help_text=mark_safe(ugettext_lazy("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #bc39cf">&nbsp;</span>'),
+                                        widget=forms.TextInput,
+                                        required=False,
+                                        max_length=20,
+                                        )
+    workspace_category_5 = forms.CharField(label=ugettext_lazy("Label for the fifth category of comments"),
+                                        help_text=mark_safe(ugettext_lazy("Paragraphs including at least one comment of this category will have a vertical bar with this color: ") + '<span style="width: 2px; height: 5px; background-color: #ffbd08">&nbsp;</span>'),
+                                        widget=forms.TextInput,
+                                        required=False,
+                                        max_length=20,
+                                        )
 
     # fields to save in the Configuration objects
-    conf_fields = ['workspace_name', 'workspace_tagline', 'workspace_registration', 'workspace_registration_moderation', 'workspace_role_model']
+    conf_fields = ['workspace_name', 'workspace_tagline', 'workspace_registration', 'workspace_registration_moderation', 'workspace_role_model', 'workspace_category_1', 'workspace_category_2', 'workspace_category_3', 'workspace_category_4', 'workspace_category_5']
 
 
 @has_global_perm('can_manage_workspace')
--- a/src/cm/views/texts.py	Wed Mar 27 17:51:18 2013 +0100
+++ b/src/cm/views/texts.py	Tue Jun 25 11:56:01 2013 +0200
@@ -244,17 +244,31 @@
     
     get_params = simplejson.dumps(request.GET)
     wrapped_text_version, _ , _ = spannify(text_version.get_content())
-    template_dict = {'text' : text,
-                               'text_version' : text_version,
-                               'title' : text_version.title, # TODO use it ...
-                               'get_params' : get_params,
-                               'content' : wrapped_text_version,
-                               'client_date_fmt' : settings.CLIENT_DATE_FMT,
-                               'read_only' : read_only,
-                               }
+
+    from cm.models import ApplicationConfiguration
+    categories = {}
+    for i in range(1, 6):
+      if text_version.__dict__['category_' + str(i)].lower() != 'none':
+        if text_version.__dict__['category_' + str(i)] != None and text_version.__dict__['category_' + str(i)] != '':
+          categories[i] = text_version.__dict__['category_' + str(i)]
+        else:
+          if ApplicationConfiguration.get_key('workspace_category_' + str(i)) != None and ApplicationConfiguration.get_key('workspace_category_' + str(i)) != '':
+            categories[i] = ApplicationConfiguration.get_key('workspace_category_' + str(i))
+
+    template_dict = {
+        'text' : text,
+        'text_version' : text_version,
+        'title' : text_version.title, # TODO use it ...
+        'get_params' : get_params,
+        'content' : wrapped_text_version,
+        'client_date_fmt' : settings.CLIENT_DATE_FMT,
+        'read_only' : read_only,
+    }
     template_dict['json_comments'] = jsonize(comments, request)
     template_dict['json_filter_datas'] = jsonize(filter_datas, request)
-    from cm.models import ApplicationConfiguration
+    if categories:
+      categories[0] = 'none'
+    template_dict['categories'] = jsonize(categories, request)
     custom_css_str = ApplicationConfiguration.get_key('custom_css')
     if custom_css_str:
       custom_css = cssutils.parseString(custom_css_str)
@@ -433,6 +447,7 @@
         text_version = get_textversion_by_keys_or_404(version_key, adminkey, key)
     else :
         text_version = text.get_latest_version()
+    from cm.models import ApplicationConfiguration
     template_dict = {'text' : text, 'text_version' : text_version}
     return render_to_response('site/text_view_frame.html',
                               template_dict,
@@ -911,7 +926,7 @@
     
     class Meta:
         model = TextVersion
-        fields = ('mod_posteriori',)
+        fields = ('mod_posteriori', 'category_1', 'category_2', 'category_3', 'category_4', 'category_5')
 
 @has_perm_on_text('can_manage_text')
 def text_settings(request, key):
@@ -924,7 +939,7 @@
         if form.is_valid():
             form.save()
             display_message(request, _(u'Text settings updated'))                            
-            return redirect(request, 'text-view', args=[text.key])
+            return redirect(request, 'text-settings', args=[text.key])
     else:
         form = SettingsTextForm(instance = text_version)