Merge with 06d158b5d24b11a2c91f16148dd0d0fa5685f13b
authorymh <ymh.work@gmail.com>
Tue, 14 Sep 2010 13:38:47 +0200
changeset 52 652969ce19d6
parent 51 28d21b2123ba (current diff)
parent 50 06d158b5d24b (diff)
child 53 93fac34ead58
child 54 608159aa29a6
Merge with 06d158b5d24b11a2c91f16148dd0d0fa5685f13b
web/franceculture/.htaccess.tmpl
web/static/img/ajaxLoader.gif
--- a/.hgignore	Tue Sep 14 13:15:28 2010 +0200
+++ b/.hgignore	Tue Sep 14 13:38:47 2010 +0200
@@ -6,4 +6,7 @@
 ^web/franceculture/\.htaccess$
 ^web/franceculture/config\.py$
 ^web/static/media/
+^sbin/virtualenv/distribute.*\.tar\.gz$
 
+syntax: regexp
+^web/franceculture/modwsgi\.wsgi$
\ No newline at end of file
--- a/.hgtags	Tue Sep 14 13:15:28 2010 +0200
+++ b/.hgtags	Tue Sep 14 13:38:47 2010 +0200
@@ -10,3 +10,7 @@
 98798bbf6194b373d5582035439bc26b7c66daf9 V00.08
 1296cc9b23d51f8090e2b593ca519ec7b877b8a2 V00.09
 5442e8569ff0a98c066a759982a70bb31ce3fa07 V00.10
+433d84e3bca68f90e1c9cb3c15ae4cedaffc5425 V00.11
+cec4b9fc89972f9104b71d03c3db101eae171184 V00.12
+699be5c7b4acc7d514f4db3a7d7737f0de8d22aa V00.13
+55f91a1f9df88c0d2d18834e22168c8b753695eb V00.14
--- a/.pydevproject	Tue Sep 14 13:15:28 2010 +0200
+++ b/.pydevproject	Tue Sep 14 13:38:47 2010 +0200
@@ -2,6 +2,6 @@
 <?eclipse-pydev version="1.0"?>
 
 <pydev_project>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">python_franceculture</pydev_property>
 <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.6</pydev_property>
 </pydev_project>
--- a/sbin/sync/sync_ldt_platform	Tue Sep 14 13:15:28 2010 +0200
+++ b/sbin/sync/sync_ldt_platform	Tue Sep 14 13:38:47 2010 +0200
@@ -9,12 +9,13 @@
 #text2unix ~/tmp/franceculture_V$1
 
 if [ -d ~/tmp/franceculture_V$1 ]; then
-    cat <<EOT | rsync -Cvrlz --delete --filter=". -" ~/tmp/franceculture_V$1/web/ iri@web.iri.centrepompidou.fr:/iridata/www/web/franceculture/
+    cat <<EOT | rsync -Cvrlz --delete --filter=". -" ~/tmp/franceculture_V$1/web/ iri@web.iri.centrepompidou.fr:/iridata/www/exp/franceculture/
 + core
 P .htpasswd
 P .htaccess
 P franceculture/.htaccess
 P franceculture/config.py
+P franceculture/modwsgi.wsgi
 P robots.txt
 P env/***
 P log/***
--- a/sbin/virtualenv/create_python_env.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/sbin/virtualenv/create_python_env.py	Tue Sep 14 13:38:47 2010 +0200
@@ -49,6 +49,7 @@
 EXTRA_TEXT += "    'DJANGO' : { 'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.2.1/tarball/', 'local': '"+ os.path.abspath(os.path.join(src_base,"Django-1.2.1.tar.gz"))+"'},\n"
 EXTRA_TEXT += "    'DJANGO-EXTENSIONS' : { 'setup': 'django-extensions', 'url':'http://django-command-extensions.googlecode.com/files/django-extensions-0.4.1.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-extensions-0.4.1.tar.gz"))+"' },\n"
 EXTRA_TEXT += "    'DJANGO-REGISTRATION' : { 'setup': 'django-registration', 'url':'http://bitbucket.org/ubernostrum/django-registration/get/tip.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-registration.tar.gz"))+"' },\n"
+EXTRA_TEXT += "    'LXML' : { 'setup': 'lxml', 'url': '"+ os.path.abspath(os.path.join(src_base,"lxml_2.2.7.tar.gz"))+"', 'local': '"+ os.path.abspath(os.path.join(src_base,"lxml-2.2.7.tar.gz"))+"'},\n"
 EXTRA_TEXT += "}\n"
 
 EXTRA_TEXT += "import sys\n"
@@ -197,7 +198,7 @@
                             show_stdout=True)
 
         if system_str == 'Linux'  and 'DISTRIBUTE' not in ignore_packages:
-            normal_install('DISTRIBUTE', 'pip', None, res_source_key, home_dir, tmp_dir)
+            normal_install('DISTRIBUTE', 'pip', None, None, res_source_key, home_dir, tmp_dir)
 
         if 'PYXML' not in ignore_packages:
             logger.notify("PyXML install : %s " % URLS['PYXML'][res_source_key])
@@ -232,20 +233,26 @@
                         show_stdout=True)
         
         
-        NORMAL_INSTALL = [ #(key,method)
-            ('PSYCOPG2', 'pip', None),
-            ('MYSQL', 'pip', None),
-            ('PIL', 'pip', None), 
-            ('FOURSUITE_XML','easy_install', None), 
-            ('DJANGO','pip', None),
-            ('DJANGO-EXTENSIONS', 'pip', None),
-            ('DJANGO-REGISTRATION', 'easy_install', '-Z')
+        NORMAL_INSTALL = [ #(key,method, option_str, extra_env)
+            #('LXML', 'easy_install', None, {'STATIC_DEPS': 'true'}),
+            ('PSYCOPG2', 'pip', None, None),
+            ('MYSQL', 'pip', None, None),
+            ('PIL', 'pip', None, None), 
+            ('FOURSUITE_XML','easy_install', None, None), 
+            ('DJANGO','pip', None, None),
+            ('DJANGO-EXTENSIONS', 'pip', None, None),
+            ('DJANGO-REGISTRATION', 'easy_install', '-Z', None),
             ]
+            
+        if system_str == "Darwin":
+            NORMAL_INSTALL.append(('LXML', 'easy_install', None, {'STATIC_DEPS': 'true'}))
+        else:
+            NORMAL_INSTALL.append(('LXML', 'easy_install', None, None))
         
             
-        for key, method, option_str in NORMAL_INSTALL:
+        for key, method, option_str, extra_env in NORMAL_INSTALL:
             if key not in ignore_packages:
-                normal_install(key, method, option_str, res_source_key, home_dir, tmp_dir)
+                normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir)
                         
         logger.notify("Clear source dir")
         shutil.rmtree(src_dir)
@@ -257,7 +264,7 @@
                   % join(script_dir, 'easy_install'))
 
 
-def normal_install(key, method, option_str, res_source_key, home_dir, tmp_dir):
+def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir):
     logger.notify("Install %s from %s with %s" % (key,URLS[key][res_source_key],method))
     if method == 'pip':
         args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS[key][res_source_key]]
@@ -266,7 +273,8 @@
         call_subprocess(args,
                 cwd=os.path.abspath(tmp_dir),
                 filter_stdout=filter_python_develop,
-                show_stdout=True)
+                show_stdout=True,
+                extra_env=extra_env)
     else:
         args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), URLS[key][res_source_key]]
         if option_str :
@@ -274,7 +282,8 @@
         call_subprocess(args,
                 cwd=os.path.abspath(tmp_dir),
                 filter_stdout=filter_python_develop,
-                show_stdout=True)
+                show_stdout=True,
+                extra_env=extra_env)
     
 
 def ensure_dir(dir):
Binary file sbin/virtualenv/res/src/lxml-2.2.7.tar.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/update_db_0_10_to_0_13.sql	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,2 @@
+ALTER TABLE ldt_utils_content ALTER COLUMN src DROP NOT NULL;
+ALTER TABLE ldt_utils_content ADD COLUMN content_creation_date timestamp with time zone;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/.htaccess.mod_python.tmpl	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,12 @@
+SetHandler python-program
+PythonHandler ldt.core.handlers.modpython
+SetEnv DJANGO_SETTINGS_MODULE franceculture.settings
+SetEnv PY_USE_XMLPLUS true
+PythonInterpreter franceculture
+PythonOption django.root /~ymh/franceculture/franceculture
+PythonOption virtualenv.activate_path /Users/ymh/dev/workspace/franceculture/sbin/virtualenv/env/venv/bin/activate_this.py
+PythonDebug on
+PythonPath "['/Users/ymh/Sites/franceculture'] + sys.path"
+Header set Pragma "no-cache"
+Header set Cache-Control "no-cache"
+Header set Expires "-1"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/.htaccess.mod_wsgi.tmpl	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,20 @@
+
+SetEnv DJANGO_SETTINGS_MODULE franceculture.settings
+SetEnv PY_USE_XMLPLUS true
+SetEnv PROJECT_PATH /iridata/users/wakimd/hg/franceculture/web
+SetEnv PYTHON_PATH /iridata/users/wakimd/Env/Efculture/lib/python2.6/site-packages
+
+Options ExecCGI FollowSymLinks
+SetHandler wsgi-script
+
+#if defined in global definition
+#defined with WSGIDaemonProcess 
+#WSGIProcessGroup franceculture
+
+RewriteEngine On
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^(.*)$ /dev/~wakimd/franceculture/franceculture/modwsgi.wsgi/$1 [QSA,PT,L]
+
+Header set Pragma "no-cache"
+Header set Cache-Control "no-cache"
+Header set Expires "-1"
--- a/web/franceculture/.htaccess.tmpl	Tue Sep 14 13:15:28 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-SetHandler python-program
-PythonHandler ldt.core.handlers.modpython
-SetEnv DJANGO_SETTINGS_MODULE franceculture.settings
-SetEnv PY_USE_XMLPLUS true
-PythonInterpreter franceculture
-PythonOption django.root /~ymh/franceculture/franceculture
-PythonOption virtualenv.activate_path /Users/ymh/dev/workspace/franceculture/sbin/virtualenv/env/venv/bin/activate_this.py
-PythonDebug on
-PythonPath "['/Users/ymh/Sites/franceculture'] + sys.path"
-Header set Pragma "no-cache"
-Header set Cache-Control "no-cache"
-Header set Expires "-1"
--- a/web/franceculture/__init__.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/__init__.py	Tue Sep 14 13:38:47 2010 +0200
@@ -1,4 +1,4 @@
-VERSION = (0,10)
+VERSION = (0,14)
 
 VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION)))
 
--- a/web/franceculture/locale/fr/LC_MESSAGES/django.po	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/locale/fr/LC_MESSAGES/django.po	Tue Sep 14 13:38:47 2010 +0200
@@ -7,10 +7,11 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-06-12 01:49+0200\n"
+"POT-Creation-Date: 2010-09-12 22:52+0200\n"
 "PO-Revision-Date: 2010-02-17 02:57+0100\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -19,84 +20,145 @@
 msgid "French"
 msgstr "Français"
 
+#: templates/base.html:44
+msgid "home"
+msgstr ""
+
+#: templates/base.html:45
+#, fuzzy
+msgid "contents"
+msgstr "Liste des contenus"
+
+#: templates/base.html:46
+#, fuzzy
+msgid "indexation projects"
+msgstr "Créer un projet"
+
+#: templates/base.html:47
+#, fuzzy
+msgid "accounts"
+msgstr "Créer un compte"
+
+#: templates/base.html:48
+msgid "Profiles"
+msgstr "Profile"
+
 #: templates/base.html:54
+msgid "Log out"
+msgstr "déconnexion"
+
+#: templates/base.html:62
 msgid "Langue"
 msgstr "Langue"
 
-#: templates/franceculture/embed_popup.html:54
+#: templates/franceculture/embed_popup.html:56
 msgid "clik here to see the project content"
 msgstr "cliquer ici pour voir le contenu du projet"
 
-#: templates/franceculture/workspace.html:76
+#: templates/franceculture/workspace.html:49
+#: templates/ldt/ldt_utils/content_list.html:50
 msgid "content list"
 msgstr "Liste des contenus"
 
-#: templates/franceculture/workspace.html:81 templates/franceculture/workspace.html:97
+#: templates/franceculture/workspace.html:51
+#: templates/franceculture/workspace.html:62
+#: templates/ldt/ldt_utils/content_list.html:52
+#: templates/ldt/ldt_utils/ldt_list.html:79
+msgid "search"
+msgstr ""
+
+#: templates/franceculture/workspace.html:60
+#: templates/ldt/ldt_utils/ldt_list.html:77
+msgid "project list"
+msgstr "Liste des projets"
+
+#: templates/franceculture/partial/contentslist.html:3
+#: templates/franceculture/partial/projectslist.html:3
+#: templates/ldt/ldt_utils/create_ldt.html:30
+msgid "name"
+msgstr ""
+
+#: templates/franceculture/partial/contentslist.html:11
+msgid "create project"
+msgstr "Créer un projet"
+
+#: templates/franceculture/partial/contentslist.html:12
+msgid "preview media"
+msgstr ""
+
+#: templates/franceculture/partial/contentslist.html:21
+#: templates/ldt/ldt_utils/create_content.html:31
+#, fuzzy
+msgid "Create content"
+msgstr "Créer un compte"
+
+#: templates/franceculture/partial/projectslist.html:14
+msgid "Project published, click to unpublish"
+msgstr ""
+
+#: templates/franceculture/partial/projectslist.html:16
+msgid "Project not published, click to publish"
+msgstr ""
+
+#: templates/franceculture/partial/projectslist.html:20
 msgid "open ldt"
 msgstr "Ouvrir sous Lignes de Temps"
 
-#: templates/franceculture/workspace.html:82
-msgid "create project"
-msgstr "Créer un projet"
-
-#: templates/franceculture/workspace.html:84
-msgid "link json by externalid"
-msgstr "ouvrir le lecteur augmenté"
-
-#: templates/franceculture/workspace.html:92
-msgid "project list"
-msgstr "Liste des projets"
-
-#: templates/franceculture/workspace.html:98
+#: templates/franceculture/partial/projectslist.html:21
 msgid "copy project"
 msgstr "Copier projet"
 
-#: templates/franceculture/workspace.html:100
+#: templates/franceculture/partial/projectslist.html:22
 msgid "link json by id"
 msgstr "Ouvrir le lecteur augmenté"
 
-#: templates/ldt/user/login_form.html:32
-msgid "Profiles"
-msgstr "Profile"
+#: templates/franceculture/partial/projectslist.html:31
+#, fuzzy
+msgid "Create project"
+msgstr "Créer un projet"
 
-#: templates/ldt/user/login_form.html:33
-msgid "Space"
-msgstr "Esp. perso."
+#: templates/ldt/ldt_utils/create_ldt.html:23
+#, fuzzy
+msgid "Create your project"
+msgstr "Créer un projet"
 
-#: templates/ldt/user/login_form.html:35
-msgid "Create an account"
-msgstr "Créer un compte"
+#: templates/ldt/ldt_utils/create_ldt.html:26
+msgid "Title"
+msgstr ""
 
-#: templates/ldt/user/login_form.html:37
-msgid "Log out"
-msgstr "déconnexion"
+#: templates/ldt/ldt_utils/create_ldt.html:28
+msgid "List of contents"
+msgstr ""
 
-#: templates/ldt/user/login_form.html:40 templates/ldt/user/login_form.html:48
-#: templates/registration/login.html:14
+#: templates/ldt/ldt_utils/create_ldt.html:47
+msgid "Create"
+msgstr ""
+
+#: templates/ldt/user/login_form.html:33 templates/registration/login.html:14
 msgid "Log in"
 msgstr "Connexion"
 
-#: templates/ldt/user/login_form.html:53
+#: templates/ldt/user/login_form.html:38
 msgid "create account"
 msgstr "Créer un compte"
 
-#: templates/ldt/user/login_form.html:57
+#: templates/ldt/user/login_form.html:42
 msgid "Pseudo"
 msgstr "Pseudo"
 
-#: templates/ldt/user/login_form.html:60 templates/ldt/user/login_form.html:67
+#: templates/ldt/user/login_form.html:45 templates/ldt/user/login_form.html:52
 msgid "this field is compulsory"
 msgstr "Ce champs et obligatoire"
 
-#: templates/ldt/user/login_form.html:64
+#: templates/ldt/user/login_form.html:49
 msgid "Password"
 msgstr "Mot de passe"
 
-#: templates/ldt/user/login_form.html:71
+#: templates/ldt/user/login_form.html:56
 msgid "reset password"
 msgstr "Réinitialiser le mot de passe"
 
-#: templates/ldt/user/login_form.html:74
+#: templates/ldt/user/login_form.html:59
 msgid "Connection"
 msgstr "Connexion"
 
@@ -111,3 +173,12 @@
 #: templates/registration/login.html:29
 msgid "Forget password?"
 msgstr "Mot de passe oublié ?"
+
+#~ msgid "link json by externalid"
+#~ msgstr "ouvrir le lecteur augmenté"
+
+#~ msgid "Space"
+#~ msgstr "Esp. perso."
+
+#~ msgid "Create an account"
+#~ msgstr "Créer un compte"
--- a/web/franceculture/settings.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/settings.py	Tue Sep 14 13:38:47 2010 +0200
@@ -82,6 +82,7 @@
 )
 
 TEMPLATE_CONTEXT_PROCESSORS = ( 
+    "django.core.context_processors.request",
     "django.core.context_processors.auth",
     "django.core.context_processors.debug",
     "django.core.context_processors.i18n",
@@ -137,5 +138,6 @@
 
 LOGIN_URL = BASE_URL + 'franceculture/accounts/login/'
 LOGOUT_URL = BASE_URL + 'franceculture'
+LOGIN_REDIRECT_URL = BASE_URL + 'franceculture'
 
 
--- a/web/franceculture/templates/base.html	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/templates/base.html	Tue Sep 14 13:38:47 2010 +0200
@@ -1,39 +1,29 @@
+{% extends "raw_base.html" %}
 {% load i18n %}
 {% load logintag %}
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{{LANGUAGE_CODE}}" lang="{{LANGUAGE_CODE}}">
-<head>
-    <meta http-equiv="content-language" content="{{LANGUAGE_CODE}}" />
-    <title>{% block title %}France Culture{% endblock %}</title>
-    {% block js_import %}
-    <script type="text/javascript" src="{{MEDIA_URL}}js/jquery.min.js"></script>
-    <script type="text/javascript" src="{{MEDIA_URL}}js/jquery.nyroModal.min.js"></script>
-    <script type="text/javascript" src="{{LDT_MEDIA_PREFIX}}js/jquery.validate.js" ></script>
-    {% endblock %}
-    {% block css_import %}
-    <link rel="stylesheet" href="{{BASE_URL}}static/css/blueprint/screen.css" type="text/css" media="screen, projection" />
-    <link rel="stylesheet" href="{{BASE_URL}}static/css/blueprint/print.css" type="text/css" media="print" />
-    <!--[if lt IE 8]>
-    <link rel="stylesheet" href="{{BASE_URL}}static/css/blueprint/ie.css" type="text/css" media="screen, projection" />
-    <![endif]-->
-    <link rel="stylesheet" href="{{BASE_URL}}static/css/style.css" type="text/css"/>
-    <link rel="stylesheet" href="{{BASE_URL}}static/css/nyroModal.css" type="text/css"/>
-    <link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}/css/style.css" type="text/css"/>
-    <link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}/js/login_ajax/login_ajax.css" type="text/css"/>
-    {% endblock %}
+{% load navigation %}
+
+{% block js_import %}
+	{{ block.super }}
+	<script type="text/javascript" src="{{MEDIA_URL}}js/jquery.nyroModal.min.js"></script>
+	<script type="text/javascript" src="{{MEDIA_URL}}js/jquery.qtip.min.js"></script>
+	<script type="text/javascript" src="{{LDT_MEDIA_PREFIX}}js/jquery.validate.js" ></script>
+{% endblock %}
+        
+{% block css_import %}
+	{{ block.super }}
+	<link rel="stylesheet" href="{{BASE_URL}}static/css/tabs.css" type="text/css" media="screen, projection" />
+	<link rel="stylesheet" href="{{BASE_URL}}static/css/nyroModal.css" type="text/css"/>
+	<link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}/js/login_ajax/login_ajax.css" type="text/css"/>
+{% endblock %}
     
-    {% block js_declaration %}
-    {% endblock %}
-    
-</head>
-<body>
+{% block body %}
+	{{ block.super }}
     <div class="container">
 	<div id="header" class="span-24 last">      
 		{% block header %}
-		<div id="header_left">
-                   <a href="{% url franceculture.views.workspace %}">France Culture</a>
+		<div id="header_left" class="span-24 last">
+                   <a href="{% url franceculture.views.workspace %}">France&nbsp;Culture</a>
 		</div>
 		{% endblock %}
 	</div>
@@ -43,10 +33,28 @@
     
         <div id="toolbar" class="span-24 last">
         {% block toolbar %}
-          <table>
-            <tr>
-            <td>{% block login %}{% loginAjax user%}{% endblock %}</td>
-            <td>
+            <div class="block span-24 last">
+				<div id="tabsdiv" class="block span-20">
+				{% if user.is_authenticated %}
+				{% url franceculture.views.workspace as workspace_url %}
+				{% url ldt.ldt_utils.views.list_ldt as space_url %}
+				{% url ldt.ldt_utils.views.list_content as content_url %}
+				{% url ldt.user.views.profile  as profile_url %}
+				    <ul class="tabs">
+						<li class='{% active request "active" workspace_url %}'><a href="{{ workspace_url }}" >{% trans "home" %}</a></li>
+						<li class='{% active request "active" content_url %}'><a href="{{ content_url }}">{% trans "contents" %}</a></li>
+						<li class='{% active request "active" space_url %}'><a href="{{ space_url }}">{% trans "indexation projects" %}</a></li>
+						<li class='{% active request "active" "" %}'><a href="#">{% trans "accounts" %}</a></li>
+			            <li class='{% active request "active" profile_url %}'><a href="{{ profile_url }}" >{% trans "Profiles" %}</a> </li>
+				    </ul>
+				{% endif %}
+				</div>
+				<div id="loginstate" class="block span-4 last">
+				{% if user.is_authenticated %}
+				{{user.username}}&nbsp;|&nbsp;<a href="{% url ldt.user.views.logout_view %}" >{% trans "Log out" %}</a>
+				{% endif %}
+				</div>
+            </div>
             {% if LANGUAGES.1 %}
               <div id="language_chooser">            
                 <form action="{{BASE_URL}}enmi/i18n/setlang/" method="post">
@@ -59,11 +67,8 @@
                 </select>        
                 </form>            
               </div>  
-              {% endif %}
-              </td>
-              </tr>
-              </table>
-            {% endblock %}
+            {% endif %}
+        {% endblock %}
         </div>
         <div id="inner_content" class="span-24 last">
 		{% block content %}{% endblock %}
@@ -79,5 +84,4 @@
 		{% endblock %}
 	</div>
     </div>
-</body>
-</html>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/templates/franceculture/partial/contentslist.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,23 @@
+{% load i18n %}
+<div class="projectscontentsheader span-12 last" id="contentsheader">
+{% trans "name" %}
+</div>
+<div class="span-12 last projectscontentstablewrapperdiv">
+<div class="span-12 last projectscontentstablediv" id="contentstablediv">
+	<table class="projectscontentstable">
+	    <tbody class="projectscontentsbody">
+	{% for content in contents %}
+		<tr class="imageline {% cycle 'projectscontentsoddline' 'projectscontentsevenline'%}">
+		    <td class="cellimg"><div class="cellimgdiv"><img src="{{MEDIA_URL}}/img/document_add.gif" title="{% trans 'create project' %}" alt="{% trans 'create project' %}" href="{% url ldt.ldt_utils.views.create_project content.iri_id %}" class="ldt_link_create"/></div></td>
+		    <td class="cellimg"><div class="cellimgdiv"><img  alt="{% trans 'preview media'%}" title="{% trans 'preview media'%}" src="{{MEDIA_URL}}/img/control_play.gif" href="{% url ldt.ldt_utils.views.index content.iri_id %}" class="ldt_link"/></div></td>
+		    <td class="contenttitle">{{ content.title }}</td>
+		</tr>
+	{% endfor %}
+		</tbody>
+	</table>
+</div>
+</div>
+<div class="projectscontentsfooter span-12 last">
++&nbsp;<a class='content_link_create' href="{% url ldt.ldt_utils.views.write_content %}">{% trans "Create content" %}</a>
+</div>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/templates/franceculture/partial/projectslist.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,32 @@
+{% load i18n %}
+<div class="projectscontentsheader span-12 last" id="projectsheader">
+{% trans "name" %}
+</div>
+<div class="span-12 last projectscontentstablewrapperdiv">
+<div class="span-12 last projectscontentstablediv" id="projectstablediv">
+<table class="projectscontentstable">
+    <tbody class="projectscontentsbody">
+{% for project in projects %}
+    <tr class="imageline {% cycle 'projectscontentsoddline' 'projectscontentsevenline'%}" >
+        {% url ldt.ldt_utils.views.project_json_id project.ldt_id as json_url_id %}
+        <td class="cellimg"><div class="cellimgdiv">
+        {% ifequal project.state 2 %}
+        <img src="{{BASE_URL}}static/admin/img/admin/icon-yes.gif" alt="{% trans 'Project published, click to unpublish' %}" title="{% trans 'Project published, click to unpublish' %}" class="publishedproject" id="project_{{project.ldt_id}}" />
+        {% else %}
+        <img src="{{BASE_URL}}static/admin/img/admin/icon-no.gif" alt="{% trans 'Project not published, click to publish' %}" title="{% trans 'Project not published, click to publish' %}" class="unpublishedproject" id="project_{{project.ldt_id}}" />
+        {% endifequal %}
+        </div>
+        </td>
+        <td class="cellimg"><div class="cellimgdiv"><img src="{{MEDIA_URL}}/img/document_edit.gif" href="{% url ldt.ldt_utils.views.indexProject project.ldt_id %}" class="ldt_link" alt="{% trans 'open ldt' %}" title="{% trans 'open ldt' %}"/></div></td>
+        <td class="cellimg"><div class="cellimgdiv"><img src="{{MEDIA_URL}}/img/documents_duplicate.gif" href="{% url ldt.ldt_utils.views.copy_project project.ldt_id %}" class="ldt_link_create" alt="{% trans 'copy project' %}" title="{% trans 'copy project' %}"/></div></td>
+        <td class="cellimg"><div class="cellimgdiv"><img src="{{MEDIA_URL}}/img/plugin.gif" href="{{WEB_URL}}{{json_url_id}}" id="player_project_{{project.ldt_id}}" class="ldt_link_embed" alt="{% trans 'link json by id' %}" title="{% trans 'link json by id' %}"/></div></td>
+        <td class="projecttitle">{{ project.title }}</td>
+    </tr>
+{% endfor %}
+    </tbody>
+</table>
+</div>
+</div>
+<div class="projectscontentsfooter span-12 last">
++&nbsp;<a class='ldt_link_create' href="{% url ldt.ldt_utils.views.create_ldt_view %}" >{% trans "Create project" %}</a>
+</div>
--- a/web/franceculture/templates/franceculture/workspace.html	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/templates/franceculture/workspace.html	Tue Sep 14 13:38:47 2010 +0200
@@ -1,65 +1,37 @@
 {% extends "base.html" %}
 {% load i18n %}
 
+{% block js_import %}
+{{block.super}}
+	<script type="text/javascript" src="{{MEDIA_URL}}js/projectscontents.js" ></script>
+{% endblock %}
+
+
 {% block js_declaration %}
 {{block.super}}
 <script type="text/javascript">
-$(document).ready(function(){
+
+var content_filter_url = "{% url franceculture.views.contentsfilter filter='__FILTER__' %}";
+var project_filter_url = "{% url franceculture.views.projectsfilter filter='__FILTER__' is_owner='false' %}";
+
+function init_events(base_node) {
+
+	init_events_contents(base_node, "{% url franceculture.views.popup_embed %}");
+			
+}
 
-	$('.ldt_link').nyroModal({
-           	type: 'iframe',
-           	forceType: 'iframe',
-       		height:662, 
-       		width:1022,
-       		bgColor: 'rgb(239, 239, 239)',
-       		padding: 5,
-       		titleFromIframe: false
-          	});
-        	
-     $('.ldt_link_create').nyroModal({
-            type: 'iframe',
-            forceType: 'iframe',
-            height:662, 
-            width:1022,
-            bgColor: 'rgb(239, 239, 239)',
-            padding: 5,
-            titleFromIframe: false,
-            beforeHideContent: function(elts, settings, callback){
-	             try {
-		              var res = $('#ldtInitSwf',$('#nyroModalIframe').contents());
-		              if(res.length > 0)
-		              {
-		              	   res.get(0).forceSave();
-		              }
-	             }
-	             catch(err)
-	             {
-	              // do nothing
-	             }                   
-	             callback();
-            }
-        });
+$(document).ready(function(){	
 
- 	 $('.ldt_link_embed').click(function(e) {
- 		e.preventDefault();
- 		link = $(e.target);
- 		json_url = link.attr("href");
- 		player_id = link.attr("id");
- 		/*$.nyroModalSettings({
- 		 	ajax: { data: ({ json_url:json_url, player_id:player_id }) }
-     	});*/
- 	    $.nyroModalManual({
-            type: 'iframe',
-            forceType: 'iframe',
-            titleFromIframe: false,
- 	    	height:662, 
- 	   		width:650,
- 	   		bgColor: 'rgb(239, 239, 239)',
- 	   		padding: 5,
-	 	    url: '{% url franceculture.views.popup_embed %}?json_url='+escape(json_url)+'&player_id='+escape(player_id),
- 	    });
- 	    return false;
-      });    
+	input_list_init = [
+		{'input_selector':"#searchcontentsinput", 'container_selector':"#contentslistcontainer", 'url':content_filter_url},
+		{'input_selector':"#searchprojectsinput", 'container_selector':"#projectslistcontainer", 'url':project_filter_url}
+	];
+
+	searchFieldInit(input_list_init);
+
+	init_events(document);
+
+
 });
 </script>
 
@@ -71,36 +43,28 @@
 {% endblock %}
 
 {% block content %}
-
-<div class="span-24 last" id="contentsdiv">
-<h1>{% trans "content list" %}</h1>
-<table>
-{% for content in contents %}
-    <tr>
-        <td>{{ content.title }}</td>
-        <td><a href="{% url ldt.ldt_utils.views.index content.iri_id %}" class="ldt_link">{% trans "open ldt" %}</a></td>
-        <td><a href="{% url ldt.ldt_utils.views.create_project content.iri_id %}" class="ldt_link_create">{% trans "create project" %}</a></td>
-        {% url ldt.ldt_utils.views.project_json_externalid content.external_id as json_url_externalid %}
-        <td><a href="{{WEB_URL}}{{json_url_externalid}}" class="ldt_link_embed" id="player_project_{{content.iri_id}}">{% trans "link json by externalid" %}</a>
-        </td>
-    </tr>
-{% endfor %}
-</table>
+<div class="span-24 last" id="allcontentsdiv">
+	<div class="span-12" id="contentsdiv">
+	    <div class="span-12 last titlediv" >
+			<div class="span-8 projectscontentstitle">{% trans "content list" %}</div>
+			<div class="span-4 last searchfielddiv" >
+			    <div class="searchfield rounded"><input id="searchcontentsinput" class="searchfieldinput searchfieldinputbase" value="{% trans 'search' %}" type="text" /><img id="contentsajaxloader" class="searchajaxloader" src="{{MEDIA_URL}}/img/ajax-loader-16x16.gif" alt="loader"/></div>
+			</div>
+		</div>
+		<div class="span-12 last projectscontentsdiv" id="contentslistcontainer">
+		{% include "franceculture/partial/contentslist.html" %}
+		</div>
+	</div>		
+	<div class="span-12 last" id="projectsdiv">
+		<div class="span-12 last titlediv" >
+			<div class="span-8 projectscontentstitle" >{% trans "project list" %}</div>
+			<div class="span-4 last searchfielddiv" >
+			    <div class="searchfield rounded"><input id="searchprojectsinput" class="searchfieldinput searchfieldinputbase" value="{% trans 'search' %}" type="text" /><img id="projectsajaxloader" class="searchajaxloader" src="{{MEDIA_URL}}/img/ajax-loader-16x16.gif" alt="loader"/></div>
+			</div>
+		</div>
+		<div class="span-12 last projectscontentsdiv" id="projectslistcontainer">
+		{% include "franceculture/partial/projectslist.html" %}
+		</div>
+	</div>
 </div>
-
-<div class="span-24 last" id="projectsdiv">
-<h1>{% trans "project list" %}</h1>
-<table>
-{% for project in projects %}
-    <tr>
-        <td>{{ project.title }}</td>
-        <td><a href="{% url ldt.ldt_utils.views.indexProject project.ldt_id %}" class="ldt_link">{% trans "open ldt" %}</a></td>
-        <td><a href="{% url ldt.ldt_utils.views.copy_project project.ldt_id %}" class="ldt_link_create">{% trans "copy project" %}</a></td>
-        {% url ldt.ldt_utils.views.project_json_id project.ldt_id as json_url_id %}
-        <td><a href="{{WEB_URL}}{{json_url_id}}" class="ldt_link_embed" id="player_project_{{project.ldt_id}}">{% trans "link json by id" %}</a>
-    </tr>
-{% endfor %}
-</table>
-</div>
-
 {% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/templates/ldt/ldt_utils/content_list.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,62 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block js_import %}
+{{block.super}}
+	<script type="text/javascript" src="{{MEDIA_URL}}js/projectscontents.js" ></script>
+{% endblock %}
+
+{% block js_declaration %}
+{{block.super}}
+<script type="text/javascript">
+
+content_filter_url = "{% url franceculture.views.contentsfilter filter='__FILTER__' %}";
+
+function init_events(base_node) {
+
+	init_events_contents(base_node, "{% url franceculture.views.popup_embed %}");		
+}
+
+$(document).ready(function(){
+
+	input_list_init = [
+		{'input_selector':"#searchcontentsinput", 'container_selector':"#contentslistcontainer", 'url':content_filter_url},
+	];
+	           	
+	
+	searchFieldInit(input_list_init);
+
+	$("#searchcontentsinput").keyup(function (e) {
+		var container_selector="#contentslistcontainer";
+		searchCallback(e.target, container_selector, searchcontentfilterurl);		
+	});
+	
+	init_events(document);
+
+});
+</script>
+
+{% endblock %}
+
+{% block css_import %}
+{{block.super}}
+    <link rel="stylesheet" href="{{BASE_URL}}static/css/workspace.css" type="text/css"/>
+{% endblock %}
+
+{% block content %}
+<div class="span-24" id="allcontentsdiv">
+	<div class="span-12" id="contentsdiv">
+	    <div class="span-12 last titlediv" >
+			<div class="span-8 projectscontentstitle">{% trans "content list" %}</div>
+			<div class="span-4 last searchfielddiv" >
+			    <div class="searchfield rounded"><input id="searchcontentsinput" class="searchfieldinput searchfieldinputbase" value="{% trans 'search' %}" type="text" /><img id="contentsajaxloader" class="searchajaxloader" src="{{MEDIA_URL}}/img/ajax-loader-16x16.gif" alt="loader"/></div>
+			</div>
+		</div>
+		<div class="span-12 last projectscontentsdiv" id="contentslistcontainer">
+		{% include "franceculture/partial/contentslist.html" %}
+		</div>
+	</div>		
+	<div class="span-12 last" id="createcontentsdiv">
+	</div>		
+</div>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/templates/ldt/ldt_utils/create_content.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,59 @@
+{% extends "raw_base.html" %}
+
+{% load i18n %} {# form of creation of content #}
+{% load adminmedia %}
+
+{% block js_import %}
+	{{ block.super }}
+    <script type="text/javascript" src="{{MEDIA_URL}}admin/js/core.js" ></script>
+    <script type="text/javascript" src="{% url jsi18n %}" } ></script>
+    <script type="text/javascript" src="{{MEDIA_URL}}js/jquery.nyroModal.min.js"></script>    
+	{{ content_form.media.js }}
+{% endblock %}
+
+{% block css_import %}
+	{{ block.super }}
+	{{ content_form.media.css }}
+	<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
+	<link rel="stylesheet" href="{{MEDIA_URL}}css/ldtform.css" />
+{% endblock %}
+
+
+{% block js_declaration %}
+	<script type="text/javascript">
+	window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
+	
+    </script>
+{% endblock %}
+
+{% block body %}
+	<div id="add_content" class="span-18 last">
+	<div class="projectscontentstitle">{% trans "Create content" %}</div>
+	<form action="{{create_content_action}}" method="POST">
+	<div id="contentformhidden">
+		{% csrf_token %}
+		<input type="hidden" name="form_status" value="{{form_status}}" id="content_form_status" />
+		{% for hidden in form.hidden_fields %}
+	    	{{ hidden }}
+	    {% endfor %}
+	    {{content_form.iri_id}}
+    </div>
+    <div id="contentformfields" class="span-18 last">
+	<div id="contentleft" class="span-9">
+		<div>{{ content_form.src.errors }}{{ content_form.src.label_tag }}{{content_form.src}}</div>
+		<div>{{ content_form.videopath.errors }}{{ content_form.videopath.label_tag }}{{content_form.videopath}}</div>
+		<div>{{ content_form.title.errors }}{{ content_form.title.label_tag }}{{content_form.title}}</div>
+		<div>{{ content_form.description.errors }}{{ content_form.description.label_tag }}{{content_form.description}}</div>
+	</div>
+	<div id="contentright" class="span-9 last" >
+		<div>{{ content_form.external_id.errors }}{{ content_form.external_id.label_tag }}{{content_form.external_id}}</div>
+		<div>{{ content_form.duration.errors }}{{ content_form.duration.label_tag }}{{content_form.duration}}</div>
+		<div>{{ content_form.content_creation_date.errors }}{{ content_form.content_creation_date.label_tag }}{{content_form.content_creation_date}}</div>
+	</div>
+	</div>
+	<div id="submitcontent" class="span-18 last">
+		<input type="submit"/>
+	</div> 
+	</form>
+	</div>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/templates/ldt/ldt_utils/create_ldt.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,53 @@
+{% extends "raw_base.html" %}
+
+{% load i18n %} {# form of creation of content #}
+{% load adminmedia %}
+
+{% block js_import %}
+	{{ block.super }}
+    <script type="text/javascript" src="{{MEDIA_URL}}js/jquery.nyroModal.min.js"></script>    
+	{{ content_form.media.js }}
+{% endblock %}
+
+{% block css_import %}
+	{{ block.super }}
+	{{ content_form.media.css }}
+	<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
+	<link rel="stylesheet" href="{{MEDIA_URL}}css/ldtform.css" />
+	<link rel="stylesheet" href="{{MEDIA_URL}}css/workspace.css" />
+{% endblock %}
+
+
+{% block body %}
+	<div id="add_contribution" class="span-12 last">
+	<div class="projectscontentstitle span-12 last">{% trans "Create your project" %}</div>
+	<form action="{{create_project_action}}" method="POST">
+	{% csrf_token %} 
+	<label for="title">{% trans "Title" %}:</label>
+	<input class="inputbox required" type="text" name="title" size="80" ; value="" id="title" />
+	<label>{% trans "List of contents" %}</label>
+	<div class="span-12 last projectscontentsdiv" id="ldtcreatecontentslistcontainer">
+		<div class="projectscontentsheader span-12 last" id="contentslistheader">{% trans "name" %}</div>
+		<div class="span-12 last projectscontentstablewrapperdiv" id="ldtcreatetablewrapperdiv">
+			<div class="span-12 last projectscontentstablediv" id="ldtcreatecontentstablediv">
+				<table class="projectscontentstable">
+				    <tbody class="projectscontentsbody">
+				{% for content in contents %}
+					<tr class="imageline {% cycle 'projectscontentsoddline' 'projectscontentsevenline'%}">
+					    <td class="cellcheckbox"><input type="checkbox" name="contents" value="{{ content.id }}" checked="true" /></td>
+					    <td class="contenttitle">{{ content.title }}</td>
+					</tr>
+				{% endfor %}
+					</tbody>
+				</table>
+			</div>
+		</div>
+	</div>
+	<div id="submitcontent" class="span-12 last">
+		<input class="button" id="ldt_submit" type="submit" value="{% trans 'Create' %}" />
+	</div>
+	</form>
+	</div>
+		
+{% endblock %}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/templates/ldt/ldt_utils/ldt_list.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,89 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block js_import %}
+{{block.super}}
+	<script type="text/javascript" src="{{MEDIA_URL}}js/projectscontents.js" ></script>
+{% endblock %}
+
+
+{% block js_declaration %}
+{{block.super}}
+<script type="text/javascript">
+
+searchprojectfilterurl = "{% url franceculture.views.projectsfilter filter='__FILTER__' is_owner='true' %}";
+publishprojecturl = "{% url ldt.ldt_utils.views.publish '__PROJECT_ID__' 'false' %}";
+unpublishprojecturl = "{% url ldt.ldt_utils.views.unpublish '__PROJECT_ID__' 'false' %}";
+
+function init_events(base_node) {
+
+	init_events_base(base_node, "{% url franceculture.views.popup_embed %}");
+
+	$('.publishedproject', base_node).click(function(e) {
+		e.preventDefault();
+		var target = $(e.target);
+		var project_id = target.attr('id').replace('project_','');
+		var url = unpublishprojecturl.replace('__PROJECT_ID__', project_id);
+
+		$.getJSON(url, function(json){
+			if(json.res) {
+				searchCallback($('#searchprojectsinput'), "#projectslistcontainer", searchprojectfilterurl, 0);
+			}
+		});
+
+	});
+
+	$('.unpublishedproject', base_node).click(function(e) {
+		e.preventDefault();
+		var target = $(e.target);
+		var project_id = target.attr('id').replace('project_','');
+		var url = publishprojecturl.replace('__PROJECT_ID__', project_id);
+
+		$.getJSON(url, {}, function(json){
+			if(json.res) {
+				searchCallback($('#searchprojectsinput'), "#projectslistcontainer", searchprojectfilterurl, 0);
+			}
+		});
+
+	});
+	
+		
+}
+
+$(document).ready(function(){
+
+	input_list_init = [
+		{'input_selector':"#searchprojectsinput", 'container_selector':"#projectslistcontainer", 'url':searchprojectfilterurl}
+	];
+
+	searchFieldInit(input_list_init);
+	
+	init_events(document);
+
+});
+</script>
+
+{% endblock %}
+
+{% block css_import %}
+{{block.super}}
+    <link rel="stylesheet" href="{{BASE_URL}}static/css/workspace.css" type="text/css"/>
+{% endblock %}
+
+{% block content %}
+<div class="span-24" id="allcontentsdiv">
+	<div class="span-12 last" id="projectsdiv">
+		<div class="span-12 last titlediv" >
+			<div class="span-8 projectscontentstitle" >{% trans "project list" %}</div>
+			<div class="span-4 last searchfielddiv" >
+			    <div class="searchfield rounded"><input id="searchprojectsinput" class="searchfieldinput searchfieldinputbase" value="{% trans 'search' %}" type="text" /><img id="projectsajaxloader" class="searchajaxloader" src="{{MEDIA_URL}}/img/ajax-loader-16x16.gif"/></div>
+			</div>
+		</div>
+		<div class="span-12 last projectscontentsdiv" id="projectslistcontainer">
+		{% include "franceculture/partial/projectslist.html" %}
+		</div>
+	</div>
+	<div class="span-12 last" id="createprojectdiv">
+	</div>		
+</div>
+{% endblock %}
--- a/web/franceculture/templates/ldt/user/login_form.html	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/templates/ldt/user/login_form.html	Tue Sep 14 13:38:47 2010 +0200
@@ -25,22 +25,7 @@
 {% block css_import %}
 {{block.super}}
 {% endblock %}
-<div id="loginstate" class="block span-24 last">
-    <ul class="usertool">
-        {% if user.is_authenticated %}    
-            <li id="user">{{user.username}}</li>
-            <li><a href="{% url ldt.user.views.profile  %}" >{% trans "Profiles" %}</a> </li>
-            <li><a href="{% url ldt.user.views.space %}">{% trans "Space" %}</a></li>
-            {% if user.is_superuser %}
-            <li><a href="{% url registration.views.register  %}" >{% trans "Create an account" %}</a></li>
-            {% endif %}
-            <li><a href="{% url ldt.user.views.logout_view %}" >{% trans "Log out" %}</a></li>  
-        
-        {% else %}     
-            <li><a href="#inlineContent" class="login_link">{% trans "Log in" %}</li>
-        {% endif %}
-    </ul>
-</div>
+
 <div id="inlineContent" style="display: none;">
     <div id="loginform">
             <div class="title">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/franceculture/templates/raw_base.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,45 @@
+{% load i18n %}
+{% load logintag %}
+{% load navigation %}
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{{LANGUAGE_CODE}}" lang="{{LANGUAGE_CODE}}">
+<head>
+{% block head %}
+	<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
+    <meta http-equiv="content-language" content="{{LANGUAGE_CODE}}" />
+    <link rel="SHORTCUT ICON" href="{{MEDIA_URL}}/img/favicon.ico" />
+    <title>{% block title %}France Culture{% endblock %}</title>
+    {% block js_import %}
+    <script type="text/javascript" src="{{MEDIA_URL}}js/jquery.min.js"></script>
+    {% endblock %}
+    
+    {% block css_declaration %}
+    <style type="text/css">
+		.rounded {
+			behavior:url("{{MEDIA_URL}}css/border-radius.htc");
+		}
+	</style>
+	{% endblock %}
+    
+    {% block css_import %}
+    
+    <link rel="stylesheet" href="{{BASE_URL}}static/css/blueprint/screen.css" type="text/css" media="screen, projection" />
+    <link rel="stylesheet" href="{{BASE_URL}}static/css/blueprint/print.css" type="text/css" media="print" />
+    <!--[if lt IE 8]>
+    <link rel="stylesheet" href="{{BASE_URL}}static/css/blueprint/ie.css" type="text/css" media="screen, projection" />
+    <![endif]-->
+    <link rel="stylesheet" href="{{BASE_URL}}static/css/style.css" type="text/css"/>
+    <link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}/css/style.css" type="text/css"/>
+    {% endblock %}
+    
+    {% block js_declaration %}
+    {% endblock %}
+{% endblock %}    
+</head>
+<body>
+{% block body %}
+{% endblock %}
+</body>
+</html>
--- a/web/franceculture/templates/registration/login.html	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/templates/registration/login.html	Tue Sep 14 13:38:47 2010 +0200
@@ -19,7 +19,7 @@
 
         <form action="" method='post' id="login-form">
             {% csrf_token %}
-            <input type="hidden" name="next" value="{% url ldt.user.views.profile%}" />            
+            <input type="hidden" name="next" value="{{ next }}" />            
         <ul id="login_fields_list">
         {{form.as_ul}}
         <li><input class="button"type="submit" value="{% trans "login" %}" /></li>
--- a/web/franceculture/urls.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/urls.py	Tue Sep 14 13:38:47 2010 +0200
@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns ,include
+from django.conf.urls.defaults import patterns ,include, url
 from django.contrib import admin
 
 
@@ -20,8 +20,10 @@
     (r'^ldt/', include('ldt.ldt_utils.urls')),
     (r'^user/', include('ldt.user.urls')),
 
-    (r'^accounts/', include('registration.backends.default.urls')),
+    (r'^accounts/', include('registration.backends.simple.urls')),
 
-    (r'^/?$', "franceculture.views.workspace"),
+    url(r'^/?$', "franceculture.views.workspace", name="root-view"),
+    url(r'^filterprojects/(?P<filter>\w*)/(?P<is_owner>true|false)/$', "franceculture.views.projectsfilter", ),
+    url(r'^filtercontents/(?P<filter>\w*)/$', "franceculture.views.contentsfilter", ),
     (r'^embedpopup/?$', "franceculture.views.popup_embed"),
 )
--- a/web/franceculture/views.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/franceculture/views.py	Tue Sep 14 13:38:47 2010 +0200
@@ -3,7 +3,9 @@
 from django.template import RequestContext
 from django.utils.html import escape
 from django.template.loader import render_to_string
-from ldt.ldt_utils.models import Content, Project
+from ldt.ldt_utils.models import Content, Project, Owner
+from ldt.ldt_utils.utils import boolean_convert
+from django.http import HttpResponseServerError
 
 
 @login_required
@@ -19,6 +21,44 @@
     return render_to_response("franceculture/workspace.html", 
                               {'contents': content_list, 'projects': project_list},
                               context_instance=RequestContext(request))
+
+@login_required
+def projectsfilter(request, filter, is_owner=False):
+    
+    project_list = None
+    is_owner = boolean_convert(is_owner)
+    
+    if is_owner:
+        owner = None
+        try:
+            owner = Owner.objects.get(user=request.user)
+        except:
+            return HttpResponseServerError("<h1>User not found</h1>")
+
+        project_list = Project.objects.filter(owner=owner)
+    else:
+        project_list = Project.objects.filter(state=2)
+    
+    if filter:
+        project_list = project_list.filter(title__icontains=filter)
+        
+    return render_to_response("franceculture/partial/projectslist.html", 
+                              {'projects': project_list},
+                              context_instance=RequestContext(request))
+
+
+@login_required
+def contentsfilter(request, filter):
+    if filter:
+        content_list = Content.objects.filter(title__icontains=filter)
+    else:
+        content_list = Content.objects.all()
+        
+    return render_to_response("franceculture/partial/contentslist.html", 
+                              {'contents': content_list},
+                              context_instance=RequestContext(request))
+
+     
     
 def popup_embed(request):
     
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/core/handlers/modwsgi.py	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,24 @@
+import os, sys, site
+
+def application(environ, start_response):
+    os.environ['DJANGO_SETTINGS_MODULE'] = environ['DJANGO_SETTINGS_MODULE']
+    os.environ['PY_USE_XMLPLUS'] = environ['PY_USE_XMLPLUS']
+
+    prev_sys_path = list(sys.path)
+
+    sys.path.append(environ['PROJECT_PATH'])
+    site.addsitedir(environ['PYTHON_PATH'])
+
+    new_sys_path = [] 
+    for item in list(sys.path): 
+        if item not in prev_sys_path: 
+            new_sys_path.append(item) 
+            sys.path.remove(item) 
+    sys.path[:0] = new_sys_path 
+
+    import django.core.handlers.wsgi
+
+    _application = django.core.handlers.wsgi.WSGIHandler()
+
+    return _application(environ, start_response)
+        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/forms/widgets.py	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,17 @@
+"""
+Some useful form widgets
+"""
+
+from django.contrib.admin.widgets import AdminSplitDateTime
+from django.utils.safestring import mark_safe
+from django.utils.translation import ugettext as _
+
+
+class LdtSplitDateTime(AdminSplitDateTime):
+    """
+    A widget that extend the AdminSplitDateTime to improve the html outputted
+    """
+    
+    def format_output(self, rendered_widgets):
+        return mark_safe(u'<div class="ldtdatetime"><div class="ldtdate"><div class="ldtdatetitle">%s</div> <div class="ldtdatefield">%s</div></div><div class="ldttime"><div class="ldttimetitle">%s</div> <div class="ldttimefield">%s</div></div></div>' % \
+            (_('Date'), rendered_widgets[0],  _('Time'), rendered_widgets[1]))
--- a/web/ldt/ldt_utils/fileimport.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/ldt_utils/fileimport.py	Tue Sep 14 13:38:47 2010 +0200
@@ -1,16 +1,15 @@
-import tempfile
-import os.path
-import shutil
+from copy import deepcopy
+from django.conf import settings
 from django.core.exceptions import ObjectDoesNotExist
 from ldt.utils import zipfileext
-from django.conf import settings
 from models import Content
-import xml.dom.minidom
-import xml.dom.ext #@UnresolvedImport
-import xml.xpath #@UnresolvedImport
 import fnmatch
+import lxml.etree
+import os.path
+import shutil
+import tempfile
+import urllib
 import uuid
-import urllib
 
 class FileImportError(Exception):
     def __init__(self, value):
@@ -48,68 +47,84 @@
     def processIri(self):
         # for just import a file ldt and get the title for every media
         if 'http' in self.src:
-            url = urllib.urlopen(self.src)
-            doc = xml.dom.minidom.parse(url)
+            #url = urllib.urlopen(self.src)
+            path = url
+            #doc = xml.dom.minidom.parse(url)
         #for import a zip, get title and copy file .iri in the media directory
         else:
             path = os.path.join(self.basepath, self.src)
-            doc = xml.dom.minidom.parse(path)
+            #doc = xml.dom.minidom.parse(path)
+            
+        doc = lxml.etree.parse(path)
         
         
-        doc = Ft.Xml.Domlette.ConvertDocument(doc) 
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        #doc = Ft.Xml.Domlette.ConvertDocument(doc) 
+        #con = xml.xpath.Context.Context(doc, 1, 1, None)
         
-        res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con)
-        self.title = res[0].value
+        res = doc.xpath("/iri/head/meta[@name='title']/@content")
+        #res = xml.xpath.Evaluate("/iri/head/meta[@name='title']/@content", context=con)
+        #self.title = res[0].value
+        self.title = res[0]
 
             
-        res = xml.xpath.Evaluate("/iri/body/ensembles",context=con)
+        #res = xml.xpath.Evaluate("/iri/body/ensembles",context=con)
+        res = doc.xpath("/iri/body/ensembles")
         ensemblesnode = res[0]
 
         ensembleids = []
 
-        for node in ensemblesnode.childNodes:
-            if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == "ensemble":
-                id = node.getAttributeNS(None,u"id")
+        for node in ensemblesnode: #ensemblesnode.childNodes:
+            #if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == "ensemble":
+            if node.tag == "ensemble":
+                #id = node.getAttributeNS(None,u"id")
+                id = node.attrib["id"]
                 if id not in ensembleids:
                     ensembleids.append(id)
 
         if self.annotations is not None:
             newEnsemble = None
-            for cnode in self.annotations.childNodes:
-                if cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "decoupage":
+            #for cnode in self.annotations.childNodes:
+            for cnode in self.annotations:
+                #if cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "decoupage":
+                if cnode.tag == "decoupage":
                     if newEnsemble is None:
-                        newensemble = doc.createElement('ensemble')
+                        #newensemble = doc.createElementNS(None,'ensemble')
                         ensembleid = self.id+"_"+str(uuid.uuid1())
-                        newensemble.setAttributeNS(None,'id',ensembleid)
-            
-                        newensemble.setAttributeNS(None,'title', self.annotations.getAttribute('title'))
-                        newensemble.setAttributeNS(None,'author', self.annotations.getAttribute('author'))
-                        newensemble.setAttributeNS(None,'date', self.annotations.getAttribute('date'))
-                        newensemble.setAttributeNS(None,'abstract', self.annotations.getAttribute('abstract'))
-                        ensemblesnode.appendChild(newensemble)
+                        newensemble = lxml.etree.SubElement(ensemblesnode,
+                                                            'ensemble',
+                                                            {'id' : ensembleid,
+                                                             'title' : self.annotations.get('title') or "",
+                                                             'author' : self.annotations.get('author') or "",
+                                                             'date' : self.annotations.get('date') or "",
+                                                             'abstract' : self.annotations.get('abstract') or ""
+                                                             }
+                                                            )                        
                         ensembleids.append(ensembleid)
-                    newDecoupageNode = cnode.cloneNode(True)
-                    newensemble.appendChild(newDecoupageNode)
-                elif cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "ensemble":
-                    ensembleid = cnode.getAttribute(u"id")
-                    cloneNode = cnode.cloneNode(True)
+                    newDecoupageNode = deepcopy(cnode)
+                    newensemble.append(newDecoupageNode)
+                #elif cnode.nodeType == xml.dom.Node.ELEMENT_NODE and cnode.tagName == "ensemble":
+                elif cnode.tag == "ensemble":
+                    #ensembleid = cnode.getAttribute(u"id")
+                    ensembleid = cnode.attrib['id']
+                    cloneNode = deepcopy(cnode)
                     if ensembleid in ensembleids:
                         ensembleid = self.id+"_"+str(uuid.uuid1())
-                        cloneNode.setAttribute(u"id", ensembleid)
+                        cloneNode.set(u"id", ensembleid)
                     ensembleids.append(ensembleid)
-                    ensemblesnode.appendChild(cloneNode)
+                    ensemblesnode.append(cloneNode)
 
-        res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con)
+        res = doc.xpath("/iri/body/medias/media[@id='video']/video")
         if self.flatten:
-            src_video = res[0].getAttributeNS(None,'src')
+            src_video = res[0].get('src')
             self.videourl = os.path.basename(src_video)
-            res[0].setAttributeNS(None,'src', self.videourl)
-        self.duration = res[0].getAttributeNS(None, u'dur')
+            res[0].set('src', self.videourl)
+        self.duration = res[0].get(u'dur')
             
         f = open(path, "w")
         try:
-            xml.dom.ext.Print(doc, stream=f)
+            #etree = lxml.etree.ElementTree(doc)
+            doc.write(f, encoding="UTF-8", pretty_print=True, xml_declaration=True)
+#            xml.dom.ext.Print(doc, stream=f)
         finally:
             f.close()
         
@@ -127,19 +142,19 @@
         #    url = self.src
         #else:
         #    url = self.id + u"/" + os.path.basename(self.src)
-        content, self.created = Content.objects.get_or_create(iri_id=self.id, defaults = {'src':self.videourl, 'iriurl': self.src, 'title':self.title, 'description':self.desc, 'videopath': self.videopath})
+        content, self.created = Content.objects.get_or_create(iri_id=self.id, defaults = {'src':unicode(self.videourl), 'iriurl': unicode(self.src), 'title':unicode(self.title), 'description':unicode(self.desc), 'videopath': unicode(self.videopath)})
         if not self.created:
-            content.iriurl = self.src
-            content.title = self.title
-            content.description = self.desc
+            content.iriurl = unicode(self.src)
+            content.title = unicode(self.title)
+            content.description = unicode(self.desc)
             content.save()
 
-        content.iriurl = self.src
-        content.videopath = self.videopath.rstrip("/") + "/"
+        content.iriurl = unicode(self.src)
+        content.videopath = unicode(self.videopath.rstrip("/") + "/")
 
-        content.iri = self.id + u"/" + os.path.basename(self.src)
-        content.title = self.title
-        content.description = self.desc
+        content.iri = unicode(self.id + u"/" + os.path.basename(self.src))
+        content.title = unicode(self.title)
+        content.description = unicode(self.desc)
         content.duration = int(self.duration)
         content.save()
 
@@ -253,26 +268,32 @@
         # copy iri in folder
         # create or update content
         contents = {}
-        if ldtpath:
-            doc = xml.dom.minidom.parse(ldtpath)
-        else:
-            doc = xml.dom.minidom.parse(self.filepath)
+        filepath = ldtpath if ldtpath else self.filepath
+        doc = lxml.etree.parse(filepath)
+        #if ldtpath:
+            #doc = xml.dom.minidom.parse(ldtpath)
+        #    doc = lxml.etree.parse(ldtpath)
+        #else:
+            #doc = xml.dom.minidom.parse(self.filepath)
         
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        #con = xml.xpath.Context.Context(doc, 1, 1, None)
         
         #get author from file ldt
-        result = xml.xpath.Evaluate("/iri/project", context=con)
+        #result = xml.xpath.Evaluate("/iri/project", context=con)
+        result = doc.xpath("/iri/project")
         for pnode in result:
-            author = pnode.getAttributeNS(None,u"user")
+            #author = pnode.getAttributeNS(None,u"user")
+            author = pnode.attrib[u"user"]
             if author:
                 self.author = unicode(author)
                 break 
 
-        result = xml.xpath.Evaluate("/iri/medias/media", context=con)
+        result = doc.xpath("/iri/medias/media")
         
         for i, medianode in  enumerate(result):
         # get iri file's id from file ldt
-            id = medianode.attributes['id'].value
+            #id = medianode.attributes['id'].value
+            id = medianode.attrib['id']
             if self.checkExistingMedia:
                 try:
                     Content.objects.get(iri_id=id)
@@ -289,9 +310,10 @@
                     else: 
                         contents[id] = IriInfo(id, i, "", flatten=self.flatten)
                     # Get iri file's url from ldt. This url can be relative path or absolute path.
-                contents[id].src = medianode.attributes['src'].value
-                if medianode.attributes['video'].value !="":
-                    contents[id].videopath = medianode.attributes['video'].value
+                #contents[id].src = medianode.attributes['src'].value
+                contents[id].src = medianode.attrib['src']
+                if medianode.attrib['video'] !="":
+                    contents[id].videopath = medianode.attrib['video']
                 elif self.videopath !="" or self.videopath:
                     contents[id].videopath = self.videopath
                 else:
@@ -299,14 +321,15 @@
                     
                 
         #get annotation of file ldt
-        result = xml.xpath.Evaluate("/iri/annotations/content", context=con)
+        #result = xml.xpath.Evaluate("/iri/annotations/content", context=con)
+        result = doc.xpath("/iri/annotations/content")
         
         for contentnode in result:
-            id = contentnode.attributes['id'].value
+            id = contentnode.attrib['id']
             # pocketfilms.utils.log.debug("ID : " + str(id))
             if contents.has_key(id):
                 if self.author:
-                    contentnode.setAttributeNS(None,"author", unicode(self.author))
+                    contentnode.set("author", unicode(self.author))
                 contents[id].annotations = contentnode
         
         #go throught values
--- a/web/ldt/ldt_utils/forms.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/ldt_utils/forms.py	Tue Sep 14 13:38:47 2010 +0200
@@ -1,6 +1,12 @@
 from django import forms
 from models import Project, Content
 import uuid
+from utils import generate_uuid
+from django.forms.widgets import Widget
+from django.contrib.admin import widgets as admin_widgets
+from django.core.urlresolvers import reverse
+from ldt.settings import BASE_URL
+from ldt.forms import widgets as ldt_widgets
 
 class LdtImportForm(forms.Form):
     importFile = forms.FileField()
@@ -27,3 +33,37 @@
 
 class CopyProjectForm (forms.Form):
     title = forms.CharField()
+    
+
+class ContentForm(forms.ModelForm):
+
+    #iri_id = forms.CharField(max_length=1024, widget=forms.HiddenInput, initial=generate_uuid)
+    iriurl = forms.CharField(max_length=1024, widget=forms.HiddenInput, required=False)
+    content_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False)
+    
+    def clean_iri_id(self):
+        data = self.cleaned_data.get('iri_id')
+        if not data:
+            data = generate_uuid()
+        return data
+    
+    def clean(self):
+        cleaned_data = self.cleaned_data
+        iriurl_data = cleaned_data.get('iriurl')
+        iri_id_data = cleaned_data['iri_id']
+        if not iriurl_data:
+            iriurl_data = "%s/%s.iri" % (iri_id_data, iri_id_data)    
+        cleaned_data['iriurl'] = iriurl_data
+        return cleaned_data
+    
+    class Meta:
+        model = Content
+        exclude = ("creation_date", "update_date", "authors")
+        widgets = {
+                   'iri_id': forms.HiddenInput,
+        }
+        
+    class Media:
+        css = {
+            'all' : ('admin/css/forms.css','admin/css/base.css', 'admin/css/base.css', 'admin/css/widgets.css')
+               }
--- a/web/ldt/ldt_utils/models.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/ldt_utils/models.py	Tue Sep 14 13:38:47 2010 +0200
@@ -1,11 +1,11 @@
+from django.conf import settings
 from django.db import models
-from django.conf import settings
+from django.utils.translation import ugettext_lazy as _
 from ldt.core.models import Document, Owner
-from django.utils.translation import ugettext_lazy as _
-from utils import create_ldt, copy_ldt, create_empty_iri, update_iri
+from utils import create_ldt, copy_ldt, create_empty_iri, update_iri, generate_uuid
+import lxml.etree
 import os.path
 import uuid
-import xml
 
 class Author(models.Model):
 
@@ -19,25 +19,24 @@
 
 
 class Content(models.Model):
-    iri_id = models.CharField(max_length=1024, unique=True)
-    iriurl = models.CharField(max_length=1024)
-    src = models.CharField(max_length=1024)
-    videopath = models.CharField(max_length=1024, null=True, blank=True)
-    creation_date = models.DateTimeField(auto_now_add=True)
-    update_date = models.DateTimeField(auto_now=True)
-    title = models.CharField(max_length=1024, null=True, blank=True)
-    description = models.TextField(null=True, blank=True)
-    external_id = models.CharField(max_length=1024, null=True, blank=True)
-    authors = models.ManyToManyField(Author, blank=True)
-    duration = models.IntegerField(null=True, blank=True)
+    iri_id = models.CharField(max_length=1024, unique=True, default=generate_uuid, verbose_name=_('content.iri_id'))
+    iriurl = models.CharField(max_length=1024, verbose_name=_('content.iriurl'))
+    src = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.src'))
+    videopath = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.videopath'))
+    creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('content.creation_date'))
+    update_date = models.DateTimeField(auto_now=True, verbose_name=_('content.update_date'))
+    title = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.title'))
+    description = models.TextField(null=True, blank=True, verbose_name=_('content.description'))
+    external_id = models.CharField(max_length=1024, null=True, blank=True, verbose_name=_('content.external_id'))
+    authors = models.ManyToManyField(Author, blank=True, verbose_name=_('content.authors'))
+    duration = models.IntegerField(null=True, blank=True, verbose_name=_('content.duration'))
+    content_creation_date = models.DateTimeField(null=True, blank=True, verbose_name=_('content.content_creation_date'))
 
     def get_duration(self):
         if self.duration is None:
-            doc = xml.dom.minidom.parse(self.iri_file_path())
-            doc = Ft.Xml.Domlette.ConvertDocument(doc)        
-            con = xml.xpath.Context.Context(doc, 1, 1, None)
-            res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con)
-            self.duration = int(res[0].getAttributeNS(None, u'dur'))
+            doc = lxml.etree.parse(self.iri_file_path())
+            res = doc.xpath("/iri/body/medias/media[@id='video']/video")
+            self.duration = int(res[0].get(u'dur') or 0)
             self.save()
         return self.duration
     
@@ -48,7 +47,8 @@
         writer.commit()
         
     #TODO: better manage the change in .iri name and error scenario (save in temp file + rename
-    def save(self):
+    def save(self, *args, **kwargs):
+        
         # create iri file if needed
         created = False
         try:
@@ -69,8 +69,9 @@
                 if os.path.exists(iri_file_path):
                     os.remove(iri_file_path)
             raise e
+        
         # update it 
-        super(Content, self).save()
+        super(Content, self).save(*args, **kwargs)
     
     def __unicode__(self):
         return str(self.id) + ": " + self.iri_id
@@ -112,13 +113,11 @@
     def get_description(self, doc=None):
         
         if doc is None:
-            doc = xml.dom.minidom.parseString(self.ldt)
-            doc = Ft.Xml.Domlette.ConvertDocument(doc)        
+            doc = lxml.etree.fromstring(self.ldt)
         
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
-        res = xml.xpath.Evaluate("/iri/project", context=con)
+        res = doc.xpath("/iri/project")
         if len(res) > 0:
-            return res[0].getAttributeNS(None, u'abstract')
+            return res[0].get(u'abstract')
         else:
             return None
         
--- a/web/ldt/ldt_utils/projectserializer.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/ldt_utils/projectserializer.py	Tue Sep 14 13:38:47 2010 +0200
@@ -1,6 +1,4 @@
-import xml.dom
-import Ft.Xml.Domlette
-import xml.xpath
+import lxml.etree
 import uuid
 from datetime import datetime
 from ldt.ldt_utils.models import Content, Project
@@ -25,10 +23,10 @@
     
     def __parse_ensemble(self, ensemble_node, content):
         
-        ensemble_id = ensemble_node.getAttributeNS(None,u"id")
-        ensemble_author = ensemble_node.getAttributeNS(None,u"author")
-        ensemble_title = ensemble_node.getAttributeNS(None,u"title")
-        ensemble_description = ensemble_node.getAttributeNS(None,u"abstract")
+        ensemble_id = ensemble_node.attrib[u"id"]
+        ensemble_author = ensemble_node.attrib[u"author"]
+        ensemble_title = ensemble_node.attrib[u"title"]
+        ensemble_description = ensemble_node.attrib[u"abstract"]
         ensemble_created = datetime.utcnow().isoformat()
         ensemble_modified = ensemble_created 
         
@@ -49,16 +47,16 @@
         }
         
         
-        for decoupage_node in ensemble_node.childNodes:
-            if decoupage_node.nodeType != xml.dom.Node.ELEMENT_NODE or decoupage_node.tagName != "decoupage" :
+        for decoupage_node in ensemble_node:
+            if decoupage_node.tag != "decoupage" :
                 continue
             
-            decoupage_id = decoupage_node.getAttributeNS(None, u"id")
-            decoupage_creator = decoupage_node.getAttributeNS(None,u"author")
+            decoupage_id = decoupage_node.attrib[ u"id"]
+            decoupage_creator = decoupage_node.attrib[u"author"]
             if not decoupage_creator:
                 decoupage_creator = "IRI"
             decoupage_contributor = decoupage_creator
-            date_str = decoupage_node.getAttributeNS(None,u"date")
+            date_str = decoupage_node.get(u"date")
             decoupage_created = None
             if date_str :
                 for date_format in DATE_FORMATS:
@@ -72,12 +70,12 @@
             decoupage_modified = decoupage_created
             
             decoupage_title = ""
-            for txtRes in xml.xpath.Evaluate("title/text()", decoupage_node): 
-                    decoupage_title += txtRes.data
+            for txtRes in decoupage_node.xpath("title/text()", smart_strings=False): 
+                    decoupage_title += txtRes
 
             decoupage_description = ""
-            for txtRes in xml.xpath.Evaluate("abstract/text()", decoupage_node): 
-                    decoupage_description += txtRes.data
+            for txtRes in decoupage_node.xpath("abstract/text()", smart_strings=False): 
+                    decoupage_description += txtRes
             
 
             
@@ -95,53 +93,48 @@
             
             self.annotation_types.append(new_annotation_types)            
                         
-            res = xml.xpath.Evaluate("elements/element", decoupage_node)
+            res = decoupage_node.xpath("elements/element")
             for element_node in res:
                 
-                element_id = element_node.getAttributeNS(None,u"id")
-                element_begin = element_node.getAttributeNS(None,u"begin")
-                element_duration = element_node.getAttributeNS(None,u"dur")
+                element_id = element_node.attrib[u"id"]
+                element_begin = element_node.attrib[u"begin"]
+                element_duration = element_node.attrib[u"dur"]
                 element_media = content.iri_id
-                element_color = element_node.getAttributeNS(None,u"color")
+                element_color = element_node.attrib[u"color"]
                 
                 element_title = ""
-                for txtRes in xml.xpath.Evaluate("title/text()", element_node): 
-                    element_title += txtRes.data 
+                for txtRes in element_node.xpath("title/text()", smart_strings=False): 
+                    element_title += txtRes
         
                 element_description = ""
-                for txtRes in xml.xpath.Evaluate("abstract/text()", element_node): 
-                    element_description += txtRes.data 
+                for txtRes in element_node.xpath("abstract/text()", smart_strings=False): 
+                    element_description += txtRes
                 
                 element_audio_src = ""
                 element_audio_href = ""
-                res = xml.xpath.Evaluate("audio", element_node)
+                res = element_node.xpath("audio")
                 if len(res) > 0:
-                    element_audio_src = res[0].getAttributeNS(None, u"source")
-                    ltext = []
-                    for n in res[0].childNodes:
-                        if n.nodeType in (dom.Node.TEXT_NODE, dom.Node.CDATA_SECTION_NODE):
-                            ltext.append(n.data)
-                    element_audio_href = ''.join(ltext)
-                
+                    element_audio_src = res[0].get(u"source",u"")
+                    element_audio_href =  res[0].text                
                 
                 element_tags = []
                 
-                tags = element_node.getAttributeNS(None,u"tags")
+                tags = element_node.get(u"tags",u"")
                 
                 tags_list = map(lambda s:s.strip(),tags.split(","))
 
                 #tags                                
                 if tags is None or len(tags) == 0:
                     tags_list = []
-                    restagnode = xml.xpath.Evaluate("tag/text()", element_node)
+                    restagnode = element_node.xpath("tag/text()", smart_strings=False)
                     for tagnode in restagnode:
-                        tags_list.append(tagnode.data)
+                        tags_list.append(tagnode)
                         
                 if tags_list is None or len(tags_list) == 0:
                     tags_list = []
-                    restagnode = xml.xpath.Evaluate("tags/tag/text()", element_node)
+                    restagnode = element_node.xpath("tags/tag/text()", smart_strings=False)
                     for tagnode in restagnode:
-                        tags_list.append(tagnode.data)
+                        tags_list.append(tagnode)
                 
                 tag_date = datetime.utcnow().isoformat()
                 for tag_title in tags_list:
@@ -198,36 +191,28 @@
 
     def __parse_ldt(self):
         
-        doc = xml.dom.minidom.parseString(self.project.ldt.encode("utf-8"))
-        self.ldt_doc = Ft.Xml.Domlette.ConvertDocument(doc)
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        self.ldt_doc = lxml.etree.fromstring(self.project.ldt.encode("utf-8"))
         
-        res = xml.xpath.Evaluate("/iri/medias/media", context=con)
+        res = self.ldt_doc.xpath("/iri/medias/media")
         for mediaNode in res:
-            iri_id = mediaNode.getAttributeNS(None,u"id")
+            iri_id = mediaNode.attrib[u"id"]
             content = Content.objects.get(iri_id=iri_id)
             self.__parse_content(content)
             
-        res = xml.xpath.Evaluate("/iri/annotations/content",context=con)               
+        res = self.ldt_doc.xpath("/iri/annotations/content")               
         
         for content_node in res:
-            content_id = content_node.getAttributeNS(None, u"id")
+            content_id = content_node.attrib[u"id"]
             content = Content.objects.get(iri_id=content_id)
-            for ensemble_node in content_node.childNodes:
-                if ensemble_node.nodeType != xml.dom.Node.ELEMENT_NODE or ensemble_node.tagName != "ensemble" :
+            for ensemble_node in content_node:
+                if ensemble_node.tag != "ensemble" :
                     continue
-                self.__parse_ensemble(ensemble_node, content)
-            
-        #res = xml.xpath.Evaluate("/iri/displays/display",context=con)
-        
-        #for display_node in res:
-            
+                self.__parse_ensemble(ensemble_node, content)            
     
     
     def __parse_content(self, content):
         
-        doc = Ft.Xml.Domlette.ConvertDocument(xml.dom.minidom.parse(content.iri_file_path()))
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        doc = lxml.etree.parse(content.iri_file_path())
         
         authors = content.authors.all()
         
@@ -243,16 +228,16 @@
         
         content_author = ""
         
-        res = xml.xpath.Evaluate("/iri/head/meta[@name='author']/@content", context=con)
+        res = doc.xpath("/iri/head/meta[@name='author']/@content")
         if len(res) > 0:
-            content_author = res[0].value
+            content_author = res[0]
         
         
         content_date = ""
         
-        res = xml.xpath.Evaluate("/iri/head/meta[@name='date']/@content", context=con)
+        res = doc.xpath("/iri/head/meta[@name='date']/@content")
         if len(res) > 0:
-            content_date = res[0].value
+            content_date = res[0]
 
         
         new_media = {
@@ -281,7 +266,7 @@
         self.medias.append(new_media)
         
         
-        res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble",context=con)
+        res = doc.xpath("/iri/body/ensembles/ensemble")
         
         for ensemble_node in res:
             self.__parse_ensemble(ensemble_node, content)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/content_list.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,84 @@
+{% extends "ldt/user/user_base.html" %}
+{% load i18n %}
+
+{% block js_declaration %}
+{{block.super}}
+<script type="text/javascript">
+$(document).ready(function(){
+
+	$('.ldt_link').nyroModal({
+           	type: 'iframe',
+           	forceType: 'iframe',
+       		height:662, 
+       		width:1022,
+       		bgColor: 'rgb(239, 239, 239)',
+       		padding: 5,
+       		titleFromIframe: false
+          	});
+        	
+     $('.ldt_link_create').nyroModal({
+            type: 'iframe',
+            forceType: 'iframe',
+            height:662, 
+            width:1022,
+            bgColor: 'rgb(239, 239, 239)',
+            padding: 5,
+            titleFromIframe: false,
+            beforeHideContent: function(elts, settings, callback){
+	             try {
+		              var res = $('#ldtInitSwf',$('#nyroModalIframe').contents());
+		              if(res.length > 0)
+		              {
+		              	   res.get(0).forceSave();
+		              }
+	             }
+	             catch(err)
+	             {
+	              // do nothing
+	             }                   
+	             callback();
+            }
+        });
+
+});
+</script>
+
+{% endblock %}
+
+{% block css_import %}
+{{block.super}}
+    <link rel="stylesheet" type="text/css" href="{{ BASE_URL }}static/ldt/css/ldt.css" />
+{% endblock %}
+
+{% block breadcrumb %}
+<li></li>
+<li><a href="{% url ldt.userpanel.views.space %}">{% trans "Space" %}</a></li>
+<li>{% trans "Ldt Project" %}</li>
+{% endblock %}
+
+{% block content_title %}{% trans "Contents" %}{%endblock %}
+
+{% block iricontent %}
+<div id='contentlist'><a
+	href="#" class="create_content_link">{% trans 'Create new content'%}</a>
+
+<table>
+<caption>{% trans "Content" %}</caption>
+	<thead>
+		<tr>
+			<th width="170">{% trans "title" %}</th>
+			<th width="20">{% trans "create project" %}</th>
+		</tr>
+	</thead>
+	<tbody>
+{% for content in contents %}
+    <tr>
+        <td><a href="{% url ldt.ldt_utils.views.index content.iri_id %}" class="ldt_link">{{ content.title }}</a></td>
+        <td><a href="{% url ldt.ldt_utils.views.create_project content.iri_id %}" class="ldt_link_create">{% trans "create project" %}</a></td>
+    </tr>
+{% endfor %}
+    </tbody>
+</table>
+</div>
+
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,31 @@
+{% load i18n %} {# form of creation of content #}
+{% load adminmedia %}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<?xml version="1.0" encoding="UTF-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <script type="text/javascript" src="{{MEDIA_URL}}admin/js/core.js" ></script>
+    <script type="text/javascript" src="{% url jsi18n %}" } ></script>
+    <script type="text/javascript" src="{{MEDIA_URL}}js/jquery.min.js"></script>
+    <script type="text/javascript" src="{{MEDIA_URL}}js/jquery.nyroModal.min.js"></script>    
+	<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
+	<link rel="stylesheet" href="{{MEDIA_URL}}css/ldtform.css" />
+	{{content_form.media }}
+	<script type="text/javascript">
+	window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
+	
+    </script>
+</head>
+<body>
+<div id="add_content">
+<div class="title">{% trans "Create content" %}</div>
+<form action="{{create_content_action}}" method="POST">
+{% csrf_token %}
+{{ content_form.as_ul }}
+<input type="hidden" name="form_status" value="{{form_status}}" id="content_form_status" />
+<input type="submit"/> 
+</form>
+</div>
+</body>
+</html>
--- a/web/ldt/ldt_utils/templates/ldt/ldt_utils/ldt_list.html	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/ldt_list.html	Tue Sep 14 13:38:47 2010 +0200
@@ -66,16 +66,16 @@
 		</tr>
 	</thead>
 	<tbody>
-		{% for ldt in ldtProjects %}
+		{% for ldt in projects %}
 		<tr>
 			<th><a href="{% url ldt.ldt_utils.views.indexProject ldt.ldt_id %}"
 				class="ldt_link">{{ ldt.title }}</a></th>
 			{% ifequal ldt.state 2%}
 			<td><a href="{% url ldt.ldt_utils.views.unpublish ldt.ldt_id%}"><img
-				alt="True" src="{{BASE_URL}}static/admin/img/admin/icon-yes.gif" /></td>
+				alt="True" src="{{BASE_URL}}static/admin/img/admin/icon-yes.gif" /></a></td>
 			{% else %}
 			<td><a href="{% url ldt.ldt_utils.views.publish ldt.ldt_id %}"><img
-				alt="False" src="{{BASE_URL}}static/admin/img/admin/icon-no.gif" /></td>
+				alt="False" src="{{BASE_URL}}static/admin/img/admin/icon-no.gif" /></a></td>
 			{% endifequal %}
 		</tr>
 		{% endfor %}
--- a/web/ldt/ldt_utils/urls.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/ldt_utils/urls.py	Tue Sep 14 13:38:47 2010 +0200
@@ -22,8 +22,15 @@
     url(r'^cljson/externalid/(?P<id>.*)$', 'views.project_json_externalid'),
 )
 
+urlpatterns += patterns('',
+    url('^jsi18n','django.views.i18n.javascript_catalog', name='jsi18n'),
+)
+
+
 if test_ldt():
     urlpatterns += patterns('ldt.ldt_utils',
+        url(r'^space/content/$', 'views.list_content'),
+        url(r'^space/content/create/$', 'views.write_content'),
         url(r'^space/ldt/$', 'views.list_ldt'),
         url(r'^space/ldt/indexproject/(?P<id>.*)$', 'views.indexProject'),
         url(r'^space/ldt/init/(?P<method>.*)/(?P<url>.+)$', 'views.init', name='space_ldt_init'),
@@ -31,7 +38,7 @@
         url(r'^space/ldt/create/$', 'views.create_ldt_view'),
         url(r'^space/ldt/created_done/$', 'views.created_ldt'),
         url(r'^space/ldt/save/$', 'views.save_ldtProject'),
-        url(r'^space/ldt/publish/(?P<id>.*)$', 'views.publish'),
-        url(r'^space/ldt/unpublish/(?P<id>.*)$', 'views.unpublish'),
+        url(r'^space/ldt/publish/(?P<id>[\w-]*)(?:/(?P<redirect>true|false))?$', 'views.publish'),
+        url(r'^space/ldt/unpublish/(?P<id>[\w-]*)(?:/(?P<redirect>true|false))?$', 'views.unpublish'),
 
 )
--- a/web/ldt/ldt_utils/utils.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/ldt_utils/utils.py	Tue Sep 14 13:38:47 2010 +0200
@@ -12,6 +12,27 @@
 import xml.xpath
 import datetime
 import Ft
+import lxml.etree
+
+__BOOLEAN_DICT = {
+    'false':False,
+    'true':True,
+    '0':False,
+    '1':True,
+    't': True,
+    'f':False
+}
+
+def boolean_convert(bool):
+    if bool is None:
+        return False
+    if bool is True or bool is False:
+        return bool
+    key = str(bool).lower()
+    return __BOOLEAN_DICT.get(key, False)
+
+def generate_uuid():
+    return unicode(uuid.uuid1())
 
 class LdtSearch(object):
 
@@ -315,15 +336,13 @@
 def update_iri(filepath, content, username):
     
     # open xml
-    doc = xml.dom.minidom.parse(filepath)
-    doc = Ft.Xml.Domlette.ConvertDocument(doc) 
+    doc = lxml.etree.parse(filepath)
     
-    con = xml.xpath.Context.Context(doc, 1, 1, None)
-    res = xml.xpath.Evaluate("/iri/heqd/meta", context=con)
+    res = doc.xpath("/iri/heqd/meta")
     # update meta
     
     for meta_node in res:
-        meta_name = meta_node.getAttributeNS(None,"name")
+        meta_name = meta_node.get("name")
         content_attr = None
         if meta_name == u'id':
             content_attr = unicode(content.iri_id)
@@ -336,19 +355,19 @@
         elif meta_name == u"date":
             content_attr = unicode(datetime.date.today().isoformat())
         if content_attr is not None:
-            meta_node.setAttributeNS(None, u"content", content_attr)
+            meta_node.set(u"content", content_attr)
 
-    res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con)
+    res = doc.xpath("/iri/body/medias/media[@id='video']/video")
     
     if len(res) > 0:
         video_node = res[0]
-        video_node.setAttributeNS(None, u'src', unicode(content.src))
-        video_node.setAttributeNS(None, u'dur', unicode(content.duration))
-        video_node.setAttributeNS(None, u'id', unicode(content.iri_id))
+        video_node.set(u'src', unicode(content.src))
+        video_node.set(u'dur', unicode(content.duration))
+        video_node.set(u'id', unicode(content.iri_id))
     # update video
     
     f = open(filepath, "w")
     try:
-        xml.dom.ext.Print(doc, stream=f)
+        doc.write(f, encoding="UTF-8", pretty_print=True, xml_declaration=True)
     finally:
         f.close()
--- a/web/ldt/ldt_utils/views.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/ldt_utils/views.py	Tue Sep 14 13:38:47 2010 +0200
@@ -9,7 +9,7 @@
 from django.utils import simplejson
 from django.utils.html import escape
 from fileimport import *
-from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm
+from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm, ContentForm
 from ldt.core.models import Owner
 from models import *
 from utils import *
@@ -133,10 +133,19 @@
     ldtProjects = Project.objects.filter(owner=owner)
     context={
     'contents': contents,
-    'ldtProjects': ldtProjects.reverse(),
+    'projects': ldtProjects.reverse(),
     }
     return render_to_response('ldt/ldt_utils/ldt_list.html', context, context_instance=RequestContext(request))
 
+@login_required         
+def list_content(request):
+    contents = Content.objects.all()
+    context={
+        'contents': contents,
+    }
+    return render_to_response('ldt/ldt_utils/content_list.html', context, context_instance=RequestContext(request))
+
+@login_required
 def create_ldt_view(request):
     if request.method == "POST" :
         form = LdtAddForm(request.POST)
@@ -276,18 +285,26 @@
     return render_to_response('ldt/ldt_utils/save_done.html', {'ldt': ldt, 'id':id, 'title':title, 'contents': new_contents}, context_instance=RequestContext(request))
     
 @login_required    
-def publish(request, id):
+def publish(request, id, redirect=True):
     ldt = get_object_or_404(Project, ldt_id=id)
     ldt.state = 2 #published
     ldt.save()
-    return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    redirect = boolean_convert(redirect)
+    if redirect:
+        return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    else:
+        return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state,'ldt_id': ldt.ldt_id}}, ensure_ascii=False),mimetype='application/json')
     
 @login_required    
-def unpublish(request, id):
+def unpublish(request, id, redirect=True):
     ldt = get_object_or_404(Project, ldt_id=id)
     ldt.state = 1 #edition
     ldt.save()
-    return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    redirect = boolean_convert(redirect)
+    if redirect:
+        return HttpResponseRedirect(reverse("ldt.ldt_utils.views.list_ldt"))
+    else:
+        return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state,'ldt_id': ldt.ldt_id}}, ensure_ascii=False),mimetype='application/json')
     
 
 def index(request, url):
@@ -347,3 +364,35 @@
         form = CopyProjectForm
     return render_to_response('ldt/ldt_utils/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request))
 
+
+def write_content_base(request):
+    
+    form_status= 'none'        
+    if request.method =="POST":
+        form = ContentForm(request.POST)
+        if form.is_valid():
+            content, created = Content.objects.get_or_create(iri_id = form.cleaned_data['iri_id'], defaults = form.cleaned_data)
+            if not created:
+                form =  ContentForm(request.POST, instance=content)
+                form.save()
+            else:
+                content.save()
+            form_status = 'saved'
+            form = ContentForm(instance=content)
+        else:
+            form_status = 'error'
+    else:
+        form_status = 'empty'
+        form = ContentForm()
+    
+    return form, form_status
+
+
+def write_content(request):
+    
+    content_form, form_status = write_content_base(request)
+    
+    return render_to_response('ldt/ldt_utils/create_content.html', {'content_form': content_form, 'form_status': form_status,'create_content_action': reverse(write_content)}, context_instance=RequestContext(request))
+
+
+    
\ No newline at end of file
--- a/web/ldt/locale/en/LC_MESSAGES/django.po	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/locale/en/LC_MESSAGES/django.po	Tue Sep 14 13:38:47 2010 +0200
@@ -7,23 +7,82 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-09 08:48-0600\n"
+"POT-Creation-Date: 2010-09-12 23:04+0200\n"
 "PO-Revision-Date: 2010-02-17 03:53+0100\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ldt/models.py:43
+#: forms/widgets.py:17
+msgid "Date"
+msgstr ""
+
+#: forms/widgets.py:17
+msgid "Time"
+msgstr ""
+
+#: ldt_utils/models.py:22
+msgid "content.iri_id"
+msgstr ""
+
+#: ldt_utils/models.py:23
+msgid "content.iriurl"
+msgstr ""
+
+#: ldt_utils/models.py:24
+msgid "content.src"
+msgstr ""
+
+#: ldt_utils/models.py:25
+msgid "content.videopath"
+msgstr ""
+
+#: ldt_utils/models.py:26
+msgid "content.creation_date"
+msgstr ""
+
+#: ldt_utils/models.py:27
+msgid "content.update_date"
+msgstr ""
+
+#: ldt_utils/models.py:28
+msgid "content.title"
+msgstr ""
+
+#: ldt_utils/models.py:29
+#, fuzzy
+msgid "content.description"
+msgstr "Login"
+
+#: ldt_utils/models.py:30
+msgid "content.external_id"
+msgstr ""
+
+#: ldt_utils/models.py:31
+msgid "content.authors"
+msgstr ""
+
+#: ldt_utils/models.py:32
+#, fuzzy
+msgid "content.duration"
+msgstr "Documentation"
+
+#: ldt_utils/models.py:33
+msgid "content.content_creation_date"
+msgstr ""
+
+#: ldt_utils/models.py:106
 msgid "created by"
 msgstr "created by"
 
-#: ldt/models.py:44
+#: ldt_utils/models.py:107
 msgid "changed by"
 msgstr "changed by"
 
-#: ldt/templates/admin/ldt/app_action.html:6
+#: ldt_utils/templates/admin/ldt_utils/app_action.html:4
 #: templates/admin/cms_change_list.html:7
 #: templates/admin/page_app_index.html:8
 #: templates/admin/page_change_form.html:17
@@ -32,57 +91,83 @@
 msgid "Home"
 msgstr "Home"
 
-#: ldt/templates/iriuser/ldt/copy_ldt.html:12
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:55
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:51
+#: templates/admin/page_base.html:19
+#: user/templates/ldt/user/login_form.html:33
+#: user/templates/ldt/user/space.html:6 user/templates/ldt/user/space.html:9
+msgid "Space"
+msgstr "Space"
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:56
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:52
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:55
+msgid "Ldt Project"
+msgstr "Ldt Project"
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:59
+msgid "Contents"
+msgstr ""
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:63
+#, fuzzy
+msgid "Create new content"
+msgstr "Create new project"
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:66
+msgid "Content"
+msgstr ""
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:69
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:64
+msgid "title"
+msgstr "Title"
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:70
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:77
+#, fuzzy
+msgid "create project"
+msgstr "Create new project"
+
+#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:11
 msgid "Copy your project"
 msgstr "Copy your project"
 
-#: ldt/templates/iriuser/ldt/copy_ldt.html:15
-#: ldt/templates/iriuser/ldt/create_ldt.html:15
+#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:14
+#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:14
 msgid "Title"
 msgstr "Title"
 
-#: ldt/templates/iriuser/ldt/copy_ldt.html:18
+#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:16
 msgid "Copy"
 msgstr "Copy"
 
-#: ldt/templates/iriuser/ldt/create_ldt.html:12
+#: ldt_utils/templates/ldt/ldt_utils/create_content.html:22
+#, fuzzy
+msgid "Create content"
+msgstr "create account"
+
+#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:11
 msgid "Create your project"
 msgstr "Create your project"
 
-#: ldt/templates/iriuser/ldt/create_ldt.html:18
+#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:16
 msgid "List of contents"
 msgstr "List of contents"
 
-#: ldt/templates/iriuser/ldt/create_ldt.html:25
+#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:23
 msgid "Create"
 msgstr "Create"
 
-#: ldt/templates/iriuser/ldt/ldt_list.html:50
-#: templates/admin/page_base.html:19
-#: user/templates/iriuser/user/login_form.html:33
-#: user/templates/iriuser/user/space.html:6
-#: user/templates/iriuser/user/space.html:9
-msgid "Space"
-msgstr "Space"
-
-#: ldt/templates/iriuser/ldt/ldt_list.html:51
-#: ldt/templates/iriuser/ldt/ldt_list.html:53
-msgid "Ldt Project"
-msgstr "Ldt Project"
-
-#: ldt/templates/iriuser/ldt/ldt_list.html:57
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:59
 msgid "Create new project"
 msgstr "Create new project"
 
-#: ldt/templates/iriuser/ldt/ldt_list.html:59
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:61
 msgid "Project"
 msgstr "Project"
 
-#: ldt/templates/iriuser/ldt/ldt_list.html:62
-msgid "title"
-msgstr "Title"
-
-#: ldt/templates/iriuser/ldt/ldt_list.html:63
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:65
 msgid " published"
 msgstr " published"
 
@@ -277,8 +362,8 @@
 msgstr "Forget password?"
 
 #: templates/admin/page_login.html:32
-#: user/templates/iriuser/user/login_form.html:37
-#: user/templates/iriuser/user/login_form.html:45
+#: user/templates/ldt/user/login_form.html:37
+#: user/templates/ldt/user/login_form.html:45
 #: user/templates/registration/login.html:14
 #: user/templates/registration/password_reset_complete.html:14
 msgid "Log in"
@@ -293,7 +378,7 @@
 msgstr "Change password"
 
 #: templates/cms/admin/cms/page/change_form.html:11
-#: user/templates/iriuser/user/login_form.html:34
+#: user/templates/ldt/user/login_form.html:34
 msgid "Log out"
 msgstr "Log out"
 
@@ -317,7 +402,7 @@
 msgid "Permissions"
 msgstr "Permissions"
 
-#: user/admin.py:27 user/templates/iriuser/user/login_form.html:61
+#: user/admin.py:27 user/templates/ldt/user/login_form.html:61
 msgid "Password"
 msgstr "Password"
 
@@ -341,20 +426,20 @@
 msgid "Sorry, that's not a valid username or password."
 msgstr "Sorry, that's not a valid username or password."
 
-#: user/templates/iriuser/user/change_email.html:6
-#: user/templates/iriuser/user/change_email_done.html:6
-#: user/templates/iriuser/user/login_form.html:32
+#: user/templates/ldt/user/change_email.html:6
+#: user/templates/ldt/user/change_email_done.html:6
+#: user/templates/ldt/user/login_form.html:32
 #: user/templates/registration/password_change_done.html:7
 #: user/templates/registration/password_change_form.html:13
 msgid "Profiles"
 msgstr "Profiles"
 
-#: user/templates/iriuser/user/change_email.html:7
-#: user/templates/iriuser/user/change_email.html:10
+#: user/templates/ldt/user/change_email.html:7
+#: user/templates/ldt/user/change_email.html:10
 msgid "Modification de l'adresse émail"
 msgstr "E-mail change"
 
-#: user/templates/iriuser/user/change_email.html:26
+#: user/templates/ldt/user/change_email.html:26
 msgid ""
 "Please enter your new e-mail twice so we can verify you typed it in "
 "correctly."
@@ -362,79 +447,79 @@
 "Please enter your new e-mail twice so we can verify you typed it in "
 "correctly."
 
-#: user/templates/iriuser/user/change_email.html:32
+#: user/templates/ldt/user/change_email.html:32
 msgid "email"
 msgstr "email"
 
-#: user/templates/iriuser/user/change_email.html:41
+#: user/templates/ldt/user/change_email.html:41
 msgid "Confirmation de l'adresse émail"
 msgstr "E-mail confirmation"
 
-#: user/templates/iriuser/user/change_email.html:48
+#: user/templates/ldt/user/change_email.html:48
 msgid "change my e-mail"
 msgstr "Change my e-mail"
 
-#: user/templates/iriuser/user/change_email_done.html:7
-#: user/templates/iriuser/user/change_email_done.html:10
+#: user/templates/ldt/user/change_email_done.html:7
+#: user/templates/ldt/user/change_email_done.html:10
 msgid "email change"
 msgstr "email change"
 
-#: user/templates/iriuser/user/change_email_done.html:12
+#: user/templates/ldt/user/change_email_done.html:12
 msgid "email changed"
 msgstr "changed by"
 
-#: user/templates/iriuser/user/change_email_done.html:13
+#: user/templates/ldt/user/change_email_done.html:13
 msgid "back to profile"
 msgstr "back to profile"
 
-#: user/templates/iriuser/user/home.html:9
+#: user/templates/ldt/user/home.html:9
 msgid "Se connecter"
 msgstr "Login"
 
-#: user/templates/iriuser/user/home.html:10
+#: user/templates/ldt/user/home.html:10
 msgid "Créer un compte"
 msgstr "Create an account"
 
-#: user/templates/iriuser/user/home.html:11
+#: user/templates/ldt/user/home.html:11
 msgid "récupérer mot de passe"
 msgstr "Forget password?"
 
-#: user/templates/iriuser/user/login_form.html:50
+#: user/templates/ldt/user/login_form.html:50
 msgid "create account"
 msgstr "create account"
 
-#: user/templates/iriuser/user/login_form.html:54
+#: user/templates/ldt/user/login_form.html:54
 msgid "Pseudo"
 msgstr "Username"
 
-#: user/templates/iriuser/user/login_form.html:57
-#: user/templates/iriuser/user/login_form.html:64
+#: user/templates/ldt/user/login_form.html:57
+#: user/templates/ldt/user/login_form.html:64
 msgid "this field is compulsory"
 msgstr "this field is compulsory"
 
-#: user/templates/iriuser/user/login_form.html:68
+#: user/templates/ldt/user/login_form.html:68
 msgid "reset password"
 msgstr "reset password"
 
-#: user/templates/iriuser/user/login_form.html:71
+#: user/templates/ldt/user/login_form.html:71
 msgid "Connection"
 msgstr "Login"
 
-#: user/templates/iriuser/user/profile.html:6
+#: user/templates/ldt/user/profile.html:6
 #: user/templates/registration/password_change_form.html:14
 #: user/templates/registration/password_change_form.html:17
 msgid "Password change"
 msgstr "Password change"
 
-#: user/templates/iriuser/user/profile.html:7
+#: user/templates/ldt/user/profile.html:7
 msgid "Mail change"
 msgstr "Mail change"
 
-#: user/templates/iriuser/user/space.html:13
+#: user/templates/ldt/user/space.html:13
 msgid "Page"
 msgstr "Pages"
 
-#: user/templates/iriuser/user/space.html:16
+#: user/templates/ldt/user/space.html:16
 msgid "Projets Lignes de temps"
 msgstr "Lignes de temps projects"
 
--- a/web/ldt/locale/fr/LC_MESSAGES/django.po	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/locale/fr/LC_MESSAGES/django.po	Tue Sep 14 13:38:47 2010 +0200
@@ -7,23 +7,82 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-09 08:48-0600\n"
+"POT-Creation-Date: 2010-09-12 23:04+0200\n"
 "PO-Revision-Date: 2010-03-09 15:52+0100\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ldt/models.py:43
+#: forms/widgets.py:17
+msgid "Date"
+msgstr ""
+
+#: forms/widgets.py:17
+msgid "Time"
+msgstr ""
+
+#: ldt_utils/models.py:22
+msgid "content.iri_id"
+msgstr ""
+
+#: ldt_utils/models.py:23
+msgid "content.iriurl"
+msgstr ""
+
+#: ldt_utils/models.py:24
+msgid "content.src"
+msgstr ""
+
+#: ldt_utils/models.py:25
+msgid "content.videopath"
+msgstr ""
+
+#: ldt_utils/models.py:26
+msgid "content.creation_date"
+msgstr ""
+
+#: ldt_utils/models.py:27
+msgid "content.update_date"
+msgstr ""
+
+#: ldt_utils/models.py:28
+msgid "content.title"
+msgstr ""
+
+#: ldt_utils/models.py:29
+#, fuzzy
+msgid "content.description"
+msgstr "Connexion"
+
+#: ldt_utils/models.py:30
+msgid "content.external_id"
+msgstr ""
+
+#: ldt_utils/models.py:31
+msgid "content.authors"
+msgstr ""
+
+#: ldt_utils/models.py:32
+#, fuzzy
+msgid "content.duration"
+msgstr "Documentation"
+
+#: ldt_utils/models.py:33
+msgid "content.content_creation_date"
+msgstr ""
+
+#: ldt_utils/models.py:106
 msgid "created by"
 msgstr "créé par"
 
-#: ldt/models.py:44
+#: ldt_utils/models.py:107
 msgid "changed by"
 msgstr "modifié par"
 
-#: ldt/templates/admin/ldt/app_action.html:6
+#: ldt_utils/templates/admin/ldt_utils/app_action.html:4
 #: templates/admin/cms_change_list.html:7
 #: templates/admin/page_app_index.html:8
 #: templates/admin/page_change_form.html:17
@@ -32,57 +91,83 @@
 msgid "Home"
 msgstr "Accueil"
 
-#: ldt/templates/iriuser/ldt/copy_ldt.html:12
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:55
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:51
+#: templates/admin/page_base.html:19
+#: user/templates/ldt/user/login_form.html:33
+#: user/templates/ldt/user/space.html:6 user/templates/ldt/user/space.html:9
+msgid "Space"
+msgstr "Esp. perso"
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:56
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:52
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:55
+msgid "Ldt Project"
+msgstr "Projet lignes de temps"
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:59
+msgid "Contents"
+msgstr ""
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:63
+#, fuzzy
+msgid "Create new content"
+msgstr "Créer un nouveau projet Ligne de Temps"
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:66
+msgid "Content"
+msgstr ""
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:69
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:64
+msgid "title"
+msgstr "Titre"
+
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:70
+#: ldt_utils/templates/ldt/ldt_utils/content_list.html:77
+#, fuzzy
+msgid "create project"
+msgstr "Créer un nouveau projet Ligne de Temps"
+
+#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:11
 msgid "Copy your project"
 msgstr "Copier votre projet"
 
-#: ldt/templates/iriuser/ldt/copy_ldt.html:15
-#: ldt/templates/iriuser/ldt/create_ldt.html:15
+#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:14
+#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:14
 msgid "Title"
 msgstr "Titre"
 
-#: ldt/templates/iriuser/ldt/copy_ldt.html:18
+#: ldt_utils/templates/ldt/ldt_utils/copy_ldt.html:16
 msgid "Copy"
 msgstr "Copier"
 
-#: ldt/templates/iriuser/ldt/create_ldt.html:12
+#: ldt_utils/templates/ldt/ldt_utils/create_content.html:22
+#, fuzzy
+msgid "Create content"
+msgstr "Créer un compte"
+
+#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:11
 msgid "Create your project"
 msgstr "Créer votre projet Lignes de Temps"
 
-#: ldt/templates/iriuser/ldt/create_ldt.html:18
+#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:16
 msgid "List of contents"
 msgstr "Liste de contenus"
 
-#: ldt/templates/iriuser/ldt/create_ldt.html:25
+#: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:23
 msgid "Create"
 msgstr "Créer"
 
-#: ldt/templates/iriuser/ldt/ldt_list.html:50
-#: templates/admin/page_base.html:19
-#: user/templates/iriuser/user/login_form.html:33
-#: user/templates/iriuser/user/space.html:6
-#: user/templates/iriuser/user/space.html:9
-msgid "Space"
-msgstr "Esp. perso"
-
-#: ldt/templates/iriuser/ldt/ldt_list.html:51
-#: ldt/templates/iriuser/ldt/ldt_list.html:53
-msgid "Ldt Project"
-msgstr "Projet lignes de temps"
-
-#: ldt/templates/iriuser/ldt/ldt_list.html:57
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:59
 msgid "Create new project"
 msgstr "Créer un nouveau projet Ligne de Temps"
 
-#: ldt/templates/iriuser/ldt/ldt_list.html:59
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:61
 msgid "Project"
 msgstr "Projet"
 
-#: ldt/templates/iriuser/ldt/ldt_list.html:62
-msgid "title"
-msgstr "Titre"
-
-#: ldt/templates/iriuser/ldt/ldt_list.html:63
+#: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:65
 msgid " published"
 msgstr "Publié"
 
@@ -154,8 +239,12 @@
 
 #: templates/admin/cms_change_form.html:142
 #, python-format
-msgid "This page must be moderated at level %(moderation_level)s, post a message for moderator."
-msgstr "Le niveau nécessaire pour modérer cette page est le niveau %(moderation_level)s, laisser un message pour le modérateur"
+msgid ""
+"This page must be moderated at level %(moderation_level)s, post a message "
+"for moderator."
+msgstr ""
+"Le niveau nécessaire pour modérer cette page est le niveau "
+"%(moderation_level)s, laisser un message pour le modérateur"
 
 #: templates/admin/cms_change_form.html:144
 msgid "Request approvemet"
@@ -202,57 +291,47 @@
 msgid "Filter"
 msgstr "Filtre"
 
-#: templates/admin/index.html:18
-#: templates/admin/page_index.html:18
+#: templates/admin/index.html:18 templates/admin/page_index.html:18
 #, python-format
 msgid "Models available in the %(name)s application."
 msgstr "Le modèle disponible dans l'application %(name)s."
 
-#: templates/admin/index.html:19
-#: templates/admin/page_app_index.html:10
+#: templates/admin/index.html:19 templates/admin/page_app_index.html:10
 #: templates/admin/page_index.html:19
 #, python-format
 msgid "%(name)s"
 msgstr "%(name)s"
 
-#: templates/admin/index.html:29
-#: templates/admin/page_change_form.html:20
+#: templates/admin/index.html:29 templates/admin/page_change_form.html:20
 #: templates/admin/page_index.html:29
 msgid "Add"
 msgstr "Ajouter"
 
-#: templates/admin/index.html:35
-#: templates/admin/page_index.html:35
+#: templates/admin/index.html:35 templates/admin/page_index.html:35
 msgid "Change"
 msgstr "modifié par"
 
-#: templates/admin/index.html:64
-#: templates/admin/page_index.html:45
+#: templates/admin/index.html:64 templates/admin/page_index.html:45
 msgid "You don't have permission to edit anything."
 msgstr "Vous n'aver pas l'autorisation d'éditer quoi que ce soit."
 
-#: templates/admin/index.html:72
-#: templates/admin/page_index.html:53
+#: templates/admin/index.html:72 templates/admin/page_index.html:53
 msgid "Recent Actions"
 msgstr "Actions récentes"
 
-#: templates/admin/index.html:73
-#: templates/admin/page_index.html:54
+#: templates/admin/index.html:73 templates/admin/page_index.html:54
 msgid "My Actions"
 msgstr "Mes actions"
 
-#: templates/admin/index.html:77
-#: templates/admin/page_index.html:58
+#: templates/admin/index.html:77 templates/admin/page_index.html:58
 msgid "None available"
 msgstr "Aucune disponible"
 
-#: templates/admin/index.html:91
-#: templates/admin/page_index.html:72
+#: templates/admin/index.html:91 templates/admin/page_index.html:72
 msgid "Unknown content"
 msgstr "Contenu inconnu"
 
-#: templates/admin/page_base.html:20
-#: templates/admin/page_index.html:11
+#: templates/admin/page_base.html:20 templates/admin/page_index.html:11
 msgid "Pages"
 msgstr "Pages"
 
@@ -283,8 +362,8 @@
 msgstr "Oubliez le mot de passe?"
 
 #: templates/admin/page_login.html:32
-#: user/templates/iriuser/user/login_form.html:37
-#: user/templates/iriuser/user/login_form.html:45
+#: user/templates/ldt/user/login_form.html:37
+#: user/templates/ldt/user/login_form.html:45
 #: user/templates/registration/login.html:14
 #: user/templates/registration/password_reset_complete.html:14
 msgid "Log in"
@@ -299,7 +378,7 @@
 msgstr "Modifier le mot de passe"
 
 #: templates/cms/admin/cms/page/change_form.html:11
-#: user/templates/iriuser/user/login_form.html:34
+#: user/templates/ldt/user/login_form.html:34
 msgid "Log out"
 msgstr "Déconnexion"
 
@@ -323,8 +402,7 @@
 msgid "Permissions"
 msgstr "Permissions"
 
-#: user/admin.py:27
-#: user/templates/iriuser/user/login_form.html:61
+#: user/admin.py:27 user/templates/ldt/user/login_form.html:61
 msgid "Password"
 msgstr "Mot de passe"
 
@@ -336,8 +414,7 @@
 msgid "New password confirmation"
 msgstr "Confirmation du nouveau mot de passe"
 
-#: user/forms.py:78
-#: user/forms.py:79
+#: user/forms.py:78 user/forms.py:79
 msgid "E-mail"
 msgstr "E-mail"
 
@@ -345,101 +422,104 @@
 msgid "The two emails didn't match."
 msgstr "les deux emails ne correspondent pas"
 
-#: user/views.py:45
-#: user/templates/registration/login.html:17
+#: user/views.py:45 user/templates/registration/login.html:17
 msgid "Sorry, that's not a valid username or password."
 msgstr "Saisissez un nom d'utilisateur et un mot de passe valide."
 
-#: user/templates/iriuser/user/change_email.html:6
-#: user/templates/iriuser/user/change_email_done.html:6
-#: user/templates/iriuser/user/login_form.html:32
+#: user/templates/ldt/user/change_email.html:6
+#: user/templates/ldt/user/change_email_done.html:6
+#: user/templates/ldt/user/login_form.html:32
 #: user/templates/registration/password_change_done.html:7
 #: user/templates/registration/password_change_form.html:13
 msgid "Profiles"
 msgstr "Mon profil"
 
-#: user/templates/iriuser/user/change_email.html:7
-#: user/templates/iriuser/user/change_email.html:10
+#: user/templates/ldt/user/change_email.html:7
+#: user/templates/ldt/user/change_email.html:10
 msgid "Modification de l'adresse émail"
 msgstr "Modification de l'adresse email"
 
-#: user/templates/iriuser/user/change_email.html:26
-msgid "Please enter your new e-mail twice so we can verify you typed it in correctly."
-msgstr "Saisissez deux fois votre nouvelle adresse émail afin de vérifier qu'il est correctment"
+#: user/templates/ldt/user/change_email.html:26
+msgid ""
+"Please enter your new e-mail twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Saisissez deux fois votre nouvelle adresse émail afin de vérifier qu'il est "
+"correctment"
 
-#: user/templates/iriuser/user/change_email.html:32
+#: user/templates/ldt/user/change_email.html:32
 msgid "email"
 msgstr "adresse émail"
 
-#: user/templates/iriuser/user/change_email.html:41
+#: user/templates/ldt/user/change_email.html:41
 msgid "Confirmation de l'adresse émail"
 msgstr "Confirmation de l'adresse email"
 
-#: user/templates/iriuser/user/change_email.html:48
+#: user/templates/ldt/user/change_email.html:48
 msgid "change my e-mail"
 msgstr "Changer l'adresse émail"
 
-#: user/templates/iriuser/user/change_email_done.html:7
-#: user/templates/iriuser/user/change_email_done.html:10
+#: user/templates/ldt/user/change_email_done.html:7
+#: user/templates/ldt/user/change_email_done.html:10
 msgid "email change"
 msgstr "Modification de l'adresse émail"
 
-#: user/templates/iriuser/user/change_email_done.html:12
+#: user/templates/ldt/user/change_email_done.html:12
 msgid "email changed"
 msgstr "email modifié"
 
-#: user/templates/iriuser/user/change_email_done.html:13
+#: user/templates/ldt/user/change_email_done.html:13
 msgid "back to profile"
 msgstr "Retourner à mon profil"
 
-#: user/templates/iriuser/user/home.html:9
+#: user/templates/ldt/user/home.html:9
 msgid "Se connecter"
 msgstr "Se connecter"
 
-#: user/templates/iriuser/user/home.html:10
+#: user/templates/ldt/user/home.html:10
 msgid "Créer un compte"
 msgstr "Créere un compte"
 
-#: user/templates/iriuser/user/home.html:11
+#: user/templates/ldt/user/home.html:11
 msgid "récupérer mot de passe"
 msgstr "Récupérer le mot de passe"
 
-#: user/templates/iriuser/user/login_form.html:50
+#: user/templates/ldt/user/login_form.html:50
 msgid "create account"
 msgstr "Créer un compte"
 
-#: user/templates/iriuser/user/login_form.html:54
+#: user/templates/ldt/user/login_form.html:54
 msgid "Pseudo"
 msgstr "Pseudo"
 
-#: user/templates/iriuser/user/login_form.html:57
-#: user/templates/iriuser/user/login_form.html:64
+#: user/templates/ldt/user/login_form.html:57
+#: user/templates/ldt/user/login_form.html:64
 msgid "this field is compulsory"
 msgstr "Ce champs est obligatoire"
 
-#: user/templates/iriuser/user/login_form.html:68
+#: user/templates/ldt/user/login_form.html:68
 msgid "reset password"
 msgstr "Réinitialiser le mot de passe"
 
-#: user/templates/iriuser/user/login_form.html:71
+#: user/templates/ldt/user/login_form.html:71
 msgid "Connection"
 msgstr "Connexion"
 
-#: user/templates/iriuser/user/profile.html:6
+#: user/templates/ldt/user/profile.html:6
 #: user/templates/registration/password_change_form.html:14
 #: user/templates/registration/password_change_form.html:17
 msgid "Password change"
 msgstr "Modification du mot de passe"
 
-#: user/templates/iriuser/user/profile.html:7
+#: user/templates/ldt/user/profile.html:7
 msgid "Mail change"
 msgstr "Modification de l'adresse émail"
 
-#: user/templates/iriuser/user/space.html:13
+#: user/templates/ldt/user/space.html:13
 msgid "Page"
 msgstr "Pages"
 
-#: user/templates/iriuser/user/space.html:16
+#: user/templates/ldt/user/space.html:16
 msgid "Projets Lignes de temps"
 msgstr "Projets Lignes de temps"
 
@@ -495,8 +575,12 @@
 msgstr "Retourner à la page de mon profil"
 
 #: user/templates/registration/password_change_form.html:20
-msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
-msgstr "Par sécurité, veuillez enter votre ancien mot de passe puis le nouveau a deux reprise afin de savoir si vous l'avez taper correctement "
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Par sécurité, veuillez enter votre ancien mot de passe puis le nouveau a "
+"deux reprise afin de savoir si vous l'avez taper correctement "
 
 #: user/templates/registration/password_change_form.html:26
 msgid "Old password:"
@@ -536,28 +620,42 @@
 msgstr "Votre mot de passe a été fixé. vous pouvez vous connecter maintenant."
 
 #: user/templates/registration/password_reset_confirm.html:15
-msgid "Please enter your new password twice so we can verify you typed it in correctly."
-msgstr "veuillez enter votre nouveau mot de pass deux fois afin de le vérifier."
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"veuillez enter votre nouveau mot de pass deux fois afin de le vérifier."
 
 #: user/templates/registration/password_reset_confirm.html:27
 msgid "Password reset unsuccessful"
 msgstr "Reinitialisation du mot de pass a échoué"
 
 #: user/templates/registration/password_reset_confirm.html:29
-msgid "The password reset link was invalid, possibly because it has already been used.  Please request a new password reset."
-msgstr "Le lien de réinitialisation du mot de passe n'est pas valide, certainement car il a déjà été utilisé. veuiller demander une nouvelle réinitialisation."
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Le lien de réinitialisation du mot de passe n'est pas valide, certainement "
+"car il a déjà été utilisé. veuiller demander une nouvelle réinitialisation."
 
 #: user/templates/registration/password_reset_done.html:8
 msgid "Password reset successful"
 msgstr "Réinitialisation du mot de passe réussie"
 
 #: user/templates/registration/password_reset_done.html:12
-msgid "We've e-mailed you instructions for setting your password to the e-mail address you submitted. You should be receiving it shortly."
-msgstr "Nous vous avons envoyer les instructions de reinitialisation de votre mot de passe à l'adresse email que vous nous avez fournie. vous devriez les recevoir bientôt."
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Nous vous avons envoyer les instructions de reinitialisation de votre mot de "
+"passe à l'adresse email que vous nous avez fournie. vous devriez les "
+"recevoir bientôt."
 
 #: user/templates/registration/password_reset_email.html:2
 msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Vous recevez ce mail car vous avez damender la réinitialisation du mot de passe"
+msgstr ""
+"Vous recevez ce mail car vous avez damender la réinitialisation du mot de "
+"passe"
 
 #: user/templates/registration/password_reset_email.html:3
 #, python-format
@@ -566,7 +664,8 @@
 
 #: user/templates/registration/password_reset_email.html:5
 msgid "Please go to the following page and choose a new password:"
-msgstr "veuillez aller à la page suivante et choisissez un nouveau mot de passe :"
+msgstr ""
+"veuillez aller à la page suivante et choisissez un nouveau mot de passe :"
 
 #: user/templates/registration/password_reset_email.html:9
 msgid "Your username, in case you've forgotten:"
@@ -582,8 +681,12 @@
 msgstr "L'équipe du site %(site_name)s"
 
 #: user/templates/registration/password_reset_form.html:22
-msgid "Forgotten your password? Enter your e-mail address below, and we'll e-mail instructions for setting a new one."
-msgstr "Mot de passe oublié ? Entrez votre adresse email ci-dessous pour recevoir les instructions pour en entrer un nouveau."
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Mot de passe oublié ? Entrez votre adresse email ci-dessous pour recevoir "
+"les instructions pour en entrer un nouveau."
 
 #: user/templates/registration/password_reset_form.html:27
 msgid "Adresse émail"
@@ -599,8 +702,12 @@
 msgstr "Activer le compte"
 
 #: user/templates/registration/registration_active.html:9
-msgid "Vous avez bien activé votre compte, vous pouvez accedez à votre espace personnel."
-msgstr "Vous avez bien activé votre compte, vous pouvez accedez à votre espace personnel."
+msgid ""
+"Vous avez bien activé votre compte, vous pouvez accedez à votre espace "
+"personnel."
+msgstr ""
+"Vous avez bien activé votre compte, vous pouvez accedez à votre espace "
+"personnel."
 
 #: user/templates/registration/registration_active.html:10
 msgid "retourner à la page de connexion"
@@ -612,8 +719,12 @@
 msgstr "Création d'un compte"
 
 #: user/templates/registration/registration_complete.html:10
-msgid "We've e-mailed you instructions for activate your account to the e-mail address you submitted. You should be receiving it shortly."
-msgstr "Nous vous avons envoyé par courriel les instructions pour activer le compte à l'adresse que vous avez indiquée. Vous devriez le recevoir rapidement."
+msgid ""
+"We've e-mailed you instructions for activate your account to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Nous vous avons envoyé par courriel les instructions pour activer le compte "
+"à l'adresse que vous avez indiquée. Vous devriez le recevoir rapidement."
 
 #~ msgid "Password (Verification)"
 #~ msgstr "Mot de passe (Vérification)"
--- a/web/ldt/media/css/dashboard.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/media/css/dashboard.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,3 +1,4 @@
+@charset "UTF-8";
 
 #content-main-app-ldt-utils {
     float: left;
--- a/web/ldt/media/css/ldt.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/media/css/ldt.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,3 +1,5 @@
+@charset "UTF-8";
+
 #addldtform
 {
     font-size: 16px;
--- a/web/ldt/media/css/style.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/media/css/style.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,3 +1,5 @@
+@charset "UTF-8";
+
 #loginstate a, #loginstate a:hover, #loginstate a:visited, #loginstate a:link, #loginstate a:active {
     color:#0063DC;
     margin-right:4px;
--- a/web/ldt/media/css/style_base.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/media/css/style_base.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,3 +1,5 @@
+@charset "UTF-8";
+
 body
 {   font-family: Arial, Helvetica, sans serif;
     padding: 0px;
--- a/web/ldt/settings.py	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/ldt/settings.py	Tue Sep 14 13:38:47 2010 +0200
@@ -13,6 +13,7 @@
 #SERVER_EMAIL = "admin@domain.com"
 
 WEB_URL = getattr(settings, 'WEB_URL', '')
+BASE_URL = getattr(settings, 'BASE_URL', '')
 MEDIA_URL = getattr(settings, 'MEDIA_URL', '')
 MEDIA_ROOT = getattr(settings, 'MEDIA_ROOT', '')
 SITE_ID = getattr(settings, 'SITE_ID', 1)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/templatetags/navigation.py	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,19 @@
+from django.template import Library
+import re
+
+register = Library()
+
+
+@register.simple_tag
+def active(request, css_class, pattern, exact=True):
+    """
+    a simple tag to test the current path and return a given css class.
+    Useful for navigation tabs
+    """
+    if pattern:
+        if exact:
+            pattern = "^%s$" % pattern.lstrip("^").rstrip("$")
+     
+        if re.search(pattern, request.path):
+            return css_class
+    return ''
\ No newline at end of file
--- a/web/static/css/LdtPlayer.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/static/css/LdtPlayer.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,105 +1,105 @@
-		#demo-frame > div.demo { padding: 5px !important; };
-		
-		button.ui-button-icon-only  {
-			height:1.5em;
-			width:1.5em;
-		}
-		
-		#Ldt-controler {
-			font-size: 62.5%;
-			font-family: "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
-		}
+@charset "UTF-8";
 
-		.Ldt-iri-chapter{
-			padding-top:10px;
-			padding-bottom:5px;
-			border-left:solid 1px #000;
-			border-right:solid 1px #000;
-		}
-		
-		.tooltip {
-			display:none;
-			background:transparent url(../css/jq-css/imgs/white_arrow_mini.png);
-			font-size:12px;
-			height:55px;
-			width:180px;
-			padding:10px;
-			padding-left:15px;
-			padding-top:15px;
-			padding-right:15px;
-			color:#000;	
-			font-family: "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
-		}
+#demo-frame > div.demo { padding: 5px !important; };
 		
-		#Ldt-Annotations{
-			padding-left:5px;
-			width:470px;
-			float:left;
-			font-size: 62.5%;
-		}
-		#Ldt-SaTitle{
-			padding-top:2px;
-			padding-bottom:5px;
-			font-size:18px;
-			color:#FFF;	
-			height:22p;
-		}
-		#Ldt-SaDescription{
-			font-size:12px;	
-			color:#FFF;	
-		}
-		#Ldt-ShowAnnotation{
-			position:absolute;
-			z-index: 999;
-			padding:5px;
-			background:url(../css/jq-css/imgs/transBlack.png);
-			font-family: "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
-		}
-		
-		#Ldt-PlaceHolder{
-			position:absolue;
-			float:none;
-		}
-		.Ldt-Control1{
-			width:70px;
-			float:left;
-		}
-		.Ldt-Control2{
-			padding-left:10px;
-			width:70px;
-			float:left;
-		}
-		.Ldt-cleaner {
-			clear:both;
-		} 
-		.share {
-			background:url('../css/jq-css/imgs/widget20.png') no-repeat scroll 0 0 transparent ;
-			display:block;
-			height:16px;
-			line-height:16px !important;
-			overflow:hidden;
-			width:16px;
-			float:left;
-			cursor:pointer;
-			margin:2px;
-		}
-		.shareFacebook{
-			background-position:0 -704px;
-		}
-		.shareMySpace{
-			background-position:0 -736px;
-		}
-		.shareTwitter{
-			background-position:0 -1072px;
-		}
-		.shareGoogle{
-			background-position:0 -752px;
-		}
-		.shareDelicious{
-			background-position:0 -672px;
-		}
-		.shareJamesPot{
-			background-position:0 -1808px;
-		}
-		
-		
\ No newline at end of file
+button.ui-button-icon-only  {
+	height:1.5em;
+	width:1.5em;
+}
+
+#Ldt-controler {
+	font-size: 62.5%;
+	font-family: "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
+}
+
+.Ldt-iri-chapter{
+	padding-top:10px;
+	padding-bottom:5px;
+	border-left:solid 1px #000;
+	border-right:solid 1px #000;
+}
+
+.tooltip {
+	display:none;
+	background:transparent url(../css/jq-css/imgs/white_arrow_mini.png);
+	font-size:12px;
+	height:55px;
+	width:180px;
+	padding:10px;
+	padding-left:15px;
+	padding-top:15px;
+	padding-right:15px;
+	color:#000;	
+	font-family: "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
+}
+
+#Ldt-Annotations{
+	padding-left:5px;
+	width:470px;
+	float:left;
+	font-size: 62.5%;
+}
+#Ldt-SaTitle{
+	padding-top:2px;
+	padding-bottom:5px;
+	font-size:18px;
+	color:#FFF;	
+	height:22p;
+}
+#Ldt-SaDescription{
+	font-size:12px;	
+	color:#FFF;	
+}
+#Ldt-ShowAnnotation{
+	position:absolute;
+	z-index: 999;
+	padding:5px;
+	background:url(../css/jq-css/imgs/transBlack.png);
+	font-family: "Trebuchet MS", "Helvetica", "Arial",  "Verdana", "sans-serif";
+}
+
+#Ldt-PlaceHolder{
+	position:absolue;
+	float:none;
+}
+.Ldt-Control1{
+	width:70px;
+	float:left;
+}
+.Ldt-Control2{
+	padding-left:10px;
+	width:70px;
+	float:left;
+}
+.Ldt-cleaner {
+	clear:both;
+} 
+.share {
+	background:url('../css/jq-css/imgs/widget20.png') no-repeat scroll 0 0 transparent ;
+	display:block;
+	height:16px;
+	line-height:16px !important;
+	overflow:hidden;
+	width:16px;
+	float:left;
+	cursor:pointer;
+	margin:2px;
+}
+.shareFacebook{
+	background-position:0 -704px;
+}
+.shareMySpace{
+	background-position:0 -736px;
+}
+.shareTwitter{
+	background-position:0 -1072px;
+}
+.shareGoogle{
+	background-position:0 -752px;
+}
+.shareDelicious{
+	background-position:0 -672px;
+}
+.shareJamesPot{
+	background-position:0 -1808px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/css/border-radius.htc	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,143 @@
+--Do not remove this if you are using--
+Original Author: Remiz Rahnas
+Original Author URL: http://www.htmlremix.com
+Published date: 2008/09/24
+
+Changes by Nick Fetchak:
+- IE8 standards mode compatibility
+- VML elements now positioned behind original box rather than inside of it - should be less prone to breakage
+Published date : 2009/11/18
+
+
+<public:attach event="oncontentready" onevent="oncontentready('v08vnSVo78t4JfjH')" />
+<script type="text/javascript">
+
+// findPos() borrowed from http://www.quirksmode.org/js/findpos.html
+function findPos(obj) {
+	var curleft = curtop = 0;
+
+	if (obj.offsetParent) {
+		do {
+			curleft += obj.offsetLeft;
+			curtop += obj.offsetTop;
+		} while (obj = obj.offsetParent);
+	}
+
+	return({
+		'x': curleft,
+		'y': curtop
+	});
+}
+
+function oncontentready(classID) {
+  if (this.className.match(classID)) { return(false); }
+
+	if (!document.namespaces.v) { document.namespaces.add("v", "urn:schemas-microsoft-com:vml"); }
+
+	this.className = this.className.concat(' ', classID);
+	var arcSize = Math.min(parseInt(this.currentStyle['-moz-border-radius'] ||
+	                                this.currentStyle['-webkit-border-radius'] ||
+	                                this.currentStyle['border-radius'] ||
+	                                this.currentStyle['-khtml-border-radius']) /
+	                       Math.min(this.offsetWidth, this.offsetHeight), 1);
+	var fillColor = this.currentStyle.backgroundColor;
+	var fillSrc = this.currentStyle.backgroundImage.replace(/^url\("(.+)"\)$/, '$1');
+	var strokeColor = this.currentStyle.borderColor;
+	var strokeWeight = parseInt(this.currentStyle.borderWidth);
+	var stroked = 'true';
+	if (isNaN(strokeWeight)) {
+		strokeWeight = 0;
+		strokeColor = fillColor;
+		stroked = 'false';
+	}
+
+	this.style.background = 'transparent';
+	this.style.borderColor = 'transparent';
+
+	// Find which element provides position:relative for the target element (default to BODY)
+	var el = this;
+	var limit = 100, i = 0;
+	while ((typeof(el) != 'unknown') && (el.currentStyle.position != 'relative') && (el.tagName != 'BODY')) {
+		el = el.parentElement;
+		i++;
+		if (i >= limit) { return(false); }
+	}
+	var el_zindex = parseInt(el.currentStyle.zIndex);
+	if (isNaN(el_zindex)) { el_zindex = 0; }
+	//alert('got tag '+ el.tagName +' with pos '+ el.currentStyle.position);
+
+	var rect_size = {
+		'width': this.offsetWidth - strokeWeight,
+		'height': this.offsetHeight - strokeWeight
+	};
+	var el_pos = findPos(el);
+	var this_pos = findPos(this);
+	this_pos.y = this_pos.y + (0.5 * strokeWeight) - el_pos.y;
+	this_pos.x = this_pos.x + (0.5 * strokeWeight) - el_pos.x;
+
+	var rect = document.createElement('v:roundrect');
+	rect.arcsize = arcSize +'px';
+	rect.strokecolor = strokeColor;
+	rect.strokeWeight = strokeWeight +'px';
+	rect.stroked = stroked;
+	rect.style.display = 'block';
+	rect.style.position = 'absolute';
+	rect.style.top = this_pos.y +'px';
+	rect.style.left = this_pos.x +'px';
+	rect.style.width = rect_size.width +'px';
+	rect.style.height = rect_size.height +'px';
+	rect.style.antialias = true;
+	rect.style.zIndex = el_zindex - 1;
+
+	var fill = document.createElement('v:fill');
+	fill.color = fillColor;
+	fill.src = fillSrc;
+	fill.type = 'tile';
+
+	rect.appendChild(fill);
+	el.appendChild(rect);
+
+	var css = el.document.createStyleSheet();
+	css.addRule("v\\:roundrect", "behavior: url(#default#VML)");
+	css.addRule("v\\:fill", "behavior: url(#default#VML)");
+
+	isIE6 = /msie|MSIE 6/.test(navigator.userAgent);
+	// IE6 doesn't support transparent borders, use padding to offset original element
+	if (isIE6 && (strokeWeight > 0)) {
+		this.style.borderStyle = 'none';
+		this.style.paddingTop = parseInt(this.currentStyle.paddingTop || 0) + strokeWeight;
+		this.style.paddingBottom = parseInt(this.currentStyle.paddingBottom || 0) + strokeWeight;
+	}
+
+	if (typeof(window.rounded_elements) == 'undefined') {
+		window.rounded_elements = new Array();
+
+		if (typeof(window.onresize) == 'function') { window.previous_onresize = window.onresize; }
+		window.onresize = window_resize;
+	}
+	this.element.vml = rect;
+	window.rounded_elements.push(this.element);
+}
+
+function window_resize() {
+	if (typeof(window.rounded_elements) == 'undefined') { return(false); }
+
+	for (var i in window.rounded_elements) {
+		var el = window.rounded_elements[i];
+
+		var strokeWeight = parseInt(el.currentStyle.borderWidth);
+		if (isNaN(strokeWeight)) { strokeWeight = 0; }
+
+		var parent_pos = findPos(el.vml.parentNode);
+		var pos = findPos(el);
+		pos.y = pos.y + (0.5 * strokeWeight) - parent_pos.y;
+		pos.x = pos.x + (0.5 * strokeWeight) - parent_pos.x;
+
+		el.vml.style.top = pos.y +'px';
+		el.vml.style.left = pos.x +'px';
+	}
+
+	if (typeof(window.previous_onresize) == 'function') { window.previous_onresize(); }
+}
+</script>
+
--- a/web/static/css/custom_player.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/static/css/custom_player.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,3 +1,5 @@
+@charset "UTF-8";
+
 #demo-frame > div.demo { padding: 5px !important; };
 .iri-chapter{
 	padding-top:10px;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/css/ldtform.css	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,107 @@
+@charset "UTF-8";
+
+body {
+	min-width: 0;
+}
+
+#add_content, #add_contribution {
+	padding: 10px;	
+}
+
+
+#add_content input, #add_content textarea, #add_content select,
+#add_contribution input, #add_contribution textarea, #add_contribution select
+{
+	background: #ededed;
+	width: 250px;
+}
+
+#add_contribution input[type="checkbox"] {
+	width: auto;
+}
+
+
+#add_content textarea {
+	height : 125px;
+}
+
+#add_content li {
+	list-style: none;
+}
+
+
+label {
+	display: block;
+	margin-top: 0.5em;
+}
+
+#add_content .vDateField,#add_content .vTimeField {
+	width: 90px;
+	float: left;
+}
+
+.projectscontentstitle {
+	border-bottom: 1px solid black;
+}
+
+#submitcontent {
+	border-top: 1px solid black;
+	padding-top : 10px;
+	text-align: right;
+}
+
+#add_content input[type="submit"], #add_contribution input[type="submit"] {
+	background-color: #656565;
+	color: white;
+	width:auto;
+	font-weight: bold;
+	padding: 5px 10px;
+}
+
+.datetimeshortcuts {
+	float: left;
+}
+
+.ldtdatetime {
+	float: left;
+	width: 350px;
+}
+
+.ldtdate,.ldttime {
+	float: left;
+	width: 150px;
+}
+
+.ldtdatetitle,.ldttimetitle {
+	color: #666;
+}
+
+#contentformhidden {
+	display: none;
+}
+
+#contentformfields {
+	margin: 10px 0px;
+}
+
+.cellcheckbox {
+	text-align: center;
+	width: 70 px;
+}
+
+#contentslistheader {
+	padding: 1px 10px 1px 36px;	
+}
+
+#ldtcreatetablewrapperdiv {
+	height: 282px;
+}
+
+#ldtcreatecontentstablediv {
+	max-height: 280px;
+}
+
+#ldtcreatecontentslistcontainer {
+	padding: 5px 0px 20px 0px;
+	height: 300px;
+}
--- a/web/static/css/nyroModal.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/static/css/nyroModal.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,3 +1,5 @@
+@charset "UTF-8";
+
 div#nyroModalFull {
 	font-size: 12px;
 	color: #777;
@@ -7,7 +9,7 @@
 	width: 150px;
 	height: 150px;
 	text-indent: -9999em;
-	background: #fff url(../img/ajaxLoader.gif) no-repeat;
+	background: #fff url(../img/ajax-loader-43x43.gif) no-repeat;
 	background-position: center;
 }
 div#nyroModalLoading.error {
--- a/web/static/css/style.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/static/css/style.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,3 +1,5 @@
+@charset "UTF-8";
+
 body {
 
  	font-family: Arial, Helvetica, sans serif;
@@ -213,4 +215,24 @@
 	display: inline;
 }
 
+#toolbar {
+	margin-top: 10px;
+	border-bottom: 3px solid #707070;
+}
 
+#inner_content {
+	padding: 40px 0px 50px 0px; 	
+}
+
+#loginstate {
+	text-align: right;
+}
+
+.projectscontentstitle {
+	color: #949494;
+	font-family: Verdana;
+	font-weight: lighter;
+	font-size: 2.0em;
+	font-style: normal;
+	text-align: left;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/css/tabs.css	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,72 @@
+/* -----------------------------------------------------------------------
+ Taken from:
+
+ Tabs Plugin 0.2 for the Blueprint CSS Framework
+ http://blueprintcss.org
+
+   * Copyright (c) 2008-Present. Refer to the main Blueprint license.
+   * See README for instructions on how to use this plugin.
+   * For credits and origins, see AUTHORS.
+
+----------------------------------------------------------------------- */
+@charset "UTF-8";
+
+.tabs { 
+	height:auto; 
+	margin:0;
+	overflow:hidden;
+	padding-left:0; 
+}
+* html .tabs { height:1%; /* fixing IE 6 */ }
+.tabs li {
+  background: #707070 url("../img/tabsright_normal.png") no-repeat right center;
+  border-bottom:none;
+  float:left;
+  line-height:1.5; 
+  list-style-type:none;
+  margin:0 ;
+  padding: 0 9px 0 0;
+  height: 29px;
+  
+}
+.tabs li a { 
+  border-bottom:none;
+  color: #ffffff;
+  cursor:pointer;
+  display:block;
+  float:left;
+  margin: .5em 2em .5em 2em;
+  text-transform: capitalize;
+  font-weight: lighter;
+}
+
+.tabs li.active { 
+  background:#29aae3 url("../img/tabsright_active.png") no-repeat right center;
+}
+
+
+.tabs li a.selected { 
+  background:#666;
+  border:1px solid #666;
+  border-bottom:none;
+  color:#fff;
+  cursor:default;
+}
+.tabs li a, .tabs li a:focus, .tabs li a:hover { 
+  text-decoration:none;
+}
+.tabs li a:focus, .tabs li a:hover { 
+  color:#555;
+  outline:none;
+}
+.tabs li a.selected:focus, .tabs li a.selected:hover { 
+  color:#fafafa;
+}	
+.tabs li.label { 
+	border:none;
+	font-weight:bold;
+	line-height:1.5; 
+	margin-right:.5em; 
+	padding:.25em .33em .25em .33em;
+}
+
--- a/web/static/css/workspace.css	Tue Sep 14 13:15:28 2010 +0200
+++ b/web/static/css/workspace.css	Tue Sep 14 13:38:47 2010 +0200
@@ -1,18 +1,9 @@
-#contentsdiv h1 {
-    text-decoration : underline;
-}
+@charset "UTF-8";
 
-#contentsdiv table {
-    border: 1px solid black;
+.titlediv {
+	margin: 0px 0px 25px 0px;
 }
 
-#projectsdiv h1 {
-    text-decoration : underline;
-}
-
-#projectsdiv table {
-    border: 1px solid black;
-}
 
 .ldt_player_code {
 	width: 580px;
@@ -23,3 +14,144 @@
 	padding: 2px;
 }
 
+.searchfielddiv {
+	top: 50%;
+	margin-top: 12px;
+}
+
+.searchfield {
+	background: white;
+	border: 1px solid #b8b8b8;
+	-moz-border-radius: 15px;
+	-webkit-border-radius:15px;
+	-khtml-border-radius:15px;
+	border-radius: 15px;
+	padding: 2px 5px;
+}
+
+.searchfield img {
+	vertical-align: top;
+}
+
+.searchfieldinput {
+	color: graytext;
+	font-style: italic;
+}
+
+
+input[type="text"].searchfieldinputbase {
+	border: none;
+}
+
+.searchfieldinputbase {
+	background: #ffffff url("../img/search.gif") no-repeat left center;
+	width: 99px;
+	height: 14px;
+	margin: 0px 2px 0px 0px;
+	vertical-align: top;
+	padding-left: 20px;
+}
+
+
+.projectscontentsdiv {
+	overflow: hidden;
+	height: 570px;
+	
+}
+div.projectscontentsdiv table {
+	width: 470px;
+	height: 100%;
+	margin-bottom: 0;
+}
+
+tr.projectscontentsoddline {
+	background: #ededed;
+}
+
+tr.projectscontentsevenline {
+	background: white;	
+}
+
+
+/* make the TH elements pretty */
+.projectscontentsheader {
+	background: #b5b5b5;
+	font-weight: bold;
+	text-transform:capitalize;
+	color: white;
+	padding: 1px 2px;
+	text-align: left;
+}
+
+
+#contentsheader {
+	padding: 1px 10px 1px 49px;
+}
+
+
+#projectsheader {
+	padding: 1px 10px 1px 93px;
+}
+
+tbody .contenttitle {
+	width: 411px;
+	padding: 4px 10px 4px 5px;
+}
+
+tbody .projecttitle {
+	width: 367px;
+	padding: 4px 10px 4px 5px;	
+}
+
+.projectscontentsfooter {
+	background: #8c8c8c;
+	color: #ffffff;
+	margin-top: 18px;
+	font-size: 1.25em;
+	font-style: normal;
+	padding : 5px 5px;
+}
+
+.projectscontentstablediv {
+	max-height: 500px;
+	overflow: auto; overflow-x: hidden;
+	border-bottom: 2px solid #b5b5b5 ;
+	float: left;
+}
+.projectscontentstablewrapperdiv {
+	height: 502px;
+}
+
+.projectscontentsbody tr {
+	padding-right: 16px;
+}
+
+.titlediv {
+	vertical-align: middle;	
+}
+
+.cellimg {
+	width: 18px;
+	text-align: center;
+	padding: 4px 2px 4px 2px;
+	cursor: pointer; cursor: hand;
+}
+
+.cellimgdiv {
+	visibility: hidden;
+}
+
+.searchajaxloader {
+	display: none;
+}
+
+a.content_link_create:link, a.content_link_create:visited,
+a.ldt_link_create:link, a.ldt_link_create:visited {
+	color: white;
+	text-decoration: none;
+}
+
+a.project_link_create:link, a.project_link_create:visited {
+	color: white;
+}
+
Binary file web/static/img/ajax-loader-16x16.gif has changed
Binary file web/static/img/ajax-loader-43x43.gif has changed
Binary file web/static/img/ajaxLoader.gif has changed
Binary file web/static/img/control_play.gif has changed
Binary file web/static/img/document_add.gif has changed
Binary file web/static/img/document_edit.gif has changed
Binary file web/static/img/documents_duplicate.gif has changed
Binary file web/static/img/favicon.ico has changed
Binary file web/static/img/plugin.gif has changed
Binary file web/static/img/search.gif has changed
Binary file web/static/img/tabsright_active.png has changed
Binary file web/static/img/tabsright_normal.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/js/jquery.qtip.css	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,337 @@
+/*
+* qTip - The jQuery tooltip plugin
+* http://craigsworks.com/projects/qtip/
+*
+* Version: 2.0.0pre
+* Copyright 2009 Craig Michael Thompson - http://craigsworks.com
+*
+* Dual licensed under MIT or GPL Version 2 licenses
+*   http://en.wikipedia.org/wiki/MIT_License
+*   http://en.wikipedia.org/wiki/GNU_General_Public_License
+*
+* Date: Mon Sep 6 15:10:26 2010 +0100
+*/
+
+.ui-tooltip-accessible{
+	left: -10000em !important;
+	top: -10000em !important;
+	display: block !important;
+	visibility: hidden !important;
+}
+
+	/* IE6 ONLY - Width detection fix */
+	* html .ui-tooltip-accessible{
+		position: static !important;
+		float: left !important;
+	}
+
+.ui-tooltip, .qtip{
+	position: absolute;
+	display: none;
+
+	max-width: 280px;
+	min-width: 50px;
+}
+
+	.ui-tooltip .ui-tooltip-wrapper{
+		position: relative;
+		overflow: hidden;
+
+		border-width: 3px;
+		border-style: solid;
+	}
+
+	.ui-tooltip .ui-tooltip-content{
+		position: relative;
+		padding: 5px 9px;
+
+		text-align: left;
+		word-wrap: break-word;
+		overflow: hidden;
+	}
+
+	.ui-tooltip .ui-tooltip-titlebar{
+		position: relative;
+		padding: 6px 35px 6px 10px;
+
+		font-weight: bold;
+	}
+
+		/*! Default close button class */
+		.ui-tooltip .ui-tooltip-close{
+			position: absolute;
+			height: 16px;
+			width: 16px;
+			padding: 1px;
+			right: 5px;
+			top: 5px;
+
+			cursor: pointer;
+			line-height: 0px;
+			font-size: 0px;
+		}
+
+			.ui-tooltip .ui-tooltip-close .ui-icon{
+				height: 16px;
+				width: 16px;
+				display: block;
+
+				opacity: 0.8;
+				-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+				filter: alpha(opacity=80);
+			}
+			.ui-tooltip .ui-tooltip-close:hover .ui-icon{
+				opacity: 1;
+				-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+				filter: alpha(opacity=100);
+			}
+
+		/*! Custom button class */
+		.ui-tooltip .ui-tooltip-button{
+			float: right;
+		}
+
+	/* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */
+	.ui-tooltip-focus{
+
+	}
+
+
+/*! Default tooltip style */
+.ui-tooltip-wrapper{
+	border-color: #F9E98E;
+	background-color: #FBF7AA;
+	color: #A27D35;
+}
+
+	.ui-tooltip .ui-tooltip-titlebar{
+		background-color: #F0DE7D;
+	}
+
+	.ui-tooltip .ui-tooltip-close .ui-icon{
+		background: #A27D35 url('images/close.png') no-repeat 50% 50%;
+	}
+
+/*! Plain tooltip style */
+.ui-tooltip-plain .ui-tooltip-wrapper{
+	border-color: black;
+	border-width: 1px;
+
+	background-color: white;
+	color: black;
+}
+
+	.ui-tooltip-plain .ui-tooltip-titlebar{
+		background-color: white;
+	}
+
+	.ui-tooltip-plain .ui-tooltip-close .ui-icon{
+		background: black;
+	}
+
+/*! Light tooltip style */
+.ui-tooltip-light .ui-tooltip-wrapper{
+	border-color: #E2E2E2;
+	background-color: white;
+	color: #454545;
+}
+
+	.ui-tooltip-light .ui-tooltip-titlebar{
+		background-color: #f1f1f1;
+	}
+
+	.ui-tooltip-light .ui-tooltip-close .ui-icon{
+		background: #454545 url('images/close-light.png') no-repeat 50% 50%;
+	}
+
+
+/*! Dark tooltip style */
+.ui-tooltip-dark .ui-tooltip-wrapper{
+	border-color: #303030;
+	background-color: #505050;
+	color: #f3f3f3;
+}
+
+	.ui-tooltip-dark .ui-tooltip-titlebar{
+		background-color: #404040;
+	}
+
+	.ui-tooltip-dark .ui-tooltip-close .ui-icon{
+		background: #f3f3f3 url('images/close-dark.png') no-repeat 50% 50%;
+	}
+
+
+/*! Red tooltip style */
+.ui-tooltip-red .ui-tooltip-wrapper{
+	border-color: #D95252;
+	background-color: #F78B83;
+	color: #912323;
+}
+
+	.ui-tooltip-red .ui-tooltip-titlebar{
+		background-color: #F06D65;
+	}
+
+	.ui-tooltip-red .ui-tooltip-close .ui-icon{
+		background: #9C2F2F url('images/close-red.png') no-repeat 50% 50%;
+	}
+
+
+/*! Green tooltip style */
+.ui-tooltip-green .ui-tooltip-wrapper{
+	border-color: #90D93F;
+	background-color: #CAED9E;
+	color: #3F6219;
+}
+
+	.ui-tooltip-green .ui-tooltip-titlebar{
+		background-color: #B0DE78;
+	}
+
+	.ui-tooltip-green .ui-tooltip-close .ui-icon{
+		background: #58792E url('images/close-green.png') no-repeat 50% 50%;
+	}
+
+
+/*! Blue tooltip style */
+.ui-tooltip-blue .ui-tooltip-wrapper{
+	border-color: #ADD9ED;
+	background-color: #E5F6FE;
+	color: #5E99BD;
+}
+
+	.ui-tooltip-blue .ui-tooltip-titlebar{
+		background-color: #D0E9F5;
+	}
+
+	.ui-tooltip-blue .ui-tooltip-close .ui-icon{
+		background: #4D9FBF url('images/close-blue.png') no-repeat 50% 50%;
+	}
+
+
+/*! Add shadows to your tooltips in all supported browsers */
+.ui-tooltip-shadow{
+  -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);
+  -moz-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);
+  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);
+
+  filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=5, OffY=5, Color='gray');
+  -ms-filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=5, OffY=5, Color='gray')";
+}
+
+div.ui-tooltip-tip{
+	position: absolute;
+	margin: 0 auto;
+	overflow: hidden;
+
+	line-height: 0.1px;
+	font-size: 1px;
+
+	background: transparent !important;
+	border: 0px !important;
+	z-index: 10;
+}
+
+	div.ui-tooltip-tip *{
+		line-height: 0.1px;
+		font-size: 0.1px;
+	}
+
+	div.ui-tooltip-tip div{
+		background: transparent !important;
+		border: 0px dashed transparent;
+	}
+
+#qtip-overlay{
+	position: absolute;
+	left: -10000em;
+	top: -10000em;
+
+	background-color: black;
+	cursor: pointer;
+
+	/* Set this to any below 15000 (default starting z-index for qTips) */
+	z-index: 14999;
+}
+
+/*! Youtube tooltip style */
+div.ui-tooltip-youtube .ui-tooltip-wrapper{
+	-moz-border-radius: 5px;
+	-webkit-border-radius: 5px;
+	border-radius: 5px;
+
+	-webkit-box-shadow: 0 0 3px #333;
+	-moz-box-shadow: 0 0 3px #333;
+	box-shadow: 0 0 3px #333;
+
+	border-color: #CCCCCC;
+	border-width: 1px;
+
+	color: white;
+}
+
+	div.ui-tooltip-youtube .ui-tooltip-close .ui-icon{
+		background: #4D9FBF url('images/close-dark.png') no-repeat 50% 50%;
+	}
+
+	div.ui-tooltip-youtube .ui-tooltip-titlebar,
+	div.ui-tooltip-youtube .ui-tooltip-content{
+		background-color: rgba(0, 0, 0, 0.85);
+	}
+
+	/* IE6 Fallback */
+	* html div.ui-tooltip-youtube-wrapper{
+		background-color: black;
+	}
+
+
+/* jQuery TOOLS Tooltip style */
+div.ui-tooltip-jtools .ui-tooltip-wrapper{
+	-moz-border-radius: 2px;
+	-webkit-border-radius: 2px;
+	border-radius: 2px;
+
+	border-color: white;
+	border-width: 2px;
+
+	-webkit-box-shadow: 0 0 12px #333;
+	-moz-box-shadow: 0 0 12px #333;
+	box-shadow: 0 0 12px #333;
+
+	background-color: rgba(0, 0, 0, 0.7);
+	background-image: -moz-linear-gradient(top, #717171, #232323);
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#717171), to(#232323));
+	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#232323);
+	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#232323)";
+
+	color: white;
+}
+
+	div.ui-tooltip-jtools .ui-tooltip-titlebar,
+	div.ui-tooltip-jtools .ui-tooltip-content{
+		background: none;
+	}
+
+	div.ui-tooltip-jtools .ui-tooltip-close .ui-icon{
+		background: black url('images/close-dark.png') no-repeat 50% 50%;
+	}
+
+
+/* Cluetip style */
+div.ui-tooltip-cluetip .ui-tooltip-wrapper{
+	border-width: 0;
+
+	-webkit-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
+	-moz-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
+	box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
+}
+
+	div.ui-tooltip-cluetip .ui-tooltip-titlebar{
+		background-color: #87876A;
+		color: white;
+	}
+	div.ui-tooltip-cluetip .ui-tooltip-content{
+		background-color: #D9D9C2;
+		color: #111;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/js/jquery.qtip.min.js	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,1 @@
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('"6t 6u";(j($){$(31).3x(j(){R i;$(2e).1J(\'3L 3E\',j(r){1V(i=0;i<$.18.g.O.Q;i++){R T=$.18.g.O[i];c(T&&T.V&&T.V.1b&&T.8.k.17!==\'29\'&&T.d.h.2r(\':28\')&&(T.8.k.1e.3E&&r.17===\'3E\'||T.8.k.1e.3L&&r.17===\'3L\')){T.2h(r,H)}}});$(31).1J(\'5j.g\',j(r){c($(r.s).5g(\'12.g\').Q===0){R h=$(\'.6w\'),T=h.g(\'T\');c(h.2r(\':28\')&&T&&T.V&&!T.V.23&&$(r.s).2m(T.d.s).Q>1){T.D(r)}}})});j 2D(w){c(!w){B p}A.x=5a(w).3l(/5x/i,\'1j\').5y(/M|25|1j/i)[0].2F();A.y=5a(w).3l(/5x/i,\'1j\').5y(/K|26|1j/i)[0].2F();A.1k={M:0,K:0};A.2y=(w.2H(0).6L(/^(t|b)/)>-1)?\'y\':\'x\';A.1w=j(){B(A.2y===\'y\')?A.y+A.x:A.x+A.y}}j 4t(w,o,G){R 1N={5B:[[0,0],[o,G],[o,0]],6a:[[0,0],[o,0],[0,G]],5K:[[0,G],[o,0],[o,G]],5N:[[0,0],[0,G],[o,G]],6y:[[0,G],[o/2,0],[o,G]],6v:[[0,0],[o,0],[o/2,G]],6i:[[0,0],[o,G/2],[0,G]],6J:[[o,0],[o,G],[0,G/2]]};1N.6M=1N.5B;1N.6z=1N.6a;1N.6x=1N.5K;1N.6C=1N.5N;B 1N[w]}j 4e(E){R 2j;c($(\'<1f />\').1q(0).1E){2j={3K:[E,E],40:[0,E],4I:[E,0],3P:[0,0]}}C c($.16.1d){2j={3K:[-2z,2z,0],40:[-2z,2z,-E],4I:[2z,5D,0],3P:[2z,5D,-E]}}B 2j}j 2G(e,4b){R 2U,i;2U=$.2p(H,{},e);1V(i 5R 2U){c(4b===H&&(/(f|1g)/i).1Y(i)){3z 2U[i]}C c(!4b&&(/(o|I|f|U|1g|4v)/i).1Y(i)){3z 2U[i]}}B 2U}j 4i(e){c(P e.f!==\'19\'){e.f={w:e.f}}c(P e.f.N!==\'19\'){e.f.N={o:e.f.N,G:e.f.N}}c(P e.I!==\'19\'){e.I={o:e.I}}c(P e.o!==\'19\'){e.o={2Z:e.o}}c(P e.o.1H===\'1w\'){e.o.1H=1A(e.o.1H.3l(/([0-9]+)/i,"$1"),10)}c(P e.o.2b===\'1w\'){e.o.2b=1A(e.o.2b.3l(/([0-9]+)/i,"$1"),10)}c(P e.f.N.x===\'2s\'){e.f.N.o=e.f.N.x;3z e.f.N.x}c(P e.f.N.y===\'2s\'){e.f.N.G=e.f.N.y;3z e.f.N.y}B e}j 4l(){R 7,i,3A,2v,1D,1P;7=A;3A=[H,{}];1V(i=0;i<3b.Q;i++){3A.5h(3b[i])}2v=[$.2p.4s($,3A)];6F(P 2v[0].21===\'1w\'){2v.5O(4i($.18.g.3c[2v[0].21]))}2v.5O(H,{1g:{h:\'g-\'+(3b[0].21||\'39\')}},$.18.g.3c.39);1D=$.2p.4s($,2v);1P=($.16.1d)?1:0;1D.f.N.o+=1P;1D.f.N.G+=1P;c(1D.f.N.o%2>0){1D.f.N.o+=1}c(1D.f.N.G%2>0){1D.f.N.G+=1}c(1D.f.w===H){c(7.8.k.w.h===\'1j\'&&7.8.k.w.s===\'1j\'){1D.f.w=p}C{1D.f.w=7.8.k.w.h}}B 1D}j 46(1f,X,E,J){R 1n=1f.1q(0).1E(\'2d\');1n.5G=J;1n.5U();1n.3p(X[0],X[1],E,0,1u.6N*2,p);1n.5Y()}j 59(){R 7,i,o,E,J,X,1Q,N,4O,2k,3e,3i,4g,4q,4G;7=A;7.d.1t.1M(\'.g-3i, .g-3e\').3W();o=7.8.e.I.o;E=7.8.e.I.E;J=7.8.e.I.J||7.8.e.f.J;X=4e(E);1Q={};1V(i 5R X){1Q[i]=\'<12 1S="\'+i+\'" e="\'+((/6n/).1Y(i)?\'M\':\'25\')+\':0; \'+\'k:34; G:\'+E+\'1a; o:\'+E+\'1a; 2u:1F; 2S-G:0.1B; 2Y-N:1B">\';c($(\'<1f />\').1q(0).1E){1Q[i]+=\'<1f G="\'+E+\'" o="\'+E+\'" e="4Q-3o: K"></1f>\'}C c($.16.1d){N=E*2+3;1Q[i]+=\'<v:3p 6f="p" 3t="\'+J+\'" 6s="\'+X[i][0]+\'" 6r="\'+X[i][1]+\'" \'+\'e="o:\'+N+\'1a; G:\'+N+\'1a; 2q-K:\'+((/26/).1Y(i)?-2:-1)+\'1a; \'+\'2q-M:\'+((/6m/).1Y(i)?X[i][2]-3.5:-1)+\'1a; \'+\'4Q-3o:K; 2a:53-4E; 3I:1x(#2L#3R)"></v:3p>\'}1Q[i]+=\'</12>\'}4O=7.3d().o-(1u.1H(o,E)*2);2k=\'<12 1I="g-2k" e="G:\'+E+\'1a; o:\'+4O+\'1a; \'+\'2u:1F; 1s-J:\'+J+\'; 2S-G:0.1B; 2Y-N:1B;">\';3e=\'<12 1I="g-3e" 4k="4f" e="G:\'+E+\'1a; \'+\'2q-M:\'+E+\'1a; 2S-G:0.1B; 2Y-N:1B; 2x:0;">\'+1Q.3K+1Q.40+2k;7.d.1t.3B(3e);3i=\'<12 1I="g-3i" 4k="4f" e="G:\'+E+\'1a; \'+\'2q-M:\'+E+\'1a; 2S-G:0.1B; 2Y-N:1B; 2x:0;">\'+1Q.4I+1Q.3P+2k;7.d.1t.5s(3i);c($(\'<1f />\').1q(0).1E){7.d.1t.1M(\'1f\').1L(j(){4g=X[$(A).3O(\'[1S]:1R\').W(\'1S\')];46.S(7,$(A),4g,E,J)})}C c($.16.1d){7.d.h.5s(\'<v:3C e="3I:1x(#2L#3R);"></v:3C>\')}4q=1u.1H(E,(E+(o-E)));4G=1u.1H(o-E,0);7.d.1y.F({I:\'6D 3q \'+J,6H:4G+\'1a \'+4q+\'1a\'})}j 4u(1f,X,J){R 1n=1f.1q(0).1E(\'2d\');1n.5G=J;1n.5U();1n.6o(X[0][0],X[0][1]);1n.5Q(X[1][0],X[1][1]);1n.5Q(X[2][0],X[2][1]);1n.5Y()}j 42(w){R 7,1P,24,4n,4h,3Q;7=A;c(7.8.e.f.w===p||!7.d.f){B}c(!w){w=2T 2D(7.d.f.W(\'1S\'))}1P=24=($.16.1d)?1:0;7.d.f.F(w[w.2y],0);c(w.2y===\'y\'){c($.16.1d){c(1A($.16.2X.2H(0),10)===6){24=w.y===\'K\'?-3:1}C{24=w.y===\'K\'?1:2}}c(w.x===\'1j\'){7.d.f.F({M:\'50%\',6K:-(7.8.e.f.N.o/2)})}C c(w.x===\'M\'){7.d.f.F({M:7.8.e.I.E-1P})}C{7.d.f.F({25:7.8.e.I.E+1P})}c(w.y===\'K\'){7.d.f.F({K:-24})}C{7.d.f.F({26:24})}}C{c($.16.1d){24=(1A($.16.2X.2H(0),10)===6)?1:(w.x===\'M\'?1:2)}c(w.y===\'1j\'){7.d.f.F({K:\'50%\',49:-(7.8.e.f.N.G/2)})}C c(w.y===\'K\'){7.d.f.F({K:7.8.e.I.E-1P})}C{7.d.f.F({26:7.8.e.I.E+1P})}c(w.x===\'M\'){7.d.f.F({M:-24})}C{7.d.f.F({25:24})}}4n=\'2x-\'+w[w.2y];4h=7.8.e.f.N[w.2y===\'x\'?\'o\':\'G\'];7.d.h.F(\'2x\',0).F(4n,4h);c($.16.1d&&1A($.16.2X.2H(0),6)===6){3Q=1A(7.d.f.F(\'2q-K\'),10)||0;3Q+=1A(7.d.u.F(\'2q-K\'),10)||0;7.d.f.F({49:3Q})}}j 44(w){R 7,J,X,3J,2o,f;7=A;c(7.d.f!==1z){7.d.f.3W()}J=7.8.e.f.J||7.8.e.I.J;c(7.8.e.f.w===p){B}C c(!w){w=2T 2D(7.8.e.f.w)}X=4t(w.1w(),7.8.e.f.N.o,7.8.e.f.N.G);7.d.f=\'<12 1I="\'+7.8.e.1g.f+\'" 4k="4f" 1S="\'+w.1w()+\'" e="k:34; \'+\'G:\'+7.8.e.f.N.G+\'1a; o:\'+7.8.e.f.N.o+\'1a; \'+\'2q:0 6e; 2S-G:0.1B; 2Y-N:1B;"></12>\';7.d.h.3B(7.d.f);c($(\'<1f />\').1q(0).1E){f=\'<1f G="\'+7.8.e.f.N.G+\'" o="\'+7.8.e.f.N.o+\'"></1f>\'}C c($.16.1d){3J=7.8.e.f.N.o+\',\'+7.8.e.f.N.G;2o=\'m\'+X[0][0]+\',\'+X[0][1];2o+=\' l\'+X[1][0]+\',\'+X[1][1];2o+=\' \'+X[2][0]+\',\'+X[2][1];2o+=\' 6I\';f=\'<v:3M 3t="\'+J+\'" 6f="p" 6p="H" 2o="\'+2o+\'" 3J="\'+3J+\'" \'+\'e="o:\'+7.8.e.f.N.o+\'1a; G:\'+7.8.e.f.N.G+\'1a; \'+\'2S-G:0.1B; 2a:53-4E; 3I:1x(#2L#3R); \'+\'4Q-3o:\'+(w.y===\'K\'?\'26\':\'K\')+\'"></v:3M>\';f+=\'<v:3C e="3I:1x(#2L#3R);"></v:3C>\';7.d.1y.F(\'k\',\'4y\')}7.d.f=7.d.h.1M(\'.\'+7.8.e.1g.f).6B(0);7.d.f.2l(f);c($(\'<1f  />\').1q(0).1E){4u.S(7,7.d.f.1M(\'1f:1R\'),X,J)}c(w.y===\'K\'&&$.16.1d&&1A($.16.2X.2H(0),10)===6){7.d.f.F({49:-4})}42.S(7,w)}j 5b(){R 7=A;c(7.d.U!==1z){7.d.U.3W()}7.d.h.W(\'3r-6E\',\'g-\'+7.11+\'-U\');7.d.U=$(\'<12 11="g-\'+7.11+\'-U" 1I="\'+7.8.e.1g.U+\'"></12>\').F(2G(7.8.e.U,H)).F({2f:($.16.1d)?1:0}).58(7.d.1y);c(7.8.u.U.1m){7.5W.S(7,7.8.u.U.1m)}c(7.8.u.U.1i!==p&&P 7.8.u.U.1i===\'1w\'){7.d.1i=$(\'<a 1I="\'+7.8.e.1g.1i+\'" 5e="1i" e="6G:25; k: 4y"></a>\').F(2G(7.8.e.1i,H)).2l(7.8.u.U.1i).58(7.d.U).5d(j(r){c(!7.V.23){7.D(r)}})}}j 5l(){R 7,3h,2i,3u;7=A;3h=7.8.q.L.s;2i=7.8.D.L.s;c(7.8.D.3g){2i=2i.2m(7.d.h)}3u=[\'5d\',\'6h\',\'6k\',\'6j\',\'4C\',\'4x\',\'5j\',\'6l\',\'35\'];j 3v(r){c(7.V.23===H){B}2g(7.1G.1W);7.1G.1W=4M(j(){$(3u).1L(j(){2i.1O(A+\'.g-1W\');7.d.u.1O(A+\'.g-1W\')});7.D(r)},7.8.D.2V)}c(7.8.D.3g===H){7.d.h.1J(\'35.g\',j(){c(7.V.23===H){B}2g(7.1G.D)})}j 4S(r){c(7.V.23===H){B}c(7.8.D.L.r===\'1W\'){$(3u).1L(j(){2i.1J(A+\'.g-1W\',3v);7.d.u.1J(A+\'.g-1W\',3v)});3v()}2g(7.1G.q);2g(7.1G.D);c(7.8.q.2V>0){7.1G.q=4M(j(){7.q(r)},7.8.q.2V)}C{7.q(r)}}j 4P(r){c(7.V.23===H){B}c(7.8.D.3g===H&&(/1K(6q|6A)/i).1Y(7.8.D.L.r)&&$(r.70).5g(\'12.g[11^="g"]\').Q>0){r.7L();r.7K();2g(7.1G.D);B p}2g(7.1G.q);2g(7.1G.D);7.d.h.3S(H,H);7.1G.D=4M(j(){7.D(r)},7.8.D.2V)}c(7.8.k.s===\'1K\'&&7.8.k.17!==\'29\'){3h.1J(\'4C.g\',j(r){7.1v.1K={M:r.3Y,K:r.4c};c(7.V.23===p&&7.8.k.1e.1K===H&&7.8.k.17!==\'29\'&&7.d.h.F(\'2a\')!==\'3a\'){7.2h(r)}})}c((7.8.q.L.s.2m(7.8.D.L.s).Q===1&&7.8.q.L.r===7.8.D.L.r&&7.8.D.L.r!==\'1W\')||7.8.D.L.r===\'4R\'){7.1v.2I=0;3h.1J(7.8.q.L.r+\'.g\',j(r){c(7.1v.2I===0){4S(r)}C{4P(r)}})}C{3h.1J(7.8.q.L.r+\'.g\',4S);c(7.8.D.L.r!==\'1W\'){2i.1J(7.8.D.L.r+\'.g\',4P)}}c((/(3g|34)/).1Y(7.8.k.17)){7.d.h.1J(\'35.g\',7.2E)}}j 22(){R 7,2l,2t;7=A;2t=7.3d();2l=\'<7J 1I="g-22" 7I="0" 7M="-1" 4T="7N:p" \'+\'e="2a:4E; k:34; z-3s:-1; 5m:7R(2B=\\\'0\\\'); I: 1B 3q 4H; \'+\'G:\'+2t.G+\'1a; o:\'+2t.o+\'1a" />\';7.d.22=7.d.1t.3B(2l).2w(\'.g-22:1R\')}j 4w(){R 7,u,1x,Y,2A;7=A;7.5J.S(7);7.V.1b=2;7.d.h=\'<12 g="\'+7.11+\'" 11="g-\'+7.11+\'" 5e="h" \'+\'3r-7Q="g-\'+7.11+\'-u" 1I="g \'+(7.8.e.1g.h||7.8.e)+\'" \'+\'e="2a:3a; -7P-I-E:0; -7O-I-E:0; I-E:0; k:\'+7.8.k.17+\';"> \'+\'  <12 1I="g-1t" e="k:4y; 2u:1F; 1m-3o:M;"> \'+\'    <12 1I="g-1y" e="2u:1F;"> \'+\'       <12 11="g-\'+7.11+\'-u" 1I="g-u \'+7.8.e.1g.u+\'"></12> \'+\'</12></12></12>\';7.d.h=$(7.d.h);7.d.h.5P(7.8.k.3U);7.d.h.Y(\'g\',{3k:0,O:[7]});7.d.1t=7.d.h.2w(\'12:1R\');7.d.1y=7.d.1t.2w(\'12:1R\');7.d.u=7.d.1y.2w(\'12:1R\').F(2G(7.8.e));c($.16.1d){7.d.1t.2m(7.d.u).F({2f:1})}c(7.8.D.L.r===\'4R\'){7.d.h.W(\'4R\',H)}c(P 7.8.e.o.2Z===\'2s\'){7.4d()}c($(\'<1f />\').1q(0).1E||$.16.1d){c(7.8.e.I.E>0){59.S(7)}C{7.d.1y.F({I:7.8.e.I.o+\'1a 3q \'+7.8.e.I.J})}c(7.8.e.f.w!==p){44.S(7)}}C{7.d.1y.F({I:7.8.e.I.o+\'1a 3q \'+7.8.e.I.J});7.8.e.I.E=0;7.8.e.f.w=p}c((P 7.8.u.1m===\'1w\'&&7.8.u.1m.Q>0)||(7.8.u.1m.4r&&7.8.u.1m.Q>0)){u=7.8.u.1m}C{u=\' \'}c(7.8.u.U.1m!==p){5b.S(7)}7.4A(u,p);5l.S(7);c(7.8.q.3x===H){7.q()}c(7.8.u.1x!==p){1x=7.8.u.1x;Y=7.8.u.Y;2A=7.8.u.2A||\'1q\';7.5Z(1x,Y,2A)}7.V.1b=H;7.5f.S(7)}j 56(s,8,11){R 7=A;7.11=11;7.8=8;7.V={4j:p,1b:p,23:p,3Z:p};7.d={s:s.5v(7.8.e.1g.s),h:1z,1t:1z,u:1z,1y:1z,U:1z,1i:1z,f:1z,22:1z};7.1v={W:p,1K:{},2I:0,2u:{M:p,K:p}};7.1G={};$.2p(7,7.8.T,{q:j(r){R 1c,1X;c(!7.V.1b){B p}c(7.d.h.F(\'2a\')!==\'3a\'){B 7}7.d.h.3S(H,p);1c=7.5n.S(7,r);c(1c===p){B 7}j 2M(){7.d.h.W(\'3r-1F\',H);c(7.8.k.17!==\'29\'){7.2E()}7.5q.S(7,r);c($.16.1d){R 4a=7.d.h.1q(0).e;4a.43(\'5m\');4a.43(\'2B\')}C{7.d.h.F({2B:\'\'})}}7.1v.2I=1;c(7.8.k.17!==\'29\'){7.2h(r,(7.8.q.Z.Q>0&&7.1b!==2))}c(P 7.8.q.1X===\'19\'){1X=$(7.8.q.1X)}C c(7.8.q.1X===H){1X=$(\'12.g\').5S(7.d.h)}c(1X){1X.1L(j(){c($(A).g(\'T\').V.1b===H){$(A).g(\'T\').D()}})}c(P 7.8.q.Z.17===\'j\'){7.8.q.Z.17.S(7.d.h,7.8.q.Z.Q);7.d.h.5u(j(){2M();$(A).5t()})}C{4N(7.8.q.Z.17.2F()){1Z\'3w\':7.d.h.7H(7.8.q.Z.Q,2M);1C;1Z\'5o\':7.d.h.7G(7.8.q.Z.Q,j(){2M();c(7.8.k.17!==\'29\'){7.2h(r,H)}});1C;1Z\'5p\':7.d.h.q(7.8.q.Z.Q,2M);1C;2L:7.d.h.q(1z,2M);1C}7.d.h.5v(7.8.e.1g.3T)}B 7},D:j(r){R 1c;c(!7.V.1b){B p}C c(7.d.h.F(\'2a\')===\'3a\'){B 7}2g(7.1G.q);7.d.h.3S(H,p);1c=7.5A.S(7,r);c(1c===p){B 7}j 2K(){7.d.h.W(\'3r-1F\',H);c($.16.1d){7.d.h.1q(0).e.43(\'2B\')}C{7.d.h.F({2B:\'\'})}7.4Z.S(7,r)}7.1v.2I=0;c(P 7.8.D.Z.17===\'j\'){7.8.D.Z.17.S(7.d.h,7.8.D.Z.Q);7.d.h.5u(j(){2K();$(A).5t()})}C{4N(7.8.D.Z.17.2F()){1Z\'3w\':7.d.h.7z(7.8.D.Z.Q,2K);1C;1Z\'5o\':7.d.h.7y(7.8.D.Z.Q,2K);1C;1Z\'5p\':7.d.h.D(7.8.D.Z.Q,2K);1C;2L:7.d.h.D(1z,2K);1C}7.d.h.7x(7.8.e.1g.3T)}B 7},2I:j(r,38){R 5r=/7w|2s/.1Y(P 38)?38:!7.d.h.2r(\':28\');7[5r?\'q\':\'D\'](r);B 7},2h:j(r,4o){c(!7.V.1b){B p}R 1U=8.k,s=$(1U.s),2Q=7.d.h.47(),2P=7.d.h.48(),1p,1l,k,1o=1U.w.h,2R=1U.w.s,1c,14,i,4L,27,45={M:j(){R 3j=$(2e).3D(),3n=$(2e).o()+$(2e).3D(),2J=1o.x===\'1j\'?2Q/2:2Q,2N=1o.x===\'1j\'?1p/2:1p,2O=(1o.x===\'1j\'?1:2)*7.8.e.I.E,1k=-2*1U.1e.x,3m=k.M+2Q,1h;c(3m>3n){1h=1k-2J-2N+2O;c(k.M+1h>3j||3j-(k.M+1h)<3m-3n){B{1e:1h,f:\'25\'}}}c(k.M<3j){1h=1k+2J+2N-2O;c(3m+1h<3n||3m+1h-3n<3j-k.M){B{1e:1h,f:\'M\'}}}B{1e:0,f:1o.x}},K:j(){R 30=$(2e).3G(),33=$(2e).G()+$(2e).3G(),2J=1o.y===\'1j\'?2P/2:2P,2N=1o.y===\'1j\'?1l/2:1l,2O=(1o.y===\'1j\'?1:2)*7.8.e.I.E,1k=-2*1U.1e.y,32=k.K+2P,1h;c(32>33){1h=1k-2J-2N+2O;c(k.K+1h>30||30-(k.K+1h)<32-33){B{1e:1h,f:\'26\'}}}c(k.K<30){1h=1k+2J+2N-2O;c(32+1h<33||32+1h-33<30-k.K){B{1e:1h,f:\'K\'}}}B{1e:0,f:1o.y}}};c(r&&8.k.s===\'1K\'){2R={x:\'M\',y:\'K\'};1p=1l=0;c(!r.3Y){k=7.1v.1K}C{k={K:r.4c,M:r.3Y}}}C{c(s[0]===31){1p=s.o();1l=s.G();k={K:0,M:0}}C c(s[0]===2e){1p=s.o();1l=s.G();k={K:s.3G(),M:s.3D()}}C c(s.2r(\'7A\')){14=7.8.k.s.W(\'14\').7B(\',\');1V(i=0;i<14.Q;i++){14[i]=1A(14[i],10)}4L=7.8.k.s.3O(\'7F\').W(\'21\');27=$(\'4U[7E="#\'+4L+\'"]:1R\').1k();k={M:1u.3H(27.M+14[0]),K:1u.3H(27.K+14[1])};4N(7.8.k.s.W(\'3M\').2F()){1Z\'7T\':1p=1u.4V(1u.5z(14[2]-14[0]));1l=1u.4V(1u.5z(14[3]-14[1]));1C;1Z\'7C\':1p=14[2]+1;1l=14[2]+1;1C;1Z\'7S\':1p=14[0];1l=14[1];1V(i=0;i<14.Q;i++){c(i%2===0){c(14[i]>1p){1p=14[i]}c(14[i]<14[0]){k.M=1u.3H(27.M+14[i])}}C{c(14[i]>1l){1l=14[i]}c(14[i]<14[1]){k.K=1u.3H(27.K+14[i])}}}1p=1p-(k.M-27.M);1l=1l-(k.K-27.K);1C}1p-=2;1l-=2}C{1p=s.47();1l=s.48();c(!7.d.h.2r(\':28\')){7.d.h.F({M:\'-81\'}).q()}c(!1U.1e.1k||7.d.h.4F()[0]===31.4X){k=s.1k()}C{k=s.k();k.K+=s.4F().3G();k.M+=s.4F().3D()}}k.M+=2R.x===\'25\'?1p:2R.x===\'1j\'?1p/2:0;k.K+=2R.y===\'26\'?1l:2R.y===\'1j\'?1l/2:0}k.M+=1U.1e.x+(1o.x===\'25\'?-2Q:1o.x===\'1j\'?-2Q/2:0);k.K+=1U.1e.y+(1o.y===\'26\'?-2P:1o.y===\'1j\'?-2P/2:0);c(7.8.e.I.E>0){c(1o.x===\'M\'){k.M-=7.8.e.I.E}C c(1o.x===\'25\'){k.M+=7.8.e.I.E}c(1o.y===\'K\'){k.K-=7.8.e.I.E}C c(1o.y===\'26\'){k.K+=7.8.e.I.E}}c(1U.1e.55){(j(){R 2W={x:0,y:0},2n={x:45.M(),y:45.K()},f=2T 2D(8.e.f.w);c(7.d.f&&f){c(2n.y.1e!==0){k.K+=2n.y.1e;f.y=2W.y=2n.y.f}c(2n.x.1e!==0){k.M+=2n.x.1e;f.x=2W.x=2n.x.f}7.1v.2u={M:2W.x===p,K:2W.y===p};c(7.d.f.W(\'1S\')!==f.1w()){44.S(7,f)}}}())}c(!7.d.22&&$.16.1d&&1A($.16.2X.2H(0),10)===6){22.S(7)}1c=7.57.S(7,r);c(1c===p){B 7}c(8.k.s!==\'1K\'&&4o===H){7.V.4j=H;7.d.h.3S().4o(k,7V,\'80\',j(){7.V.4j=p})}C{7.d.h.F(k)}7.5c.S(7,r);B 7},4d:j(1r){c(!7.V.1b||(1r&&P 1r!==\'2s\')){B p}R 1F=7.d.1y.7W().2m(7.d.f).2m(7.d.1i),2f=7.d.1t.2m(7.d.1y.2w()),h=7.d.h,1H=7.8.e.o.1H,2b=7.8.e.o.2b;c(!1r){c(P 7.8.e.o.2Z===\'2s\'){1r=7.8.e.o.2Z}C{7.d.h.F({o:\'6e\'});1F.D();h.o(1r);c($.16.1d){2f.F({2f:\'\'})}1r=7.3d().o;c(!7.8.e.o.2Z){1r=1u.2b(1u.1H(1r,2b),1H)}}}c(1r%2){1r+=1}7.d.h.o(1r);1F.q();c(7.8.e.I.E){7.d.h.1M(\'.g-2k\').1L(j(i){$(A).o(1r-(7.8.e.I.E*2))})}c($.16.1d){2f.F({2f:1});7.d.1t.o(1r);c(7.d.22){7.d.22.o(1r).G(7.3d.G)}}B 7},7Y:j(21){R f,2j,1n,w,X;c(!7.V.1b||P 21!==\'1w\'||!$.18.g.3c[21]){B p}7.8.e=4l.S(7,$.18.g.3c[21],7.8.4v.e);7.d.u.F(2G(7.8.e));c(7.8.u.U.1m!==p){7.d.U.F(2G(7.8.e.U,H))}7.d.1y.F({7U:7.8.e.I.J});c(7.8.e.f.w!==p){c($(\'<1f />\').1q(0).1E){f=7.d.h.1M(\'.g-f 1f:1R\');1n=f.1q(0).1E(\'2d\');1n.5I(0,0,3N,3N);w=f.3O(\'12[1S]:1R\').W(\'1S\');X=4t(w,7.8.e.f.N.o,7.8.e.f.N.G);4u.S(7,f,X,7.8.e.f.J||7.8.e.I.J)}C c($.16.1d){f=7.d.h.1M(\'.g-f [5E="3M"]\');f.W(\'3t\',7.8.e.f.J||7.8.e.I.J)}}c(7.8.e.I.E>0){7.d.h.1M(\'.g-2k\').F({7X:7.8.e.I.J});c($(\'<1f />\').1q(0).1E){2j=4e(7.8.e.I.E);7.d.h.1M(\'.g-1t 1f\').1L(j(){1n=$(A).1q(0).1E(\'2d\');1n.5I(0,0,3N,3N);w=$(A).3O(\'12[1S]:1R\').W(\'1S\');46.S(7,$(A),2j[w],7.8.e.I.E,7.8.e.I.J)})}C c($.16.1d){7.d.h.1M(\'.g-1t [5E="3p"]\').1L(j(){$(A).W(\'3t\',7.8.e.I.J)})}}B 7},4A:j(u,5F){R 36,37,4K;j 4J(){7.4d();c(5F!==p){c(7.8.k.17!==\'29\'){7.2h(7.d.h.2r(\':28\'),H)}c(7.8.e.f.w!==p){42.S(7)}}}c(!u){B p}36=7.54.S(7,u);c(P 36===\'1w\'){u=36}C c(36===p){B}c(7.V.1b){c($.16.1d){7.d.1y.2w().F({2f:\'7Z\'})}c(u.4r&&u.Q>0){u.5V(H).5P(7.d.u).q()}C{7.d.u.2l(u)}37=7.d.u.1M(\'4U[6O=p]\');c(37.Q>0){4K=0;37.1L(j(i){$(\'<4U 4T="\'+$(A).W(\'4T\')+\'" />\').7D(j(){c(++4K===37.Q){4J()}})})}C{4J()}}C{7.8.u.1m=u}7.4Y.S(7);B 7},5Z:j(1x,Y,2A){R 1c;j 4D(u){7.63.S(7);7.4A(u)}c(!7.V.1b){B p}1c=7.51.S(7);c(1c===p){B 7}c(2A===\'60\'){$.60(1x,Y,4D)}C{$.1q(1x,Y,4D)}B 7},5W:j(u){R 1c;c(!7.V.1b||!u){B p}1c=7.64.S(7);c(1c===p){B 7}c(7.d.1i){7.d.1i=7.d.1i.5V(H)}7.d.U.2l(u);c(7.d.1i){7.d.U.3B(7.d.1i)}7.65.S(7);B 7},2E:j(r){R 4B,3F,3y,1c;c(!7.V.1b||7.8.k.17===\'29\'){B p}4B=1A(7.d.h.F(\'z-3s\'),10);3F=7u+$(\'12.g[11^="g"]\').Q-1;c(!7.V.3Z&&4B!==3F){1c=7.5H.S(7,r);c(1c===p){B 7}$(\'12.g[11^="g"]\').5S(7.d.h).1L(j(){c($(A).g(\'T\').V.1b===H){3y=1A($(A).F(\'z-3s\'),10);c(P 3y===\'2s\'&&3y>-1){$(A).F({68:1A($(A).F(\'z-3s\'),10)-1})}$(A).g(\'T\').V.3Z=p}});7.d.h.F({68:3F});7.V.3Z=H;7.5C.S(7,r)}B 7},3X:j(38){7.V.23=38?H:p;B 7},3f:j(){R i,1c,O,4z=7.d.s.Y(\'4p\'+7.1v.W[0]);1c=7.61.S(7);c(1c===p){B 7}c(7.V.1b){7.8.q.L.s.1O(\'4C.g\',7.2h);7.8.q.L.s.1O(\'4x.g\',7.D);7.8.q.L.s.1O(7.8.q.L.r+\'.g\');7.8.D.L.s.1O(7.8.D.L.r+\'.g\');7.d.h.1O(7.8.D.L.r+\'.g\');7.d.h.1O(\'35.g\',7.2E);7.d.h.3W()}C{7.8.q.L.s.1O(7.8.q.L.r+\'.g-\'+7.11+\'-4m\')}c(P 7.d.s.Y(\'g\')===\'19\'){O=7.d.s.Y(\'g\').O;c(P O===\'19\'&&O.Q>0){1V(i=0;i<O.Q-1;i++){c(O[i].11===7.11){O.5X(i,1)}}}}$.18.g.O.5X(7.11,1);c(P O===\'19\'&&O.Q>0){7.d.s.Y(\'g\').3k=O.Q-1}C{7.d.s.73(\'g\')}c(4z){7.d.s.W(7.1v.W[0],4z)}7.62.S(7);B 7.d.s},72:j(){R q,1k;c(!7.V.1b){B p}q=(7.d.h.F(\'2a\')!==\'3a\')?p:H;c(q){7.d.h.F({3V:\'1F\'}).q()}1k=7.d.h.1k();c(q){7.d.h.F({3V:\'28\'}).D()}B 1k},3d:j(){R q,2t;c(!7.V.1b){B p}q=(!7.d.h.2r(\':28\'))?H:p;c(q){7.d.h.F({3V:\'1F\'}).q()}2t={G:7.d.h.48(),o:7.d.h.47()};c(q){7.d.h.F({3V:\'28\'}).D()}B 2t}})}$.18.g=j(8,41){R i,11,O,20,2c,1T,15,T;c(P 8===\'1w\'){c($(A).Y(\'g\')){c(8===\'T\'){B $(A).Y(\'g\').O[$(A).Y(\'g\').3k]}C c(8===\'O\'){B $(A).Y(\'g\').O}}C{B $(A)}}C{c(!8){8={}}c(P 8.u!==\'19\'||(8.u.4r&&8.u.Q>0)){8.u={1m:8.u}}c(P 8.u.U!==\'19\'){8.u.U={1m:8.u.U}}c(P 8.k!==\'19\'){8.k={w:8.k}}c(P 8.k.w!==\'19\'){8.k.w={s:8.k.w,h:8.k.w}}c(P 8.q!==\'19\'){8.q={L:8.q}}c(P 8.q.L!==\'19\'){8.q.L={r:8.q.L}}c(P 8.q.Z!==\'19\'){8.q.Z={17:8.q.Z}}c(P 8.D!==\'19\'){8.D={L:8.D}}c(P 8.D.L!==\'19\'){8.D.L={r:8.D.L}}c(P 8.D.Z!==\'19\'){8.D.Z={17:8.D.Z}}c(P 8.e!==\'19\'){8.e={21:8.e}}8.e=4i(8.e);20=$.2p(H,{},$.18.g.39,8);20.e=4l.S({8:20},20.e);20.4v=$.2p(H,{},8)}B $(A).1L(j(){R 7=$(A),u=p;c(P 8===\'1w\'){1T=8.2F();O=$(A).g(\'O\');c(P O===\'19\'){c(41===H&&1T===\'3f\'){1V(i=O.Q-1;i>-1;i--){c(\'19\'===P O[i]){O[i].3f()}}}C{c(41!==H){O=[$(A).g(\'T\')]}1V(i=0;i<O.Q;i++){c(1T===\'3f\'){O[i].3f()}C c(O[i].V.1b===H){c(1T===\'q\'){O[i].q()}C c(1T===\'D\'){O[i].D()}C c(1T===\'2E\'){O[i].2E()}C c(1T===\'3X\'){O[i].3X(H)}C c(1T===\'71\'){O[i].3X(p)}C c(1T===\'7v\'){O[i].2h()}}}}}}C{15=$.2p(H,{},20);15.D.Z.Q=20.D.Z.Q;15.q.Z.Q=20.q.Z.Q;c(15.k.3U===p){15.k.3U=$(31.4X)}c(15.k.s===p){15.k.s=$(A)}c(15.q.L.s===p){15.q.L.s=$(A)}c(15.D.L.s===p){15.D.L.s=$(A)}15.k.w.h=2T 2D(15.k.w.h);15.k.w.s=2T 2D(15.k.w.s);c(!15.u.1m.Q){$([\'U\',\'6b\']).1L(j(i,W){R 2C=7.W(W);c(2C&&2C.Q){u=[W,2C];7.Y(\'4p\'+W,2C).74(W);15.u.1m=2C.3l(/\\n/75,\'<78 />\');B p}})}11=$.18.g.O.Q;1V(i=0;i<11;i++){c(P $.18.g.O[i]===\'5i\'){11=i;1C}}2c=2T 56($(A),15,11);$.18.g.O[11]=2c;2c.1v.W=u;c(P $(A).Y(\'g\')===\'19\'&&$(A).Y(\'g\')){c(P $(A).W(\'g\')===\'5i\'){$(A).Y(\'g\').3k=$(A).Y(\'g\').O.Q}$(A).Y(\'g\').O.5h(2c)}C{$(A).Y(\'g\',{3k:0,O:[2c]})}c(15.u.5w===p&&15.q.L.r!==p&&15.q.3x!==H){15.q.L.s.1J(15.q.L.r+\'.g-\'+11+\'-4m\',{g:11},j(r){T=$.18.g.O[r.Y.g];T.8.q.L.s.1O(T.8.q.L.r+\'.g-\'+r.Y.g+\'-4m\');T.1v.1K={M:r.3Y,K:r.4c};4w.S(T);T.8.q.L.s.77(T.8.q.L.r)})}C{2c.1v.1K={M:15.q.L.s.1k().M,K:15.q.L.s.1k().K};4w.S(2c)}}})};$.18.g.O=[];$.18.g.18={W:$.18.W};$.18.W=j(W){R T=$(A).g(\'T\');B(3b.Q===1&&(/U|6b/i).1Y(W)&&T.V&&T.V.1b===H)?$(A).Y(\'4p\'+T.1v.W[0]):$.18.g.18.W.4s(A,3b)};$.18.g.39={u:{5w:p,1m:p,1x:p,Y:1z,U:{1m:p,1i:p}},k:{s:p,w:{s:\'3P\',h:\'3K\'},1e:{x:0,y:0,1K:H,55:p,3E:H,3L:H,1k:p},17:\'34\',3U:p},q:{L:{s:p,r:\'35\'},Z:{17:\'3w\',Q:5T},2V:76,1X:p,3x:p},D:{L:{s:p,r:\'4x\'},Z:{17:\'3w\',Q:5T},2V:0,3g:p},T:{5J:j(){},5f:j(){},57:j(){},5c:j(){},5n:j(){},5q:j(){},5A:j(){},4Z:j(){},54:j(){},4Y:j(){},51:j(){},63:j(){},64:j(){},65:j(){},61:j(){},62:j(){},5H:j(){},5C:j(){}}};$.18.g.3c={39:{1s:\'66\',J:\'#6Z\',2u:\'1F\',6Y:\'M\',o:{2b:0,1H:6S},2x:\'6R 6Q\',I:{o:1,E:0,J:\'#6P\'},f:{w:p,J:p,N:{o:13,G:13},2B:1},U:{1s:\'#6T\',6U:\'6X\',2x:\'6W 6V\'},1i:{79:\'7a\'},1g:{s:\'\',f:\'g-f\',U:\'g-U\',1i:\'g-1i\',u:\'g-u\',3T:\'g-3T\'}},5L:{I:{o:3,E:0,J:\'#7o\'},U:{1s:\'#7n\',J:\'#5M\'},1s:\'#7m\',J:\'#5M\',1g:{h:\'g-5L\'}},6d:{I:{o:3,E:0,J:\'#7p\'},U:{1s:\'#7q\',J:\'#6c\'},1s:\'66\',J:\'#6c\',1g:{h:\'g-6d\'}},69:{I:{o:3,E:0,J:\'#7t\'},U:{1s:\'#7s\',J:\'#67\'},1s:\'#7r\',J:\'#67\',1g:{h:\'g-69\'}},4H:{I:{o:3,E:0,J:\'#7l\'},U:{1s:\'#7k\',J:\'#6g\'},1s:\'#7e\',J:\'#6g\',1g:{h:\'g-4H\'}},52:{I:{o:3,E:0,J:\'#7d\'},U:{1s:\'#7c\',J:\'#4W\'},1s:\'#7b\',J:\'#4W\',1g:{h:\'g-52\'}},5k:{I:{o:3,E:0,J:\'#7f\'},U:{1s:\'#7g\',J:\'#7j\'},1s:\'#7i\',J:\'#7h\',1g:{h:\'g-5k\'}}}}(82));',62,499,'|||||||self|options||||if|elements|style|tip|qtip|tooltip||function|position||||width|false|show|event|target||content||corner||||this|return|else|hide|radius|css|height|true|border|color|top|when|left|size|interfaces|typeof|length|var|call|api|title|status|attr|coordinates|data|effect||id|div||coords|config|browser|type|fn|object|px|rendered|returned|msie|adjust|canvas|classes|adj|button|center|offset|targetHeight|text|context|my|targetWidth|get|newWidth|background|wrapper|Math|cache|string|url|contentWrapper|null|parseInt|1px|break|finalStyle|getContext|hidden|timers|max|class|bind|mouse|each|find|tips|unbind|ieAdjust|containers|first|rel|command|posOptions|for|inactive|solo|test|case|opts|name|bgiframe|disabled|positionAdjust|right|bottom|imagePos|visible|static|display|min|obj||window|zoom|clearTimeout|updatePosition|hideTarget|borders|betweenCorners|html|add|adapted|path|extend|margin|is|number|dimensions|overflow|styleExtend|children|padding|precedance|90|method|opacity|val|Corner|focus|toLowerCase|jQueryStyle|charAt|toggle|myOffset|afterHide|default|afterShow|atOffset|borderAdjust|elemHeight|elemWidth|at|line|new|styleObj|delay|adjusted|version|font|value|topEdge|document|pBottom|bottomEdge|absolute|mouseover|parsedContent|images|state|defaults|none|arguments|styles|getDimensions|borderTop|destroy|fixed|showTarget|borderBottom|leftEdge|current|replace|pRight|rightEdge|align|arc|solid|aria|index|fillcolor|inactiveEvents|inactiveMethod|fade|ready|elemIndex|delete|styleArray|prepend|image|scrollLeft|scroll|newIndex|scrollTop|floor|behavior|coordsize|topLeft|resize|shape|300|parent|bottomRight|newMargin|VML|stop|active|container|visiblity|remove|disable|pageX|focused|topRight|blanket|positionTip|removeAttribute|createTip|adapt|drawBorder|outerWidth|outerHeight|marginTop|ieStyle|sub|pageY|updateWidth|calculateBorders|ltr|borderCoord|paddingSize|sanitizeStyle|animated|dir|buildStyle|create|paddingCorner|animate|old|sideWidth|jquery|apply|calculateTip|drawTip|user|construct|mouseout|relative|oldattr|updateContent|curIndex|mousemove|setupContent|block|offsetParent|vertWidth|red|bottomLeft|afterLoad|loadedImages|mapName|setTimeout|switch|betweenWidth|hideMethod|vertical|unfocus|showMethod|src|img|ceil|58792E|body|onContentUpdate|onHide||beforeContentLoad|green|inline|beforeContentUpdate|screen|QTip|beforePositionUpdate|prependTo|createBorder|String|createTitle|onPositionUpdate|click|role|onRender|parents|push|undefined|mouseenter|blue|assignEvents|filter|beforeShow|slide|grow|onShow|condition|append|dequeue|queue|addClass|prerender|middle|match|abs|beforeHide|bottomright|onFocus|270|nodeName|reposition|fillStyle|beforeFocus|clearRect|beforeRender|topright|cream|A27D35|topleft|unshift|appendTo|lineTo|in|not|100|beginPath|clone|updateTitle|splice|fill|loadContent|post|beforeDestroy|onDestroy|onContentLoad|beforeTitleUpdate|onTitleUpdate|white|f3f3f3|zIndex|dark|bottomleft|alt|454545|light|auto|stroked|9C2F2F|dblclick|rightcenter|mouseup|mousedown|mouseleave|Right|Left|moveTo|filled|out|endangle|startangle|use|strict|bottomcenter|qtipSelector|leftbottom|topcenter|righttop|leave|eq|rightbottom|0px|labelledby|while|float|borderWidth|xe|leftcenter|marginLeft|search|lefttop|PI|complete|d3d3d3|9px|5px|250|e1e1e1|fontWeight|12px|7px|bold|textAlign|111|relatedTarget|enable|getPosition|removeData|removeAttr|gi|140|trigger|br|cursor|pointer|CDE6AC|b9db8c|A9DB66|F79992|ADD9ED|D0E9F5|4D9FBF|E5F6FE|5E99BD|f28279|CE6F6F|FBF7AA|F0DE7D|F9E98E|E2E2E2|f1f1f1|505050|404040|303030|15000|update|boolean|removeClass|slideUp|fadeOut|area|split|circle|load|usemap|map|slideDown|fadeIn|frameborder|iframe|preventDefault|stopPropagation|tabindex|javascript|webkit|moz|describedby|alpha|poly|rect|borderColor|200|siblings|backgroundColor|updateStyle|normal|swing|10000000em|jQuery'.split('|'),0,{}))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/js/projectscontents.js	Tue Sep 14 13:38:47 2010 +0200
@@ -0,0 +1,208 @@
+$.fn.realVal = function() {
+	var obj = $(this[0]);
+	if(obj.val) {
+		if(obj.val() == obj.attr('defaultText')) {
+			return '';
+		}
+		else {
+			return obj.val();
+		}
+	}
+	else {
+		return null;
+	}
+};
+
+function init_events_base(base_node, embed_url) {
+
+	$('.ldt_link',base_node).nyroModal({
+       	type: 'iframe',
+       	forceType: 'iframe',
+       	windowResize: false,
+   		height:662, 
+   		width:1022,
+   		bgColor: 'rgb(239, 239, 239)',
+   		padding: 5,
+   		titleFromIframe: false
+      	});
+    	
+ 	$('.ldt_link_create',base_node).nyroModal({
+        type: 'iframe',
+        forceType: 'iframe',
+        windowResize: false,
+        height:680, 
+        width:500,
+        bgColor: 'rgb(239, 239, 239)',
+        padding: 5,
+        titleFromIframe: false,
+        beforeHideContent: function(elts, settings, callback){
+             try {
+	              var res = $('#ldtInitSwf',$('#nyroModalIframe').contents());
+	              if(res.length > 0)
+	              {
+	              	   res.get(0).forceSave();
+	              }
+             }
+             catch(err)
+             {
+              // do nothing
+             }                   
+             callback();
+        	},
+        	endShowContent: function(elts, settings){
+        		var iframe = $('#nyroModalIframe', elts.content);
+    			iframe.load(function(){
+    				var swfobject = $(this).contents().find("#ldtInitSwf"); 
+    				if (swfobject.length) {
+    					$.nyroModalSettings({
+    						height: swfobject.height() + 31,
+    						width: swfobject.width() + 21
+    					});
+    				}
+    			});
+        	}
+    	});
+
+	$('.ldt_link_embed',base_node).click(function(e) {
+		e.preventDefault();
+		var link = $(e.target);
+		var json_url = link.attr("href");
+		var player_id = link.attr("id");
+		/*$.nyroModalSettings({
+		 	ajax: { data: ({ json_url:json_url, player_id:player_id }) }
+		  	});*/
+		   $.nyroModalManual({
+		       type: 'iframe',
+		       forceType: 'iframe',
+		       titleFromIframe: false,
+		       height:662, 
+               width:650,
+               bgColor: 'rgb(239, 239, 239)',
+               padding: 5,
+		       url: embed_url+'?json_url='+escape(json_url)+'&player_id='+escape(player_id),
+		   });
+		   return false;
+	});
+
+
+	$('.imageline',base_node).each(function(i) {
+	    var tr = $(this);
+		tr.mouseover(function() {
+	    	$('.cellimgdiv',this).css('visibility', 'visible');
+		}); 
+		tr.mouseout(function() {
+	    	$('.cellimgdiv',this).css('visibility', 'hidden');
+		});
+	});
+	
+	$('.cellimgdiv img').qtip({ 
+		style: { 
+			'name': 'dark',
+			'filter':'alpha(opacity=70)',
+			'-moz-opacity':'0.7',
+			'-khtml-opacity': '0.7',
+			'opacity': '0.7',
+			'border': {
+				'width' : '0',
+				'color': '#505050',
+			}, 
+			'tip': true
+		} 
+	});
+	
+
+};
+
+
+function searchCallback(target, container_selector, url, timeout) {
+
+	timeout = typeof(timeout) != 'undefined' ? timeout : 0;
+	var target = $(target); 
+
+	if(target.attr('timer')) {
+		clearTimeout(target.attr('timer'));
+	}
+	
+	target.attr('timer',setTimeout(function() {
+		target.next(".searchajaxloader").show();
+		url = url.replace('__FILTER__',escape($(target).realVal()));
+		$(container_selector).load(url, null, function() {
+			target.next(".searchajaxloader").hide();
+			init_events($(container_selector));
+			target.removeAttr('timer');
+		});
+	},
+	300));
+};
+
+
+function init_events_contents(base_node, embed_url) {
+
+	init_events_base(base_node, embed_url);
+	
+	$('.content_link_create').nyroModal({
+	    type: 'iframe',
+	    forceType: 'iframe',
+	    height:500, 
+	    width:765,
+	    bgColor: 'rgb(239, 239, 239)',
+	    padding: 5,
+	    titleFromIframe: false,
+	    endRemove: function(elts, settings) {
+	    	searchCallback($("#searchcontentsinput"),"#contentslistcontainer",content_filter_url)
+		},
+	  	endShowContent: function(elts, settings) {
+		  	$('#nyroModalIframe', elts.content).load(function() {
+			  	var form_status = $(this).contents().find("#content_form_status").val(); 
+			  	if(form_status == 'saved') {
+			  		$.nyroModalRemove();
+			  	}
+		  	});
+		}
+	});
+
+}
+
+
+
+function searchFieldInit(input_list_init) {
+
+	$(".searchfieldinputbase").keydown(function (e) {
+	 	if(e.which == 27) {
+	 	 	$(e.target).blur();
+	 	 	$(e.target).next(".searchajaxloader").hide();
+	 	}
+	});
+	
+	 
+	$('.searchfieldinput').each(function(i) {
+	     var sbox = $(this);
+	     if(sbox.val() != '') {
+	    	 sbox.attr('defaultText', sbox.val());
+	     }
+	
+	     sbox.focus(function() {
+	         box = $(this);
+	         if(box.val() == box.attr('defaultText')) {
+	             box.val('');
+	             box.toggleClass("searchfieldinput");
+	         }
+	     });
+	
+	     sbox.blur(function() {
+	         var box = $(this);
+	         if(box.val() == '' && box.attr('defaultText')) {
+	             box.val(box.attr('defaultText'));
+	             box.toggleClass("searchfieldinput");
+	         }
+	     });
+	     
+	});
+
+	$.each(input_list_init, function(index, value) {
+		$(value['input_selector']).keyup(function (e) {
+			searchCallback(e.target, value['container_selector'], value['url']);
+		});
+	});
+
+}